Firefox-Marionette
view release on metacpan or search on metacpan
lib/Firefox/Marionette.pm view on Meta::CPAN
$self->{marionette_binary} = $parameters{$deprecated_key};
}
}
if ( $parameters{binary} ) {
$self->{marionette_binary} = $parameters{binary};
}
return;
}
sub _store_restart_parameters {
my ( $self, %parameters ) = @_;
$self->{_restart_parameters} = { restart => 1 };
foreach my $key ( sort { $a cmp $b } keys %parameters ) {
next if ( $key eq 'profile' );
next if ( $key eq 'capabilities' );
next if ( $key eq 'timeout' );
next if ( $key eq 'geo' );
$self->{_restart_parameters}->{$key} = $parameters{$key};
}
return;
}
sub _init {
my ( $class, %parameters ) = @_;
my $self = bless {}, $class;
$self->_store_restart_parameters(%parameters);
$self->{last_message_id} = 0;
$self->{creation_pid} = $PROCESS_ID;
$self->{sleep_time_in_ms} = $parameters{sleep_time_in_ms};
$self->{force_scp_protocol} = $parameters{scp};
$self->{visible} = $parameters{visible};
$self->{force_webauthn} = $parameters{webauthn};
$self->{geo} = $parameters{geo};
foreach my $type (qw(nightly developer waterfox)) {
if ( defined $parameters{$type} ) {
$self->{requested_version}->{$type} = $parameters{$type};
}
}
if ( defined $parameters{survive} ) {
$self->{survive} = $parameters{survive};
}
$self->{extension_index} = 0;
$self->{debug} = $parameters{debug};
$self->{ssh_via_host} = $parameters{via};
$self->{reconnect_index} = $parameters{index};
$self->_get_marionette_parameter(%parameters);
if ( $parameters{console} ) {
$self->{console} = 1;
}
if ( defined $parameters{adb} ) {
$self->_setup_adb( $parameters{adb}, $parameters{port} );
}
if ( defined $parameters{host} ) {
if ( $OSNAME eq 'MSWin32' ) {
$parameters{user} ||= Win32::LoginName();
}
else {
$parameters{user} ||= getpwuid $EFFECTIVE_USER_ID;
}
if ( $parameters{host} =~ s/:(\d+)$//smx ) {
$parameters{port} = $1;
}
$parameters{port} ||= scalar getservbyname 'ssh', 'tcp';
$self->_setup_ssh(
$parameters{host}, $parameters{port},
$parameters{user}, $parameters{reconnect}
);
}
if ( defined $parameters{system_access} ) {
$self->{system_access} = $parameters{system_access};
}
else {
$self->{system_access} = 1;
}
if ( defined $parameters{width} ) {
$self->{window_width} = $parameters{width};
}
if ( defined $parameters{height} ) {
$self->{window_height} = $parameters{height};
}
if ( defined $parameters{trackable} ) {
$self->{trackable} = $parameters{trackable};
}
if ( defined $parameters{timezone} ) {
$self->{timezone} = $parameters{timezone};
}
$self->_load_specified_extensions(%parameters);
$self->_determine_mime_types(%parameters);
return $self;
}
sub _load_specified_extensions {
my ( $self, %parameters ) = @_;
if ( defined $parameters{har} ) {
$self->{_har} = $parameters{har};
require Firefox::Marionette::Extension::HarExportTrigger;
}
if ( $parameters{stealth} ) {
$self->{stealth} = 1;
require Firefox::Marionette::Extension::Stealth;
}
return;
}
sub _determine_mime_types {
my ( $self, %parameters ) = @_;
$self->{mime_types} = [
qw(
application/x-gzip
application/gzip
application/zip
application/pdf
application/octet-stream
application/msword
application/vnd.openxmlformats-officedocument.wordprocessingml.document
application/vnd.openxmlformats-officedocument.wordprocessingml.template
application/vnd.ms-word.document.macroEnabled.12
application/vnd.ms-word.template.macroEnabled.12
lib/Firefox/Marionette.pm view on Meta::CPAN
return $alive_pid;
}
sub _setup_profile {
my ($self) = @_;
if ( $self->{profile_name} ) {
$self->{_profile_directory} =
Firefox::Marionette::Profile->directory( $self->{profile_name} );
$self->{profile_path} =
File::Spec->catfile( $self->{_profile_directory}, 'prefs.js' );
}
else {
$self->{_profile_directory} =
File::Spec->catfile( $self->{_root_directory}, 'profile' );
$self->{_download_directory} =
File::Spec->catfile( $self->{_root_directory}, 'downloads' );
$self->{profile_path} =
File::Spec->catfile( $self->{_profile_directory}, 'prefs.js' );
}
return;
}
sub _reconnect {
my ( $self, %parameters ) = @_;
if ( $parameters{profile_name} ) {
$self->{profile_name} = $parameters{profile_name};
}
$self->{_reconnected} = 1;
if ( my $ssh = $self->_ssh() ) {
if ( my $pid = $self->_firefox_pid() ) {
if ( $self->_remote_process_running($pid) ) {
$self->{_firefox_pid} = $pid;
}
}
}
else {
if ( my $pid = $self->_get_local_reconnect_pid() ) {
if (
( kill 0, $pid )
&& ( my $port =
$self->_check_for_existing_local_firefox_process() )
)
{
$self->{_firefox_pid} = $pid;
}
}
}
my ( $host, $user );
if ( my $ssh = $self->_ssh() ) {
$host = $self->_ssh()->{host};
$user = $self->_ssh()->{user};
}
elsif (( $OSNAME eq 'MSWin32' )
|| ( $OSNAME eq 'cygwin' ) )
{
$user = Win32::LoginName();
$host = 'localhost';
}
else {
$user = getpwuid $EFFECTIVE_USER_ID;
$host = 'localhost';
}
my $quoted_user = defined $user ? quotemeta $user : q[];
if ( $self->_ssh() ) {
$self->_initialise_remote_uname();
}
$self->_check_visible(%parameters);
my $port = $self->_get_marionette_port();
defined $port
or Firefox::Marionette::Exception->throw(
"Existing firefox process could not be found at $user\@$host");
my $socket;
socket $socket,
$self->_using_unix_sockets_for_ssh_connection()
? Socket::PF_UNIX()
: Socket::PF_INET(), Socket::SOCK_STREAM(), 0
or Firefox::Marionette::Exception->throw(
"Failed to create a socket:$EXTENDED_OS_ERROR");
binmode $socket;
my $sock_addr = $self->_get_sock_addr( $host, $port );
connect $socket, $sock_addr
or Firefox::Marionette::Exception->throw(
"Failed to re-connect to Firefox process at '$host:$port':$EXTENDED_OS_ERROR"
);
$self->{_socket} = $socket;
my $initial_response = $self->_read_from_socket();
$self->{marionette_protocol} = $initial_response->{marionetteProtocol};
$self->{application_type} = $initial_response->{applicationType};
$self->_compatibility_checks_for_older_marionette();
return $self->new_session( $parameters{capabilities} );
}
sub _compatibility_checks_for_older_marionette {
my ($self) = @_;
if ( !$self->marionette_protocol() ) {
if ( $self->{_initial_packet_size} == _OLD_INITIAL_PACKET_SIZE() ) {
$self->{_old_protocols_key} = 'type';
}
else {
$self->{_old_protocols_key} = 'name';
}
my $message_id = $self->_new_message_id();
$self->_send_request(
[
_COMMAND(), $message_id, 'getMarionetteID', 'to' => 'root'
]
);
my $next_message = $self->_read_from_socket();
$self->{marionette_id} = $next_message->{id};
}
return;
}
sub profile_directory {
my ($self) = @_;
return $self->{_profile_directory};
}
sub _pk11_tokendb_interface_preamble {
( run in 2.751 seconds using v1.01-cache-2.11-cpan-3fabe0161c3 )