-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCefExtensionHandlerAdapter.h
214 lines (193 loc) · 9.5 KB
/
CefExtensionHandlerAdapter.h
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
// Copyright © 2018 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#pragma once
#include "Stdafx.h"
#include "include\cef_extension.h"
#include "include\cef_extension_handler.h"
#include "BrowserSettings.h"
#include "CefExtensionWrapper.h"
#include "CefBrowserWrapper.h"
#include "CefGetExtensionResourceCallbackWrapper.h"
#include "WindowInfo.h"
using namespace CefSharp;
namespace CefSharp
{
namespace Internals
{
private class CefExtensionHandlerAdapter : public CefExtensionHandler
{
gcroot<IExtensionHandler^> _handler;
public:
CefExtensionHandlerAdapter(IExtensionHandler^ handler)
: _handler(handler)
{
}
~CefExtensionHandlerAdapter()
{
delete _handler;
_handler = nullptr;
}
///
// Called if the CefRequestContext::LoadExtension request fails. |result| will
// be the error code.
///
/*--cef()--*/
void OnExtensionLoadFailed(cef_errorcode_t result) override
{
_handler->OnExtensionLoadFailed((CefErrorCode)result);
}
///
// Called if the CefRequestContext::LoadExtension request succeeds.
// |extension| is the loaded extension.
///
/*--cef()--*/
void OnExtensionLoaded(CefRefPtr<CefExtension> extension) override
{
//TODO: Should this be auto disposed?
_handler->OnExtensionLoaded(gcnew CefExtensionWrapper(extension));
}
///
// Called after the CefExtension::Unload request has completed.
///
/*--cef()--*/
void OnExtensionUnloaded(CefRefPtr<CefExtension> extension) override
{
//TODO: Add comment to interface saying extension is only valid within the scope
//of this method as it's auto disposed
CefExtensionWrapper wrapper(extension);
_handler->OnExtensionUnloaded(%wrapper);
}
///
// Called when an extension needs a browser to host a background script
// specified via the "background" manifest key. The browser will have no
// visible window and cannot be displayed. |extension| is the extension that
// is loading the background script. |url| is an internally generated
// reference to an HTML page that will be used to load the background script
// via a <script> src attribute. To allow creation of the browser optionally
// modify |client| and |settings| and return false. To cancel creation of the
// browser (and consequently cancel load of the background script) return
// true. Successful creation will be indicated by a call to
// CefLifeSpanHandler::OnAfterCreated, and CefBrowserHost::IsBackgroundHost
// will return true for the resulting browser. See
// https://developer.chrome.com/extensions/event_pages for more information
// about extension background script usage.
///
/*--cef()--*/
bool OnBeforeBackgroundBrowser(CefRefPtr<CefExtension> extension,
const CefString& url,
CefRefPtr<CefClient>& client,
CefBrowserSettings& settings) override
{
BrowserSettings browserSettingsWrapper(&settings);
return _handler->OnBeforeBackgroundBrowser(gcnew CefExtensionWrapper(extension),
StringUtils::ToClr(url),
%browserSettingsWrapper);
}
///
// Called when an extension API (e.g. chrome.tabs.create) requests creation of
// a new browser. |extension| and |browser| are the source of the API call.
// |active_browser| may optionally be specified via the windowId property or
// returned via the GetActiveBrowser() callback and provides the default
// |client| and |settings| values for the new browser. |index| is the position
// value optionally specified via the index property. |url| is the URL that
// will be loaded in the browser. |active| is true if the new browser should
// be active when opened. To allow creation of the browser optionally modify
// |windowInfo|, |client| and |settings| and return false. To cancel creation
// of the browser return true. Successful creation will be indicated by a call
// to CefLifeSpanHandler::OnAfterCreated. Any modifications to |windowInfo|
// will be ignored if |active_browser| is wrapped in a CefBrowserView.
///
/*--cef()--*/
bool OnBeforeBrowser(CefRefPtr<CefExtension> extension,
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefBrowser> active_browser,
int index,
const CefString& url,
bool active,
CefWindowInfo& windowInfo,
CefRefPtr<CefClient>& client,
CefBrowserSettings& settings) override
{
BrowserSettings browserSettingsWrapper(&settings);
return _handler->OnBeforeBrowser(gcnew CefExtensionWrapper(extension),
gcnew CefBrowserWrapper(browser),
gcnew CefBrowserWrapper(active_browser),
index,
StringUtils::ToClr(url),
active,
gcnew WindowInfo(&windowInfo),
%browserSettingsWrapper);
}
///
// Called when no tabId is specified to an extension API call that accepts a
// tabId parameter (e.g. chrome.tabs.*). |extension| and |browser| are the
// source of the API call. Return the browser that will be acted on by the API
// call or return NULL to act on |browser|. The returned browser must share
// the same CefRequestContext as |browser|. Incognito browsers should not be
// considered unless the source extension has incognito access enabled, in
// which case |include_incognito| will be true.
///
/*--cef()--*/
CefRefPtr<CefBrowser> GetActiveBrowser(
CefRefPtr<CefExtension> extension,
CefRefPtr<CefBrowser> browser,
bool includeIncognito) override
{
//TODO: Should extension be auto disposed?
auto activeBrowser = _handler->GetActiveBrowser(gcnew CefExtensionWrapper(extension),
gcnew CefBrowserWrapper(browser),
includeIncognito);
if (activeBrowser == nullptr)
{
return nullptr;
}
//TODO: CLean this up
auto wrapper = static_cast<CefBrowserWrapper^>(activeBrowser);
return wrapper->Browser.get();
}
///
// Called when the tabId associated with |target_browser| is specified to an
// extension API call that accepts a tabId parameter (e.g. chrome.tabs.*).
// |extension| and |browser| are the source of the API call. Return true
// to allow access of false to deny access. Access to incognito browsers
// should not be allowed unless the source extension has incognito access
// enabled, in which case |include_incognito| will be true.
///
/*--cef()--*/
bool CanAccessBrowser(CefRefPtr<CefExtension> extension,
CefRefPtr<CefBrowser> browser,
bool includeIncognito,
CefRefPtr<CefBrowser> target_browser) override
{
return _handler->CanAccessBrowser(gcnew CefExtensionWrapper(extension),
gcnew CefBrowserWrapper(browser),
includeIncognito,
gcnew CefBrowserWrapper(target_browser));
}
///
// Called to retrieve an extension resource that would normally be loaded from
// disk (e.g. if a file parameter is specified to chrome.tabs.executeScript).
// |extension| and |browser| are the source of the resource request. |file| is
// the requested relative file path. To handle the resource request return
// true and execute |callback| either synchronously or asynchronously. For the
// default behavior which reads the resource from the extension directory on
// disk return false. Localization substitutions will not be applied to
// resources handled via this method.
///
/*--cef()--*/
bool GetExtensionResource(
CefRefPtr<CefExtension> extension,
CefRefPtr<CefBrowser> browser,
const CefString& file,
CefRefPtr<CefGetExtensionResourceCallback> callback) override
{
return _handler->GetExtensionResource(gcnew CefExtensionWrapper(extension),
gcnew CefBrowserWrapper(browser),
StringUtils::ToClr(file),
gcnew CefGetExtensionResourceCallbackWrapper(callback));
}
IMPLEMENT_REFCOUNTINGM(CefExtensionHandlerAdapter);
};
}
}