| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_host_view_win.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <peninputpanel_i.c> | 9 #include <peninputpanel_i.c> |
| 10 #include <stack> | 10 #include <stack> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "base/win/scoped_comptr.h" | 21 #include "base/win/scoped_comptr.h" |
| 22 #include "base/win/scoped_gdi_object.h" | 22 #include "base/win/scoped_gdi_object.h" |
| 23 #include "base/win/win_util.h" | 23 #include "base/win/win_util.h" |
| 24 #include "base/win/windows_version.h" | 24 #include "base/win/windows_version.h" |
| 25 #include "base/win/wrapped_window_proc.h" | 25 #include "base/win/wrapped_window_proc.h" |
| 26 #include "content/browser/accessibility/browser_accessibility_state_impl.h" | 26 #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
| 27 #include "content/browser/accessibility/browser_accessibility_win.h" | 27 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 28 #include "content/browser/gpu/gpu_data_manager_impl.h" | 28 #include "content/browser/gpu/gpu_data_manager_impl.h" |
| 29 #include "content/browser/gpu/gpu_process_host.h" | 29 #include "content/browser/gpu/gpu_process_host.h" |
| 30 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 30 #include "content/browser/gpu/gpu_process_host_ui_shim.h" |
| 31 #include "content/browser/plugin_process_host.h" | |
| 32 #include "content/browser/renderer_host/backing_store.h" | 31 #include "content/browser/renderer_host/backing_store.h" |
| 33 #include "content/browser/renderer_host/backing_store_win.h" | 32 #include "content/browser/renderer_host/backing_store_win.h" |
| 34 #include "content/browser/renderer_host/render_process_host_impl.h" | 33 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 35 #include "content/browser/renderer_host/render_widget_host_impl.h" | 34 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 36 #include "content/common/accessibility_messages.h" | 35 #include "content/common/accessibility_messages.h" |
| 37 #include "content/common/gpu/gpu_messages.h" | 36 #include "content/common/gpu/gpu_messages.h" |
| 38 #include "content/common/plugin_messages.h" | 37 #include "content/common/plugin_messages.h" |
| 39 #include "content/common/view_messages.h" | 38 #include "content/common/view_messages.h" |
| 40 #include "content/public/browser/browser_thread.h" | 39 #include "content/public/browser/browser_thread.h" |
| 41 #include "content/public/browser/child_process_data.h" | 40 #include "content/public/browser/child_process_data.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 53 #include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFact
ory.h" | 52 #include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFact
ory.h" |
| 54 #include "ui/base/events/event.h" | 53 #include "ui/base/events/event.h" |
| 55 #include "ui/base/ime/composition_text.h" | 54 #include "ui/base/ime/composition_text.h" |
| 56 #include "ui/base/l10n/l10n_util_win.h" | 55 #include "ui/base/l10n/l10n_util_win.h" |
| 57 #include "ui/base/text/text_elider.h" | 56 #include "ui/base/text/text_elider.h" |
| 58 #include "ui/base/ui_base_switches.h" | 57 #include "ui/base/ui_base_switches.h" |
| 59 #include "ui/base/view_prop.h" | 58 #include "ui/base/view_prop.h" |
| 60 #include "ui/base/win/hwnd_util.h" | 59 #include "ui/base/win/hwnd_util.h" |
| 61 #include "ui/base/win/mouse_wheel_util.h" | 60 #include "ui/base/win/mouse_wheel_util.h" |
| 62 #include "ui/gfx/canvas.h" | 61 #include "ui/gfx/canvas.h" |
| 63 #include "ui/gfx/gdi_util.h" | |
| 64 #include "ui/gfx/rect.h" | 62 #include "ui/gfx/rect.h" |
| 65 #include "ui/gfx/screen.h" | 63 #include "ui/gfx/screen.h" |
| 66 #include "webkit/glue/webcursor.h" | 64 #include "webkit/glue/webcursor.h" |
| 67 #include "webkit/plugins/npapi/plugin_constants_win.h" | 65 #include "webkit/plugins/npapi/plugin_constants_win.h" |
| 68 #include "webkit/plugins/npapi/webplugin.h" | 66 #include "webkit/plugins/npapi/webplugin.h" |
| 69 #include "webkit/plugins/npapi/webplugin_delegate_impl.h" | 67 #include "webkit/plugins/npapi/webplugin_delegate_impl.h" |
| 70 | 68 |
| 71 using base::TimeDelta; | 69 using base::TimeDelta; |
| 72 using base::TimeTicks; | 70 using base::TimeTicks; |
| 73 using ui::ViewProp; | 71 using ui::ViewProp; |
| 74 using WebKit::WebInputEvent; | 72 using WebKit::WebInputEvent; |
| 75 using WebKit::WebInputEventFactory; | 73 using WebKit::WebInputEventFactory; |
| 76 using WebKit::WebMouseEvent; | 74 using WebKit::WebMouseEvent; |
| 77 using WebKit::WebTextDirection; | 75 using WebKit::WebTextDirection; |
| 78 using webkit::npapi::WebPluginGeometry; | |
| 79 | 76 |
| 80 namespace content { | 77 namespace content { |
| 81 namespace { | 78 namespace { |
| 82 | 79 |
| 83 // Tooltips will wrap after this width. Yes, wrap. Imagine that! | 80 // Tooltips will wrap after this width. Yes, wrap. Imagine that! |
| 84 const int kTooltipMaxWidthPixels = 300; | 81 const int kTooltipMaxWidthPixels = 300; |
| 85 | 82 |
| 86 // Maximum number of characters we allow in a tooltip. | 83 // Maximum number of characters we allow in a tooltip. |
| 87 const int kMaxTooltipLength = 1024; | 84 const int kMaxTooltipLength = 1024; |
| 88 | 85 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 118 if (::IsWindowVisible(window)) { | 115 if (::IsWindowVisible(window)) { |
| 119 const HWND owner = ::GetWindow(window, GW_OWNER); | 116 const HWND owner = ::GetWindow(window, GW_OWNER); |
| 120 if (toplevel_hwnd == owner) { | 117 if (toplevel_hwnd == owner) { |
| 121 ::PostMessage(window, WM_CANCELMODE, 0, 0); | 118 ::PostMessage(window, WM_CANCELMODE, 0, 0); |
| 122 } | 119 } |
| 123 } | 120 } |
| 124 | 121 |
| 125 return TRUE; | 122 return TRUE; |
| 126 } | 123 } |
| 127 | 124 |
| 128 // |window| is the plugin HWND, created and destroyed in the plugin process. | |
| 129 // |parent| is the parent HWND, created and destroyed on the browser UI thread. | |
| 130 void NotifyPluginProcessHostHelper(HWND window, HWND parent, int tries) { | |
| 131 // How long to wait between each try. | |
| 132 static const int kTryDelayMs = 200; | |
| 133 | |
| 134 DWORD plugin_process_id; | |
| 135 bool found_starting_plugin_process = false; | |
| 136 GetWindowThreadProcessId(window, &plugin_process_id); | |
| 137 for (PluginProcessHostIterator iter; !iter.Done(); ++iter) { | |
| 138 if (!iter.GetData().handle) { | |
| 139 found_starting_plugin_process = true; | |
| 140 continue; | |
| 141 } | |
| 142 if (base::GetProcId(iter.GetData().handle) == plugin_process_id) { | |
| 143 iter->AddWindow(parent); | |
| 144 return; | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 if (found_starting_plugin_process) { | |
| 149 // A plugin process has started but we don't have its handle yet. Since | |
| 150 // it's most likely the one for this plugin, try a few more times after a | |
| 151 // delay. | |
| 152 if (tries > 0) { | |
| 153 MessageLoop::current()->PostDelayedTask( | |
| 154 FROM_HERE, | |
| 155 base::Bind(&NotifyPluginProcessHostHelper, window, parent, tries - 1), | |
| 156 base::TimeDelta::FromMilliseconds(kTryDelayMs)); | |
| 157 return; | |
| 158 } | |
| 159 } | |
| 160 | |
| 161 // The plugin process might have died in the time to execute the task, don't | |
| 162 // leak the HWND. | |
| 163 PostMessage(parent, WM_CLOSE, 0, 0); | |
| 164 } | |
| 165 | |
| 166 // Windows callback for OnDestroy to detach the plugin windows. | 125 // Windows callback for OnDestroy to detach the plugin windows. |
| 167 BOOL CALLBACK DetachPluginWindowsCallback(HWND window, LPARAM param) { | 126 BOOL CALLBACK DetachPluginWindowsCallback(HWND window, LPARAM param) { |
| 168 if (webkit::npapi::WebPluginDelegateImpl::IsPluginDelegateWindow(window) && | 127 if (webkit::npapi::WebPluginDelegateImpl::IsPluginDelegateWindow(window) && |
| 169 !IsHungAppWindow(window)) { | 128 !IsHungAppWindow(window)) { |
| 170 ::ShowWindow(window, SW_HIDE); | 129 ::ShowWindow(window, SW_HIDE); |
| 171 SetParent(window, NULL); | 130 SetParent(window, NULL); |
| 172 } | 131 } |
| 173 return TRUE; | 132 return TRUE; |
| 174 } | 133 } |
| 175 | 134 |
| 176 // The plugin wrapper window which lives in the browser process has this proc | |
| 177 // as its window procedure. We only handle the WM_PARENTNOTIFY message sent by | |
| 178 // windowed plugins for mouse input. This is forwarded off to the wrappers | |
| 179 // parent which is typically the RVH window which turns on user gesture. | |
| 180 LRESULT CALLBACK PluginWrapperWindowProc(HWND window, unsigned int message, | |
| 181 WPARAM wparam, LPARAM lparam) { | |
| 182 if (message == WM_PARENTNOTIFY) { | |
| 183 switch (LOWORD(wparam)) { | |
| 184 case WM_LBUTTONDOWN: | |
| 185 case WM_RBUTTONDOWN: | |
| 186 case WM_MBUTTONDOWN: | |
| 187 ::SendMessage(GetParent(window), message, wparam, lparam); | |
| 188 return 0; | |
| 189 default: | |
| 190 break; | |
| 191 } | |
| 192 } | |
| 193 return ::DefWindowProc(window, message, wparam, lparam); | |
| 194 } | |
| 195 | |
| 196 void SendToGpuProcessHost(int gpu_host_id, scoped_ptr<IPC::Message> message) { | 135 void SendToGpuProcessHost(int gpu_host_id, scoped_ptr<IPC::Message> message) { |
| 197 GpuProcessHost* gpu_process_host = GpuProcessHost::FromID(gpu_host_id); | 136 GpuProcessHost* gpu_process_host = GpuProcessHost::FromID(gpu_host_id); |
| 198 if (!gpu_process_host) | 137 if (!gpu_process_host) |
| 199 return; | 138 return; |
| 200 | 139 |
| 201 gpu_process_host->Send(message.release()); | 140 gpu_process_host->Send(message.release()); |
| 202 } | 141 } |
| 203 | 142 |
| 204 void PostTaskOnIOThread(const tracked_objects::Location& from_here, | 143 void PostTaskOnIOThread(const tracked_objects::Location& from_here, |
| 205 base::Closure task) { | 144 base::Closure task) { |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 SetBrowserAccessibilityManager( | 643 SetBrowserAccessibilityManager( |
| 705 BrowserAccessibilityManager::CreateEmptyDocument( | 644 BrowserAccessibilityManager::CreateEmptyDocument( |
| 706 m_hWnd, busy_state, this)); | 645 m_hWnd, busy_state, this)); |
| 707 } | 646 } |
| 708 | 647 |
| 709 return GetBrowserAccessibilityManager()->GetRoot()-> | 648 return GetBrowserAccessibilityManager()->GetRoot()-> |
| 710 ToBrowserAccessibilityWin(); | 649 ToBrowserAccessibilityWin(); |
| 711 } | 650 } |
| 712 | 651 |
| 713 void RenderWidgetHostViewWin::MovePluginWindows( | 652 void RenderWidgetHostViewWin::MovePluginWindows( |
| 714 const std::vector<WebPluginGeometry>& plugin_window_moves) { | 653 const gfx::Point& scroll_offset, |
| 715 if (plugin_window_moves.empty()) | 654 const std::vector<webkit::npapi::WebPluginGeometry>& plugin_window_moves) { |
| 716 return; | 655 MovePluginWindowsHelper(m_hWnd, plugin_window_moves); |
| 717 | |
| 718 bool oop_plugins = | |
| 719 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess) && | |
| 720 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kInProcessPlugins); | |
| 721 | |
| 722 HDWP defer_window_pos_info = | |
| 723 ::BeginDeferWindowPos(static_cast<int>(plugin_window_moves.size())); | |
| 724 | |
| 725 if (!defer_window_pos_info) { | |
| 726 NOTREACHED(); | |
| 727 return; | |
| 728 } | |
| 729 | |
| 730 for (size_t i = 0; i < plugin_window_moves.size(); ++i) { | |
| 731 unsigned long flags = 0; | |
| 732 const WebPluginGeometry& move = plugin_window_moves[i]; | |
| 733 HWND window = move.window; | |
| 734 | |
| 735 // As the plugin parent window which lives on the browser UI thread is | |
| 736 // destroyed asynchronously, it is possible that we have a stale window | |
| 737 // sent in by the renderer for moving around. | |
| 738 // Note: get the parent before checking if the window is valid, to avoid a | |
| 739 // race condition where the window is destroyed after the check but before | |
| 740 // the GetParent call. | |
| 741 HWND parent = ::GetParent(window); | |
| 742 if (!::IsWindow(window)) | |
| 743 continue; | |
| 744 | |
| 745 if (oop_plugins) { | |
| 746 if (parent == m_hWnd) { | |
| 747 // The plugin window is a direct child of this window, add an | |
| 748 // intermediate window that lives on this thread to speed up scrolling. | |
| 749 // Note this only works with out of process plugins since we depend on | |
| 750 // PluginProcessHost to destroy the intermediate HWNDs. | |
| 751 parent = ReparentWindow(window); | |
| 752 ::ShowWindow(window, SW_SHOW); // Window was created hidden. | |
| 753 } else if (::GetParent(parent) != m_hWnd) { | |
| 754 // The renderer should only be trying to move windows that are children | |
| 755 // of its render widget window. However, this may happen as a result of | |
| 756 // a race condition, so we ignore it and not kill the plugin process. | |
| 757 continue; | |
| 758 } | |
| 759 | |
| 760 // We move the intermediate parent window which doesn't result in cross- | |
| 761 // process synchronous Windows messages. | |
| 762 window = parent; | |
| 763 } | |
| 764 | |
| 765 if (move.visible) | |
| 766 flags |= SWP_SHOWWINDOW; | |
| 767 else | |
| 768 flags |= SWP_HIDEWINDOW; | |
| 769 | |
| 770 if (move.rects_valid) { | |
| 771 HRGN hrgn = ::CreateRectRgn(move.clip_rect.x(), | |
| 772 move.clip_rect.y(), | |
| 773 move.clip_rect.right(), | |
| 774 move.clip_rect.bottom()); | |
| 775 gfx::SubtractRectanglesFromRegion(hrgn, move.cutout_rects); | |
| 776 | |
| 777 // Note: System will own the hrgn after we call SetWindowRgn, | |
| 778 // so we don't need to call DeleteObject(hrgn) | |
| 779 ::SetWindowRgn(window, hrgn, !move.clip_rect.IsEmpty()); | |
| 780 } else { | |
| 781 flags |= SWP_NOMOVE; | |
| 782 flags |= SWP_NOSIZE; | |
| 783 } | |
| 784 | |
| 785 defer_window_pos_info = ::DeferWindowPos(defer_window_pos_info, | |
| 786 window, NULL, | |
| 787 move.window_rect.x(), | |
| 788 move.window_rect.y(), | |
| 789 move.window_rect.width(), | |
| 790 move.window_rect.height(), flags); | |
| 791 if (!defer_window_pos_info) { | |
| 792 DCHECK(false) << "DeferWindowPos failed, so all plugin moves ignored."; | |
| 793 return; | |
| 794 } | |
| 795 } | |
| 796 | |
| 797 ::EndDeferWindowPos(defer_window_pos_info); | |
| 798 } | |
| 799 | |
| 800 HWND RenderWidgetHostViewWin::ReparentWindow(HWND window) { | |
| 801 static ATOM atom = 0; | |
| 802 static HMODULE instance = NULL; | |
| 803 if (!atom) { | |
| 804 WNDCLASSEX window_class; | |
| 805 base::win::InitializeWindowClass( | |
| 806 webkit::npapi::kWrapperNativeWindowClassName, | |
| 807 &base::win::WrappedWindowProc<PluginWrapperWindowProc>, | |
| 808 CS_DBLCLKS, | |
| 809 0, | |
| 810 0, | |
| 811 NULL, | |
| 812 reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), | |
| 813 NULL, | |
| 814 NULL, | |
| 815 NULL, | |
| 816 &window_class); | |
| 817 instance = window_class.hInstance; | |
| 818 atom = RegisterClassEx(&window_class); | |
| 819 } | |
| 820 DCHECK(atom); | |
| 821 | |
| 822 HWND orig_parent = ::GetParent(window); | |
| 823 HWND parent = CreateWindowEx( | |
| 824 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, | |
| 825 MAKEINTATOM(atom), 0, | |
| 826 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, | |
| 827 0, 0, 0, 0, orig_parent, 0, instance, 0); | |
| 828 ui::CheckWindowCreated(parent); | |
| 829 // If UIPI is enabled we need to add message filters for parents with | |
| 830 // children that cross process boundaries. | |
| 831 if (::GetPropW(orig_parent, webkit::npapi::kNativeWindowClassFilterProp)) { | |
| 832 // Process-wide message filters required on Vista must be added to: | |
| 833 // chrome_content_client.cc ChromeContentClient::SandboxPlugin | |
| 834 ChangeWindowMessageFilterEx(parent, WM_MOUSEWHEEL, MSGFLT_ALLOW, NULL); | |
| 835 ChangeWindowMessageFilterEx(parent, WM_GESTURE, MSGFLT_ALLOW, NULL); | |
| 836 ChangeWindowMessageFilterEx(parent, WM_APPCOMMAND, MSGFLT_ALLOW, NULL); | |
| 837 ::RemovePropW(orig_parent, webkit::npapi::kNativeWindowClassFilterProp); | |
| 838 } | |
| 839 ::SetParent(window, parent); | |
| 840 // How many times we try to find a PluginProcessHost whose process matches | |
| 841 // the HWND. | |
| 842 static const int kMaxTries = 5; | |
| 843 BrowserThread::PostTask( | |
| 844 BrowserThread::IO, | |
| 845 FROM_HERE, | |
| 846 base::Bind(&NotifyPluginProcessHostHelper, window, parent, kMaxTries)); | |
| 847 return parent; | |
| 848 } | 656 } |
| 849 | 657 |
| 850 static BOOL CALLBACK AddChildWindowToVector(HWND hwnd, LPARAM lparam) { | 658 static BOOL CALLBACK AddChildWindowToVector(HWND hwnd, LPARAM lparam) { |
| 851 std::vector<HWND>* vector = reinterpret_cast<std::vector<HWND>*>(lparam); | 659 std::vector<HWND>* vector = reinterpret_cast<std::vector<HWND>*>(lparam); |
| 852 vector->push_back(hwnd); | 660 vector->push_back(hwnd); |
| 853 return TRUE; | 661 return TRUE; |
| 854 } | 662 } |
| 855 | 663 |
| 856 void RenderWidgetHostViewWin::CleanupCompositorWindow() { | 664 void RenderWidgetHostViewWin::CleanupCompositorWindow() { |
| 857 if (!compositor_host_window_) | 665 if (!compositor_host_window_) |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 ime_input_.CancelIME(m_hWnd); | 801 ime_input_.CancelIME(m_hWnd); |
| 994 } | 802 } |
| 995 | 803 |
| 996 void RenderWidgetHostViewWin::ImeCompositionRangeChanged( | 804 void RenderWidgetHostViewWin::ImeCompositionRangeChanged( |
| 997 const ui::Range& range, | 805 const ui::Range& range, |
| 998 const std::vector<gfx::Rect>& character_bounds) { | 806 const std::vector<gfx::Rect>& character_bounds) { |
| 999 composition_range_ = range; | 807 composition_range_ = range; |
| 1000 composition_character_bounds_ = character_bounds; | 808 composition_character_bounds_ = character_bounds; |
| 1001 } | 809 } |
| 1002 | 810 |
| 1003 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam) { | |
| 1004 if (!webkit::npapi::WebPluginDelegateImpl::IsPluginDelegateWindow(hwnd)) | |
| 1005 return TRUE; | |
| 1006 | |
| 1007 gfx::Rect* rect = reinterpret_cast<gfx::Rect*>(lparam); | |
| 1008 static UINT msg = RegisterWindowMessage(webkit::npapi::kPaintMessageName); | |
| 1009 WPARAM wparam = rect->x() << 16 | rect->y(); | |
| 1010 lparam = rect->width() << 16 | rect->height(); | |
| 1011 | |
| 1012 // SendMessage gets the message across much quicker than PostMessage, since it | |
| 1013 // doesn't get queued. When the plugin thread calls PeekMessage or other | |
| 1014 // Win32 APIs, sent messages are dispatched automatically. | |
| 1015 SendNotifyMessage(hwnd, msg, wparam, lparam); | |
| 1016 | |
| 1017 return TRUE; | |
| 1018 } | |
| 1019 | |
| 1020 void RenderWidgetHostViewWin::Redraw() { | 811 void RenderWidgetHostViewWin::Redraw() { |
| 1021 RECT damage_bounds; | 812 RECT damage_bounds; |
| 1022 GetUpdateRect(&damage_bounds, FALSE); | 813 GetUpdateRect(&damage_bounds, FALSE); |
| 1023 | 814 |
| 1024 base::win::ScopedGDIObject<HRGN> damage_region(CreateRectRgn(0, 0, 0, 0)); | 815 base::win::ScopedGDIObject<HRGN> damage_region(CreateRectRgn(0, 0, 0, 0)); |
| 1025 GetUpdateRgn(damage_region, FALSE); | 816 GetUpdateRgn(damage_region, FALSE); |
| 1026 | 817 |
| 1027 // Paint the invalid region synchronously. Our caller will not paint again | 818 // Paint the invalid region synchronously. Our caller will not paint again |
| 1028 // until we return, so by painting to the screen here, we ensure effective | 819 // until we return, so by painting to the screen here, we ensure effective |
| 1029 // rate-limiting of backing store updates. This helps a lot on pages that | 820 // rate-limiting of backing store updates. This helps a lot on pages that |
| 1030 // have animations or fairly expensive layout (e.g., google maps). | 821 // have animations or fairly expensive layout (e.g., google maps). |
| 1031 // | 822 // |
| 1032 // We paint this window synchronously, however child windows (i.e. plugins) | 823 // We paint this window synchronously, however child windows (i.e. plugins) |
| 1033 // are painted asynchronously. By avoiding synchronous cross-process window | 824 // are painted asynchronously. By avoiding synchronous cross-process window |
| 1034 // message dispatching we allow scrolling to be smooth, and also avoid the | 825 // message dispatching we allow scrolling to be smooth, and also avoid the |
| 1035 // browser process locking up if the plugin process is hung. | 826 // browser process locking up if the plugin process is hung. |
| 1036 // | 827 // |
| 1037 RedrawWindow(NULL, damage_region, RDW_UPDATENOW | RDW_NOCHILDREN); | 828 RedrawWindow(NULL, damage_region, RDW_UPDATENOW | RDW_NOCHILDREN); |
| 1038 | 829 |
| 1039 // Send the invalid rect in screen coordinates. | 830 // Send the invalid rect in screen coordinates. |
| 1040 gfx::Rect screen_rect = GetViewBounds(); | 831 gfx::Rect screen_rect = GetViewBounds(); |
| 1041 gfx::Rect invalid_screen_rect(damage_bounds); | 832 gfx::Rect invalid_screen_rect(damage_bounds); |
| 1042 invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y()); | 833 invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y()); |
| 1043 | 834 |
| 1044 LPARAM lparam = reinterpret_cast<LPARAM>(&invalid_screen_rect); | 835 PaintPluginWindowsHelper(m_hWnd, invalid_screen_rect); |
| 1045 EnumChildWindows(m_hWnd, EnumChildProc, lparam); | |
| 1046 } | 836 } |
| 1047 | 837 |
| 1048 void RenderWidgetHostViewWin::DidUpdateBackingStore( | 838 void RenderWidgetHostViewWin::DidUpdateBackingStore( |
| 1049 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, | 839 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, |
| 1050 const std::vector<gfx::Rect>& copy_rects) { | 840 const std::vector<gfx::Rect>& copy_rects) { |
| 1051 if (is_hidden_) | 841 if (is_hidden_) |
| 1052 return; | 842 return; |
| 1053 | 843 |
| 1054 // Schedule invalidations first so that the ScrollWindowEx call is closer to | 844 // Schedule invalidations first so that the ScrollWindowEx call is closer to |
| 1055 // Redraw. That minimizes chances of "flicker" resulting if the screen | 845 // Redraw. That minimizes chances of "flicker" resulting if the screen |
| (...skipping 1636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2692 | 2482 |
| 2693 // On Vista and later we present directly to the view window rather than a | 2483 // On Vista and later we present directly to the view window rather than a |
| 2694 // child window. | 2484 // child window. |
| 2695 if (GpuDataManagerImpl::GetInstance()->IsUsingAcceleratedSurface()) { | 2485 if (GpuDataManagerImpl::GetInstance()->IsUsingAcceleratedSurface()) { |
| 2696 if (!accelerated_surface_.get()) | 2486 if (!accelerated_surface_.get()) |
| 2697 accelerated_surface_.reset(new AcceleratedSurface(m_hWnd)); | 2487 accelerated_surface_.reset(new AcceleratedSurface(m_hWnd)); |
| 2698 return gfx::GLSurfaceHandle(m_hWnd, true); | 2488 return gfx::GLSurfaceHandle(m_hWnd, true); |
| 2699 } | 2489 } |
| 2700 | 2490 |
| 2701 // On XP we need a child window that can be resized independently of the | 2491 // On XP we need a child window that can be resized independently of the |
| 2702 // partent. | 2492 // parent. |
| 2703 static ATOM atom = 0; | 2493 static ATOM atom = 0; |
| 2704 static HMODULE instance = NULL; | 2494 static HMODULE instance = NULL; |
| 2705 if (!atom) { | 2495 if (!atom) { |
| 2706 WNDCLASSEX window_class; | 2496 WNDCLASSEX window_class; |
| 2707 base::win::InitializeWindowClass( | 2497 base::win::InitializeWindowClass( |
| 2708 L"CompositorHostWindowClass", | 2498 L"CompositorHostWindowClass", |
| 2709 &base::win::WrappedWindowProc<CompositorHostWindowProc>, | 2499 &base::win::WrappedWindowProc<CompositorHostWindowProc>, |
| 2710 0, 0, 0, NULL, NULL, NULL, NULL, NULL, | 2500 0, 0, 0, NULL, NULL, NULL, NULL, NULL, |
| 2711 &window_class); | 2501 &window_class); |
| 2712 instance = window_class.hInstance; | 2502 instance = window_class.hInstance; |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3285 position->rcDocument = document_rect; | 3075 position->rcDocument = document_rect; |
| 3286 return 1; | 3076 return 1; |
| 3287 } | 3077 } |
| 3288 | 3078 |
| 3289 void RenderWidgetHostViewWin::UpdateIMEState() { | 3079 void RenderWidgetHostViewWin::UpdateIMEState() { |
| 3290 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE && | 3080 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE && |
| 3291 text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD) { | 3081 text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD) { |
| 3292 if (base::win::IsTsfAwareRequired()) { | 3082 if (base::win::IsTsfAwareRequired()) { |
| 3293 ui::TsfBridge::GetInstance()->EnableIME(); | 3083 ui::TsfBridge::GetInstance()->EnableIME(); |
| 3294 } else { | 3084 } else { |
| 3295 ime_input_.EnableIME(m_hWnd); | 3085 ime_input_.EnableIME(m_hWnd); |
| 3296 } | 3086 } |
| 3297 } else { | 3087 } else { |
| 3298 if (base::win::IsTsfAwareRequired()) { | 3088 if (base::win::IsTsfAwareRequired()) { |
| 3299 ui::TsfBridge::GetInstance()->DisableIME(); | 3089 ui::TsfBridge::GetInstance()->DisableIME(); |
| 3300 } else { | 3090 } else { |
| 3301 ime_input_.DisableIME(m_hWnd); | 3091 ime_input_.DisableIME(m_hWnd); |
| 3302 } | |
| 3303 } | 3092 } |
| 3304 } | 3093 } |
| 3094 } |
| 3305 | 3095 |
| 3306 //////////////////////////////////////////////////////////////////////////////// | 3096 //////////////////////////////////////////////////////////////////////////////// |
| 3307 // RenderWidgetHostView, public: | 3097 // RenderWidgetHostView, public: |
| 3308 | 3098 |
| 3309 // static | 3099 // static |
| 3310 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( | 3100 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( |
| 3311 RenderWidgetHost* widget) { | 3101 RenderWidgetHost* widget) { |
| 3312 return new RenderWidgetHostViewWin(widget); | 3102 return new RenderWidgetHostViewWin(widget); |
| 3313 } | 3103 } |
| 3314 | 3104 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3327 // receive a focus change in the context of a pointer down message, it means | 3117 // receive a focus change in the context of a pointer down message, it means |
| 3328 // that the pointer down message occurred on the edit field and we should | 3118 // that the pointer down message occurred on the edit field and we should |
| 3329 // display the on screen keyboard | 3119 // display the on screen keyboard |
| 3330 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_) | 3120 if (!received_focus_change_after_pointer_down_ && virtual_keyboard_) |
| 3331 DisplayOnScreenKeyboardIfNeeded(); | 3121 DisplayOnScreenKeyboardIfNeeded(); |
| 3332 received_focus_change_after_pointer_down_ = false; | 3122 received_focus_change_after_pointer_down_ = false; |
| 3333 pointer_down_context_ = false; | 3123 pointer_down_context_ = false; |
| 3334 } | 3124 } |
| 3335 | 3125 |
| 3336 } // namespace content | 3126 } // namespace content |
| OLD | NEW |