| 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.h" | 6 #include "win8/metro_driver/chrome_app_view.h" |
| 7 | 7 |
| 8 #include <corewindow.h> | 8 #include <corewindow.h> |
| 9 #include <windows.applicationModel.datatransfer.h> | 9 #include <windows.applicationModel.datatransfer.h> |
| 10 #include <windows.foundation.h> | 10 #include <windows.foundation.h> |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 // ensures that chrome exits. | 150 // ensures that chrome exits. |
| 151 void MetroExit(bool send_alt_f4_mnemonic) { | 151 void MetroExit(bool send_alt_f4_mnemonic) { |
| 152 if (send_alt_f4_mnemonic && globals.view && | 152 if (send_alt_f4_mnemonic && globals.view && |
| 153 globals.view->core_window_hwnd() == ::GetForegroundWindow()) { | 153 globals.view->core_window_hwnd() == ::GetForegroundWindow()) { |
| 154 DVLOG(1) << "We are in the foreground. Exiting via Alt F4"; | 154 DVLOG(1) << "We are in the foreground. Exiting via Alt F4"; |
| 155 SendMnemonic(VK_F4, ALT, false, false); | 155 SendMnemonic(VK_F4, ALT, false, false); |
| 156 DWORD core_window_process_id = 0; | 156 DWORD core_window_process_id = 0; |
| 157 DWORD core_window_thread_id = GetWindowThreadProcessId( | 157 DWORD core_window_thread_id = GetWindowThreadProcessId( |
| 158 globals.view->core_window_hwnd(), &core_window_process_id); | 158 globals.view->core_window_hwnd(), &core_window_process_id); |
| 159 if (core_window_thread_id != ::GetCurrentThreadId()) { | 159 if (core_window_thread_id != ::GetCurrentThreadId()) { |
| 160 globals.appview_msg_loop->PostDelayedTask( | 160 globals.appview_task_runner->PostDelayedTask( |
| 161 FROM_HERE, | 161 FROM_HERE, |
| 162 base::Bind(&MetroExit, false), | 162 base::Bind(&MetroExit, false), |
| 163 base::TimeDelta::FromMilliseconds(100)); | 163 base::TimeDelta::FromMilliseconds(100)); |
| 164 } | 164 } |
| 165 } else { | 165 } else { |
| 166 globals.app_exit->Exit(); | 166 globals.app_exit->Exit(); |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| 170 void AdjustToFitWindow(HWND hwnd, int flags) { | 170 void AdjustToFitWindow(HWND hwnd, int flags) { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 return view_state; | 421 return view_state; |
| 422 } | 422 } |
| 423 | 423 |
| 424 void UnsnapHelper() { | 424 void UnsnapHelper() { |
| 425 ChromeAppView::Unsnap(); | 425 ChromeAppView::Unsnap(); |
| 426 } | 426 } |
| 427 | 427 |
| 428 extern "C" __declspec(dllexport) | 428 extern "C" __declspec(dllexport) |
| 429 void MetroUnsnap() { | 429 void MetroUnsnap() { |
| 430 DVLOG(1) << __FUNCTION__; | 430 DVLOG(1) << __FUNCTION__; |
| 431 globals.appview_msg_loop->PostTask( | 431 globals.appview_task_runner->PostTask( |
| 432 FROM_HERE, base::Bind(&UnsnapHelper)); | 432 FROM_HERE, base::Bind(&UnsnapHelper)); |
| 433 } | 433 } |
| 434 | 434 |
| 435 extern "C" __declspec(dllexport) | 435 extern "C" __declspec(dllexport) |
| 436 HWND GetRootWindow() { | 436 HWND GetRootWindow() { |
| 437 DVLOG(1) << __FUNCTION__; | 437 DVLOG(1) << __FUNCTION__; |
| 438 return globals.view->core_window_hwnd(); | 438 return globals.view->core_window_hwnd(); |
| 439 } | 439 } |
| 440 | 440 |
| 441 extern "C" __declspec(dllexport) | 441 extern "C" __declspec(dllexport) |
| 442 void SetFrameWindow(HWND hwnd) { | 442 void SetFrameWindow(HWND hwnd) { |
| 443 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(hwnd); | 443 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(hwnd); |
| 444 globals.appview_msg_loop->PostTask( | 444 globals.appview_task_runner->PostTask( |
| 445 FROM_HERE, base::Bind(&SetFrameWindowInternal, hwnd)); | 445 FROM_HERE, base::Bind(&SetFrameWindowInternal, hwnd)); |
| 446 } | 446 } |
| 447 | 447 |
| 448 // TODO(ananta) | 448 // TODO(ananta) |
| 449 // Handle frame window close by deleting it from the window list and making the | 449 // Handle frame window close by deleting it from the window list and making the |
| 450 // next guy visible. | 450 // next guy visible. |
| 451 extern "C" __declspec(dllexport) | 451 extern "C" __declspec(dllexport) |
| 452 void CloseFrameWindow(HWND hwnd) { | 452 void CloseFrameWindow(HWND hwnd) { |
| 453 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(hwnd); | 453 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(hwnd); |
| 454 | 454 |
| 455 // This is a hack to ensure that the BrowserViewLayout code layout happens | 455 // This is a hack to ensure that the BrowserViewLayout code layout happens |
| 456 // just at the right time to hide the switcher button if it is visible. | 456 // just at the right time to hide the switcher button if it is visible. |
| 457 globals.appview_msg_loop->PostDelayedTask( | 457 globals.appview_task_runner->PostDelayedTask( |
| 458 FROM_HERE, base::Bind(&CloseFrameWindowInternal, hwnd), | 458 FROM_HERE, base::Bind(&CloseFrameWindowInternal, hwnd), |
| 459 base::TimeDelta::FromMilliseconds(50)); | 459 base::TimeDelta::FromMilliseconds(50)); |
| 460 } | 460 } |
| 461 | 461 |
| 462 // Returns the initial url. This returns a valid url only if we were launched | 462 // Returns the initial url. This returns a valid url only if we were launched |
| 463 // into metro via a url navigation. | 463 // into metro via a url navigation. |
| 464 extern "C" __declspec(dllexport) | 464 extern "C" __declspec(dllexport) |
| 465 const wchar_t* GetInitialUrl() { | 465 const wchar_t* GetInitialUrl() { |
| 466 DVLOG(1) << __FUNCTION__; | 466 DVLOG(1) << __FUNCTION__; |
| 467 bool was_initial_activation = globals.is_initial_activation; | 467 bool was_initial_activation = globals.is_initial_activation; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 497 *previous_state = static_cast<base::win::MetroPreviousExecutionState>( | 497 *previous_state = static_cast<base::win::MetroPreviousExecutionState>( |
| 498 globals.previous_state); | 498 globals.previous_state); |
| 499 } | 499 } |
| 500 return static_cast<base::win::MetroLaunchType>( | 500 return static_cast<base::win::MetroLaunchType>( |
| 501 globals.initial_activation_kind); | 501 globals.initial_activation_kind); |
| 502 } | 502 } |
| 503 | 503 |
| 504 extern "C" __declspec(dllexport) | 504 extern "C" __declspec(dllexport) |
| 505 void FlipFrameWindows() { | 505 void FlipFrameWindows() { |
| 506 DVLOG(1) << __FUNCTION__; | 506 DVLOG(1) << __FUNCTION__; |
| 507 globals.appview_msg_loop->PostTask( | 507 globals.appview_task_runner->PostTask( |
| 508 FROM_HERE, base::Bind(&FlipFrameWindowsInternal)); | 508 FROM_HERE, base::Bind(&FlipFrameWindowsInternal)); |
| 509 } | 509 } |
| 510 | 510 |
| 511 extern "C" __declspec(dllexport) | 511 extern "C" __declspec(dllexport) |
| 512 void DisplayNotification(const char* origin_url, const char* icon_url, | 512 void DisplayNotification(const char* origin_url, const char* icon_url, |
| 513 const wchar_t* title, const wchar_t* body, | 513 const wchar_t* title, const wchar_t* body, |
| 514 const wchar_t* display_source, | 514 const wchar_t* display_source, |
| 515 const char* notification_id, | 515 const char* notification_id, |
| 516 base::win::MetroNotificationClickedHandler handler, | 516 base::win::MetroNotificationClickedHandler handler, |
| 517 const wchar_t* handler_context) { | 517 const wchar_t* handler_context) { |
| 518 // TODO(ananta) | 518 // TODO(ananta) |
| 519 // Needs implementation. | 519 // Needs implementation. |
| 520 DVLOG(1) << __FUNCTION__; | 520 DVLOG(1) << __FUNCTION__; |
| 521 | 521 |
| 522 ToastNotificationHandler::DesktopNotification notification(origin_url, | 522 ToastNotificationHandler::DesktopNotification notification(origin_url, |
| 523 icon_url, | 523 icon_url, |
| 524 title, | 524 title, |
| 525 body, | 525 body, |
| 526 display_source, | 526 display_source, |
| 527 notification_id, | 527 notification_id, |
| 528 handler, | 528 handler, |
| 529 handler_context); | 529 handler_context); |
| 530 globals.appview_msg_loop->PostTask( | 530 globals.appview_task_runner->PostTask( |
| 531 FROM_HERE, base::Bind(&ChromeAppView::DisplayNotification, | 531 FROM_HERE, base::Bind(&ChromeAppView::DisplayNotification, |
| 532 globals.view, notification)); | 532 globals.view, notification)); |
| 533 } | 533 } |
| 534 | 534 |
| 535 extern "C" __declspec(dllexport) | 535 extern "C" __declspec(dllexport) |
| 536 bool CancelNotification(const char* notification_id) { | 536 bool CancelNotification(const char* notification_id) { |
| 537 // TODO(ananta) | 537 // TODO(ananta) |
| 538 // Needs implementation. | 538 // Needs implementation. |
| 539 DVLOG(1) << __FUNCTION__; | 539 DVLOG(1) << __FUNCTION__; |
| 540 | 540 |
| 541 if (!globals.view->IsValidNotification(notification_id)) { | 541 if (!globals.view->IsValidNotification(notification_id)) { |
| 542 NOTREACHED() << "Invalid notification id :" << notification_id; | 542 NOTREACHED() << "Invalid notification id :" << notification_id; |
| 543 return false; | 543 return false; |
| 544 } | 544 } |
| 545 | 545 |
| 546 globals.appview_msg_loop->PostTask( | 546 globals.appview_task_runner->PostTask( |
| 547 FROM_HERE, base::Bind(&ChromeAppView::CancelNotification, | 547 FROM_HERE, base::Bind(&ChromeAppView::CancelNotification, |
| 548 globals.view, std::string(notification_id))); | 548 globals.view, std::string(notification_id))); |
| 549 return true; | 549 return true; |
| 550 } | 550 } |
| 551 | 551 |
| 552 // Returns command line switches if any to be used by metro chrome. | 552 // Returns command line switches if any to be used by metro chrome. |
| 553 extern "C" __declspec(dllexport) | 553 extern "C" __declspec(dllexport) |
| 554 const wchar_t* GetMetroCommandLineSwitches() { | 554 const wchar_t* GetMetroCommandLineSwitches() { |
| 555 DVLOG(1) << __FUNCTION__; | 555 DVLOG(1) << __FUNCTION__; |
| 556 // The metro_command_line_switches field should be filled up once. | 556 // The metro_command_line_switches field should be filled up once. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 578 DCHECK(button2_handler); | 578 DCHECK(button2_handler); |
| 579 | 579 |
| 580 MetroDialogBox::DialogBoxInfo dialog_box_info; | 580 MetroDialogBox::DialogBoxInfo dialog_box_info; |
| 581 dialog_box_info.title = title; | 581 dialog_box_info.title = title; |
| 582 dialog_box_info.content = content; | 582 dialog_box_info.content = content; |
| 583 dialog_box_info.button1_label = button1_label; | 583 dialog_box_info.button1_label = button1_label; |
| 584 dialog_box_info.button2_label = button2_label; | 584 dialog_box_info.button2_label = button2_label; |
| 585 dialog_box_info.button1_handler = button1_handler; | 585 dialog_box_info.button1_handler = button1_handler; |
| 586 dialog_box_info.button2_handler = button2_handler; | 586 dialog_box_info.button2_handler = button2_handler; |
| 587 | 587 |
| 588 globals.appview_msg_loop->PostTask( | 588 globals.appview_task_runner->PostTask( |
| 589 FROM_HERE, base::Bind( | 589 FROM_HERE, base::Bind( |
| 590 &ChromeAppView::ShowDialogBox, globals.view, dialog_box_info)); | 590 &ChromeAppView::ShowDialogBox, globals.view, dialog_box_info)); |
| 591 } | 591 } |
| 592 | 592 |
| 593 // Provides functionality to dismiss the previously displayed metro style | 593 // Provides functionality to dismiss the previously displayed metro style |
| 594 // dialog box. | 594 // dialog box. |
| 595 extern "C" __declspec(dllexport) | 595 extern "C" __declspec(dllexport) |
| 596 void DismissDialogBox() { | 596 void DismissDialogBox() { |
| 597 VLOG(1) << __FUNCTION__; | 597 VLOG(1) << __FUNCTION__; |
| 598 | 598 |
| 599 globals.appview_msg_loop->PostTask( | 599 globals.appview_task_runner->PostTask( |
| 600 FROM_HERE, base::Bind( | 600 FROM_HERE, base::Bind( |
| 601 &ChromeAppView::DismissDialogBox, | 601 &ChromeAppView::DismissDialogBox, |
| 602 globals.view)); | 602 globals.view)); |
| 603 } | 603 } |
| 604 | 604 |
| 605 extern "C" __declspec(dllexport) | 605 extern "C" __declspec(dllexport) |
| 606 void SetFullscreen(bool fullscreen) { | 606 void SetFullscreen(bool fullscreen) { |
| 607 VLOG(1) << __FUNCTION__; | 607 VLOG(1) << __FUNCTION__; |
| 608 | 608 |
| 609 globals.appview_msg_loop->PostTask( | 609 globals.appview_task_runner->PostTask( |
| 610 FROM_HERE, base::Bind( | 610 FROM_HERE, base::Bind( |
| 611 &ChromeAppView::SetFullscreen, | 611 &ChromeAppView::SetFullscreen, |
| 612 globals.view, fullscreen)); | 612 globals.view, fullscreen)); |
| 613 } | 613 } |
| 614 | 614 |
| 615 template <typename ContainerT> | 615 template <typename ContainerT> |
| 616 void CloseSecondaryWindows(ContainerT& windows) { | 616 void CloseSecondaryWindows(ContainerT& windows) { |
| 617 DVLOG(1) << "Closing secondary windows", windows.size(); | 617 DVLOG(1) << "Closing secondary windows", windows.size(); |
| 618 std::for_each(windows.begin(), windows.end(), [](HWND hwnd) { | 618 std::for_each(windows.begin(), windows.end(), [](HWND hwnd) { |
| 619 ::PostMessageW(hwnd, WM_CLOSE, 0, 0); | 619 ::PostMessageW(hwnd, WM_CLOSE, 0, 0); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 hr = window_->Activate(); | 814 hr = window_->Activate(); |
| 815 if (SUCCEEDED(hr)) { | 815 if (SUCCEEDED(hr)) { |
| 816 // TODO(cpu): Draw something here. | 816 // TODO(cpu): Draw something here. |
| 817 } else { | 817 } else { |
| 818 DVLOG(1) << "Activate failed, hr=" << hr; | 818 DVLOG(1) << "Activate failed, hr=" << hr; |
| 819 } | 819 } |
| 820 | 820 |
| 821 // Create a message loop to allow message passing into this thread. | 821 // Create a message loop to allow message passing into this thread. |
| 822 base::MessageLoopForUI msg_loop; | 822 base::MessageLoopForUI msg_loop; |
| 823 | 823 |
| 824 // Announce our message loop to the world. | 824 // Announce our message loop task runner to the world. |
| 825 globals.appview_msg_loop = msg_loop.message_loop_proxy(); | 825 globals.appview_task_runner = msg_loop.task_runner(); |
| 826 | 826 |
| 827 // And post the task that'll do the inner Metro message pumping to it. | 827 // And post the task that'll do the inner Metro message pumping to it. |
| 828 msg_loop.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); | 828 msg_loop.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); |
| 829 | 829 |
| 830 // Post the recurring task which checks for OSK activation in metro chrome. | 830 // Post the recurring task which checks for OSK activation in metro chrome. |
| 831 // Please refer to the comments in the CheckForOSKActivation function for why | 831 // Please refer to the comments in the CheckForOSKActivation function for why |
| 832 // this is needed. | 832 // this is needed. |
| 833 // TODO(ananta) | 833 // TODO(ananta) |
| 834 // Take this out when the documented OSK notifications start working. | 834 // Take this out when the documented OSK notifications start working. |
| 835 msg_loop.PostDelayedTask( | 835 msg_loop.PostDelayedTask( |
| 836 FROM_HERE, | 836 FROM_HERE, |
| 837 base::Bind(&ChromeAppView::CheckForOSKActivation, | 837 base::Bind(&ChromeAppView::CheckForOSKActivation, |
| 838 base::Unretained(this)), | 838 base::Unretained(this)), |
| 839 base::TimeDelta::FromMilliseconds(kCheckOSKDelayMs)); | 839 base::TimeDelta::FromMilliseconds(kCheckOSKDelayMs)); |
| 840 | 840 |
| 841 msg_loop.Run(); | 841 msg_loop.Run(); |
| 842 | 842 |
| 843 globals.appview_msg_loop = NULL; | 843 globals.appview_task_runner = NULL; |
| 844 | 844 |
| 845 DVLOG(0) << "ProcessEvents done, hr=" << hr; | 845 DVLOG(0) << "ProcessEvents done, hr=" << hr; |
| 846 | 846 |
| 847 // We join here with chrome's main thread so that the chrome is not killed | 847 // We join here with chrome's main thread so that the chrome is not killed |
| 848 // while a critical operation is still in progress. Now, if there are host | 848 // while a critical operation is still in progress. Now, if there are host |
| 849 // windows active it is possible we end up stuck on the wait below therefore | 849 // windows active it is possible we end up stuck on the wait below therefore |
| 850 // we tell chrome to close its windows. | 850 // we tell chrome to close its windows. |
| 851 if (!globals.host_windows.empty()) { | 851 if (!globals.host_windows.empty()) { |
| 852 DVLOG(1) << "Chrome still has windows open!"; | 852 DVLOG(1) << "Chrome still has windows open!"; |
| 853 EndChromeSession(); | 853 EndChromeSession(); |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 CheckHR(core_app.As(&app_exit)); | 1207 CheckHR(core_app.As(&app_exit)); |
| 1208 globals.app_exit = app_exit.Detach(); | 1208 globals.app_exit = app_exit.Detach(); |
| 1209 } | 1209 } |
| 1210 | 1210 |
| 1211 IFACEMETHODIMP | 1211 IFACEMETHODIMP |
| 1212 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { | 1212 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { |
| 1213 globals.view = mswr::Make<ChromeAppView>().Detach(); | 1213 globals.view = mswr::Make<ChromeAppView>().Detach(); |
| 1214 *view = globals.view; | 1214 *view = globals.view; |
| 1215 return (*view) ? S_OK : E_OUTOFMEMORY; | 1215 return (*view) ? S_OK : E_OUTOFMEMORY; |
| 1216 } | 1216 } |
| OLD | NEW |