OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // Implementation of ChromeActiveDocument | 5 // Implementation of ChromeActiveDocument |
6 #include "chrome_frame/chrome_active_document.h" | 6 #include "chrome_frame/chrome_active_document.h" |
7 | 7 |
8 #include <hlink.h> | 8 #include <hlink.h> |
9 #include <htiface.h> | 9 #include <htiface.h> |
10 #include <initguid.h> | 10 #include <initguid.h> |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 in_place_frame_->SetActiveObject(in_place_active_object, NULL); | 608 in_place_frame_->SetActiveObject(in_place_active_object, NULL); |
609 if (in_place_ui_window) | 609 if (in_place_ui_window) |
610 in_place_ui_window->SetActiveObject(in_place_active_object, NULL); | 610 in_place_ui_window->SetActiveObject(in_place_active_object, NULL); |
611 } | 611 } |
612 } | 612 } |
613 } | 613 } |
614 m_spClientSite->ShowObject(); | 614 m_spClientSite->ShowObject(); |
615 return S_OK; | 615 return S_OK; |
616 } | 616 } |
617 | 617 |
618 void ChromeActiveDocument::OnNavigationStateChanged(int tab_handle, int flags, | 618 void ChromeActiveDocument::OnNavigationStateChanged( |
619 const IPC::NavigationInfo& nav_info) { | 619 int flags, const NavigationInfo& nav_info) { |
620 // TODO(joshia): handle INVALIDATE_TAB,INVALIDATE_LOAD etc. | 620 // TODO(joshia): handle INVALIDATE_TAB,INVALIDATE_LOAD etc. |
621 DVLOG(1) << __FUNCTION__ | 621 DVLOG(1) << __FUNCTION__ |
622 << "\n Flags: " << flags | 622 << "\n Flags: " << flags |
623 << ", Url: " << nav_info.url | 623 << ", Url: " << nav_info.url |
624 << ", Title: " << nav_info.title | 624 << ", Title: " << nav_info.title |
625 << ", Type: " << nav_info.navigation_type | 625 << ", Type: " << nav_info.navigation_type |
626 << ", Relative Offset: " << nav_info.relative_offset | 626 << ", Relative Offset: " << nav_info.relative_offset |
627 << ", Index: " << nav_info.navigation_index; | 627 << ", Index: " << nav_info.navigation_index; |
628 | 628 |
629 UpdateNavigationState(nav_info); | 629 UpdateNavigationState(nav_info); |
630 } | 630 } |
631 | 631 |
632 void ChromeActiveDocument::OnUpdateTargetUrl(int tab_handle, | 632 void ChromeActiveDocument::OnUpdateTargetUrl( |
633 const std::wstring& new_target_url) { | 633 const std::wstring& new_target_url) { |
634 if (in_place_frame_) | 634 if (in_place_frame_) |
635 in_place_frame_->SetStatusText(new_target_url.c_str()); | 635 in_place_frame_->SetStatusText(new_target_url.c_str()); |
636 } | 636 } |
637 | 637 |
638 bool IsFindAccelerator(const MSG& msg) { | 638 bool IsFindAccelerator(const MSG& msg) { |
639 // TODO(robertshield): This may not stand up to localization. Fix if this | 639 // TODO(robertshield): This may not stand up to localization. Fix if this |
640 // is the case. | 640 // is the case. |
641 return msg.message == WM_KEYDOWN && msg.wParam == 'F' && | 641 return msg.message == WM_KEYDOWN && msg.wParam == 'F' && |
642 win_util::IsCtrlPressed() && | 642 win_util::IsCtrlPressed() && |
643 !(win_util::IsAltPressed() || win_util::IsShiftPressed()); | 643 !(win_util::IsAltPressed() || win_util::IsShiftPressed()); |
644 } | 644 } |
645 | 645 |
646 void ChromeActiveDocument::OnAcceleratorPressed(int tab_handle, | 646 void ChromeActiveDocument::OnAcceleratorPressed(const MSG& accel_message) { |
647 const MSG& accel_message) { | |
648 if (::TranslateAccelerator(m_hWnd, accelerator_table_, | 647 if (::TranslateAccelerator(m_hWnd, accelerator_table_, |
649 const_cast<MSG*>(&accel_message))) | 648 const_cast<MSG*>(&accel_message))) |
650 return; | 649 return; |
651 | 650 |
652 bool handled_accel = false; | 651 bool handled_accel = false; |
653 if (in_place_frame_ != NULL) { | 652 if (in_place_frame_ != NULL) { |
654 handled_accel = (S_OK == in_place_frame_->TranslateAcceleratorW( | 653 handled_accel = (S_OK == in_place_frame_->TranslateAcceleratorW( |
655 const_cast<MSG*>(&accel_message), 0)); | 654 const_cast<MSG*>(&accel_message), 0)); |
656 } | 655 } |
657 | 656 |
658 if (!handled_accel) { | 657 if (!handled_accel) { |
659 if (IsFindAccelerator(accel_message)) { | 658 if (IsFindAccelerator(accel_message)) { |
660 // Handle the showing of the find dialog explicitly. | 659 // Handle the showing of the find dialog explicitly. |
661 OnFindInPage(); | 660 OnFindInPage(); |
662 } else { | 661 } else { |
663 BaseActiveX::OnAcceleratorPressed(tab_handle, accel_message); | 662 BaseActiveX::OnAcceleratorPressed(accel_message); |
664 } | 663 } |
665 } else { | 664 } else { |
666 DVLOG(1) << "IE handled accel key " << accel_message.wParam; | 665 DVLOG(1) << "IE handled accel key " << accel_message.wParam; |
667 } | 666 } |
668 } | 667 } |
669 | 668 |
670 void ChromeActiveDocument::OnTabbedOut(int tab_handle, bool reverse) { | 669 void ChromeActiveDocument::OnTabbedOut(bool reverse) { |
671 DVLOG(1) << __FUNCTION__; | 670 DVLOG(1) << __FUNCTION__; |
672 if (in_place_frame_) { | 671 if (in_place_frame_) { |
673 MSG msg = { NULL, WM_KEYDOWN, VK_TAB }; | 672 MSG msg = { NULL, WM_KEYDOWN, VK_TAB }; |
674 in_place_frame_->TranslateAcceleratorW(&msg, 0); | 673 in_place_frame_->TranslateAcceleratorW(&msg, 0); |
675 } | 674 } |
676 } | 675 } |
677 | 676 |
678 void ChromeActiveDocument::OnDidNavigate(int tab_handle, | 677 void ChromeActiveDocument::OnDidNavigate(const NavigationInfo& nav_info) { |
679 const IPC::NavigationInfo& nav_info) { | |
680 DVLOG(1) << __FUNCTION__ << std::endl | 678 DVLOG(1) << __FUNCTION__ << std::endl |
681 << "Url: " << nav_info.url | 679 << "Url: " << nav_info.url |
682 << ", Title: " << nav_info.title | 680 << ", Title: " << nav_info.title |
683 << ", Type: " << nav_info.navigation_type | 681 << ", Type: " << nav_info.navigation_type |
684 << ", Relative Offset: " << nav_info.relative_offset | 682 << ", Relative Offset: " << nav_info.relative_offset |
685 << ", Index: " << nav_info.navigation_index; | 683 << ", Index: " << nav_info.navigation_index; |
686 | 684 |
687 CrashMetricsReporter::GetInstance()->IncrementMetric( | 685 CrashMetricsReporter::GetInstance()->IncrementMetric( |
688 CrashMetricsReporter::CHROME_FRAME_NAVIGATION_COUNT); | 686 CrashMetricsReporter::CHROME_FRAME_NAVIGATION_COUNT); |
689 | 687 |
690 // This could be NULL if the active document instance is being destroyed. | 688 // This could be NULL if the active document instance is being destroyed. |
691 if (!m_spInPlaceSite) { | 689 if (!m_spInPlaceSite) { |
692 DVLOG(1) << __FUNCTION__ << "m_spInPlaceSite is NULL. Returning"; | 690 DVLOG(1) << __FUNCTION__ << "m_spInPlaceSite is NULL. Returning"; |
693 return; | 691 return; |
694 } | 692 } |
695 | 693 |
696 UpdateNavigationState(nav_info); | 694 UpdateNavigationState(nav_info); |
697 } | 695 } |
698 | 696 |
699 void ChromeActiveDocument::OnCloseTab(int tab_handle) { | 697 void ChromeActiveDocument::OnCloseTab() { |
700 // Base class will fire DIChromeFrameEvents::onclose. | 698 // Base class will fire DIChromeFrameEvents::onclose. |
701 BaseActiveX::OnCloseTab(tab_handle); | 699 BaseActiveX::OnCloseTab(); |
702 | 700 |
703 // Close the container window. | 701 // Close the container window. |
704 ScopedComPtr<IWebBrowser2> web_browser2; | 702 ScopedComPtr<IWebBrowser2> web_browser2; |
705 DoQueryService(SID_SWebBrowserApp, m_spClientSite, web_browser2.Receive()); | 703 DoQueryService(SID_SWebBrowserApp, m_spClientSite, web_browser2.Receive()); |
706 if (web_browser2) | 704 if (web_browser2) |
707 web_browser2->Quit(); | 705 web_browser2->Quit(); |
708 } | 706 } |
709 | 707 |
710 void ChromeActiveDocument::UpdateNavigationState( | 708 void ChromeActiveDocument::UpdateNavigationState( |
711 const IPC::NavigationInfo& new_navigation_info) { | 709 const NavigationInfo& new_navigation_info) { |
712 HRESULT hr = S_OK; | 710 HRESULT hr = S_OK; |
713 bool is_title_changed = (navigation_info_.title != new_navigation_info.title); | 711 bool is_title_changed = (navigation_info_.title != new_navigation_info.title); |
714 bool is_ssl_state_changed = | 712 bool is_ssl_state_changed = |
715 (navigation_info_.security_style != new_navigation_info.security_style) || | 713 (navigation_info_.security_style != new_navigation_info.security_style) || |
716 (navigation_info_.displayed_insecure_content != | 714 (navigation_info_.displayed_insecure_content != |
717 new_navigation_info.displayed_insecure_content) || | 715 new_navigation_info.displayed_insecure_content) || |
718 (navigation_info_.ran_insecure_content != | 716 (navigation_info_.ran_insecure_content != |
719 new_navigation_info.ran_insecure_content); | 717 new_navigation_info.ran_insecure_content); |
720 | 718 |
721 if (is_ssl_state_changed) { | 719 if (is_ssl_state_changed) { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 VARIANT* in_args, | 910 VARIANT* in_args, |
913 VARIANT* out_args) { | 911 VARIANT* out_args) { |
914 if (IsValid() && out_args) { | 912 if (IsValid() && out_args) { |
915 bool should_unload = true; | 913 bool should_unload = true; |
916 automation_client_->OnUnload(&should_unload); | 914 automation_client_->OnUnload(&should_unload); |
917 out_args->vt = VT_BOOL; | 915 out_args->vt = VT_BOOL; |
918 out_args->boolVal = should_unload ? VARIANT_TRUE : VARIANT_FALSE; | 916 out_args->boolVal = should_unload ? VARIANT_TRUE : VARIANT_FALSE; |
919 } | 917 } |
920 } | 918 } |
921 | 919 |
922 void ChromeActiveDocument::OnOpenURL(int tab_handle, | 920 void ChromeActiveDocument::OnOpenURL(const GURL& url_to_open, |
923 const GURL& url_to_open, | |
924 const GURL& referrer, | 921 const GURL& referrer, |
925 int open_disposition) { | 922 int open_disposition) { |
926 // If the disposition indicates that we should be opening the URL in the | 923 // If the disposition indicates that we should be opening the URL in the |
927 // current tab, then we can reuse the ChromeFrameAutomationClient instance | 924 // current tab, then we can reuse the ChromeFrameAutomationClient instance |
928 // maintained by the current ChromeActiveDocument instance. We cache this | 925 // maintained by the current ChromeActiveDocument instance. We cache this |
929 // instance so that it can be used by the new ChromeActiveDocument instance | 926 // instance so that it can be used by the new ChromeActiveDocument instance |
930 // which may be instantiated for handling the new URL. | 927 // which may be instantiated for handling the new URL. |
931 if (open_disposition == CURRENT_TAB) { | 928 if (open_disposition == CURRENT_TAB) { |
932 // Grab a reference to ensure that the document remains valid. | 929 // Grab a reference to ensure that the document remains valid. |
933 AddRef(); | 930 AddRef(); |
934 g_active_doc_cache.Set(this); | 931 g_active_doc_cache.Set(this); |
935 } | 932 } |
936 | 933 |
937 BaseActiveX::OnOpenURL(tab_handle, url_to_open, referrer, open_disposition); | 934 BaseActiveX::OnOpenURL(url_to_open, referrer, open_disposition); |
938 } | 935 } |
939 | 936 |
940 void ChromeActiveDocument::OnAttachExternalTab(int tab_handle, | 937 void ChromeActiveDocument::OnAttachExternalTab( |
941 const IPC::AttachExternalTabParams& params) { | 938 const AttachExternalTabParams& params) { |
942 if (!automation_client_.get()) { | 939 if (!automation_client_.get()) { |
943 DLOG(WARNING) << "Invalid automation client instance"; | 940 DLOG(WARNING) << "Invalid automation client instance"; |
944 return; | 941 return; |
945 } | 942 } |
946 DWORD flags = 0; | 943 DWORD flags = 0; |
947 if (params.user_gesture) | 944 if (params.user_gesture) |
948 flags = NWMF_USERREQUESTED; | 945 flags = NWMF_USERREQUESTED; |
949 else if (popup_allowed_) | 946 else if (popup_allowed_) |
950 flags = NWMF_USERALLOWED; | 947 flags = NWMF_USERALLOWED; |
951 | 948 |
952 HRESULT hr = S_OK; | 949 HRESULT hr = S_OK; |
953 if (popup_manager_) { | 950 if (popup_manager_) { |
954 const std::wstring& url_wide = UTF8ToWide(params.url.spec()); | 951 const std::wstring& url_wide = UTF8ToWide(params.url.spec()); |
955 hr = popup_manager_->EvaluateNewWindow(url_wide.c_str(), NULL, url_, | 952 hr = popup_manager_->EvaluateNewWindow(url_wide.c_str(), NULL, url_, |
956 NULL, FALSE, flags, 0); | 953 NULL, FALSE, flags, 0); |
957 } | 954 } |
958 // Allow popup | 955 // Allow popup |
959 if (hr == S_OK) { | 956 if (hr == S_OK) { |
960 BaseActiveX::OnAttachExternalTab(tab_handle, params); | 957 BaseActiveX::OnAttachExternalTab(params); |
961 return; | 958 return; |
962 } | 959 } |
963 | 960 |
964 automation_client_->BlockExternalTab(params.cookie); | 961 automation_client_->BlockExternalTab(params.cookie); |
965 } | 962 } |
966 | 963 |
967 bool ChromeActiveDocument::PreProcessContextMenu(HMENU menu) { | 964 bool ChromeActiveDocument::PreProcessContextMenu(HMENU menu) { |
968 ScopedComPtr<IBrowserService> browser_service; | 965 ScopedComPtr<IBrowserService> browser_service; |
969 ScopedComPtr<ITravelLog> travel_log; | 966 ScopedComPtr<ITravelLog> travel_log; |
970 GetBrowserServiceAndTravelLog(browser_service.Receive(), | 967 GetBrowserServiceAndTravelLog(browser_service.Receive(), |
971 travel_log.Receive()); | 968 travel_log.Receive()); |
972 if (!browser_service || !travel_log) | 969 if (!browser_service || !travel_log) |
973 return true; | 970 return true; |
974 | 971 |
975 EnableMenuItem(menu, IDC_BACK, MF_BYCOMMAND | | 972 EnableMenuItem(menu, IDC_BACK, MF_BYCOMMAND | |
976 (SUCCEEDED(travel_log->GetTravelEntry(browser_service, TLOG_BACK, | 973 (SUCCEEDED(travel_log->GetTravelEntry(browser_service, TLOG_BACK, |
977 NULL)) ? | 974 NULL)) ? |
978 MF_ENABLED : MF_DISABLED)); | 975 MF_ENABLED : MF_DISABLED)); |
979 EnableMenuItem(menu, IDC_FORWARD, MF_BYCOMMAND | | 976 EnableMenuItem(menu, IDC_FORWARD, MF_BYCOMMAND | |
980 (SUCCEEDED(travel_log->GetTravelEntry(browser_service, TLOG_FORE, | 977 (SUCCEEDED(travel_log->GetTravelEntry(browser_service, TLOG_FORE, |
981 NULL)) ? | 978 NULL)) ? |
982 MF_ENABLED : MF_DISABLED)); | 979 MF_ENABLED : MF_DISABLED)); |
983 // Call base class (adds 'About' item) | 980 // Call base class (adds 'About' item) |
984 return BaseActiveX::PreProcessContextMenu(menu); | 981 return BaseActiveX::PreProcessContextMenu(menu); |
985 } | 982 } |
986 | 983 |
987 bool ChromeActiveDocument::HandleContextMenuCommand(UINT cmd, | 984 bool ChromeActiveDocument::HandleContextMenuCommand( |
988 const IPC::MiniContextMenuParams& params) { | 985 UINT cmd, const MiniContextMenuParams& params) { |
989 ScopedComPtr<IWebBrowser2> web_browser2; | 986 ScopedComPtr<IWebBrowser2> web_browser2; |
990 DoQueryService(SID_SWebBrowserApp, m_spClientSite, web_browser2.Receive()); | 987 DoQueryService(SID_SWebBrowserApp, m_spClientSite, web_browser2.Receive()); |
991 | 988 |
992 if (cmd == IDC_BACK) | 989 if (cmd == IDC_BACK) |
993 web_browser2->GoBack(); | 990 web_browser2->GoBack(); |
994 else if (cmd == IDC_FORWARD) | 991 else if (cmd == IDC_FORWARD) |
995 web_browser2->GoForward(); | 992 web_browser2->GoForward(); |
996 else if (cmd == IDC_RELOAD) | 993 else if (cmd == IDC_RELOAD) |
997 web_browser2->Refresh(); | 994 web_browser2->Refresh(); |
998 else | 995 else |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1226 tab->OverrideEncoding(chrome_encoding_name); | 1223 tab->OverrideEncoding(chrome_encoding_name); |
1227 | 1224 |
1228 // Like we did on SetPageFontSize, we may forward the command back to IEFrame | 1225 // Like we did on SetPageFontSize, we may forward the command back to IEFrame |
1229 // to update the menu state to indicate that which encoding was set. | 1226 // to update the menu state to indicate that which encoding was set. |
1230 // TODO(iyengar) | 1227 // TODO(iyengar) |
1231 // Do some investigation into why this Exec call fails. | 1228 // Do some investigation into why this Exec call fails. |
1232 IEExec(&CGID_ExplorerBarDoc, command_id, cmd_exec_opt, NULL, NULL); | 1229 IEExec(&CGID_ExplorerBarDoc, command_id, cmd_exec_opt, NULL, NULL); |
1233 return S_OK; | 1230 return S_OK; |
1234 } | 1231 } |
1235 | 1232 |
1236 void ChromeActiveDocument::OnGoToHistoryEntryOffset(int tab_handle, | 1233 void ChromeActiveDocument::OnGoToHistoryEntryOffset(int offset) { |
1237 int offset) { | |
1238 DVLOG(1) << __FUNCTION__ << " - offset:" << offset; | 1234 DVLOG(1) << __FUNCTION__ << " - offset:" << offset; |
1239 | 1235 |
1240 ScopedComPtr<IBrowserService> browser_service; | 1236 ScopedComPtr<IBrowserService> browser_service; |
1241 ScopedComPtr<ITravelLog> travel_log; | 1237 ScopedComPtr<ITravelLog> travel_log; |
1242 GetBrowserServiceAndTravelLog(browser_service.Receive(), | 1238 GetBrowserServiceAndTravelLog(browser_service.Receive(), |
1243 travel_log.Receive()); | 1239 travel_log.Receive()); |
1244 | 1240 |
1245 if (browser_service && travel_log) | 1241 if (browser_service && travel_log) |
1246 travel_log->Travel(browser_service, offset); | 1242 travel_log->Travel(browser_service, offset); |
1247 } | 1243 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 web_browser2->put_Height(dimensions_.height()); | 1356 web_browser2->put_Height(dimensions_.height()); |
1361 web_browser2->put_Left(dimensions_.x()); | 1357 web_browser2->put_Left(dimensions_.x()); |
1362 web_browser2->put_Top(dimensions_.y()); | 1358 web_browser2->put_Top(dimensions_.y()); |
1363 | 1359 |
1364 dimensions_.set_height(0); | 1360 dimensions_.set_height(0); |
1365 dimensions_.set_width(0); | 1361 dimensions_.set_width(0); |
1366 } | 1362 } |
1367 } | 1363 } |
1368 | 1364 |
1369 bool ChromeActiveDocument::IsNewNavigation( | 1365 bool ChromeActiveDocument::IsNewNavigation( |
1370 const IPC::NavigationInfo& new_navigation_info) const { | 1366 const NavigationInfo& new_navigation_info) const { |
1371 // A new navigation is typically an internal navigation which is initiated by | 1367 // A new navigation is typically an internal navigation which is initiated by |
1372 // the renderer(WebKit). Condition 1 below has to be true along with the | 1368 // the renderer(WebKit). Condition 1 below has to be true along with the |
1373 // any of the other conditions below. | 1369 // any of the other conditions below. |
1374 // 1. The navigation index is greater than 0 which means that a top level | 1370 // 1. The navigation index is greater than 0 which means that a top level |
1375 // navigation was initiated on the current external tab. | 1371 // navigation was initiated on the current external tab. |
1376 // 2. The navigation type has changed. | 1372 // 2. The navigation type has changed. |
1377 // 3. The url or the referrer are different. | 1373 // 3. The url or the referrer are different. |
1378 if (new_navigation_info.navigation_index <= 0) | 1374 if (new_navigation_info.navigation_index <= 0) |
1379 return false; | 1375 return false; |
1380 | 1376 |
1381 if (new_navigation_info.navigation_index == | 1377 if (new_navigation_info.navigation_index == |
1382 navigation_info_.navigation_index) | 1378 navigation_info_.navigation_index) |
1383 return false; | 1379 return false; |
1384 | 1380 |
1385 if (new_navigation_info.navigation_type != navigation_info_.navigation_type) | 1381 if (new_navigation_info.navigation_type != navigation_info_.navigation_type) |
1386 return true; | 1382 return true; |
1387 | 1383 |
1388 if (new_navigation_info.url != navigation_info_.url) | 1384 if (new_navigation_info.url != navigation_info_.url) |
1389 return true; | 1385 return true; |
1390 | 1386 |
1391 if (new_navigation_info.referrer != navigation_info_.referrer) | 1387 if (new_navigation_info.referrer != navigation_info_.referrer) |
1392 return true; | 1388 return true; |
1393 | 1389 |
1394 return false; | 1390 return false; |
1395 } | 1391 } |
OLD | NEW |