Chromium Code Reviews| 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 "win8/metro_driver/stdafx.h" | 5 #include "win8/metro_driver/stdafx.h" |
| 6 #include "win8/metro_driver/chrome_app_view_ash.h" | 6 #include "win8/metro_driver/chrome_app_view_ash.h" |
| 7 | 7 |
| 8 #include <corewindow.h> | 8 #include <corewindow.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 #include <windows.foundation.h> | 10 #include <windows.foundation.h> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 18 #include "base/win/metro.h" | 18 #include "base/win/metro.h" |
| 19 #include "base/win/win_util.h" | 19 #include "base/win/win_util.h" |
| 20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
| 21 #include "ipc/ipc_channel.h" | 21 #include "ipc/ipc_channel.h" |
| 22 #include "ipc/ipc_channel_proxy.h" | 22 #include "ipc/ipc_channel_proxy.h" |
| 23 #include "ipc/ipc_sender.h" | 23 #include "ipc/ipc_sender.h" |
| 24 #include "ui/events/gestures/gesture_sequence.h" | 24 #include "ui/events/gestures/gesture_sequence.h" |
| 25 #include "ui/metro_viewer/metro_viewer_messages.h" | 25 #include "ui/metro_viewer/metro_viewer_messages.h" |
| 26 #include "win8/metro_driver/file_picker_ash.h" | 26 #include "win8/metro_driver/file_picker_ash.h" |
| 27 #include "win8/metro_driver/ime/text_service.h" | |
| 27 #include "win8/metro_driver/metro_driver.h" | 28 #include "win8/metro_driver/metro_driver.h" |
| 28 #include "win8/metro_driver/winrt_utils.h" | 29 #include "win8/metro_driver/winrt_utils.h" |
| 29 #include "win8/viewer/metro_viewer_constants.h" | 30 #include "win8/viewer/metro_viewer_constants.h" |
| 30 | 31 |
| 31 typedef winfoundtn::ITypedEventHandler< | 32 typedef winfoundtn::ITypedEventHandler< |
| 32 winapp::Core::CoreApplicationView*, | 33 winapp::Core::CoreApplicationView*, |
| 33 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; | 34 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; |
| 34 | 35 |
| 35 typedef winfoundtn::ITypedEventHandler< | 36 typedef winfoundtn::ITypedEventHandler< |
| 36 winui::Core::CoreWindow*, | 37 winui::Core::CoreWindow*, |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_OpenURLOnDesktop, | 158 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_OpenURLOnDesktop, |
| 158 OnOpenURLOnDesktop) | 159 OnOpenURLOnDesktop) |
| 159 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursor, OnSetCursor) | 160 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursor, OnSetCursor) |
| 160 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileOpen, | 161 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileOpen, |
| 161 OnDisplayFileOpenDialog) | 162 OnDisplayFileOpenDialog) |
| 162 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileSaveAs, | 163 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileSaveAs, |
| 163 OnDisplayFileSaveAsDialog) | 164 OnDisplayFileSaveAsDialog) |
| 164 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplaySelectFolder, | 165 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplaySelectFolder, |
| 165 OnDisplayFolderPicker) | 166 OnDisplayFolderPicker) |
| 166 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPos, OnSetCursorPos) | 167 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPos, OnSetCursorPos) |
| 168 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeCancelComposition, | |
| 169 OnImeCancelComposition) | |
| 170 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeTextInputClientUpdated, | |
| 171 OnImeTextInputClientChanged) | |
| 167 IPC_MESSAGE_UNHANDLED(__debugbreak()) | 172 IPC_MESSAGE_UNHANDLED(__debugbreak()) |
| 168 IPC_END_MESSAGE_MAP() | 173 IPC_END_MESSAGE_MAP() |
| 169 return true; | 174 return true; |
| 170 } | 175 } |
| 171 | 176 |
| 172 virtual void OnChannelError() OVERRIDE { | 177 virtual void OnChannelError() OVERRIDE { |
| 173 DVLOG(1) << "Channel error. Exiting."; | 178 DVLOG(1) << "Channel error. Exiting."; |
| 174 MetroExit(app_view_->core_window_hwnd()); | 179 MetroExit(app_view_->core_window_hwnd()); |
| 175 // In early Windows 8 versions the code above sometimes fails so we call | 180 // In early Windows 8 versions the code above sometimes fails so we call |
| 176 // it a second time with a NULL window which just calls Exit(). | 181 // it a second time with a NULL window which just calls Exit(). |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 234 | 239 |
| 235 void OnSetCursorPos(int x, int y) { | 240 void OnSetCursorPos(int x, int y) { |
| 236 VLOG(1) << "In IPC OnSetCursorPos: " << x << ", " << y; | 241 VLOG(1) << "In IPC OnSetCursorPos: " << x << ", " << y; |
| 237 ui_proxy_->PostTask( | 242 ui_proxy_->PostTask( |
| 238 FROM_HERE, | 243 FROM_HERE, |
| 239 base::Bind(&ChromeAppViewAsh::OnSetCursorPos, | 244 base::Bind(&ChromeAppViewAsh::OnSetCursorPos, |
| 240 base::Unretained(app_view_), | 245 base::Unretained(app_view_), |
| 241 x, y)); | 246 x, y)); |
| 242 } | 247 } |
| 243 | 248 |
| 249 void OnImeCancelComposition() { | |
| 250 ui_proxy_->PostTask( | |
| 251 FROM_HERE, | |
| 252 base::Bind(&ChromeAppViewAsh::OnImeCancelComposition, | |
| 253 base::Unretained(app_view_))); | |
| 254 } | |
| 255 | |
| 256 void OnImeTextInputClientChanged( | |
| 257 const std::vector<int32>& input_scopes, | |
| 258 const std::vector<metro_viewer::CharacterBounds>& character_bounds) { | |
| 259 ui_proxy_->PostTask( | |
| 260 FROM_HERE, | |
| 261 base::Bind(&ChromeAppViewAsh::OnImeUpdateTextInputClient, | |
| 262 base::Unretained(app_view_), | |
| 263 input_scopes, | |
| 264 character_bounds)); | |
| 265 } | |
| 244 | 266 |
| 245 scoped_refptr<base::MessageLoopProxy> ui_proxy_; | 267 scoped_refptr<base::MessageLoopProxy> ui_proxy_; |
| 246 ChromeAppViewAsh* app_view_; | 268 ChromeAppViewAsh* app_view_; |
| 247 }; | 269 }; |
| 248 | 270 |
| 249 bool WaitForChromeIPCConnection(const std::string& channel_name) { | 271 bool WaitForChromeIPCConnection(const std::string& channel_name) { |
| 250 int ms_elapsed = 0; | 272 int ms_elapsed = 0; |
| 251 while (!IPC::Channel::IsNamedServerInitialized(channel_name) && | 273 while (!IPC::Channel::IsNamedServerInitialized(channel_name) && |
| 252 ms_elapsed < 10000) { | 274 ms_elapsed < 10000) { |
| 253 ms_elapsed += 500; | 275 ms_elapsed += 500; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 window_ = window; | 487 window_ = window; |
| 466 DVLOG(1) << __FUNCTION__; | 488 DVLOG(1) << __FUNCTION__; |
| 467 | 489 |
| 468 // Retrieve the native window handle via the interop layer. | 490 // Retrieve the native window handle via the interop layer. |
| 469 mswr::ComPtr<ICoreWindowInterop> interop; | 491 mswr::ComPtr<ICoreWindowInterop> interop; |
| 470 HRESULT hr = window->QueryInterface(interop.GetAddressOf()); | 492 HRESULT hr = window->QueryInterface(interop.GetAddressOf()); |
| 471 CheckHR(hr); | 493 CheckHR(hr); |
| 472 hr = interop->get_WindowHandle(&core_window_hwnd_); | 494 hr = interop->get_WindowHandle(&core_window_hwnd_); |
| 473 CheckHR(hr); | 495 CheckHR(hr); |
| 474 | 496 |
| 497 text_service_ = metro_driver::CreateTextService(this, core_window_hwnd_); | |
| 498 | |
| 475 hr = window_->add_SizeChanged(mswr::Callback<SizeChangedHandler>( | 499 hr = window_->add_SizeChanged(mswr::Callback<SizeChangedHandler>( |
| 476 this, &ChromeAppViewAsh::OnSizeChanged).Get(), | 500 this, &ChromeAppViewAsh::OnSizeChanged).Get(), |
| 477 &sizechange_token_); | 501 &sizechange_token_); |
| 478 CheckHR(hr); | 502 CheckHR(hr); |
| 479 | 503 |
| 480 // Register for pointer and keyboard notifications. We forward | 504 // Register for pointer and keyboard notifications. We forward |
| 481 // them to the browser process via IPC. | 505 // them to the browser process via IPC. |
| 482 hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>( | 506 hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>( |
| 483 this, &ChromeAppViewAsh::OnPointerMoved).Get(), | 507 this, &ChromeAppViewAsh::OnPointerMoved).Get(), |
| 484 &pointermoved_token_); | 508 &pointermoved_token_); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 ui_loop_.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); | 636 ui_loop_.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); |
| 613 ui_loop_.Run(); | 637 ui_loop_.Run(); |
| 614 | 638 |
| 615 DVLOG(0) << "ProcessEvents done, hr=" << hr; | 639 DVLOG(0) << "ProcessEvents done, hr=" << hr; |
| 616 return hr; | 640 return hr; |
| 617 } | 641 } |
| 618 | 642 |
| 619 IFACEMETHODIMP | 643 IFACEMETHODIMP |
| 620 ChromeAppViewAsh::Uninitialize() { | 644 ChromeAppViewAsh::Uninitialize() { |
| 621 DVLOG(1) << __FUNCTION__; | 645 DVLOG(1) << __FUNCTION__; |
| 646 text_service_.reset(); | |
| 622 window_ = nullptr; | 647 window_ = nullptr; |
| 623 view_ = nullptr; | 648 view_ = nullptr; |
| 624 core_window_hwnd_ = NULL; | 649 core_window_hwnd_ = NULL; |
| 625 return S_OK; | 650 return S_OK; |
| 626 } | 651 } |
| 627 | 652 |
| 628 // static | 653 // static |
| 629 HRESULT ChromeAppViewAsh::Unsnap() { | 654 HRESULT ChromeAppViewAsh::Unsnap() { |
| 630 mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> view_statics; | 655 mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> view_statics; |
| 631 HRESULT hr = winrt_utils::CreateActivationFactory( | 656 HRESULT hr = winrt_utils::CreateActivationFactory( |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 780 DVLOG(1) << __FUNCTION__; | 805 DVLOG(1) << __FUNCTION__; |
| 781 DVLOG(1) << "Success: " << success; | 806 DVLOG(1) << "Success: " << success; |
| 782 if (ui_channel_) { | 807 if (ui_channel_) { |
| 783 ui_channel_->Send(new MetroViewerHostMsg_SelectFolderDone( | 808 ui_channel_->Send(new MetroViewerHostMsg_SelectFolderDone( |
| 784 success, | 809 success, |
| 785 base::FilePath(folder_picker->result()))); | 810 base::FilePath(folder_picker->result()))); |
| 786 } | 811 } |
| 787 delete folder_picker; | 812 delete folder_picker; |
| 788 } | 813 } |
| 789 | 814 |
| 815 void ChromeAppViewAsh::OnImeCancelComposition() { | |
| 816 if (!text_service_) | |
|
ananta
2013/11/27 20:02:47
Can text_service_ be NULL here and in other Ime ha
yukawa
2013/11/28 06:06:20
Less likely but Yes. Currently metro_driver::Creat
ananta
2013/12/02 23:15:23
The LOG(ERROR) statements you have in the CreateTe
| |
| 817 return; | |
| 818 text_service_->CancelComposition(); | |
| 819 } | |
| 820 | |
| 821 void ChromeAppViewAsh::OnImeUpdateTextInputClient( | |
| 822 const std::vector<int32>& input_scopes, | |
| 823 const std::vector<metro_viewer::CharacterBounds>& character_bounds) { | |
| 824 if (!text_service_) | |
| 825 return; | |
| 826 text_service_->OnDocumentChanged(input_scopes, character_bounds); | |
| 827 } | |
| 828 | |
| 829 void ChromeAppViewAsh::OnCompositionChanged( | |
| 830 const string16& text, | |
| 831 int32 selection_start, | |
| 832 int32 selection_end, | |
| 833 const std::vector<metro_viewer::UnderlineInfo>& underlines) { | |
| 834 ui_channel_->Send(new MetroViewerHostMsg_ImeCompositionChanged( | |
| 835 text, selection_start, selection_end, underlines)); | |
| 836 } | |
| 837 | |
| 838 void ChromeAppViewAsh::OnTextCommitted(const string16& text) { | |
| 839 ui_channel_->Send(new MetroViewerHostMsg_ImeTextCommitted(text)); | |
| 840 } | |
| 841 | |
| 790 HRESULT ChromeAppViewAsh::OnActivate( | 842 HRESULT ChromeAppViewAsh::OnActivate( |
| 791 winapp::Core::ICoreApplicationView*, | 843 winapp::Core::ICoreApplicationView*, |
| 792 winapp::Activation::IActivatedEventArgs* args) { | 844 winapp::Activation::IActivatedEventArgs* args) { |
| 793 DVLOG(1) << __FUNCTION__; | 845 DVLOG(1) << __FUNCTION__; |
| 794 // Note: If doing more work in this function, you migth need to call | 846 // Note: If doing more work in this function, you migth need to call |
| 795 // get_PreviousExecutionState() and skip the work if the result is | 847 // get_PreviousExecutionState() and skip the work if the result is |
| 796 // ApplicationExecutionState_Running and globals.previous_state is too. | 848 // ApplicationExecutionState_Running and globals.previous_state is too. |
| 797 args->get_PreviousExecutionState(&globals.previous_state); | 849 args->get_PreviousExecutionState(&globals.previous_state); |
| 798 DVLOG(1) << "Previous Execution State: " << globals.previous_state; | 850 DVLOG(1) << "Previous Execution State: " << globals.previous_state; |
| 799 | 851 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1026 winui::Core::CoreWindowActivationState state; | 1078 winui::Core::CoreWindowActivationState state; |
| 1027 HRESULT hr = args->get_WindowActivationState(&state); | 1079 HRESULT hr = args->get_WindowActivationState(&state); |
| 1028 if (FAILED(hr)) | 1080 if (FAILED(hr)) |
| 1029 return hr; | 1081 return hr; |
| 1030 | 1082 |
| 1031 // Treat both full activation (Ash was reopened from the Start Screen or from | 1083 // Treat both full activation (Ash was reopened from the Start Screen or from |
| 1032 // any other Metro entry point in Windows) and pointer activation (user | 1084 // any other Metro entry point in Windows) and pointer activation (user |
| 1033 // clicked back in Ash after using another app on another monitor) the same. | 1085 // clicked back in Ash after using another app on another monitor) the same. |
| 1034 if (state == winui::Core::CoreWindowActivationState_CodeActivated || | 1086 if (state == winui::Core::CoreWindowActivationState_CodeActivated || |
| 1035 state == winui::Core::CoreWindowActivationState_PointerActivated) { | 1087 state == winui::Core::CoreWindowActivationState_PointerActivated) { |
| 1088 if (text_service_) | |
| 1089 text_service_->OnWindowActivated(); | |
| 1036 ui_channel_->Send(new MetroViewerHostMsg_WindowActivated()); | 1090 ui_channel_->Send(new MetroViewerHostMsg_WindowActivated()); |
| 1037 } | 1091 } |
| 1038 return S_OK; | 1092 return S_OK; |
| 1039 } | 1093 } |
| 1040 | 1094 |
| 1041 HRESULT ChromeAppViewAsh::HandleSearchRequest( | 1095 HRESULT ChromeAppViewAsh::HandleSearchRequest( |
| 1042 winapp::Activation::IActivatedEventArgs* args) { | 1096 winapp::Activation::IActivatedEventArgs* args) { |
| 1043 mswr::ComPtr<winapp::Activation::ISearchActivatedEventArgs> search_args; | 1097 mswr::ComPtr<winapp::Activation::ISearchActivatedEventArgs> search_args; |
| 1044 CheckHR(args->QueryInterface( | 1098 CheckHR(args->QueryInterface( |
| 1045 winapp::Activation::IID_ISearchActivatedEventArgs, &search_args)); | 1099 winapp::Activation::IID_ISearchActivatedEventArgs, &search_args)); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1136 mswr::ComPtr<winapp::Core::ICoreApplicationExit> app_exit; | 1190 mswr::ComPtr<winapp::Core::ICoreApplicationExit> app_exit; |
| 1137 CheckHR(core_app.As(&app_exit)); | 1191 CheckHR(core_app.As(&app_exit)); |
| 1138 globals.app_exit = app_exit.Detach(); | 1192 globals.app_exit = app_exit.Detach(); |
| 1139 } | 1193 } |
| 1140 | 1194 |
| 1141 IFACEMETHODIMP | 1195 IFACEMETHODIMP |
| 1142 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { | 1196 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { |
| 1143 *view = mswr::Make<ChromeAppViewAsh>().Detach(); | 1197 *view = mswr::Make<ChromeAppViewAsh>().Detach(); |
| 1144 return (*view) ? S_OK : E_OUTOFMEMORY; | 1198 return (*view) ? S_OK : E_OUTOFMEMORY; |
| 1145 } | 1199 } |
| OLD | NEW |