Index: content/browser/web_contents/web_contents_view_win.cc |
=================================================================== |
--- content/browser/web_contents/web_contents_view_win.cc (revision 244508) |
+++ content/browser/web_contents/web_contents_view_win.cc (working copy) |
@@ -1,465 +0,0 @@ |
-// Copyright (c) 2012 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 "content/browser/web_contents/web_contents_view_win.h" |
- |
-#include "base/bind.h" |
-#include "base/memory/scoped_vector.h" |
-#include "content/browser/frame_host/interstitial_page_impl.h" |
-#include "content/browser/renderer_host/render_view_host_factory.h" |
-#include "content/browser/renderer_host/render_view_host_impl.h" |
-#include "content/browser/renderer_host/render_widget_host_view_win.h" |
-#include "content/browser/web_contents/web_contents_drag_win.h" |
-#include "content/browser/web_contents/web_contents_impl.h" |
-#include "content/browser/web_contents/web_drag_dest_win.h" |
-#include "content/public/browser/web_contents_delegate.h" |
-#include "content/public/browser/web_contents_view_delegate.h" |
-#include "ui/base/win/hidden_window.h" |
-#include "ui/base/win/hwnd_subclass.h" |
-#include "ui/gfx/screen.h" |
- |
-namespace content { |
-WebContentsViewPort* CreateWebContentsView( |
- WebContentsImpl* web_contents, |
- WebContentsViewDelegate* delegate, |
- RenderViewHostDelegateView** render_view_host_delegate_view) { |
- WebContentsViewWin* rv = new WebContentsViewWin(web_contents, delegate); |
- *render_view_host_delegate_view = rv; |
- return rv; |
-} |
- |
-namespace { |
- |
-typedef std::map<HWND, WebContentsViewWin*> HwndToWcvMap; |
-HwndToWcvMap hwnd_to_wcv_map; |
- |
-void RemoveHwndToWcvMapEntry(WebContentsViewWin* wcv) { |
- HwndToWcvMap::iterator it; |
- for (it = hwnd_to_wcv_map.begin(); it != hwnd_to_wcv_map.end();) { |
- if (it->second == wcv) |
- hwnd_to_wcv_map.erase(it++); |
- else |
- ++it; |
- } |
-} |
- |
-BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { |
- HwndToWcvMap::iterator it = hwnd_to_wcv_map.find(hwnd); |
- if (it == hwnd_to_wcv_map.end()) |
- return TRUE; // must return TRUE to continue enumeration. |
- WebContentsViewWin* wcv = it->second; |
- RenderWidgetHostViewWin* rwhv = static_cast<RenderWidgetHostViewWin*>( |
- wcv->web_contents()->GetRenderWidgetHostView()); |
- if (rwhv) |
- rwhv->UpdateScreenInfo(rwhv->GetNativeView()); |
- |
- return TRUE; // must return TRUE to continue enumeration. |
-} |
- |
-class PositionChangedMessageFilter : public ui::HWNDMessageFilter { |
- public: |
- PositionChangedMessageFilter() {} |
- |
- private: |
- // Overridden from ui::HWNDMessageFilter: |
- virtual bool FilterMessage(HWND hwnd, |
- UINT message, |
- WPARAM w_param, |
- LPARAM l_param, |
- LRESULT* l_result) OVERRIDE { |
- if (message == WM_WINDOWPOSCHANGED || message == WM_SETTINGCHANGE) |
- EnumChildWindows(hwnd, EnumChildProc, 0); |
- |
- return false; |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(PositionChangedMessageFilter); |
-}; |
- |
-void AddFilterToParentHwndSubclass(HWND hwnd, ui::HWNDMessageFilter* filter) { |
- HWND parent = ::GetAncestor(hwnd, GA_ROOT); |
- if (parent) { |
- ui::HWNDSubclass::RemoveFilterFromAllTargets(filter); |
- ui::HWNDSubclass::AddFilterToTarget(parent, filter); |
- } |
-} |
- |
-} // namespace namespace |
- |
-WebContentsViewWin::WebContentsViewWin(WebContentsImpl* web_contents, |
- WebContentsViewDelegate* delegate) |
- : web_contents_(web_contents), |
- delegate_(delegate), |
- hwnd_message_filter_(new PositionChangedMessageFilter) { |
-} |
- |
-WebContentsViewWin::~WebContentsViewWin() { |
- RemoveHwndToWcvMapEntry(this); |
- |
- if (IsWindow(hwnd())) |
- DestroyWindow(hwnd()); |
-} |
- |
-gfx::NativeView WebContentsViewWin::GetNativeView() const { |
- return hwnd(); |
-} |
- |
-gfx::NativeView WebContentsViewWin::GetContentNativeView() const { |
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
- return rwhv ? rwhv->GetNativeView() : NULL; |
-} |
- |
-gfx::NativeWindow WebContentsViewWin::GetTopLevelNativeWindow() const { |
- return ::GetAncestor(GetNativeView(), GA_ROOT); |
-} |
- |
-void WebContentsViewWin::GetContainerBounds(gfx::Rect *out) const { |
- // Copied from NativeWidgetWin::GetClientAreaScreenBounds(). |
- RECT r; |
- GetClientRect(hwnd(), &r); |
- POINT point = { r.left, r.top }; |
- ClientToScreen(hwnd(), &point); |
- *out = gfx::Rect(point.x, point.y, r.right - r.left, r.bottom - r.top); |
-} |
- |
-void WebContentsViewWin::OnTabCrashed(base::TerminationStatus status, |
- int error_code) { |
-} |
- |
-void WebContentsViewWin::SizeContents(const gfx::Size& size) { |
- gfx::Rect bounds; |
- GetContainerBounds(&bounds); |
- if (bounds.size() != size) { |
- SetWindowPos(hwnd(), NULL, 0, 0, size.width(), size.height(), |
- SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); |
- } else { |
- // Our size matches what we want but the renderers size may not match. |
- // Pretend we were resized so that the renderers size is updated too. |
- if (web_contents_->GetInterstitialPage()) |
- web_contents_->GetInterstitialPage()->SetSize(size); |
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
- if (rwhv) |
- rwhv->SetSize(size); |
- } |
-} |
- |
-void WebContentsViewWin::CreateView( |
- const gfx::Size& initial_size, gfx::NativeView context) { |
- initial_size_ = initial_size; |
- |
- set_window_style(WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); |
- |
- Init(ui::GetHiddenWindow(), gfx::Rect(initial_size_)); |
- |
- // Remove the root view drop target so we can register our own. |
- RevokeDragDrop(GetNativeView()); |
- drag_dest_ = new WebDragDest(hwnd(), web_contents_); |
- if (delegate_) { |
- WebDragDestDelegate* delegate = delegate_->GetDragDestDelegate(); |
- if (delegate) |
- drag_dest_->set_delegate(delegate); |
- } |
-} |
- |
-void WebContentsViewWin::Focus() { |
- if (web_contents_->GetInterstitialPage()) { |
- web_contents_->GetInterstitialPage()->Focus(); |
- return; |
- } |
- |
- if (delegate_.get() && delegate_->Focus()) |
- return; |
- |
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
- if (rwhv) |
- rwhv->Focus(); |
-} |
- |
-void WebContentsViewWin::SetInitialFocus() { |
- if (web_contents_->FocusLocationBarByDefault()) |
- web_contents_->SetFocusToLocationBar(false); |
- else |
- Focus(); |
-} |
- |
-void WebContentsViewWin::StoreFocus() { |
- if (delegate_) |
- delegate_->StoreFocus(); |
-} |
- |
-void WebContentsViewWin::RestoreFocus() { |
- if (delegate_) |
- delegate_->RestoreFocus(); |
-} |
- |
-DropData* WebContentsViewWin::GetDropData() const { |
- return drag_dest_->current_drop_data(); |
-} |
- |
-gfx::Rect WebContentsViewWin::GetViewBounds() const { |
- RECT r; |
- GetWindowRect(hwnd(), &r); |
- return gfx::Rect(r); |
-} |
- |
-RenderWidgetHostView* WebContentsViewWin::CreateViewForWidget( |
- RenderWidgetHost* render_widget_host) { |
- if (render_widget_host->GetView()) { |
- // During testing, the view will already be set up in most cases to the |
- // test view, so we don't want to clobber it with a real one. To verify that |
- // this actually is happening (and somebody isn't accidentally creating the |
- // view twice), we check for the RVH Factory, which will be set when we're |
- // making special ones (which go along with the special views). |
- DCHECK(RenderViewHostFactory::has_factory()); |
- return render_widget_host->GetView(); |
- } |
- |
- RenderWidgetHostViewWin* view = static_cast<RenderWidgetHostViewWin*>( |
- RenderWidgetHostView::CreateViewForWidget(render_widget_host)); |
- view->CreateWnd(GetNativeView()); |
- view->ShowWindow(SW_SHOW); |
- view->SetSize(initial_size_); |
- return view; |
-} |
- |
-RenderWidgetHostView* WebContentsViewWin::CreateViewForPopupWidget( |
- RenderWidgetHost* render_widget_host) { |
- return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host); |
-} |
- |
-void WebContentsViewWin::SetPageTitle(const base::string16& title) { |
- // It's possible to get this after the hwnd has been destroyed. |
- if (GetNativeView()) |
- ::SetWindowText(GetNativeView(), title.c_str()); |
-} |
- |
-void WebContentsViewWin::RenderViewCreated(RenderViewHost* host) { |
-} |
- |
-void WebContentsViewWin::RenderViewSwappedIn(RenderViewHost* host) { |
-} |
- |
-void WebContentsViewWin::SetOverscrollControllerEnabled(bool enabled) { |
-} |
- |
-void WebContentsViewWin::ShowContextMenu(const ContextMenuParams& params) { |
- if (delegate_) |
- delegate_->ShowContextMenu(params); |
- // WARNING: this may have been deleted. |
-} |
- |
-void WebContentsViewWin::ShowPopupMenu(const gfx::Rect& bounds, |
- int item_height, |
- double item_font_size, |
- int selected_item, |
- const std::vector<MenuItem>& items, |
- bool right_aligned, |
- bool allow_multiple_selection) { |
- // External popup menus are only used on Mac and Android. |
- NOTIMPLEMENTED(); |
-} |
- |
-void WebContentsViewWin::StartDragging(const DropData& drop_data, |
- blink::WebDragOperationsMask operations, |
- const gfx::ImageSkia& image, |
- const gfx::Vector2d& image_offset, |
- const DragEventSourceInfo& event_info) { |
- drag_handler_ = new WebContentsDragWin( |
- GetNativeView(), |
- web_contents_, |
- drag_dest_, |
- base::Bind(&WebContentsViewWin::EndDragging, base::Unretained(this))); |
- drag_handler_->StartDragging(drop_data, operations, image, image_offset); |
-} |
- |
-void WebContentsViewWin::UpdateDragCursor(blink::WebDragOperation operation) { |
- drag_dest_->set_drag_cursor(operation); |
-} |
- |
-void WebContentsViewWin::GotFocus() { |
- if (web_contents_->GetDelegate()) |
- web_contents_->GetDelegate()->WebContentsFocused(web_contents_); |
-} |
- |
-void WebContentsViewWin::TakeFocus(bool reverse) { |
- if (web_contents_->GetDelegate() && |
- !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) && |
- delegate_.get()) { |
- delegate_->TakeFocus(reverse); |
- } |
-} |
- |
-void WebContentsViewWin::EndDragging() { |
- drag_handler_ = NULL; |
- web_contents_->SystemDragEnded(); |
-} |
- |
-void WebContentsViewWin::CloseTab() { |
- RenderViewHost* rvh = web_contents_->GetRenderViewHost(); |
- rvh->GetDelegate()->Close(rvh); |
-} |
- |
-LRESULT WebContentsViewWin::OnCreate( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- hwnd_to_wcv_map.insert(std::make_pair(hwnd(), this)); |
- AddFilterToParentHwndSubclass(hwnd(), hwnd_message_filter_.get()); |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnDestroy( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- if (drag_dest_) { |
- RevokeDragDrop(GetNativeView()); |
- drag_dest_ = NULL; |
- } |
- if (drag_handler_) { |
- drag_handler_->CancelDrag(); |
- drag_handler_ = NULL; |
- } |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnWindowPosChanged( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- |
- // Our parent might have changed. So we re-install our hwnd message filter. |
- AddFilterToParentHwndSubclass(hwnd(), hwnd_message_filter_.get()); |
- |
- WINDOWPOS* window_pos = reinterpret_cast<WINDOWPOS*>(lparam); |
- if (window_pos->flags & SWP_HIDEWINDOW) { |
- web_contents_->WasHidden(); |
- return 0; |
- } |
- |
- // The WebContents was shown by a means other than the user selecting a |
- // Tab, e.g. the window was minimized then restored. |
- if (window_pos->flags & SWP_SHOWWINDOW) |
- web_contents_->WasShown(); |
- |
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
- if (rwhv) { |
- RenderWidgetHostViewWin* view = static_cast<RenderWidgetHostViewWin*>(rwhv); |
- view->UpdateScreenInfo(view->GetNativeView()); |
- } |
- |
- // Unless we were specifically told not to size, cause the renderer to be |
- // sized to the new bounds, which forces a repaint. Not required for the |
- // simple minimize-restore case described above, for example, since the |
- // size hasn't changed. |
- if (window_pos->flags & SWP_NOSIZE) |
- return 0; |
- |
- gfx::Size size(window_pos->cx, window_pos->cy); |
- if (web_contents_->GetInterstitialPage()) |
- web_contents_->GetInterstitialPage()->SetSize(size); |
- if (rwhv) |
- rwhv->SetSize(size); |
- |
- if (delegate_) |
- delegate_->SizeChanged(size); |
- |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnMouseDown( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- // Make sure this WebContents is activated when it is clicked on. |
- if (web_contents_->GetDelegate()) |
- web_contents_->GetDelegate()->ActivateContents(web_contents_); |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnMouseMove( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- // Let our delegate know that the mouse moved (useful for resetting status |
- // bubble state). |
- if (web_contents_->GetDelegate()) { |
- web_contents_->GetDelegate()->ContentsMouseEvent( |
- web_contents_, |
- gfx::Screen::GetNativeScreen()->GetCursorScreenPoint(), |
- true); |
- } |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnNCCalcSize( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- // Hack for ThinkPad mouse wheel driver. We have set the fake scroll bars |
- // to receive scroll messages from ThinkPad touch-pad driver. Suppress |
- // painting of scrollbars by returning 0 size for them. |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnNCHitTest( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- return HTTRANSPARENT; |
-} |
- |
-LRESULT WebContentsViewWin::OnScroll( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- int scroll_type = LOWORD(wparam); |
- short position = HIWORD(wparam); |
- HWND scrollbar = reinterpret_cast<HWND>(lparam); |
- // This window can receive scroll events as a result of the ThinkPad's |
- // touch-pad scroll wheel emulation. |
- // If ctrl is held, zoom the UI. There are three issues with this: |
- // 1) Should the event be eaten or forwarded to content? We eat the event, |
- // which is like Firefox and unlike IE. |
- // 2) Should wheel up zoom in or out? We zoom in (increase font size), which |
- // is like IE and Google maps, but unlike Firefox. |
- // 3) Should the mouse have to be over the content area? We zoom as long as |
- // content has focus, although FF and IE require that the mouse is over |
- // content. This is because all events get forwarded when content has |
- // focus. |
- if (GetAsyncKeyState(VK_CONTROL) & 0x8000) { |
- int distance = 0; |
- switch (scroll_type) { |
- case SB_LINEUP: |
- distance = WHEEL_DELTA; |
- break; |
- case SB_LINEDOWN: |
- distance = -WHEEL_DELTA; |
- break; |
- // TODO(joshia): Handle SB_PAGEUP, SB_PAGEDOWN, SB_THUMBPOSITION, |
- // and SB_THUMBTRACK for completeness |
- default: |
- break; |
- } |
- |
- web_contents_->GetDelegate()->ContentsZoomChange(distance > 0); |
- return 0; |
- } |
- |
- // Reflect scroll message to the view() to give it a chance |
- // to process scrolling. |
- SendMessage(GetContentNativeView(), message, wparam, lparam); |
- return 0; |
-} |
- |
-LRESULT WebContentsViewWin::OnSize( |
- UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { |
- // NOTE: Because we handle OnWindowPosChanged without calling DefWindowProc, |
- // OnSize is NOT called on window resize. This handler is called only once |
- // when the window is created. |
- // Don't call base class OnSize to avoid useless layout for 0x0 size. |
- // We will get OnWindowPosChanged later and layout root view in WasSized. |
- |
- // Hack for ThinkPad touch-pad driver. |
- // Set fake scrollbars so that we can get scroll messages, |
- SCROLLINFO si = {0}; |
- si.cbSize = sizeof(si); |
- si.fMask = SIF_ALL; |
- |
- si.nMin = 1; |
- si.nMax = 100; |
- si.nPage = 10; |
- si.nPos = 50; |
- |
- ::SetScrollInfo(hwnd(), SB_HORZ, &si, FALSE); |
- ::SetScrollInfo(hwnd(), SB_VERT, &si, FALSE); |
- |
- return 1; |
-} |
- |
-} // namespace content |