class Fzeet::WebBrowser

Attributes

cp[R]
events[R]
handlers[R]
ocs[R]
oips[R]
parent[R]

Public Class Methods

new(parent) click to toggle source
Calls superclass method
# File lib/fzeet/windows/shdocvw.rb, line 120
def initialize(parent)
        @parent = parent

        @oips = Windows::OleInPlaceSite.new

        @oips.instance_variable_set(:@browser, self)

        class << @oips
                attr_reader :browser

                def CanInPlaceActivate
                        Windows::S_OK
                end

                def GetWindow(phwnd)
                        phwnd.write_pointer(browser.parent.handle)

                        Windows::S_OK
                end

                def GetWindowContext(pframe, pdoc, prPos, prClip, pinfo)
                        pframe.write_pointer(0)
                        pdoc.write_pointer(0)
                        Windows.GetClientRect(browser.parent.handle, prPos)
                        Windows.GetClientRect(browser.parent.handle, prClip)

                        Windows::S_OK
                end

                def OnPosRectChange(prPos)
                        browser.QueryInstance(Windows::OleInPlaceObject) { |oipo|
                                oipo.SetObjectRects(prPos, prPos)
                        }

                        Windows::S_OK
                end
        end

        @ocs = Windows::OleClientSite.new

        @ocs.instance_variable_set(:@browser, self)

        class << @ocs
                attr_reader :browser

                def QueryInterface(piid, ppv)
                        if Windows::GUID.new(piid) == Windows::IOleInPlaceSite::IID
                                ppv.write_pointer(browser.oips); browser.oips.AddRef

                                return Windows::S_OK
                        end

                        super
                end
        end

        super()

        @events = Windows::WebBrowserEvents.new

        @events.instance_variable_set(:@browser, self)

        class << @events
                attr_reader :browser

                (self::VTBL.members - Windows::IDispatch::VTBL.members).each { |name|
                        define_method(name) { |dispParams|
                                (handlers = browser.handlers && browser.handlers[name]) && handlers.each { |handler|
                                        (handler.arity == 0) ? handler.call : handler.call(dispParams)
                                }
                        }
                }
        end

        QueryInstance(Windows::ConnectionPointContainer) { |cpc|
                FFI::MemoryPointer.new(:pointer) { |pcp|
                        cpc.FindConnectionPoint(Windows::WebBrowserEvents::IID, pcp)

                        @cp = Windows::ConnectionPoint.new(pcp.read_pointer)
                }
        }

        @cookie = nil
        FFI::MemoryPointer.new(:ulong) { |p| @cp.Advise(@events, p); @cookie = p.get_ulong(0) }

        QueryInstance(Windows::OleObject) { |oo|
                oo.SetClientSite(@ocs)
                oo.DoVerb(Windows::OLEIVERB_INPLACEACTIVATE, nil, @ocs, 0, @parent.handle, @parent.rect)
        }

        @parent.
                on(:size) {
                        r = @parent.rect

                        put_Top(r[:top]); put_Left(r[:left]); put_Width(r[:right]); put_Height(r[:bottom])
                }.

                on(:destroy) {
                        @oips.Release
                        @ocs.Release
                        @cp.Unadvise(@cookie)
                        @events.Release
                        @cp.Release
                        Release()
                }.

                instance_variable_set(:@__WebBrowser__, self)
end

Public Instance Methods

back() click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 247
def back; GoBack(); self; rescue; self end
document() click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 254
def document
        disp = nil

        FFI::MemoryPointer.new(:pointer) { |pdisp|
                get_Document(pdisp)

                disp = Windows::Dispatch.new(pdisp.read_pointer)

                return disp.QueryInstance(Windows::HTMLDocument2)
        }
ensure
        disp.Release if disp
end
forward() click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 248
def forward; GoForward(); self; rescue; self end
goto(where) click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 237
def goto(where)
        where = Windows.SysAllocString("#{where}\0".encode('utf-16le'))

        Navigate(where, nil, nil, nil, nil)

        self
ensure
        Windows.SysFreeString(where)
end
home() click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 249
def home; GoHome(); self end
on(event, &block) click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 231
def on(event, &block)
        ((@handlers ||= {})[event] ||= []) << block

        self
end
refresh() click to toggle source
# File lib/fzeet/windows/shdocvw.rb, line 252
def refresh; Refresh(); self end