crx_unpack 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 35671687290d12fd310aad815c35a0d3c9fbf390
4
+ data.tar.gz: 068af8fe5bc7de7cbb50f611069a297fb5afab0d
5
+ SHA512:
6
+ metadata.gz: ba35e105088719caf5d0e54a2fe17eeab03540b70af3c6a1b448b5b592766b5872b5cf363b7681efe439623789c0503c2ef908c690a0db875dd5c9506421bffd
7
+ data.tar.gz: 25381eb5cf3f95cd4e06d290c02c4b6dc37043792991ccf4c0e29e250762ff1a2b970cdfe2317a6a38ddf7cafaa73394eeec67d4c230d4b4ba8e22f42703f116
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
@@ -0,0 +1,5 @@
1
+ ## 0.0.1
2
+
3
+ * Initial release
4
+ * Implement public methods `CrxUnpack#unpack`, `CrxUnpack#unpack_from_io`, `CrxUnpack#unpack_from_file`, `CrxUnpack#unpack_contents`, `CrxUnpack#unpack_contents_from_io`, `CrxUnpack#unpack_contents_from_file`, `CrxUnpack.unpack`, `CrxUnpack.unpack_from_io`, `CrxUnpack.unpack_from_file`, `CrxUnpack.unpack_contents`, `CrxUnpack.unpack_contents_from_io` and `CrxUnpack.unpack_contents_from_file`
5
+ * Add rspec test
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in crx_unpack.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Kensuke Nagae
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,40 @@
1
+ # CrxUnpack
2
+
3
+ [![Build Status](https://travis-ci.org/kyanny/crx_unpack.png)](https://travis-ci.org/kyanny/crx_unpack)
4
+
5
+ Unpack [Chrome extension (crx)](http://developer.chrome.com/extensions/crx.html) file
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'crx_unpack'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install crx_unpack
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ require 'crx_unpack'
25
+
26
+ data = open('extension.crx', 'rb').read
27
+ crx = CrxUnpack.unpack(data)
28
+ crx.zip #=> zip data of extension contents
29
+
30
+ # unzip extension contents into `./extension' directory
31
+ CrxUnpack.unpack_contents_from_file('extension.crx', './extension')
32
+ ```
33
+
34
+ ## Contributing
35
+
36
+ 1. Fork it
37
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
38
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
39
+ 4. Push to the branch (`git push origin my-new-feature`)
40
+ 5. Create new Pull Request
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new("spec")
5
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ require 'crx_unpack'
3
+
4
+ crx = ARGV.shift
5
+ dest = ARGV.shift
6
+ unless crx && dest
7
+ puts <<USAGE
8
+ Usage: #{File.basename($0)} extension.crx dest
9
+
10
+ USAGE
11
+ exit!
12
+ end
13
+
14
+ CrxUnpack.unpack_contents_from_file(crx, dest)
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'crx_unpack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "crx_unpack"
8
+ spec.version = CrxUnpack::VERSION
9
+ spec.authors = ["Kensuke Nagae"]
10
+ spec.email = ["kyanny@gmail.com"]
11
+ spec.description = %q{Unpack Chrome extension (crx) file}
12
+ spec.summary = %q{Unpack Chrome extension (crx) file}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.executables = %w(crx_unpack)
21
+
22
+ spec.add_dependency "rubyzip"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ end
@@ -0,0 +1,85 @@
1
+ require "crx_unpack/version"
2
+ require 'zip/zip'
3
+ require 'fileutils'
4
+
5
+ class CrxUnpack
6
+ attr_reader :magic, :version, :public_key_length, :signature_length, :public_key, :signature, :zip
7
+
8
+ def unpack(data)
9
+ @magic = data.slice!(0, 4)
10
+ @version = data.slice!(0, 4)
11
+ @public_key_length = data.slice!(0, 4).unpack("i*")[0]
12
+ @signature_length = data.slice!(0, 4).unpack("i*")[0]
13
+ @public_key = data.slice!(0, public_key_length)
14
+ @signature = data.slice!(0, signature_length)
15
+ @zip = data
16
+ self
17
+ end
18
+
19
+ def unpack_from_io(io)
20
+ io.binmode? || io.binmode
21
+ unpack(io.read)
22
+ end
23
+
24
+ def unpack_from_file(file)
25
+ unpack(open(file, 'rb').read)
26
+ end
27
+
28
+ def unpack_contents(data, dest, leave_zip_file=false)
29
+ unpack(data)
30
+ dest = File.expand_path(dest)
31
+ unless Dir.exists?(dest)
32
+ Dir.mkdir(dest)
33
+ end
34
+
35
+ Dir.chdir(dest) do
36
+ zip_file = 'extension.zip'
37
+ open(zip_file, 'wb'){ |f| f.write zip }
38
+
39
+ $stdout.reopen('/dev/null') # Ignore `Invalid date/time in zip entry' warning
40
+ zf = Zip::ZipFile.new(zip_file)
41
+ zf.each do |entry|
42
+ zf.extract(entry, entry.to_s)
43
+ end
44
+ $stdout.flush
45
+ $stdout.reopen(STDERR)
46
+
47
+ File.unlink(zip_file) unless leave_zip_file
48
+ end
49
+ end
50
+
51
+ def unpack_contents_from_io(io, dest, leave_zip_file=false)
52
+ io.binmode? || io.binmode
53
+ unpack_contents(io.read, dest, leave_zip_file)
54
+ end
55
+
56
+ def unpack_contents_from_file(file, dest, leave_zip_file=false)
57
+ unpack_contents(open(file, 'rb').read, dest, leave_zip_file)
58
+ end
59
+
60
+ class << self
61
+ def unpack(data)
62
+ new.unpack(data)
63
+ end
64
+
65
+ def unpack_from_io(io)
66
+ new.unpack_from_io(io)
67
+ end
68
+
69
+ def unpack_from_file(file)
70
+ new.unpack_from_file(file)
71
+ end
72
+
73
+ def unpack_contents(data, dest, leave_zip_file=false)
74
+ new.unpack_contents(data, dest, leave_zip_file)
75
+ end
76
+
77
+ def unpack_contents_from_io(io, dest, leave_zip_file=false)
78
+ new.unpack_contents_from_io(io, dest, leave_zip_file)
79
+ end
80
+
81
+ def unpack_contents_from_file(file, dest, leave_zip_file=false)
82
+ new.unpack_contents_from_file(file, dest, leave_zip_file)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ class CrxUnpack
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,164 @@
1
+ require 'crx_unpack'
2
+ require 'tmpdir'
3
+ require 'digest/sha1'
4
+
5
+ shared_context 'Move to temporary directory' do
6
+ before do
7
+ @pwd = Dir.pwd
8
+ @tmpdir = Dir.mktmpdir
9
+ Dir.chdir(@tmpdir)
10
+ end
11
+
12
+ after do
13
+ Dir.chdir(@pwd)
14
+ FileUtils.rm_r(@tmpdir)
15
+ end
16
+ end
17
+
18
+ def sha1hex(file)
19
+ Digest::SHA1.hexdigest open(file).read
20
+ end
21
+
22
+ describe CrxUnpack do
23
+ let(:crx_file) do
24
+ File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'extension.crx'))
25
+ end
26
+
27
+ let(:crx_io) do
28
+ open(crx_file, 'rb')
29
+ end
30
+
31
+ let(:crx_data) do
32
+ open(crx_file, 'rb').read
33
+ end
34
+
35
+ let(:fixture_files) do
36
+ Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'extension', '*')))
37
+ end
38
+
39
+ describe '#unpack' do
40
+ it 'unpacks crx data' do
41
+ subject.unpack(crx_data)
42
+ expect(subject.zip[0,2]).to eq("PK")
43
+ end
44
+ end
45
+
46
+ describe '#unpack_from_io' do
47
+ it 'unpacks crx data from io' do
48
+ subject.unpack_from_io(crx_io)
49
+ expect(subject.zip[0,2]).to eq("PK")
50
+ end
51
+ end
52
+
53
+ describe '#unpack_from_file' do
54
+ it 'unpacks crx data from file' do
55
+ subject.unpack_from_file(crx_file)
56
+ expect(subject.zip[0,2]).to eq("PK")
57
+ end
58
+ end
59
+
60
+ describe '.unpack' do
61
+ it 'unpacks crx data' do
62
+ crx = described_class.unpack(crx_data)
63
+ expect(crx.zip[0,2]).to eq("PK")
64
+ end
65
+ end
66
+
67
+ describe '.unpack_from_io' do
68
+ it 'unpacks crx data from io' do
69
+ crx = described_class.unpack_from_io(crx_io)
70
+ expect(crx.zip[0,2]).to eq("PK")
71
+ end
72
+ end
73
+
74
+ describe '.unpack_from_file' do
75
+ it 'unpacks crx data from file' do
76
+ crx = described_class.unpack_from_file(crx_file)
77
+ expect(crx.zip[0,2]).to eq("PK")
78
+ end
79
+ end
80
+
81
+ describe '#unpack_contents' do
82
+ include_context 'Move to temporary directory'
83
+
84
+ it 'unpacks crx contents' do
85
+ subject.unpack_contents(crx_data, 'extension')
86
+
87
+ Dir.chdir('extension') do
88
+ fixture_files.each do |file|
89
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ describe '#unpack_contents_from_io' do
96
+ include_context 'Move to temporary directory'
97
+
98
+ it 'unpacks crx contents from io' do
99
+ subject.unpack_contents_from_io(crx_io, 'extension')
100
+
101
+ Dir.chdir('extension') do
102
+ fixture_files.each do |file|
103
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#unpack_contents_from_file' do
110
+ include_context 'Move to temporary directory'
111
+
112
+ it 'unpacks crx contents from file' do
113
+ subject.unpack_contents_from_file(crx_file, 'extension')
114
+
115
+ Dir.chdir('extension') do
116
+ fixture_files.each do |file|
117
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ describe '.unpack_contents' do
124
+ include_context 'Move to temporary directory'
125
+
126
+ it 'unpacks crx contents' do
127
+ described_class.unpack_contents(crx_data, 'extension')
128
+
129
+ Dir.chdir('extension') do
130
+ fixture_files.each do |file|
131
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ describe '.unpack_contents_from_io' do
138
+ include_context 'Move to temporary directory'
139
+
140
+ it 'unpacks crx contents from io' do
141
+ described_class.unpack_contents_from_io(crx_io, 'extension')
142
+
143
+ Dir.chdir('extension') do
144
+ fixture_files.each do |file|
145
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '.unpack_contents_from_file' do
152
+ include_context 'Move to temporary directory'
153
+
154
+ it 'unpacks crx contents from file' do
155
+ described_class.unpack_contents_from_file(crx_file, 'extension')
156
+
157
+ Dir.chdir('extension') do
158
+ fixture_files.each do |file|
159
+ expect(sha1hex(File.basename(file))).to eq(sha1hex(file))
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,15 @@
1
+ {
2
+ "manifest_version": 2,
3
+
4
+ "name": "One-click Kittens",
5
+ "description": "This extension demonstrates a 'browser action' with kittens.",
6
+ "version": "1.0",
7
+
8
+ "browser_action": {
9
+ "default_icon": "icon.png",
10
+ "default_popup": "popup.html"
11
+ },
12
+ "permissions": [
13
+ "https://secure.flickr.com/"
14
+ ]
15
+ }
@@ -0,0 +1,31 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <title>Getting Started Extension's Popup</title>
5
+ <style>
6
+ body {
7
+ min-width: 357px;
8
+ overflow-x: hidden;
9
+ }
10
+
11
+ img {
12
+ margin: 5px;
13
+ border: 2px solid black;
14
+ vertical-align: middle;
15
+ width: 75px;
16
+ height: 75px;
17
+ }
18
+ </style>
19
+
20
+ <!--
21
+ - JavaScript and HTML must be in separate files: see our Content Security
22
+ - Policy documentation[1] for details and explanation.
23
+ -
24
+ - [1]: http://developer.chrome.com/extensions/contentSecurityPolicy.html
25
+ -->
26
+ <script src="popup.js"></script>
27
+ </head>
28
+ <body>
29
+ </body>
30
+ </html>
31
+
@@ -0,0 +1,83 @@
1
+ // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ /**
6
+ * Global variable containing the query we'd like to pass to Flickr. In this
7
+ * case, kittens!
8
+ *
9
+ * @type {string}
10
+ */
11
+ var QUERY = 'kittens';
12
+
13
+ var kittenGenerator = {
14
+ /**
15
+ * Flickr URL that will give us lots and lots of whatever we're looking for.
16
+ *
17
+ * See http://www.flickr.com/services/api/flickr.photos.search.html for
18
+ * details about the construction of this URL.
19
+ *
20
+ * @type {string}
21
+ * @private
22
+ */
23
+ searchOnFlickr_: 'https://secure.flickr.com/services/rest/?' +
24
+ 'method=flickr.photos.search&' +
25
+ 'api_key=90485e931f687a9b9c2a66bf58a3861a&' +
26
+ 'text=' + encodeURIComponent(QUERY) + '&' +
27
+ 'safe_search=1&' +
28
+ 'content_type=1&' +
29
+ 'sort=interestingness-desc&' +
30
+ 'per_page=20',
31
+
32
+ /**
33
+ * Sends an XHR GET request to grab photos of lots and lots of kittens. The
34
+ * XHR's 'onload' event is hooks up to the 'showPhotos_' method.
35
+ *
36
+ * @public
37
+ */
38
+ requestKittens: function() {
39
+ var req = new XMLHttpRequest();
40
+ req.open("GET", this.searchOnFlickr_, true);
41
+ req.onload = this.showPhotos_.bind(this);
42
+ req.send(null);
43
+ },
44
+
45
+ /**
46
+ * Handle the 'onload' event of our kitten XHR request, generated in
47
+ * 'requestKittens', by generating 'img' elements, and stuffing them into
48
+ * the document for display.
49
+ *
50
+ * @param {ProgressEvent} e The XHR ProgressEvent.
51
+ * @private
52
+ */
53
+ showPhotos_: function (e) {
54
+ var kittens = e.target.responseXML.querySelectorAll('photo');
55
+ for (var i = 0; i < kittens.length; i++) {
56
+ var img = document.createElement('img');
57
+ img.src = this.constructKittenURL_(kittens[i]);
58
+ img.setAttribute('alt', kittens[i].getAttribute('title'));
59
+ document.body.appendChild(img);
60
+ }
61
+ },
62
+
63
+ /**
64
+ * Given a photo, construct a URL using the method outlined at
65
+ * http://www.flickr.com/services/api/misc.urlKittenl
66
+ *
67
+ * @param {DOMElement} A kitten.
68
+ * @return {string} The kitten's URL.
69
+ * @private
70
+ */
71
+ constructKittenURL_: function (photo) {
72
+ return "http://farm" + photo.getAttribute("farm") +
73
+ ".static.flickr.com/" + photo.getAttribute("server") +
74
+ "/" + photo.getAttribute("id") +
75
+ "_" + photo.getAttribute("secret") +
76
+ "_s.jpg";
77
+ }
78
+ };
79
+
80
+ // Run our kitten generation script as soon as the document's DOM is ready.
81
+ document.addEventListener('DOMContentLoaded', function () {
82
+ kittenGenerator.requestKittens();
83
+ });
@@ -0,0 +1,4 @@
1
+ require 'rspec'
2
+
3
+ RSpec.configure do |config|
4
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crx_unpack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kensuke Nagae
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubyzip
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Unpack Chrome extension (crx) file
70
+ email:
71
+ - kyanny@gmail.com
72
+ executables:
73
+ - crx_unpack
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .travis.yml
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/crx_unpack
85
+ - crx_unpack.gemspec
86
+ - lib/crx_unpack.rb
87
+ - lib/crx_unpack/version.rb
88
+ - spec/crx_unpack_spec.rb
89
+ - spec/fixtures/extension.crx
90
+ - spec/fixtures/extension/icon.png
91
+ - spec/fixtures/extension/manifest.json
92
+ - spec/fixtures/extension/popup.html
93
+ - spec/fixtures/extension/popup.js
94
+ - spec/spec_helper.rb
95
+ homepage: ''
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.0.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Unpack Chrome extension (crx) file
119
+ test_files:
120
+ - spec/crx_unpack_spec.rb
121
+ - spec/fixtures/extension.crx
122
+ - spec/fixtures/extension/icon.png
123
+ - spec/fixtures/extension/manifest.json
124
+ - spec/fixtures/extension/popup.html
125
+ - spec/fixtures/extension/popup.js
126
+ - spec/spec_helper.rb
127
+ has_rdoc: