summaryrefslogtreecommitdiff
path: root/chromium/chrome/renderer/extensions/app_hooks_delegate.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/renderer/extensions/app_hooks_delegate.h')
-rw-r--r--chromium/chrome/renderer/extensions/app_hooks_delegate.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/chromium/chrome/renderer/extensions/app_hooks_delegate.h b/chromium/chrome/renderer/extensions/app_hooks_delegate.h
new file mode 100644
index 00000000000..da546fb5eb5
--- /dev/null
+++ b/chromium/chrome/renderer/extensions/app_hooks_delegate.h
@@ -0,0 +1,108 @@
+// Copyright 2017 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 CHROME_RENDERER_EXTENSIONS_APP_HOOKS_DELEGATE_H_
+#define CHROME_RENDERER_EXTENSIONS_APP_HOOKS_DELEGATE_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "chrome/renderer/extensions/chrome_v8_extension_handler.h"
+#include "extensions/renderer/bindings/api_binding_hooks_delegate.h"
+#include "v8/include/v8.h"
+
+class GURL;
+
+namespace content {
+class RenderFrame;
+}
+
+namespace extensions {
+class APIRequestHandler;
+class Dispatcher;
+class ScriptContext;
+
+// The custom hooks for the chrome.app API.
+class AppHooksDelegate : public APIBindingHooksDelegate {
+ public:
+ using GetterCallback =
+ base::Callback<void(const v8::PropertyCallbackInfo<v8::Value>& info)>;
+
+ AppHooksDelegate(Dispatcher* dispatcher, APIRequestHandler* request_handler);
+ ~AppHooksDelegate() override;
+
+ // APIBindingHooksDelegate:
+ APIBindingHooks::RequestResult HandleRequest(
+ const std::string& method_name,
+ const APISignature* signature,
+ v8::Local<v8::Context> context,
+ std::vector<v8::Local<v8::Value>>* arguments,
+ const APITypeReferenceMap& refs) override;
+ void InitializeTemplate(v8::Isolate* isolate,
+ v8::Local<v8::ObjectTemplate> object_template,
+ const APITypeReferenceMap& type_refs) override;
+
+ // Total misnomer. Returns true if there is a hosted app associated with
+ // |script_context| active in this process. This naming is to match the
+ // chrome.app function it implements.
+ bool GetIsInstalled(ScriptContext* script_context) const;
+
+ private:
+ // A helper class to handle IPC message sending/receiving. Isolated from
+ // AppHooksDelegate to avoid multiple inheritence.
+ class IPCHelper : public ChromeV8ExtensionHandler {
+ public:
+ explicit IPCHelper(AppHooksDelegate* owner);
+ ~IPCHelper() override;
+
+ // Sends the IPC message to the browser to get the install state of the
+ // app.
+ void SendGetAppInstallStateMessage(content::RenderFrame* render_frame,
+ const GURL& url,
+ int request_id);
+
+ private:
+ // IPC::Listener:
+ bool OnMessageReceived(const IPC::Message& message) override;
+
+ // Handle for ExtensionMsg_GetAppInstallStateResponse; just forwards to
+ // AppHooksDelegate.
+ void OnAppInstallStateResponse(const std::string& state, int request_id);
+
+ AppHooksDelegate* owner_ = nullptr;
+
+ DISALLOW_COPY_AND_ASSIGN(IPCHelper);
+ };
+
+ // Returns the manifest of the extension associated with the frame.
+ v8::Local<v8::Value> GetDetails(ScriptContext* script_context) const;
+
+ // Determines the install state for the extension associated with the frame.
+ // Note that this could be "disabled" for hosted apps when the user visits the
+ // site but doesn't have the app enabled. The response is determined
+ // asynchronously before completing the request with the given |request_id|.
+ void GetInstallState(ScriptContext* script_context, int request_id);
+
+ // Returns the "running state" (one of running, cannot run, and ready to run)
+ // for the extension associated with the frame of the script context.
+ const char* GetRunningState(ScriptContext* script_context) const;
+
+ // Handle for ExtensionMsg_GetAppInstallStateResponse.
+ void OnAppInstallStateResponse(const std::string& state, int request_id);
+
+ // Dispatcher handle. Not owned.
+ Dispatcher* dispatcher_ = nullptr;
+
+ APIRequestHandler* request_handler_ = nullptr;
+
+ IPCHelper ipc_helper_;
+
+ GetterCallback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(AppHooksDelegate);
+};
+
+} // namespace extensions
+
+#endif // CHROME_RENDERER_EXTENSIONS_APP_HOOKS_DELEGATE_H_