Home | History | Annotate | Download | only in renderer_context_menu
      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