OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 5 #include <algorithm> |
6 #include <set> | 6 #include <set> |
7 | 7 |
8 #include "chrome/browser/tab_contents/render_view_context_menu.h" | 8 #include "chrome/browser/tab_contents/render_view_context_menu.h" |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "chrome/browser/prefs/pref_member.h" | 29 #include "chrome/browser/prefs/pref_member.h" |
30 #include "chrome/browser/prefs/pref_service.h" | 30 #include "chrome/browser/prefs/pref_service.h" |
31 #include "chrome/browser/profiles/profile.h" | 31 #include "chrome/browser/profiles/profile.h" |
32 #include "chrome/browser/profiles/profile_io_data.h" | 32 #include "chrome/browser/profiles/profile_io_data.h" |
33 #include "chrome/browser/search_engines/template_url.h" | 33 #include "chrome/browser/search_engines/template_url.h" |
34 #include "chrome/browser/search_engines/template_url_service.h" | 34 #include "chrome/browser/search_engines/template_url_service.h" |
35 #include "chrome/browser/search_engines/template_url_service_factory.h" | 35 #include "chrome/browser/search_engines/template_url_service_factory.h" |
36 #include "chrome/browser/spellchecker/spellcheck_host.h" | 36 #include "chrome/browser/spellchecker/spellcheck_host.h" |
37 #include "chrome/browser/spellchecker/spellcheck_host_metrics.h" | 37 #include "chrome/browser/spellchecker/spellcheck_host_metrics.h" |
38 #include "chrome/browser/spellchecker/spellchecker_platform_engine.h" | 38 #include "chrome/browser/spellchecker/spellchecker_platform_engine.h" |
| 39 #include "chrome/browser/tab_contents/spelling_menu_observer.h" |
39 #include "chrome/browser/translate/translate_manager.h" | 40 #include "chrome/browser/translate/translate_manager.h" |
40 #include "chrome/browser/translate/translate_prefs.h" | 41 #include "chrome/browser/translate/translate_prefs.h" |
41 #include "chrome/browser/translate/translate_tab_helper.h" | 42 #include "chrome/browser/translate/translate_tab_helper.h" |
42 #include "chrome/browser/ui/browser.h" | 43 #include "chrome/browser/ui/browser.h" |
43 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" | 44 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" |
44 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 45 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
45 #include "chrome/common/chrome_constants.h" | 46 #include "chrome/common/chrome_constants.h" |
46 #include "chrome/common/chrome_switches.h" | 47 #include "chrome/common/chrome_switches.h" |
47 #include "chrome/common/pref_names.h" | 48 #include "chrome/common/pref_names.h" |
48 #include "chrome/common/print_messages.h" | 49 #include "chrome/common/print_messages.h" |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 break; | 545 break; |
545 case WebContextMenuData::MediaTypePlugin: | 546 case WebContextMenuData::MediaTypePlugin: |
546 AppendPluginItems(); | 547 AppendPluginItems(); |
547 break; | 548 break; |
548 #ifdef WEBCONTEXT_MEDIATYPEFILE_DEFINED | 549 #ifdef WEBCONTEXT_MEDIATYPEFILE_DEFINED |
549 case WebContextMenuData::MediaTypeFile: | 550 case WebContextMenuData::MediaTypeFile: |
550 break; | 551 break; |
551 #endif | 552 #endif |
552 } | 553 } |
553 | 554 |
| 555 if (params_.is_editable) { |
| 556 // Add a menu item that shows suggestions from the Spelling service. |
| 557 PrefService* pref = profile_->GetPrefs(); |
| 558 bool use_spelling_service = |
| 559 pref && pref->GetBoolean(prefs::kSpellCheckUseSpellingService); |
| 560 if (use_spelling_service) { |
| 561 if (!spelling_menu_observer_.get()) |
| 562 spelling_menu_observer_.reset(new SpellingMenuObserver(this)); |
| 563 |
| 564 if (spelling_menu_observer_.get()) |
| 565 observers_.AddObserver(spelling_menu_observer_.get()); |
| 566 } |
| 567 } |
| 568 |
| 569 // Ask our observers to add their menu items. |
| 570 FOR_EACH_OBSERVER(RenderViewContextMenuObserver, observers_, |
| 571 InitMenu(params_)); |
| 572 |
554 if (params_.is_editable) | 573 if (params_.is_editable) |
555 AppendEditableItems(); | 574 AppendEditableItems(); |
556 else if (has_selection) | 575 else if (has_selection) |
557 AppendCopyItem(); | 576 AppendCopyItem(); |
558 | 577 |
559 if (has_selection) | 578 if (has_selection) |
560 AppendSearchProvider(); | 579 AppendSearchProvider(); |
561 | 580 |
562 if (!IsDevToolsURL(params_.page_url)) | 581 if (!IsDevToolsURL(params_.page_url)) |
563 AppendAllExtensionItems(); | 582 AppendAllExtensionItems(); |
564 | 583 |
565 AppendDeveloperItems(); | 584 AppendDeveloperItems(); |
566 } | 585 } |
567 | 586 |
568 void RenderViewContextMenu::LookUpInDictionary() { | 587 void RenderViewContextMenu::LookUpInDictionary() { |
569 // Used only in the Mac port. | 588 // Used only in the Mac port. |
570 NOTREACHED(); | 589 NOTREACHED(); |
571 } | 590 } |
572 | 591 |
| 592 void RenderViewContextMenu::AddMenuItem(int command_id, |
| 593 const string16& title) { |
| 594 menu_model_.AddItem(command_id, title); |
| 595 } |
| 596 |
| 597 void RenderViewContextMenu::UpdateMenuItem(int command_id, |
| 598 bool enabled, |
| 599 const string16& label) { |
| 600 // This function needs platform-specific implementation. |
| 601 NOTIMPLEMENTED(); |
| 602 } |
| 603 |
| 604 |
| 605 RenderViewHost* RenderViewContextMenu::GetRenderViewHost() const { |
| 606 return source_tab_contents_->render_view_host(); |
| 607 } |
| 608 |
| 609 Profile* RenderViewContextMenu::GetProfile() const { |
| 610 return profile_; |
| 611 } |
| 612 |
573 bool RenderViewContextMenu::AppendCustomItems() { | 613 bool RenderViewContextMenu::AppendCustomItems() { |
574 size_t total_items = 0; | 614 size_t total_items = 0; |
575 AddCustomItemsToMenu(params_.custom_items, 0, &total_items, this, | 615 AddCustomItemsToMenu(params_.custom_items, 0, &total_items, this, |
576 &menu_model_); | 616 &menu_model_); |
577 return total_items > 0; | 617 return total_items > 0; |
578 } | 618 } |
579 | 619 |
580 void RenderViewContextMenu::AppendDeveloperItems() { | 620 void RenderViewContextMenu::AppendDeveloperItems() { |
581 // Show Inspect Element in DevTools itself only in case of the debug | 621 // Show Inspect Element in DevTools itself only in case of the debug |
582 // devtools build. | 622 // devtools build. |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 menu_model_.AddSeparator(); | 826 menu_model_.AddSeparator(); |
787 | 827 |
788 // |spellcheck_host| can be null when the suggested word is | 828 // |spellcheck_host| can be null when the suggested word is |
789 // provided by Web SpellCheck API. | 829 // provided by Web SpellCheck API. |
790 SpellCheckHost* spellcheck_host = profile_->GetSpellCheckHost(); | 830 SpellCheckHost* spellcheck_host = profile_->GetSpellCheckHost(); |
791 if (spellcheck_host && spellcheck_host->GetMetrics()) | 831 if (spellcheck_host && spellcheck_host->GetMetrics()) |
792 spellcheck_host->GetMetrics()->RecordSuggestionStats(1); | 832 spellcheck_host->GetMetrics()->RecordSuggestionStats(1); |
793 } | 833 } |
794 | 834 |
795 // If word is misspelled, give option for "Add to dictionary" | 835 // If word is misspelled, give option for "Add to dictionary" |
796 if (!params_.misspelled_word.empty()) { | 836 if (!spelling_menu_observer_.get() && !params_.misspelled_word.empty()) { |
797 if (params_.dictionary_suggestions.empty()) { | 837 if (params_.dictionary_suggestions.empty()) { |
798 menu_model_.AddItem(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, | 838 menu_model_.AddItem(IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS, |
799 l10n_util::GetStringUTF16( | 839 l10n_util::GetStringUTF16( |
800 IDS_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS)); | 840 IDS_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS)); |
801 } | 841 } |
802 menu_model_.AddItemWithStringId(IDC_SPELLCHECK_ADD_TO_DICTIONARY, | 842 menu_model_.AddItemWithStringId(IDC_SPELLCHECK_ADD_TO_DICTIONARY, |
803 IDS_CONTENT_CONTEXT_ADD_TO_DICTIONARY); | 843 IDS_CONTENT_CONTEXT_ADD_TO_DICTIONARY); |
804 menu_model_.AddSeparator(); | 844 menu_model_.AddSeparator(); |
805 } | 845 } |
806 | 846 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 ExtensionMenuItem* item = manager->GetItemById(i->second); | 993 ExtensionMenuItem* item = manager->GetItemById(i->second); |
954 if (item) | 994 if (item) |
955 return item; | 995 return item; |
956 } | 996 } |
957 return NULL; | 997 return NULL; |
958 } | 998 } |
959 | 999 |
960 // Menu delegate functions ----------------------------------------------------- | 1000 // Menu delegate functions ----------------------------------------------------- |
961 | 1001 |
962 bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { | 1002 bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { |
| 1003 // If this command is is added by one of our observers, we dispatch it to the |
| 1004 // observer. |
| 1005 ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
| 1006 RenderViewContextMenuObserver* observer; |
| 1007 while ((observer = it.GetNext()) != NULL) { |
| 1008 if (observer->IsCommandIdSupported(id)) |
| 1009 return observer->IsCommandIdEnabled(id); |
| 1010 } |
| 1011 |
963 if (id == IDC_PRINT && | 1012 if (id == IDC_PRINT && |
964 (source_tab_contents_->content_restrictions() & | 1013 (source_tab_contents_->content_restrictions() & |
965 CONTENT_RESTRICTION_PRINT)) { | 1014 CONTENT_RESTRICTION_PRINT)) { |
966 return false; | 1015 return false; |
967 } | 1016 } |
968 | 1017 |
969 if (id == IDC_SAVE_PAGE && | 1018 if (id == IDC_SAVE_PAGE && |
970 (source_tab_contents_->content_restrictions() & | 1019 (source_tab_contents_->content_restrictions() & |
971 CONTENT_RESTRICTION_SAVE)) { | 1020 CONTENT_RESTRICTION_SAVE)) { |
972 return false; | 1021 return false; |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 if ((id < IDC_SPELLCHECK_LANGUAGES_FIRST) || | 1370 if ((id < IDC_SPELLCHECK_LANGUAGES_FIRST) || |
1322 (id >= IDC_SPELLCHECK_LANGUAGES_LAST)) | 1371 (id >= IDC_SPELLCHECK_LANGUAGES_LAST)) |
1323 return false; | 1372 return false; |
1324 | 1373 |
1325 std::vector<std::string> languages; | 1374 std::vector<std::string> languages; |
1326 return SpellCheckHost::GetSpellCheckLanguages(profile_, &languages) == | 1375 return SpellCheckHost::GetSpellCheckLanguages(profile_, &languages) == |
1327 (id - IDC_SPELLCHECK_LANGUAGES_FIRST); | 1376 (id - IDC_SPELLCHECK_LANGUAGES_FIRST); |
1328 } | 1377 } |
1329 | 1378 |
1330 void RenderViewContextMenu::ExecuteCommand(int id) { | 1379 void RenderViewContextMenu::ExecuteCommand(int id) { |
| 1380 // If this command is is added by one of our observers, we dispatch it to the |
| 1381 // observer. |
| 1382 ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
| 1383 RenderViewContextMenuObserver* observer; |
| 1384 while ((observer = it.GetNext()) != NULL) { |
| 1385 if (observer->IsCommandIdSupported(id)) |
| 1386 return observer->ExecuteCommand(id); |
| 1387 } |
| 1388 |
1331 // Check to see if one of the spell check language ids have been clicked. | 1389 // Check to see if one of the spell check language ids have been clicked. |
1332 if (id >= IDC_SPELLCHECK_LANGUAGES_FIRST && | 1390 if (id >= IDC_SPELLCHECK_LANGUAGES_FIRST && |
1333 id < IDC_SPELLCHECK_LANGUAGES_LAST) { | 1391 id < IDC_SPELLCHECK_LANGUAGES_LAST) { |
1334 const size_t language_number = id - IDC_SPELLCHECK_LANGUAGES_FIRST; | 1392 const size_t language_number = id - IDC_SPELLCHECK_LANGUAGES_FIRST; |
1335 std::vector<std::string> languages; | 1393 std::vector<std::string> languages; |
1336 SpellCheckHost::GetSpellCheckLanguages(profile_, &languages); | 1394 SpellCheckHost::GetSpellCheckLanguages(profile_, &languages); |
1337 if (language_number < languages.size()) { | 1395 if (language_number < languages.size()) { |
1338 StringPrefMember dictionary_language; | 1396 StringPrefMember dictionary_language; |
1339 dictionary_language.Init(prefs::kSpellCheckDictionary, | 1397 dictionary_language.Init(prefs::kSpellCheckDictionary, |
1340 profile_->GetPrefs(), NULL); | 1398 profile_->GetPrefs(), NULL); |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1854 g_browser_process->clipboard()); | 1912 g_browser_process->clipboard()); |
1855 } | 1913 } |
1856 | 1914 |
1857 void RenderViewContextMenu::MediaPlayerActionAt( | 1915 void RenderViewContextMenu::MediaPlayerActionAt( |
1858 const gfx::Point& location, | 1916 const gfx::Point& location, |
1859 const WebMediaPlayerAction& action) { | 1917 const WebMediaPlayerAction& action) { |
1860 RenderViewHost* rvh = source_tab_contents_->render_view_host(); | 1918 RenderViewHost* rvh = source_tab_contents_->render_view_host(); |
1861 rvh->Send(new ViewMsg_MediaPlayerActionAt( | 1919 rvh->Send(new ViewMsg_MediaPlayerActionAt( |
1862 rvh->routing_id(), location, action)); | 1920 rvh->routing_id(), location, action)); |
1863 } | 1921 } |
OLD | NEW |