summaryrefslogtreecommitdiff
path: root/chromium/chrome/renderer/extensions/app_hooks_delegate.h
blob: da546fb5eb5a06271b6478672220d52a55a74573 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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_