1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-08-15 20:02:56 +02:00

#25 Added incognito mode

This commit is contained in:
Tim Voronov
2018-09-23 21:11:13 -04:00
parent 4df1949b91
commit 2a1bac6650

View File

@@ -3,40 +3,52 @@ package browser
import (
"context"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/mafredri/cdp"
"github.com/mafredri/cdp/devtool"
"github.com/mafredri/cdp/protocol/target"
"github.com/mafredri/cdp/rpcc"
"github.com/mafredri/cdp/session"
"github.com/pkg/errors"
"sync"
)
type (
CdpDriver struct {
address string
}
type CdpDriver struct {
sync.Mutex
dev *devtool.DevTools
conn *rpcc.Conn
client *cdp.Client
session *session.Manager
contextID target.BrowserContextID
}
CdpConnection struct {
target *devtool.Target
core *rpcc.Conn
}
)
func NewDriver(address string) *CdpDriver {
drv := new(CdpDriver)
drv.dev = devtool.New(address)
func NewDriver(conn string) *CdpDriver {
return &CdpDriver{
address: conn,
}
return drv
}
func (drv *CdpDriver) GetDocument(ctx context.Context, url string) (values.HtmlNode, error) {
ctx, cancel := context.WithTimeout(ctx, DefaultTimeout)
defer cancel()
devt := devtool.New(drv.address)
target, err := devt.CreateURL(ctx, url)
err := drv.init(ctx)
if err != nil {
return nil, err
}
conn, err := rpcc.DialContext(ctx, target.WebSocketDebuggerURL)
ctx, cancel := context.WithTimeout(ctx, DefaultTimeout)
defer cancel()
// Create a new target belonging to the browser context, similar
// to opening a new tab in an incognito window.
createTargetArgs := target.NewCreateTargetArgs(url).SetBrowserContextID(drv.contextID)
createTarget, err := drv.client.Target.CreateTarget(ctx, createTargetArgs)
if err != nil {
return nil, err
}
// Connect to target using the existing websocket connection.
conn, err := drv.session.Dial(ctx, createTarget.TargetID)
if err != nil {
return nil, err
@@ -46,6 +58,59 @@ func (drv *CdpDriver) GetDocument(ctx context.Context, url string) (values.HtmlN
}
func (drv *CdpDriver) Close() error {
// TODO: Do we need this method?
drv.Lock()
defer drv.Unlock()
if drv.session != nil {
drv.session.Close()
return drv.conn.Close()
}
return nil
}
func (drv *CdpDriver) init(ctx context.Context) error {
drv.Lock()
defer drv.Unlock()
if drv.session == nil {
ver, err := drv.dev.Version(ctx)
if err != nil {
return errors.Wrap(err, "failed to initialize driver")
}
bconn, err := rpcc.DialContext(ctx, ver.WebSocketDebuggerURL)
if err != nil {
return errors.Wrap(err, "failed to initialize driver")
}
bc := cdp.NewClient(bconn)
sess, err := session.NewManager(bc)
if err != nil {
bconn.Close()
return errors.Wrap(err, "failed to initialize driver")
}
createCtx, err := bc.Target.CreateBrowserContext(ctx)
if err != nil {
bconn.Close()
sess.Close()
return err
}
drv.conn = bconn
drv.client = bc
drv.session = sess
drv.contextID = createCtx.BrowserContextID
}
return nil
}