extensionUtils: Allow getCurrentExtension() to be called from anyone
Currently it's assumed only an extension can call this method. However it can be useful if any part of the shell want to know if it was invoked by an extension. https://bugzilla.gnome.org/show_bug.cgi?id=770717
This commit is contained in:
parent
384e01b368
commit
c405081d89
@ -21,14 +21,25 @@ const ExtensionType = {
|
|||||||
// Maps uuid -> metadata object
|
// Maps uuid -> metadata object
|
||||||
const extensions = {};
|
const extensions = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getCurrentExtension:
|
||||||
|
*
|
||||||
|
* Returns the current extension, or null if not called from an extension.
|
||||||
|
*/
|
||||||
function getCurrentExtension() {
|
function getCurrentExtension() {
|
||||||
let stack = (new Error()).stack;
|
let stack = (new Error()).stack.split('\n');
|
||||||
|
let extensionStackLine;
|
||||||
|
|
||||||
// Assuming we're importing this directly from an extension (and we shouldn't
|
// Search for an occurrence of an extension stack frame
|
||||||
// ever not be), its UUID should be directly in the path here.
|
// Start at 1 because 0 is the stack frame of this function
|
||||||
let extensionStackLine = stack.split('\n')[1];
|
for (let i = 1; i < stack.length; i++) {
|
||||||
|
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
|
||||||
|
extensionStackLine = stack[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!extensionStackLine)
|
if (!extensionStackLine)
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
|
|
||||||
// The stack line is like:
|
// The stack line is like:
|
||||||
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
@ -38,7 +49,7 @@ function getCurrentExtension() {
|
|||||||
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
||||||
if (!match)
|
if (!match)
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
|
|
||||||
let path = match[1];
|
let path = match[1];
|
||||||
let file = Gio.File.new_for_path(path);
|
let file = Gio.File.new_for_path(path);
|
||||||
@ -52,7 +63,7 @@ function getCurrentExtension() {
|
|||||||
file = file.get_parent();
|
file = file.get_parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user