1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" 6 7 #include "base/bind.h" 8 #include "base/message_loop/message_loop.h" 9 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" 12 #include "content/public/browser/notification_service.h" 13 #include "content/public/test/test_utils.h" 14 15 ContextMenuNotificationObserver::ContextMenuNotificationObserver( 16 int command_to_execute) 17 : command_to_execute_(command_to_execute) { 18 registrar_.Add(this, 19 chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN, 20 content::NotificationService::AllSources()); 21 } 22 23 ContextMenuNotificationObserver::~ContextMenuNotificationObserver() { 24 } 25 26 void ContextMenuNotificationObserver::Observe( 27 int type, 28 const content::NotificationSource& source, 29 const content::NotificationDetails& details) { 30 switch (type) { 31 case chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN: { 32 RenderViewContextMenu* context_menu = 33 content::Source<RenderViewContextMenu>(source).ptr(); 34 base::MessageLoop::current()->PostTask( 35 FROM_HERE, 36 base::Bind(&ContextMenuNotificationObserver::ExecuteCommand, 37 base::Unretained(this), 38 context_menu)); 39 break; 40 } 41 42 default: 43 NOTREACHED(); 44 } 45 } 46 47 void ContextMenuNotificationObserver::ExecuteCommand( 48 RenderViewContextMenu* context_menu) { 49 context_menu->ExecuteCommand(command_to_execute_, 0); 50 context_menu->Cancel(); 51 } 52 53 SaveLinkAsContextMenuObserver::SaveLinkAsContextMenuObserver( 54 const content::NotificationSource& source) 55 : ContextMenuNotificationObserver(IDC_CONTENT_CONTEXT_SAVELINKAS), 56 menu_visible_(false) { 57 } 58 59 SaveLinkAsContextMenuObserver::~SaveLinkAsContextMenuObserver() { 60 } 61 62 void SaveLinkAsContextMenuObserver::Observe( 63 int type, 64 const content::NotificationSource& source, 65 const content::NotificationDetails& details) { 66 switch (type) { 67 case chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN: { 68 menu_visible_ = true; 69 RenderViewContextMenu* context_menu = 70 content::Source<RenderViewContextMenu>(source).ptr(); 71 base::MessageLoop::current()->PostTask( 72 FROM_HERE, 73 base::Bind(&SaveLinkAsContextMenuObserver::Cancel, 74 base::Unretained(this), 75 context_menu)); 76 break; 77 } 78 79 default: 80 NOTREACHED(); 81 } 82 } 83 84 void SaveLinkAsContextMenuObserver::WaitForMenu() { 85 content::WindowedNotificationObserver menu_observer( 86 chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN, 87 content::NotificationService::AllSources()); 88 if (!menu_visible_) 89 menu_observer.Wait(); 90 menu_visible_ = false; 91 } 92 93 base::string16 SaveLinkAsContextMenuObserver::GetSuggestedFilename() { 94 return params_.suggested_filename; 95 } 96 97 void SaveLinkAsContextMenuObserver::Cancel( 98 RenderViewContextMenu* context_menu) { 99 params_ = context_menu->params(); 100 context_menu->Cancel(); 101 } 102