Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhanced image rendering methods #37

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/jquery.js

Large diffs are not rendered by default.

26 changes: 26 additions & 0 deletions examples/render-html-snippet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
var Chimera = require(__dirname + '/../lib/main').Chimera;

var c = new Chimera();
var start = new Date();
var htmlSnippet =
'<html>' +
'<head></head>' +
'<body>' +
'<div id="theDiv" style="height: 100px; width: 500px; border: 4px solid #f00; background-size: 50px 50px; background-color: #fc0; background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent);text-align: center; color:#bbb; text-shadow: #888 1px 1px;"><h1 style="line-height: 100px; margin: 0px;">Hello World</h1></div>' +
'</body>' +
'</html>';

c.perform({
html: htmlSnippet,

callback: function (err, result) {
// Clip the capture to our Div
c.browser.clipToElement("#theDiv");
// Capture to File
c.browser.capture('html-render.png');

console.log("All done. Took " + (new Date() - start) + 'ms');
c.close();
process.exit();
}
});
20 changes: 20 additions & 0 deletions examples/render-to-node-buffer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
var Chimera = require(__dirname + '/../lib/main').Chimera;

var c = new Chimera();
var start = new Date();
c.perform({
url: "http://www.google.com",
callback: function (err, result) {
console.log('capture screen shot to a buffer');
var imageBuffer = c.browser.captureBytes();
var fs = require('fs');
fs.writeFileSync("direct.png", imageBuffer);
// We now have a buffer containing the PNG image data. we can send this directly over the wire without touching the filesystem.

// Or write it to the filesystem for demo purposes. Whatever.
console.log("All done. Took " + (new Date() - start) + 'ms');

c.close();
process.exit();
}
});
12 changes: 10 additions & 2 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,16 @@ function Chimera(options) {
}
}

Chimera.prototype.capture = function(filename) {
return this.browser.capture(filename);
Chimera.prototype.clipToElement = function(selector){
this.browser.clipToElement(selector);
}

Chimera.prototype.capture = function (filename) {
return this.browser.capture(filename);
};

Chimera.prototype.captureBytes = function () {
return this.browser.captureBytes();
};

Chimera.prototype.cookies = function() {
Expand Down
117 changes: 104 additions & 13 deletions src/browser.cc
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#define BUILDING_NODE_EXTENSION
#include <node.h>
#include "browser.h"
#include "top_v8.h"
Expand All @@ -20,11 +21,14 @@ Browser::~Browser() {
void Browser::Initialize(Handle<Object> target) {
Local<FunctionTemplate> tpl = FunctionTemplate::New(New);
tpl->SetClassName(String::NewSymbol("Browser"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
tpl->InstanceTemplate()->SetInternalFieldCount(1);

tpl->PrototypeTemplate()->Set(String::NewSymbol("open"), FunctionTemplate::New(Open)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("renderSnippet"), FunctionTemplate::New(RenderSnippet)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("clipToElement"), FunctionTemplate::New(ClipToElement)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("close"), FunctionTemplate::New(Close)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("capture"), FunctionTemplate::New(Capture)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("captureBytes"), FunctionTemplate::New(CaptureBytes)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("cookies"), FunctionTemplate::New(Cookies)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("setCookies"), FunctionTemplate::New(SetCookies)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("setProxy"), FunctionTemplate::New(SetProxy)->GetFunction());
Expand Down Expand Up @@ -100,7 +104,7 @@ Handle<Value> Browser::Cookies(const Arguments& args) {
if (0 != chimera) {
cookies = chimera->getCookies();
}

return scope.Close(top_v8::FromQString(cookies));
}

Expand All @@ -119,10 +123,29 @@ Handle<Value> Browser::SetCookies(const Arguments& args) {
if (0 != chimera) {
chimera->setCookies(top_v8::ToQString(args[0]->ToString()));
}

return scope.Close(Undefined());
}

Handle<Value> Browser::ClipToElement(const Arguments& args) {
HandleScope scope;

if (!args[0]->IsString()) {
return ThrowException(Exception::TypeError(
String::New("First argument must be an element selector")));
}

Browser* w = ObjectWrap::Unwrap<Browser>(args.This());
Chimera* chimera = w->getChimera();

if (0 != chimera) {
chimera->clipToElement(top_v8::ToQString(args[0]->ToString()));
}

return scope.Close(Undefined());
}


Handle<Value> Browser::SetProxy(const Arguments& args) {
HandleScope scope;

Expand All @@ -135,49 +158,116 @@ Handle<Value> Browser::SetProxy(const Arguments& args) {
Chimera* chimera = w->getChimera();

if (0 != chimera) {
chimera->setProxy(top_v8::ToQString(args[0]->ToString()), top_v8::ToQString(args[1]->ToString()), args[2]->Int32Value(),
chimera->setProxy(top_v8::ToQString(args[0]->ToString()), top_v8::ToQString(args[1]->ToString()), args[2]->Int32Value(),
top_v8::ToQString(args[3]->ToString()), top_v8::ToQString(args[4]->ToString()));
}

return scope.Close(Undefined());
}


Handle<Value> Browser::Capture(const Arguments& args) {
HandleScope scope;

if (!args[0]->IsString()) {
return ThrowException(Exception::TypeError(
String::New("First argument must be a filename string")));
}

Browser* w = ObjectWrap::Unwrap<Browser>(args.This());
Chimera* chimera = w->getChimera();

if (0 != chimera) {
chimera->capture(top_v8::ToQString(args[0]->ToString()));
}

return scope.Close(Undefined());
}

Handle<Value> Browser::Close(const Arguments& args) {
Handle<Value> Browser::CaptureBytes(const Arguments& args) {
HandleScope scope;

Browser* w = ObjectWrap::Unwrap<Browser>(args.This());
Chimera* chimera = w->getChimera();
QByteArray qb;
if (0 != chimera) {
qb = chimera->captureBytes();
}

return scope.Close(top_v8::ToNodeBuffer(qb)->handle_);
}



Handle<Value> Browser::Close(const Arguments& args) {
HandleScope scope;

Browser* w = ObjectWrap::Unwrap<Browser>(args.This());
Chimera* chimera = w->getChimera();

if (0 != chimera) {
chimera->exit(1);
w->setChimera(0);
chimera->deleteLater();
}

return scope.Close(Undefined());
}

Handle<Value> Browser::Open(const Arguments& args) {
HandleScope scope;

if (!args[1]->IsString()) {
return ThrowException(Exception::TypeError(
String::New("Second argument must be a javascript string")));
}

if (!args[2]->IsFunction()) {
return ThrowException(Exception::TypeError(
String::New("Third argument must be a callback function")));
}

Local<Function> callback = Local<Function>::Cast(args[2]);

BWork* work = new BWork();
work->error = false;
work->request.data = work;
work->callback = Persistent<Function>::New(callback);

Browser* w = ObjectWrap::Unwrap<Browser>(args.This());
Chimera* chimera = w->getChimera();

if (0 != chimera) {
work->chimera = chimera;
} else {
work->chimera = new Chimera();
work->chimera->setUserAgent(w->userAgent());
work->chimera->setLibraryCode(w->libraryCode());
work->chimera->setCookies(w->cookies());
if (w->disableImages_) {
work->chimera->disableImages();
}
w->setChimera(work->chimera);
}

work->chimera->setEmbedScript(top_v8::ToQString(args[1]->ToString()));

if (args[0]->IsString()) {
work->url = top_v8::ToQString(args[0]->ToString());
work->chimera->open(work->url);
} else {
std::cout << "debug -- about to call execute" << std::endl;
work->chimera->execute();
}

int status = uv_queue_work(uv_default_loop(), &work->request, AsyncWork, (uv_after_work_cb)AsyncAfter);
assert(status == 0);

return Undefined();
}

Handle<Value> Browser::RenderSnippet(const Arguments& args) {
HandleScope scope;

if (!args[1]->IsString()) {
return ThrowException(Exception::TypeError(
Expand Down Expand Up @@ -215,10 +305,9 @@ Handle<Value> Browser::Open(const Arguments& args) {
work->chimera->setEmbedScript(top_v8::ToQString(args[1]->ToString()));

if (args[0]->IsString()) {
work->url = top_v8::ToQString(args[0]->ToString());
work->chimera->open(work->url);
work->html = top_v8::ToQString(args[0]->ToString());
work->chimera->renderSnippet(work->html);
} else {
std::cout << "debug -- about to call execute" << std::endl;
work->chimera->execute();
}

Expand All @@ -227,3 +316,5 @@ Handle<Value> Browser::Open(const Arguments& args) {

return Undefined();
}


4 changes: 4 additions & 0 deletions src/browser.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct BWork {
Chimera* chimera;
QString code;
QString url;
QString html;
QString errorResult;
};

Expand All @@ -34,11 +35,14 @@ class Browser : public node::ObjectWrap {
static v8::Persistent<v8::Function> constructor;
static v8::Handle<v8::Value> New(const v8::Arguments& args);
static v8::Handle<v8::Value> Open(const v8::Arguments& args);
static v8::Handle<v8::Value> RenderSnippet(const v8::Arguments& args);
static v8::Handle<v8::Value> Close(const v8::Arguments& args);
static v8::Handle<v8::Value> Capture(const v8::Arguments& args);
static v8::Handle<v8::Value> Cookies(const v8::Arguments& args);
static v8::Handle<v8::Value> SetCookies(const v8::Arguments& args);
static v8::Handle<v8::Value> SetProxy(const v8::Arguments& args);
static v8::Handle<v8::Value> ClipToElement(const v8::Arguments& args);
static v8::Handle<v8::Value> CaptureBytes(const v8::Arguments& args);

Chimera* chimera_;
QString libraryCode_;
Expand Down
Loading