Presentation at Open Source Bridge 2016
June 21, 2016
Erik Möller - @xirzon
Slides: https://freeyourstuff.cc/osb2016 (source)
Many sites offer ..
The Network Effect
and how to hack it.
But how does it work?
How does a Chrome extension work?
Firefox WebExtensions (still alpha) are very similar ("designed for compatibility").
Let's look at a plugin!
Reminder: Slides at https://freeyourstuff.cc/osb2016
GitHub repo at: https://github.com/eloquence/freeyourstuff.cc
extension/src/plugins/yelp/index.js
function retrieveReviews(callback) {
let page = 1;
let reviews = {
head: {},
data: []
};
let firstURL = 'https://www.yelp.com/user_details_reviews_self';
$.get(firstURL)
.done(processPage)
.fail(plugin.handleConnectionError(firstURL));
(Confused by ES6 syntax like let
? Here's a cheatsheet.)
function processPage(html) {
try {
let $dom = $($.parseHTML(html));
if (page === 1) {
let idLink = $dom.find('.user-display-name');
reviews.head.reviewerName = idLink.text();
reviews.head.reviewerID =
(idLink.attr('href').match(/userid=(.*)/) || [])[1];
}
retrieveReviews(reviews => {
datasets.reviews = new DataSet(reviews, request.schema.reviews).set;
chrome.runtime.sendMessage({
action: 'dispatch',
data: datasets,
schema: request.schema
});
});
var jsonTests = {
reviews: retrieveReviews
};
The Node.js test runner will:
retrieveReviews
inside jsdom
jsdom
inside Node.js
let virtualConsole = jsdom.createVirtualConsole().sendTo(console);
const document = jsdom.jsdom(undefined, {
userAgent,
cookieJar,
virtualConsole,
url: schemas[schemaKey].schema.site.canonicalURL
});
let window = document.defaultView;
phantomjs
for testsCredits: