Parcourir la source

Add set_boolean_preference for Firefox Profile.pm

Daniel Gempesaw il y a 11 ans
Parent
commit
7c7a07e48f
2 fichiers modifiés avec 93 ajouts et 51 suppressions
  1. 27 11
      lib/Selenium/Remote/Driver/Firefox/Profile.pm
  2. 66 40
      t/Firefox-Profile.t

+ 27 - 11
lib/Selenium/Remote/Driver/Firefox/Profile.pm

@@ -89,13 +89,15 @@ sub set_preference {
         my $value = $prefs{$_};
         my $clean_value = '';
 
-        if (blessed($value) and $value->isa("JSON::Boolean")) {
-            $clean_value = $value ? "true" : "false";
-        }
-        elsif ($value =~ /^(['"]).*\1$/ or looks_like_number($value)) {
+        if ($value =~ /^(['"]).*\1$/ or looks_like_number($value)) {
+            # plain integers: 0, 1, 32768, or integers wrapped in strings:
+            # "0", "1", "20140204". in either case, there's nothing for us
+            # to do.
             $clean_value = $value;
         }
         else {
+            # otherwise it's hopefully a string that we'll need to
+            # quote on our own
             $clean_value = '"' . $value . '"';
         }
 
@@ -103,9 +105,28 @@ sub set_preference {
     }
 }
 
-sub set_preferences {
+=method set_boolean_preference
+
+Set preferences that require boolean values of 'true' or 'false'. You
+can set multiple preferences at once. For string or integer
+preferences, use C<set_preference()>.
+
+    $profile->set_boolean_preference("false.pref" => 0);
+    # user_pref("false.pref", false);
+
+    $profile->set_boolean_preference("true.pref" => 1);
+    # user_pref("true.pref", true);
+
+=cut
+
+sub set_boolean_preference {
     my ($self, %prefs) = @_;
-    $self->set_preference(%prefs);
+
+    foreach (keys %prefs) {
+        my $value = $prefs{$_};
+
+        $self->{user_prefs}->{$_} = $value ? 'true' : 'false';
+    }
 }
 
 =method get_preference
@@ -147,11 +168,6 @@ sub add_extension {
     push (@{$self->{extensions}}, $xpi_abs_path);
 }
 
-sub path {
-    my $self = shift;
-    return $self->{profile_dir};
-}
-
 sub _encode {
     my $self = shift;
 

+ 66 - 40
t/Firefox-Profile.t

@@ -75,49 +75,75 @@ CUSTOM_EXTENSION_LOADED: {
            "custom profile with extension loaded");
 }
 
-PREFERENCES_FORMATTING: {
+PREFERENCES: {
     my $profile = Selenium::Remote::Driver::Firefox::Profile->new();
-    my $prefs = {
-        'string' => "howdy, there",
-        'integer' => 12345,
-        'true' => JSON::true,
-        'false' => JSON::false,
-        'string.like.integer' => '"12345"',
-    };
-
-    my %expected = map {
-        my $q = $_ eq 'string' ? '"' : '';
-        $_ => $q . $prefs->{$_} . $q
-    } keys %$prefs;
-
-    $profile->set_preference(%$prefs);
-
-    foreach (keys %$prefs) {
-        cmp_ok($profile->get_preference($_), "eq", $expected{$_},
-               "$_ preference is formatted properly");
+    # We're keeping the expected values together as we accumulate them
+    # so we can validate them all at the end in the pack_and_unpack
+    # section
+    my $expected = {};
+
+  STRINGS_AND_INTEGERS: {
+        my $prefs = {
+            'string' => "howdy, there",
+            'integer' => 12345,
+            'string.like.integer' => '"12345"',
+        };
+
+        foreach (keys %$prefs) {
+            my $q = $_ eq 'string' ? '"' : '';
+            $expected->{$_} = $q . $prefs->{$_} . $q;
+        }
+
+        $profile->set_preference(%$prefs);
+
+        foreach (keys %$prefs) {
+            cmp_ok($profile->get_preference($_), "eq", $expected->{$_},
+                   "$_ preference is formatted properly");
+        }
     }
 
-    my $encoded = $profile->_encode();
-    my $fh = File::Temp->new();
-    print $fh decode_base64($encoded);
-    close $fh;
-    my $zip = Archive::Extract->new(
-        archive => $fh->filename,
-        type => "zip"
-    );
-    my $tempdir = File::Temp->newdir();
-    my $ok = $zip->extract( to => $tempdir );
-    my $outdir = $zip->extract_path;
-
-    my $filename = $tempdir . "/user.js";
-    open ($fh, "<", $filename);
-    my (@file) = <$fh>;
-    close ($fh);
-    my $userjs = join('', @file);
-
-    foreach (keys %expected) {
-        cmp_ok($userjs, "=~", qr/$expected{$_}\);/,
-               "$_ preference is formatted properly after packing and unpacking");
+  BOOLEANS: {
+        my $prefs = {
+            'boolean.true' => 1,
+            'boolean.false' => 0,
+        };
+
+        foreach (keys %$prefs) {
+            $expected->{$_} = $prefs->{$_} ? 'true' : 'false';
+        }
+
+        $profile->set_boolean_preference(%$prefs);
+
+        foreach (keys %$prefs) {
+            cmp_ok($profile->get_preference($_), "eq", $expected->{$_},
+                   "$_ pref is formatted correctly");
+        }
+    }
+
+  PACK_AND_UNPACK: {
+        my $encoded = $profile->_encode();
+        my $fh = File::Temp->new();
+        print $fh decode_base64($encoded);
+        close $fh;
+        my $zip = Archive::Extract->new(
+            archive => $fh->filename,
+            type => "zip"
+        );
+        my $tempdir = File::Temp->newdir();
+        my $ok = $zip->extract( to => $tempdir );
+        my $outdir = $zip->extract_path;
+
+        my $filename = $tempdir . "/user.js";
+        open ($fh, "<", $filename);
+        my (@file) = <$fh>;
+        close ($fh);
+        my $userjs = join('', @file);
+
+        foreach (keys %$expected) {
+            my $value = $expected->{$_};
+            cmp_ok($userjs, "=~", qr/$value\);/,
+                   "$_ preference is formatted properly after packing and unpacking");
+        }
     }
 }