PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.12
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.12
1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 All 36 releases
← All changes | desktop-mode.php +153 -111 0.9.7 → 1.1.12 View file →
@@ -1,10 +1,10 @@
1 1 <?php
2 2 /**
3 - * Plugin Name: Desktop Mode
4 - * Plugin URI: https://github.com/WordPress/desktop-mode
3 + * Plugin Name: OpenStation
4 + * Plugin URI: https://github.com/WordPress/openstation
5 5 * Description: Renders the WordPress admin as a desktop OS. Admin screens become draggable, resizable, minimizable windows floating on a desktop with a dock. Purely opt-in per user.
6 - * Version: 0.9.7
6 + * Version: 1.1.12
7 7 * Requires at least: 6.0
8 8 * Requires PHP: 7.4
9 9 * Author: Daniel López Sánchez
10 10 * Author URI: https://github.com/allterraindeveloper
@@ -10,18 +10,19 @@
10 10 * Author URI: https://github.com/allterraindeveloper
11 11 * License: GPLv2 or later
12 12 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
13 13 * Text Domain: desktop-mode
14 + * Domain Path: /languages
14 15 *
15 - * @package WPDesktopMode
16 + * @package OpenStation
16 17 */
17 18
18 19 defined( 'ABSPATH' ) || exit;
19 20
20 -define( 'DESKTOP_MODE_VERSION', '0.9.7' );
21 -define( 'DESKTOP_MODE_FILE', __FILE__ );
22 -define( 'DESKTOP_MODE_DIR', plugin_dir_path( __FILE__ ) );
23 -define( 'DESKTOP_MODE_URL', plugin_dir_url( __FILE__ ) );
21 +define( 'OPENSTATION_VERSION', '1.1.12' );
22 +define( 'OPENSTATION_FILE', __FILE__ );
23 +define( 'OPENSTATION_DIR', plugin_dir_path( __FILE__ ) );
24 +define( 'OPENSTATION_URL', plugin_dir_url( __FILE__ ) );
24 25
25 26 /**
26 27 * Whether the current request needs the admin-rendering modules.
27 28 *
@@ -27,9 +28,9 @@
27 28 *
28 29 * Most of the plugin must load on every request — feature modules
29 30 * register REST routes, record content mutations that can originate
30 31 * on the frontend (comment submission, WooCommerce orders, plugin-
31 - * driven post saves), and expose `desktop_mode_register_*()` APIs
32 + * driven post saves), and expose `openstation_register_*()` APIs
32 33 * that third-party plugins call from their own `init` hooks in any
33 34 * context. But the admin *rendering* layer (shell markup, asset
34 35 * enqueues, the chromeless bridge, admin notices, migrations, the
35 36 * `wp_ajax_*` save handler) only ever fires on hooks that don't
@@ -41,13 +42,11 @@
41 42 * defined until `parse_request`), cron, WP-CLI, and the PHPUnit
42 43 * environment (the test bootstrap loads the plugin outside admin
43 44 * context but exercises the render layer directly).
44 45 *
45 - * @since 0.9.7
46 - *
47 46 * @return bool True to load the admin-rendering modules.
48 47 */
49 -function desktop_mode_request_needs_admin_modules() {
48 +function openstation_request_needs_admin_modules() {
50 49 $needs = is_admin()
51 50 || wp_doing_cron()
52 51 || ( defined( 'WP_CLI' ) && WP_CLI )
53 52 || ( defined( 'WP_TESTS_DOMAIN' ) )
@@ -57,9 +56,9 @@
57 56 // Early REST sniff. False positives just load a little more
58 57 // code (safe direction); plain-permalink REST is covered by
59 58 // the `rest_route` query var.
60 59 $rest_prefix = function_exists( 'rest_get_url_prefix' ) ? rest_get_url_prefix() : 'wp-json';
61 - $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? (string) $_SERVER['REQUEST_URI'] : '';
60 + $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? (string) esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
62 61 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- request-shape sniff only, no data is read.
63 62 if ( ( '' !== $rest_prefix && false !== strpos( $request_uri, '/' . $rest_prefix ) ) || isset( $_GET['rest_route'] ) ) {
64 63 $needs = true;
65 64 }
@@ -72,18 +71,16 @@
72 71 * that internally dispatches `desktop-mode/v1` REST routes via
73 72 * `rest_do_request()` outside a sniffable REST request can force
74 73 * the full load by returning true.
75 74 *
76 - * @since 0.9.7
77 - *
78 75 * @param bool $needs Whether the current request loads the
79 76 * admin-rendering module set.
80 77 */
81 - return (bool) apply_filters( 'desktop_mode_load_admin_modules', $needs );
78 + return (bool) apply_filters( 'openstation_load_admin_modules', $needs );
82 79 }
83 80
84 81 // Foundation primitives — must load before anything that consumes them.
85 -require_once DESKTOP_MODE_DIR . 'includes/core/registry-factory.php';
82 +require_once OPENSTATION_DIR . 'includes/core/registry-factory.php';
86 83
87 84 // Routing helpers register filters at file-load time but call
88 85 // chromeless / classic detection helpers (still in helpers.php)
89 86 // at hook-fire time — both files load before any hook fires, so
@@ -88,74 +85,128 @@
88 85 // chromeless / classic detection helpers (still in helpers.php)
89 86 // at hook-fire time — both files load before any hook fires, so
90 87 // the order is strict-but-flexible. Routing first because it is
91 88 // the smaller, more isolated piece.
92 -require_once DESKTOP_MODE_DIR . 'includes/core/routing.php';
89 +require_once OPENSTATION_DIR . 'includes/core/routing.php';
93 90
94 -require_once DESKTOP_MODE_DIR . 'includes/helpers.php';
91 +require_once OPENSTATION_DIR . 'includes/helpers.php';
95 92
96 93 // Dock + payload assembly. Loaded right after helpers.php so the
97 -// foundational `desktop_mode_is_enabled()` etc. exist by the time
94 +// foundational `openstation_is_enabled()` etc. exist by the time
98 95 // any payload function is invoked at hook-fire time.
99 -require_once DESKTOP_MODE_DIR . 'includes/core/payload.php';
100 -require_once DESKTOP_MODE_DIR . 'includes/assets.php';
101 -require_once DESKTOP_MODE_DIR . 'includes/admin-bar.php';
102 -require_once DESKTOP_MODE_DIR . 'includes/session.php';
103 -require_once DESKTOP_MODE_DIR . 'includes/presence.php';
104 -require_once DESKTOP_MODE_DIR . 'includes/nonce-refresh.php';
105 -require_once DESKTOP_MODE_DIR . 'includes/sticky-notes/heartbeat.php';
106 -require_once DESKTOP_MODE_DIR . 'includes/os-settings.php';
107 -require_once DESKTOP_MODE_DIR . 'includes/seen-intros.php';
108 -require_once DESKTOP_MODE_DIR . 'includes/portal.php';
109 -require_once DESKTOP_MODE_DIR . 'includes/default-window.php';
110 -require_once DESKTOP_MODE_DIR . 'includes/themes-tabs.php';
111 -require_once DESKTOP_MODE_DIR . 'includes/media-query.php';
112 -require_once DESKTOP_MODE_DIR . 'includes/accents.php';
113 -require_once DESKTOP_MODE_DIR . 'includes/toast-types.php';
114 -require_once DESKTOP_MODE_DIR . 'includes/registries/native-windows.php';
115 -require_once DESKTOP_MODE_DIR . 'includes/registries/window-tabs.php';
116 -require_once DESKTOP_MODE_DIR . 'includes/registries/icons.php';
117 -require_once DESKTOP_MODE_DIR . 'includes/registries/wallpapers.php';
118 -require_once DESKTOP_MODE_DIR . 'includes/registries/widgets.php';
119 -require_once DESKTOP_MODE_DIR . 'includes/components.php';
120 -require_once DESKTOP_MODE_DIR . 'includes/commands.php';
121 -require_once DESKTOP_MODE_DIR . 'includes/settings-tabs.php';
122 -require_once DESKTOP_MODE_DIR . 'includes/dock-rail-renderer.php';
123 -require_once DESKTOP_MODE_DIR . 'includes/title-bar-buttons.php';
124 -require_once DESKTOP_MODE_DIR . 'includes/unfocus-effects.php';
125 -require_once DESKTOP_MODE_DIR . 'includes/window-links.php';
126 -require_once DESKTOP_MODE_DIR . 'includes/window-chrome.php';
127 -require_once DESKTOP_MODE_DIR . 'includes/window-notices.php';
128 -require_once DESKTOP_MODE_DIR . 'includes/wallpapers.php';
129 -require_once DESKTOP_MODE_DIR . 'includes/widgets/heartbeat.php';
130 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-comments.php';
131 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-post-stats.php';
132 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-site-views.php';
133 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-jazz-quote.php';
134 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-starter.php';
135 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-notes.php';
136 -require_once DESKTOP_MODE_DIR . 'includes/widgets/widget-focus-timer.php';
137 -require_once DESKTOP_MODE_DIR . 'includes/extended-options.php';
138 -require_once DESKTOP_MODE_DIR . 'includes/oauth-relay.php';
139 -require_once DESKTOP_MODE_DIR . 'includes/ai-copilot/bootstrap.php';
96 +require_once OPENSTATION_DIR . 'includes/core/payload.php';
97 +require_once OPENSTATION_DIR . 'includes/assets.php';
98 +require_once OPENSTATION_DIR . 'includes/admin-bar.php';
99 +// Loaded before the session: `openstation_sanitize_session()` calls
100 +// `openstation_sanitize_workspace_profile()` on every desktop it reads.
101 +require_once OPENSTATION_DIR . 'includes/workspaces.php';
102 +require_once OPENSTATION_DIR . 'includes/session.php';
103 +require_once OPENSTATION_DIR . 'includes/multisite.php';
104 +require_once OPENSTATION_DIR . 'includes/presence.php';
105 +require_once OPENSTATION_DIR . 'includes/nonce-refresh.php';
106 +require_once OPENSTATION_DIR . 'includes/os-settings.php';
107 +require_once OPENSTATION_DIR . 'includes/mobile.php';
108 +// The About journal is still lazy — this file only registers its authenticated
109 +// AJAX action. Load the registration unconditionally so alternate admin-ajax
110 +// bootstraps cannot skip it while classifying the request shape.
111 +require_once OPENSTATION_DIR . 'includes/about-feed.php';
112 +require_once OPENSTATION_DIR . 'includes/seen-intros.php';
113 +// One-time data migrations. After os-settings.php and seen-intros.php,
114 +// whose meta-key constants and helpers the migrations call.
115 +//
116 +// Unconditional, unlike the rest of the admin-only set below, because
117 +// its activation hook has to be registered on ANY request that can
118 +// dispatch activation. `activate_plugin()` includes the plugin file and
119 +// fires `activate_<basename>` in whatever context it was called from,
120 +// and a programmatic activation (a Playground Blueprint, a provisioning
121 +// script) need not look like an admin request at all. Registering the
122 +// runner's `admin_init` hook on a frontend request costs nothing: it
123 +// never fires there.
124 +require_once OPENSTATION_DIR . 'includes/migrations.php';
125 +require_once OPENSTATION_DIR . 'includes/portal.php';
126 +require_once OPENSTATION_DIR . 'includes/default-window.php';
127 +// Solo window rendering mode (`?openstation_solo=<id>`). Unconditional
128 +// because `includes/render/` reads its flag, and because extensions
129 +// (the Electron adapter) call its helpers from their own hooks.
130 +require_once OPENSTATION_DIR . 'includes/solo-window.php';
131 +// The shell screen (`admin.php?page=openstation`) and the one "this
132 +// request paints the shell" predicate. Unconditional because modules
133 +// loaded outside the admin block (PWA, native windows, desktop themes)
134 +// gate on it.
135 +require_once OPENSTATION_DIR . 'includes/shell-screen.php';
136 +require_once OPENSTATION_DIR . 'includes/themes-tabs.php';
137 +require_once OPENSTATION_DIR . 'includes/media-query.php';
138 +require_once OPENSTATION_DIR . 'includes/accents.php';
139 +require_once OPENSTATION_DIR . 'includes/toast-types.php';
140 +require_once OPENSTATION_DIR . 'includes/wp-icon-registry.php';
141 +require_once OPENSTATION_DIR . 'includes/registries/native-windows.php';
142 +require_once OPENSTATION_DIR . 'includes/registries/window-tabs.php';
143 +require_once OPENSTATION_DIR . 'includes/registries/icons.php';
144 +require_once OPENSTATION_DIR . 'includes/registries/wallpapers.php';
145 +require_once OPENSTATION_DIR . 'includes/registries/widgets.php';
146 +require_once OPENSTATION_DIR . 'includes/components.php';
147 +require_once OPENSTATION_DIR . 'includes/commands.php';
148 +require_once OPENSTATION_DIR . 'includes/settings-tabs.php';
149 +require_once OPENSTATION_DIR . 'includes/dock-rail-renderer.php';
150 +require_once OPENSTATION_DIR . 'includes/title-bar-buttons.php';
151 +require_once OPENSTATION_DIR . 'includes/window-actions.php';
152 +require_once OPENSTATION_DIR . 'includes/unfocus-effects.php';
153 +require_once OPENSTATION_DIR . 'includes/window-links.php';
154 +require_once OPENSTATION_DIR . 'includes/window-chrome.php';
155 +require_once OPENSTATION_DIR . 'includes/window-notices.php';
156 +require_once OPENSTATION_DIR . 'includes/wallpapers.php';
157 +require_once OPENSTATION_DIR . 'includes/mio.php';
158 +require_once OPENSTATION_DIR . 'includes/mio-portrait.php';
159 +require_once OPENSTATION_DIR . 'includes/widgets/heartbeat.php';
160 +require_once OPENSTATION_DIR . 'includes/widgets/widget-comments.php';
161 +require_once OPENSTATION_DIR . 'includes/widgets/widget-post-stats.php';
162 +require_once OPENSTATION_DIR . 'includes/widgets/widget-site-views.php';
163 +require_once OPENSTATION_DIR . 'includes/widgets/widget-jazz-quote.php';
164 +require_once OPENSTATION_DIR . 'includes/widgets/widget-starter.php';
165 +require_once OPENSTATION_DIR . 'includes/widgets/widget-notes.php';
166 +require_once OPENSTATION_DIR . 'includes/widgets/widget-drafts.php';
167 +require_once OPENSTATION_DIR . 'includes/widgets/widget-focus-timer.php';
168 +require_once OPENSTATION_DIR . 'includes/extended-options.php';
169 +require_once OPENSTATION_DIR . 'includes/oauth-relay.php';
170 +require_once OPENSTATION_DIR . 'includes/ai-copilot/bootstrap.php';
140 171 // Content-changes must load before the recycle bin — the bin's
141 172 // changelog delegates into the generic recorder.
142 -require_once DESKTOP_MODE_DIR . 'includes/content-changes.php';
143 -require_once DESKTOP_MODE_DIR . 'includes/recycle-bin/bootstrap.php';
144 -require_once DESKTOP_MODE_DIR . 'includes/desktop-files/bootstrap.php';
145 -require_once DESKTOP_MODE_DIR . 'includes/notes/bootstrap.php';
146 -require_once DESKTOP_MODE_DIR . 'includes/posts-window/bootstrap.php';
147 -require_once DESKTOP_MODE_DIR . 'includes/pages-window/bootstrap.php';
148 -require_once DESKTOP_MODE_DIR . 'includes/users-window/bootstrap.php';
149 -require_once DESKTOP_MODE_DIR . 'includes/user-edit-window/bootstrap.php';
150 -require_once DESKTOP_MODE_DIR . 'includes/plugins-window/bootstrap.php';
151 -require_once DESKTOP_MODE_DIR . 'includes/comments-window/bootstrap.php';
152 -require_once DESKTOP_MODE_DIR . 'includes/my-wordpress/bootstrap.php';
153 -require_once DESKTOP_MODE_DIR . 'includes/content-graph/bootstrap.php';
154 -require_once DESKTOP_MODE_DIR . 'includes/living-tree/bootstrap.php';
155 -require_once DESKTOP_MODE_DIR . 'includes/games/bootstrap.php';
156 -require_once DESKTOP_MODE_DIR . 'includes/pwa.php';
157 -require_once DESKTOP_MODE_DIR . 'includes/compat/divi.php';
173 +require_once OPENSTATION_DIR . 'includes/content-changes.php';
174 +require_once OPENSTATION_DIR . 'includes/recycle-bin/bootstrap.php';
175 +require_once OPENSTATION_DIR . 'includes/desktop-files/bootstrap.php';
176 +require_once OPENSTATION_DIR . 'includes/desktop-themes/bootstrap.php';
177 +require_once OPENSTATION_DIR . 'includes/notes/bootstrap.php';
178 +// Posts, Pages, Users, User Edit, Plugins and Comments are App
179 +// Framework apps (`apps/posts/`, `apps/pages/`, `apps/users/`,
180 +// `apps/user-edit/`, `apps/plugins/`, `apps/comments/`): each `.os.php`
181 +// pulls in its own PHP parts (permissions, REST fields and routes,
182 +// AJAX handlers) when the framework loads it on `init`.
183 +// Station Home is an App Framework app (`apps/station-home/`); only
184 +// its plugin-card registry — a public API plugins call on `init` —
185 +// lives here, so it exists before any app loads.
186 +require_once OPENSTATION_DIR . 'includes/station-home/cards.php';
187 +require_once OPENSTATION_DIR . 'includes/my-wordpress/bootstrap.php';
188 +require_once OPENSTATION_DIR . 'includes/content-graph/bootstrap.php';
189 +// The App Framework: `.os.php` windows under `apps/` (Code Blue lives
190 +// there) and any directory a plugin adds. Loads after the registries
191 +// it registers into and after the feature modules, so an app can
192 +// hook them.
193 +require_once OPENSTATION_DIR . 'includes/framework/wordpress.php';
194 +require_once OPENSTATION_DIR . 'includes/living-tree/bootstrap.php';
195 +require_once OPENSTATION_DIR . 'includes/games/bootstrap.php';
196 +require_once OPENSTATION_DIR . 'includes/agents/bootstrap.php';
197 +require_once OPENSTATION_DIR . 'includes/network/bootstrap.php';
198 +// First run: install / first-enable stamps, the "Turn on" plugin row
199 +// action, the activation nudge and the shell tour's gate. Loads on
200 +// every request because the stamps are written from the AJAX toggle,
201 +// the portal and the activation hook, none of them an admin render.
202 +require_once OPENSTATION_DIR . 'includes/first-run/bootstrap.php';
203 +// Deactivation feedback: the dialog on the Plugins screen and the
204 +// REST route it posts to. Unconditional so the route registers on
205 +// REST requests; it stores nothing on the site.
206 +require_once OPENSTATION_DIR . 'includes/feedback/bootstrap.php';
207 +require_once OPENSTATION_DIR . 'includes/pwa.php';
208 +require_once OPENSTATION_DIR . 'includes/compat/divi.php';
158 209
159 210 // Admin-rendering modules — every hook these register (`admin_init`,
160 211 // `admin_enqueue_scripts`, `in_admin_header`, `admin_head`,
161 212 // `admin_footer`, `admin_body_class`, `wp_ajax_*`) only fires inside
@@ -160,31 +211,28 @@
160 211 // `admin_enqueue_scripts`, `in_admin_header`, `admin_head`,
161 212 // `admin_footer`, `admin_body_class`, `wp_ajax_*`) only fires inside
162 213 // wp-admin, so pure frontend page views skip them entirely. REST,
163 214 // cron, WP-CLI, admin-ajax, and the PHPUnit environment all load
164 -// them (see desktop_mode_request_needs_admin_modules()). Relative
215 +// them (see openstation_request_needs_admin_modules()). Relative
165 216 // order preserved from the historical unconditional list.
166 -if ( desktop_mode_request_needs_admin_modules() ) {
167 - require_once DESKTOP_MODE_DIR . 'includes/ajax.php';
168 - // One-time data migrations. After os-settings.php so the meta-key
169 - // constant and save/sanitize helpers the migrations call already exist.
170 - require_once DESKTOP_MODE_DIR . 'includes/migrations.php';
171 - require_once DESKTOP_MODE_DIR . 'includes/welcome-dialog.php';
172 - require_once DESKTOP_MODE_DIR . 'includes/update-notice.php';
173 - require_once DESKTOP_MODE_DIR . 'includes/core-notices.php';
174 - require_once DESKTOP_MODE_DIR . 'includes/plugin-notices.php';
175 - require_once DESKTOP_MODE_DIR . 'includes/render.php';
176 - require_once DESKTOP_MODE_DIR . 'includes/devtools.php';
217 +if ( openstation_request_needs_admin_modules() ) {
218 + require_once OPENSTATION_DIR . 'includes/ajax.php';
219 + require_once OPENSTATION_DIR . 'includes/welcome-dialog.php';
220 + require_once OPENSTATION_DIR . 'includes/update-notice.php';
221 + require_once OPENSTATION_DIR . 'includes/core-notices.php';
222 + require_once OPENSTATION_DIR . 'includes/plugin-notices.php';
223 + require_once OPENSTATION_DIR . 'includes/render.php';
224 + require_once OPENSTATION_DIR . 'includes/devtools.php';
177 225 }
178 226
179 227 /**
180 228 * Cascade-deactivate plugins that declare `Requires Plugins: desktop-mode`
181 - * when Desktop Mode itself is being deactivated.
229 + * when OpenStation itself is being deactivated.
182 230 *
183 - * Without this, a third-party plugin like `wp-desktop-messages` keeps
184 - * its `init` hook armed after Desktop Mode is turned off — the next
231 + * Without this, a third-party plugin like `os-messages` keeps
232 + * its `init` hook armed after OpenStation is turned off — the next
185 233 * admin page load fires `init`, the hook calls
186 - * `desktop_mode_register_window()`, and the request fatals because the
234 + * `openstation_register_window()`, and the request fatals because the
187 235 * function lives in the plugin we just deactivated. The user lands on
188 236 * a white screen instead of the classic admin we redirected them to.
189 237 *
190 238 * WordPress's plugin dependency feature (6.5+) blocks ACTIVATION of a
@@ -191,9 +239,9 @@
191 239 * plugin whose declared `Requires Plugins` aren't all active, but it
192 240 * does NOT auto-deactivate dependents when their requirement is
193 241 * deactivated through any path — the user is expected to do that
194 242 * themselves. The classic plugins.php list shows a warning; the REST
195 - * controller (`PUT /wp/v2/plugins/desktop-mode/desktop-mode`) we route
243 + * controller (`PUT /wp/v2/plugins/desktop-mode/openstation`) we route
196 244 * through has no such gate. So we cascade ourselves.
197 245 *
198 246 * Timing: `deactivate_plugins()` writes `active_plugins` to the DB
199 247 * AFTER its hook loop finishes. If we call `deactivate_plugins()`
@@ -206,26 +254,24 @@
206 254 * Matching uses `WP_Plugin_Dependencies::get_dependents()` keyed on
207 255 * our own directory slug (`dirname( plugin_basename( __FILE__ ) )`),
208 256 * which is the same string the dependent's `Requires Plugins` header
209 257 * resolves against. The filter below lets sites widen or narrow the
210 - * cascade — e.g. add a plugin that wraps `desktop_mode_*` calls in
258 + * cascade — e.g. add a plugin that wraps `openstation_*` calls in
211 259 * `function_exists` guards and shouldn't be torn down with us.
212 260 *
213 261 * Silent deactivation (`$silent = true`) skips the dependent
214 262 * plugins' own deactivation hooks. Those callbacks routinely call
215 - * `desktop_mode_*` helpers expecting Desktop Mode to be wired up;
263 + * `openstation_*` helpers expecting OpenStation to be wired up;
216 264 * firing them mid-cascade can trigger the same fatal we're trying
217 265 * to prevent. Skipping them is the safer default.
218 - *
219 - * @since 0.8.2
220 266 */
221 -function desktop_mode_cascade_deactivate_dependents() {
267 +function openstation_cascade_deactivate_dependents() {
222 268 // Defer to `shutdown` so we run AFTER the outer
223 269 // `deactivate_plugins()` has flushed its own option update.
224 270 // Inline cascade gets clobbered by the outer's write-back.
225 - add_action( 'shutdown', 'desktop_mode_do_cascade_deactivate', 0 );
271 + add_action( 'shutdown', 'openstation_do_cascade_deactivate', 0 );
226 272 }
227 -register_deactivation_hook( DESKTOP_MODE_FILE, 'desktop_mode_cascade_deactivate_dependents' );
273 +register_deactivation_hook( OPENSTATION_FILE, 'openstation_cascade_deactivate_dependents' );
228 274
229 275 /**
230 276 * The deferred cascade body — runs on `shutdown` after the
231 277 * outer `deactivate_plugins()` has persisted its update.
@@ -231,14 +277,12 @@
231 277 * outer `deactivate_plugins()` has persisted its update.
232 278 *
233 279 * Split out from the `register_deactivation_hook` callback because
234 280 * that callback must register, not execute, the cascade. See
235 - * {@see desktop_mode_cascade_deactivate_dependents} for the timing
281 + * {@see openstation_cascade_deactivate_dependents} for the timing
236 282 * rationale.
237 - *
238 - * @since 0.8.2
239 283 */
240 -function desktop_mode_do_cascade_deactivate() {
284 +function openstation_do_cascade_deactivate() {
241 285 if ( ! class_exists( 'WP_Plugin_Dependencies' ) ) {
242 286 // Pre-6.5 — no native dependency tracking. Sites running an
243 287 // old Core won't have dependents declared via the header
244 288 // either; nothing to cascade.
@@ -246,9 +290,9 @@
246 290 }
247 291
248 292 WP_Plugin_Dependencies::initialize();
249 293
250 - $slug = dirname( plugin_basename( DESKTOP_MODE_FILE ) );
294 + $slug = dirname( plugin_basename( OPENSTATION_FILE ) );
251 295 if ( '' === $slug || '.' === $slug ) {
252 296 return;
253 297 }
254 298
@@ -255,18 +299,16 @@
255 299 $dependents = (array) WP_Plugin_Dependencies::get_dependents( $slug );
256 300
257 301 /**
258 302 * Filter the list of plugin files to cascade-deactivate when
259 - * Desktop Mode is deactivated. Defaults to every plugin whose
303 + * OpenStation is deactivated. Defaults to every plugin whose
260 304 * `Requires Plugins` header lists our directory slug.
261 305 *
262 - * @since 0.8.2
263 - *
264 306 * @param string[] $dependents Plugin files (e.g. "foo/foo.php").
265 - * @param string $slug Desktop Mode's directory slug.
307 + * @param string $slug OpenStation's directory slug.
266 308 */
267 309 $dependents = (array) apply_filters(
268 - 'desktop_mode_cascade_deactivate_dependents',
310 + 'openstation_cascade_deactivate_dependents',
269 311 $dependents,
270 312 $slug
271 313 );
272 314