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 #ifndef COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_
      6 #define COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_
      7 
      8 #include "base/strings/string16.h"
      9 
     10 namespace content {
     11 class BrowserContext;
     12 class RenderViewHost;
     13 class WebContents;
     14 }
     15 
     16 // An interface that controls a RenderViewContextMenu instance from observers.
     17 // This interface is designed mainly for controlling the instance while showing
     18 // so we can add a context-menu item that takes long time to create its text,
     19 // such as retrieving the item text from a server. The simplest usage is:
     20 // 1. Adding an item with temporary text;
     21 // 2. Posting a background task that creates the item text, and;
     22 // 3. Calling UpdateMenuItem() in the callback function.
     23 // The following snippet describes the simple usage that updates a context-menu
     24 // item with this interface.
     25 //
     26 //   class MyTask : public net::URLFetcherDelegate {
     27 //    public:
     28 //     MyTask(RenderViewContextMenuProxy* proxy, int id)
     29 //         : proxy_(proxy),
     30 //           id_(id) {
     31 //     }
     32 //     virtual ~MyTask() {
     33 //     }
     34 //     virtual void OnURLFetchComplete(const net::URLFetcher* source,
     35 //                                     const GURL& url,
     36 //                                     const net::URLRequestStatus& status,
     37 //                                     int response,
     38 //                                     const net::ResponseCookies& cookies,
     39 //                                     const std::string& data) {
     40 //       bool enabled = response == 200;
     41 //       const char* text = enabled ? "OK" : "ERROR";
     42 //       proxy_->UpdateMenuItem(id_, enabled, base::ASCIIToUTF16(text));
     43 //     }
     44 //     void Start(const GURL* url, net::URLRequestContextGetter* context) {
     45 //       fetcher_.reset(new URLFetcher(url, URLFetcher::GET, this));
     46 //       fetcher_->SetRequestContext(context);
     47 //       content::AssociateURLFetcherWithRenderView(
     48 //           fetcher_.get(),
     49 //           proxy_->GetRenderViewHost()->GetSiteInstance()->GetSite(),
     50 //           proxy_->GetRenderViewHost()->GetProcess()->GetID(),
     51 //           proxy_->GetRenderViewHost()->GetRoutingID());
     52 //       fetcher_->Start();
     53 //     }
     54 //
     55 //    private:
     56 //     URLFetcher fetcher_;
     57 //     RenderViewContextMenuProxy* proxy_;
     58 //     int id_;
     59 //   };
     60 //
     61 //   void RenderViewContextMenu::AppendEditableItems() {
     62 //     // Add a menu item with temporary text shown while we create the final
     63 //     // text.
     64 //     menu_model_.AddItemWithStringId(IDC_MY_ITEM, IDC_MY_TEXT);
     65 //
     66 //     // Start a task that creates the final text.
     67 //     my_task_ = new MyTask(this, IDC_MY_ITEM);
     68 //     my_task_->Start(...);
     69 //   }
     70 //
     71 class RenderViewContextMenuProxy {
     72  public:
     73   // Add a menu item to a context menu.
     74   virtual void AddMenuItem(int command_id, const base::string16& title) = 0;
     75   virtual void AddCheckItem(int command_id, const base::string16& title) = 0;
     76   virtual void AddSeparator() = 0;
     77 
     78   // Add a submenu item to a context menu.
     79   virtual void AddSubMenu(int command_id,
     80                           const base::string16& label,
     81                           ui::MenuModel* model) = 0;
     82 
     83   // Update the status and text of the specified context-menu item.
     84   virtual void UpdateMenuItem(int command_id,
     85                               bool enabled,
     86                               bool hidden,
     87                               const base::string16& title) = 0;
     88 
     89   // Retrieve the given associated objects with a context menu.
     90   virtual content::RenderViewHost* GetRenderViewHost() const = 0;
     91   virtual content::WebContents* GetWebContents() const = 0;
     92   virtual content::BrowserContext* GetBrowserContext() const = 0;
     93 };
     94 
     95 #endif  // COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_
     96