blob: a5063296a8b0377ed394af5c35c7265b858fa1c6 [file] [log] [blame]
{% filter format_blink_cpp_source_code %}
{% include 'copyright_block.txt' %}
#include "bindings/core/v8/ConditionalFeaturesForCore.h"
{% for include in includes %}
#include "{{include}}"
{% endfor %}
namespace blink {
namespace {
InstallConditionalFeaturesFunction g_old_install_conditional_features_function =
nullptr;
InstallConditionalFeaturesOnGlobalFunction
g_old_install_conditional_features_on_global_function = nullptr;
InstallPendingConditionalFeatureFunction
g_old_install_pending_conditional_feature_function = nullptr;
void InstallConditionalFeaturesForCore(
const WrapperTypeInfo* wrapper_type_info,
const ScriptState* script_state,
v8::Local<v8::Object> prototype_object,
v8::Local<v8::Function> interface_object) {
(*g_old_install_conditional_features_function)(
wrapper_type_info, script_state, prototype_object, interface_object);
ExecutionContext* execution_context = ExecutionContext::From(script_state);
if (!execution_context)
return;
v8::Isolate* isolate = script_state->GetIsolate();
const DOMWrapperWorld& world = script_state->World();
// TODO(iclelland): Unify ContextFeatureSettings with the rest of the
// conditional features.
if (wrapper_type_info == &V8Window::wrapperTypeInfo) {
auto* settings = ContextFeatureSettings::From(
execution_context,
ContextFeatureSettings::CreationMode::kDontCreateIfNotExists);
if (settings && settings->isMojoJSEnabled()) {
v8::Local<v8::Object> instance_object =
script_state->GetContext()->Global();
V8Window::installMojoJS(isolate, world, instance_object, prototype_object,
interface_object);
}
if (settings && settings->isMojoJSTestEnabled()) {
v8::Local<v8::Object> instance_object =
script_state->GetContext()->Global();
V8Window::installMojoJSTest(isolate, world, instance_object,
prototype_object, interface_object);
}
}
// TODO(iclelland): Extract this common code out of ConditionalFeaturesForCore
// and ConditionalFeaturesForModules into a block.
{% for interface in installers_by_interface %}
if (wrapper_type_info == &{{interface.v8_class}}::wrapperTypeInfo) {
{% if interface.is_global %}
v8::Local<v8::Object> instance_object =
script_state->GetContext()->Global();
{% endif %}
{% for installer in interface.installers %}
if ({{installer.condition}}(execution_context)) {
{{installer.v8_class_or_partial}}::{{installer.install_method}}(
isolate, world, {% if interface.is_global %}instance_object{% else %}v8::Local<v8::Object>(){% endif %}, prototype_object, interface_object);
}
{% endfor %}
}
{% endfor %}
}
void InstallConditionalFeaturesOnGlobalForCore(
const WrapperTypeInfo* wrapper_type_info,
const ScriptState* script_state) {
(*g_old_install_conditional_features_on_global_function)(wrapper_type_info,
script_state);
// TODO(chasej): Generate this logic at compile-time, based on interfaces with
// [SecureContext] attribute.
if (wrapper_type_info == &V8Window::wrapperTypeInfo) {
V8Window::InstallConditionalFeaturesOnGlobal(script_state->GetContext(),
script_state->World());
}
}
void InstallPendingConditionalFeatureForCore(const String& feature,
const ScriptState* script_state) {
(*g_old_install_pending_conditional_feature_function)(feature, script_state);
// TODO(iclelland): Extract this common code out of ConditionalFeaturesForCore
// and ConditionalFeaturesForModules into a block.
{% if installers_by_feature %}
v8::Local<v8::Object> prototype_object;
v8::Local<v8::Function> interface_object;
v8::Isolate* isolate = script_state->GetIsolate();
const DOMWrapperWorld& world = script_state->World();
V8PerContextData* context_data = script_state->PerContextData();
{% for feature in installers_by_feature %}
if (feature == {{feature.name_constant}}) {
{% for installer in feature.installers %}
{% if installer.interface_is_global %}
{{installer.v8_class_or_partial}}::{{installer.install_method}}(
isolate, world, script_state->GetContext()->Global(),
v8::Local<v8::Object>(), v8::Local<v8::Function>());
{% else %}
if (context_data->GetExistingConstructorAndPrototypeForType(
&{{installer.v8_class}}::wrapperTypeInfo, &prototype_object, &interface_object)) {
{{installer.v8_class_or_partial}}::{{installer.install_method}}(
isolate, world, v8::Local<v8::Object>(), prototype_object, interface_object);
}
{% endif %}
{% endfor %}
}
{% endfor %}
{% endif %}
}
} // namespace
void RegisterInstallConditionalFeaturesForCore() {
g_old_install_conditional_features_function =
SetInstallConditionalFeaturesFunction(&InstallConditionalFeaturesForCore);
g_old_install_conditional_features_on_global_function =
SetInstallConditionalFeaturesOnGlobalFunction(
&InstallConditionalFeaturesOnGlobalForCore);
g_old_install_pending_conditional_feature_function =
SetInstallPendingConditionalFeatureFunction(
&InstallPendingConditionalFeatureForCore);
}
} // namespace blink
{% endfilter %}{# format_blink_cpp_source_code #}