App-FirefoxMultiAccountContainersUtils
view release on metacpan or search on metacpan
lib/App/FirefoxMultiAccountContainersUtils.pm view on Meta::CPAN
our %argspec0_profile = (
profile => {
# XXX not observed yet by pericmd-lite when setting default value for
# args, only 'default' clause is checked. so we currently still set
# default value manually in _get_containers_json
schema => 'firefox::local_profile_name::default_first*',
pos => 0,
},
);
our %argspecopt_profile = (
profile => {
# XXX not observed yet by pericmd-lite when setting default value for
# args, only 'default' clause is checked. so we currently still set
# default value manually in _get_containers_json
schema => 'firefox::local_profile_name::default_first*',
},
);
sub _get_containers_json {
require App::FirefoxUtils;
require File::Copy;
require File::Slurper;
require Firefox::Util::Profile;
require JSON::MaybeXS;
my ($args, $do_backup) = @_;
my $res;
if ($do_backup) {
$res = App::FirefoxUtils::firefox_is_running();
return [500, "Can't check if Firefox is running: $res->[0] - $res->[1]"]
unless $res->[0] == 200;
if ($args->{-dry_run}) {
log_info "[DRY-RUN] Note that Firefox is still running, ".
"you should stop Firefox first when actually modifying containers";
} else {
return [412, "Please stop Firefox first"] if $res->[2];
}
}
$res = Firefox::Util::Profile::list_firefox_profiles(detail=>1);
return [500, "Can't list Firefox profiles: $res->[0] - $res->[1]"]
unless $res->[0] == 200;
# set default value of args, this will eventually be removed if pericmd has
# observed x.perl.default_value_rules
#use DDC; print "D1:"; dd $args;
$args->{profile} //= $res->[2][0]{name};
#use DDC; print "D2:"; dd $args;
my $path;
{
for (@{ $res->[2] }) {
next unless $_->{name} eq $args->{profile};
$path = $_->{path};
last;
}
}
return [404, "No such Firefox profile '$args->{profile}', ".
"available profiles include: ".
join(", ", map {$_->{name}} @{$res->[2]})]
unless defined $path;
$path = "$path/containers.json";
return [412, "Can't find '$path', is this Firefox using Multi-Account Containers?"]
unless (-f $path);
unless ($args->{-dry_run} || !$do_backup) {
log_info "Backing up $path to $path~ ...";
File::Copy::copy($path, "$path~") or
return [500, "Can't backup $path to $path~: $!"];
}
my $json = JSON::MaybeXS::decode_json(File::Slurper::read_text($path));
[200, "OK", {path=>$path, content=>$json}];
}
sub _complete_container {
require Firefox::Util::Profile;
my %args = @_;
# XXX if firefox profile is already specified, only list containers for that
# profile.
my $res = Firefox::Util::Profile::list_firefox_profiles();
$res->[0] == 200 or return {message => "Can't list Firefox profiles: $res->[0] - $res->[1]"};
my %containers;
for my $profile (@{ $res->[2] }) {
my $cres = firefox_mua_list_containers(profile => $profile);
$cres->[0] == 200 or next;
for (@{ $cres->[2] }) {
next unless $_->{public};
next unless $_->{name};
$containers{ $_->{name} }++;
}
}
Complete::Util::complete_hash_key(
word => $args{word},
hash => \%containers,
);
}
$SPEC{firefox_mua_list_containers} = {
v => 1.1,
summary => "List Firefox Multi-Account Containers add-on's containers",
args => {
%argspec0_profile,
},
};
sub firefox_mua_list_containers {
my %args = @_;
my $res;
$res = _get_containers_json(\%args, 0);
return $res unless $res->[0] == 200;
my $json = $res->[2]{content};
( run in 1.088 second using v1.01-cache-2.11-cpan-39bf76dae61 )