|
25 | 25 |
|
26 | 26 | #include "atom/common/node_includes.h" |
27 | 27 |
|
28 | | -// Force all builtin modules to be referenced so they can actually run their |
29 | | -// DSO constructors, see http://git.io/DRIqCg. |
30 | | -#define REFERENCE_MODULE(name) \ |
31 | | - extern "C" void _register_ ## name(void); \ |
32 | | - void (*fp_register_ ## name)(void) = _register_ ## name |
33 | | -// Electron's builtin modules. |
34 | | -REFERENCE_MODULE(atom_browser_app); |
35 | | -REFERENCE_MODULE(atom_browser_auto_updater); |
36 | | -REFERENCE_MODULE(atom_browser_browser_view); |
37 | | -REFERENCE_MODULE(atom_browser_content_tracing); |
38 | | -REFERENCE_MODULE(atom_browser_debugger); |
39 | | -REFERENCE_MODULE(atom_browser_desktop_capturer); |
40 | | -REFERENCE_MODULE(atom_browser_dialog); |
41 | | -REFERENCE_MODULE(atom_browser_download_item); |
42 | | -REFERENCE_MODULE(atom_browser_global_shortcut); |
43 | | -REFERENCE_MODULE(atom_browser_menu); |
44 | | -REFERENCE_MODULE(atom_browser_net); |
45 | | -REFERENCE_MODULE(atom_browser_power_monitor); |
46 | | -REFERENCE_MODULE(atom_browser_power_save_blocker); |
47 | | -REFERENCE_MODULE(atom_browser_protocol); |
48 | | -REFERENCE_MODULE(atom_browser_render_process_preferences); |
49 | | -REFERENCE_MODULE(atom_browser_session); |
50 | | -REFERENCE_MODULE(atom_browser_system_preferences); |
51 | | -REFERENCE_MODULE(atom_browser_tray); |
52 | | -REFERENCE_MODULE(atom_browser_web_contents); |
53 | | -REFERENCE_MODULE(atom_browser_web_view_manager); |
54 | | -REFERENCE_MODULE(atom_browser_window); |
55 | | -REFERENCE_MODULE(atom_common_asar); |
56 | | -REFERENCE_MODULE(atom_common_clipboard); |
57 | | -REFERENCE_MODULE(atom_common_crash_reporter); |
58 | | -REFERENCE_MODULE(atom_common_native_image); |
59 | | -REFERENCE_MODULE(atom_common_notification); |
60 | | -REFERENCE_MODULE(atom_common_screen); |
61 | | -REFERENCE_MODULE(atom_common_shell); |
62 | | -REFERENCE_MODULE(atom_common_v8_util); |
63 | | -REFERENCE_MODULE(atom_renderer_ipc); |
64 | | -REFERENCE_MODULE(atom_renderer_web_frame); |
65 | | -#undef REFERENCE_MODULE |
| 28 | +#define ELECTRON_BUILTIN_MODULES(V) \ |
| 29 | + V(atom_browser_app) \ |
| 30 | + V(atom_browser_auto_updater) \ |
| 31 | + V(atom_browser_browser_view) \ |
| 32 | + V(atom_browser_content_tracing) \ |
| 33 | + V(atom_browser_debugger) \ |
| 34 | + V(atom_browser_desktop_capturer) \ |
| 35 | + V(atom_browser_dialog) \ |
| 36 | + V(atom_browser_download_item) \ |
| 37 | + V(atom_browser_global_shortcut) \ |
| 38 | + V(atom_browser_menu) \ |
| 39 | + V(atom_browser_net) \ |
| 40 | + V(atom_browser_power_monitor) \ |
| 41 | + V(atom_browser_power_save_blocker) \ |
| 42 | + V(atom_browser_protocol) \ |
| 43 | + V(atom_browser_render_process_preferences) \ |
| 44 | + V(atom_browser_session) \ |
| 45 | + V(atom_browser_system_preferences) \ |
| 46 | + V(atom_browser_tray) \ |
| 47 | + V(atom_browser_web_contents) \ |
| 48 | + V(atom_browser_web_view_manager) \ |
| 49 | + V(atom_browser_window) \ |
| 50 | + V(atom_common_asar) \ |
| 51 | + V(atom_common_clipboard) \ |
| 52 | + V(atom_common_crash_reporter) \ |
| 53 | + V(atom_common_native_image) \ |
| 54 | + V(atom_common_notification) \ |
| 55 | + V(atom_common_screen) \ |
| 56 | + V(atom_common_shell) \ |
| 57 | + V(atom_common_v8_util) \ |
| 58 | + V(atom_renderer_ipc) \ |
| 59 | + V(atom_renderer_web_frame) |
| 60 | + |
| 61 | +// This is used to load built-in modules. Instead of using |
| 62 | +// __attribute__((constructor)), we call the _register_<modname> |
| 63 | +// function for each built-in modules explicitly. This is only |
| 64 | +// forward declaration. The definitions are in each module's |
| 65 | +// implementation when calling the NODE_BUILTIN_MODULE_CONTEXT_AWARE. |
| 66 | +#define V(modname) void _register_##modname(); |
| 67 | +ELECTRON_BUILTIN_MODULES(V) |
| 68 | +#undef V |
66 | 69 |
|
67 | 70 | namespace atom { |
68 | 71 |
|
@@ -96,6 +99,12 @@ base::FilePath GetResourcesPath(bool is_browser) { |
96 | 99 | return resources_path; |
97 | 100 | } |
98 | 101 |
|
| 102 | +void RegisterBuiltinModules() { |
| 103 | +#define V(modname) _register_##modname(); |
| 104 | + ELECTRON_BUILTIN_MODULES(V) |
| 105 | +#undef V |
| 106 | +} |
| 107 | + |
99 | 108 | } // namespace |
100 | 109 |
|
101 | 110 | NodeBindings::NodeBindings(BrowserEnvironment browser_env) |
@@ -139,6 +148,9 @@ void NodeBindings::Initialize() { |
139 | 148 | // (we assume node::Init would not modify the parameters under embedded mode). |
140 | 149 | node::Init(nullptr, nullptr, nullptr, nullptr); |
141 | 150 |
|
| 151 | + // Explicitly register electron's builtin modules. |
| 152 | + RegisterBuiltinModules(); |
| 153 | + |
142 | 154 | #if defined(OS_WIN) |
143 | 155 | // uv_init overrides error mode to suppress the default crash dialog, bring |
144 | 156 | // it back if user wants to show it. |
|
0 commit comments