class Firebrew::Firefox::Extension::Manager

Attributes

profile[R]

Public Class Methods

new(params={}) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 15
def initialize(params={})
  @profile = params[:profile]
end

Public Instance Methods

all() click to toggle source
# File lib/firebrew/firefox/extension.rb, line 19
def all
  profile_extensions = self.fetch['addons'].find_all do |extension|
    extension['location'] == 'app-profile'
  end
  
  profile_extensions.map do |extension|
    Extension.new({
      name: extension['defaultLocale']['name'],
      guid: extension['id'],
      version: extension['version'],
      uri: extension['descriptor'],
    }, self)
  end
end
find(name) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 34
def find(name)
  self.all.find{|ext| ext.name == name }
end
find!(name) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 38
def find!(name)
  result = self.find(name)
  raise Firebrew::ExtensionNotFoundError, "Extension not found: #{name}" if result.nil?
  result
end
install(extension, is_displaying_progress = false) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 44
def install(extension, is_displaying_progress = false)
  dir = File.join(self.profile.path, 'extensions')
  FileUtils.mkdir_p dir
  xpi_path = '%s.xpi' % File.join(dir, extension.guid)
  
  File.open(xpi_path,'wb') do |out|
    uri = [extension.uri].flatten.first
    pout = is_displaying_progress ? $stdout : nil
    Firebrew::Downloader.new(uri, out, output: pout).exec
  end
  
  xpi = Zip::File.open(File.open(xpi_path,'rb'))
  install_manifests = xpi.find_entry('install.rdf')
  install_manifests = install_manifests.get_input_stream.read
  install_manifests = REXML::Document.new(install_manifests)
  is_unpacking = REXML::XPath.match(install_manifests, '/RDF/Description/em:unpack/text()').first
  is_unpacking = is_unpacking.nil? ? false : is_unpacking.value.strip == 'true'
  
  if is_unpacking then
    extension.uri = xpi_path.pathmap('%X')
    FileUtils.mkdir_p(extension.uri)
    
    xpi.each do |entry|
      next if entry.ftype == :directory
      content = entry.get_input_stream.read
      Dir.chdir(extension.uri) do
        FileUtils.mkdir_p File.dirname(entry.name)
        File.write(entry.name, content)
      end
    end
    
    xpi.close
    FileUtils.rm_rf(xpi_path)
  else
    extension.uri = xpi_path
    xpi.close
  end
  
  self.add(extension)
  self.push
end
uninstall(extension) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 86
def uninstall(extension)
  FileUtils.rm_r extension.uri
  self.remove(extension)
  self.push
end

Protected Instance Methods

add(extension) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 112
def add(extension)
  self.fetch['addons'].push(
    'id'=> extension.guid,
    'location'=> 'app-profile',
    'version'=> extension.version,
    'descriptor'=> extension.uri,
    'defaultLocale'=> {
      'name'=> extension.name
    }
  )
end
data_path() click to toggle source
# File lib/firebrew/firefox/extension.rb, line 94
def data_path
  path = File.join(self.profile.path, 'extensions.json')
  unless File.exists?(path) then
    File.write(path, %({"schemaVersion": 16, "addons": []}))
  end
  path
end
fetch() click to toggle source
# File lib/firebrew/firefox/extension.rb, line 102
def fetch
  return @data unless @data.nil?
  @data = JSON.load(File.read(self.data_path))
end
push() click to toggle source
# File lib/firebrew/firefox/extension.rb, line 107
def push
  json = JSON::pretty_generate(self.fetch, allow_nan: true, max_nesting: false)
  File.write(self.data_path, json)
end
remove(extension) click to toggle source
# File lib/firebrew/firefox/extension.rb, line 124
def remove(extension)
  self.fetch['addons'].delete_if{|v| v['id'] == extension.guid}
end