class Origami::PDF::JavaScript::Engine

Attributes

context[R]
doc[R]
options[R]
parseInt[R]
privileged_mode[R]

Public Class Methods

new(pdf) click to toggle source
# File lib/origami/javascript.rb, line 571
def initialize(pdf)
    @options =
    {
        viewerVersion: 11.008,
        viewerType: JavaScript::Viewers::ADOBE_READER,
        viewerVariation: JavaScript::Viewers::ADOBE_READER,
        platform: JavaScript::Platforms::WINDOWS,
        console: STDOUT,
        log_method_calls: false,
        privileged_mode: false
    }

    @doc = JavaScript::Doc.new(self, pdf)
    @context = V8::Context.new(with: @doc)
    @privileged_mode = @options[:privileged_mode]

    @parseInt = V8::Context.new['parseInt']
    @hooks = {}
end

Public Instance Methods

debugger_break() click to toggle source
# File lib/origami/javascript.rb, line 671
def debugger_break
    exec 'debugger'
end
enable_debugger(port = 5858) click to toggle source

Binds the V8 remote debugging agent on the specified TCP port.

# File lib/origami/javascript.rb, line 667
def enable_debugger(port = 5858)
    V8::C::Debug.EnableAgent("Origami", port)
end
exec(script) click to toggle source

Evaluates a JavaScript code in the current context.

# File lib/origami/javascript.rb, line 602
def exec(script)
    @context.eval(script)
end
hook(name, &callback) click to toggle source

Set a hook on a JavaScript method.

# File lib/origami/javascript.rb, line 609
def hook(name, &callback)
    ns = name.split('.')
    previous = @context

    ns.each do |n|
        raise JavaScript::EngineError, "#{name} does not exist" if previous.nil?
        previous = previous[n]
    end

    case previous
    when V8::Function, UnboundMethod, nil then
        @context[name] = lambda do |*args|
            callback[previous, *args]
        end

        @hooks[name] = [previous, callback]
    else
        raise JavaScript::EngineError, "#{name} is not a function"
    end
end
members(obj) click to toggle source

Returns an Hash of all defined members in specified object name.

# File lib/origami/javascript.rb, line 640
                def members(obj)
                    members = {}
                    list = @context.eval <<-JS
                        (function(base) {
                            var members = [];
                            for (var i in base) members.push([i, base[i]]);
                            return members;
                        })(#{obj})
                    JS

                    list.each do |var|
                        members[var[0]] = var[1]
                    end

                    members
                end
privileged?() click to toggle source

Returns true if the engine is set to execute in privileged mode. Allows execution of security protected methods.

# File lib/origami/javascript.rb, line 595
def privileged?
    @privileged_mode
end
scope() click to toggle source

Returns all members in the global scope.

# File lib/origami/javascript.rb, line 660
def scope
    members('this')
end
unhook(name) click to toggle source

Removes an existing hook on a JavaScript method.

# File lib/origami/javascript.rb, line 633
def unhook(name)
    @context[name] = @hooks[name][0] if @hooks.has_key?(name)
end