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