| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_EXTENSIONS_CHROME_EXTENSION_FUNCTION_DETAILS_H_ |
| #define CHROME_BROWSER_EXTENSIONS_CHROME_EXTENSION_FUNCTION_DETAILS_H_ |
| |
| #include "base/memory/raw_ptr.h" |
| #include "ui/gfx/native_widget_types.h" |
| |
| class Browser; |
| class ExtensionFunction; |
| |
| // Provides Chrome-specific details to ExtensionFunction |
| // implementations. |
| class ChromeExtensionFunctionDetails { |
| public: |
| // Constructs a new ChromeExtensionFunctionDetails instance for |function|. |
| // This instance does not own |function|. |function| must outlive this |
| // instance. |
| explicit ChromeExtensionFunctionDetails(ExtensionFunction* function); |
| |
| ChromeExtensionFunctionDetails(const ChromeExtensionFunctionDetails&) = |
| delete; |
| ChromeExtensionFunctionDetails& operator=( |
| const ChromeExtensionFunctionDetails&) = delete; |
| |
| ~ChromeExtensionFunctionDetails(); |
| |
| // Gets the "current" browser, if any. |
| // |
| // Many extension APIs operate relative to the current browser, which is the |
| // browser the calling code is running inside of. For example, popups and tabs |
| // all have a containing browser, but background pages and notification |
| // bubbles do not. |
| // |
| // If there is no containing window, the current browser defaults to the |
| // foremost one. |
| // |
| // Incognito browsers are not considered unless the calling extension has |
| // incognito access enabled. |
| // |
| // This method can return NULL if there is no matching browser, which can |
| // happen if only incognito windows are open, or early in startup or shutdown |
| // shutdown when there are no active windows. |
| // |
| // TODO(devlin): This method is incredibly non-deterministic (sometimes just |
| // returning "any" browser), and almost never the right thing to use. Instead, |
| // use ExtensionFunction::GetSenderWebContents(). We should get rid of this. |
| Browser* GetCurrentBrowser() const; |
| |
| // Find a UI surface to display any UI (like a permission prompt) for the |
| // extension calling this function. This will check, in order of preference, |
| // - The current window for the function (as defined by |
| // WindowControllerList::CurrentWindowForFunction()), |
| // - The sender web contents |
| // - Open app windows |
| // - A browser with the same profile |
| gfx::NativeWindow GetNativeWindowForUI(); |
| |
| // Returns a pointer to the associated ExtensionFunction |
| ExtensionFunction* function() { return function_; } |
| const ExtensionFunction* function() const { return function_; } |
| |
| private: |
| // The function for which these details have been created. Must outlive the |
| // ChromeExtensionFunctionDetails instance. |
| raw_ptr<ExtensionFunction> function_; |
| }; |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_CHROME_EXTENSION_FUNCTION_DETAILS_H_ |