// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_ #define COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_ #include "base/strings/string16.h" namespace content { class BrowserContext; class RenderViewHost; class WebContents; } // An interface that controls a RenderViewContextMenu instance from observers. // This interface is designed mainly for controlling the instance while showing // so we can add a context-menu item that takes long time to create its text, // such as retrieving the item text from a server. The simplest usage is: // 1. Adding an item with temporary text; // 2. Posting a background task that creates the item text, and; // 3. Calling UpdateMenuItem() in the callback function. // The following snippet describes the simple usage that updates a context-menu // item with this interface. // // class MyTask : public net::URLFetcherDelegate { // public: // MyTask(RenderViewContextMenuProxy* proxy, int id) // : proxy_(proxy), // id_(id) { // } // virtual ~MyTask() { // } // virtual void OnURLFetchComplete(const net::URLFetcher* source, // const GURL& url, // const net::URLRequestStatus& status, // int response, // const net::ResponseCookies& cookies, // const std::string& data) { // bool enabled = response == 200; // const char* text = enabled ? "OK" : "ERROR"; // proxy_->UpdateMenuItem(id_, enabled, base::ASCIIToUTF16(text)); // } // void Start(const GURL* url, net::URLRequestContextGetter* context) { // fetcher_.reset(new URLFetcher(url, URLFetcher::GET, this)); // fetcher_->SetRequestContext(context); // content::AssociateURLFetcherWithRenderView( // fetcher_.get(), // proxy_->GetRenderViewHost()->GetSiteInstance()->GetSite(), // proxy_->GetRenderViewHost()->GetProcess()->GetID(), // proxy_->GetRenderViewHost()->GetRoutingID()); // fetcher_->Start(); // } // // private: // URLFetcher fetcher_; // RenderViewContextMenuProxy* proxy_; // int id_; // }; // // void RenderViewContextMenu::AppendEditableItems() { // // Add a menu item with temporary text shown while we create the final // // text. // menu_model_.AddItemWithStringId(IDC_MY_ITEM, IDC_MY_TEXT); // // // Start a task that creates the final text. // my_task_ = new MyTask(this, IDC_MY_ITEM); // my_task_->Start(...); // } // class RenderViewContextMenuProxy { public: // Add a menu item to a context menu. virtual void AddMenuItem(int command_id, const base::string16& title) = 0; virtual void AddCheckItem(int command_id, const base::string16& title) = 0; virtual void AddSeparator() = 0; // Add a submenu item to a context menu. virtual void AddSubMenu(int command_id, const base::string16& label, ui::MenuModel* model) = 0; // Update the status and text of the specified context-menu item. virtual void UpdateMenuItem(int command_id, bool enabled, bool hidden, const base::string16& title) = 0; // Retrieve the given associated objects with a context menu. virtual content::RenderViewHost* GetRenderViewHost() const = 0; virtual content::WebContents* GetWebContents() const = 0; virtual content::BrowserContext* GetBrowserContext() const = 0; }; #endif // COMPONENTS_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_PROXY_H_