Jarrednicholls Hacking Webkit and Js
Jarrednicholls Hacking Webkit and Js
Data Persistence
Browser Engine
Render Engine
We
Data Persistence
bK
it Browser Engine
Render Engine
http://www.webkit.org/projects/goals.html
How?
Client Interface
WebKit Components
Render Engine
CSS
DOM SVG
HTML Canvas
WebCore
HTML Canvas
WebCore
Client Interface
API Calls
Events
Port
(Chrome, Safari, etc.)
Port Abstraction
Networking
Thread Geolocation Timer
I/O
Client Interface
API Calls
Events
Port
(Chrome, Safari, etc.)
<input type=”number” />
Paint me
some spin
buttons, STAT!
I know how to
do that!
WebKit Port
<input type=”number” />
ri
pl ght
ea th
se er
,k e
th
x
WebKit
<input type=”number” />
Piece of cake!
y !
ex
’ s
in
ok
lo Port
<input type=”number” />
Theme Interface
bool paintInnerSpinButton(RenderObject*, const
PaintInfo&, const IntRect&);
<input type=”number” />
Theme Interface
bool paintInnerSpinButton(RenderObject*, const
PaintInfo&, const IntRect&);
Theme
Client Interface
RenderTheme->paint()
paintInnerSpinButton Port
WebKit Components
Render Engine
CSS
DOM SVG
HTML Canvas
WebCore
ArrayBuffer.idl
Web IDL
gen
erate
- bi n
ding
s.pl
ArrayBuffer
Wrapper
JavaScript Engine (JSC/V8)
ArrayBuffer
WebCore
ArrayBuffer.h
interface
[
JSGenerateIsReachable=Impl,
CustomConstructor,
ConstructorParameters=1,
JSNoStaticTables
]
ArrayBuffer
{
readonly
attribute
int
byteLength;
ArrayBuffer
slice(in
long
begin,
in
[Optional]
long
end);
};
Mac
Xcode 3.1.4+ & command-line tools
> which g++ => /usr/bin/g++
Windows
Don’t even bother (see “Building Chromium” :)
...but if you’re really brave: http://www.webkit.org/building/tools.html
Get the Source
Get the Source
SVN
svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit
Git (RECOMMENDED!!!)
git clone git://git.webkit.org/WebKit.git
or
git clone git://github.com/WebKit/webkit.git WebKit
Build WebKit
Build WebKit
> cd WebKit
> Tools/Scripts/build-webkit
Go have lunch...
> Tools/Scripts/run-safari
Build WebKit
> cd WebKit
> Tools/Scripts/build-webkit
Windows
Visual Studio (Express)
Windows SDK
DirectX SDK
Windows Driver Development Kit
Details: http://www.chromium.org/developers/how-tos/build-instructions-windows#TOC-Prerequisite-software
Get the Source
Get the Source
Details: http://dev.chromium.org/developers/how-tos/get-the-code
Build Chromium
Build Chromium
> cd chromium/src
> GYP_GENERATORS=ninja gclient runhooks --force
> ninja -C out/Release chrome
Go on vacation...
> cd chromium/src
> GYP_GENERATORS=ninja gclient runhooks --force
> ninja -C out/Release chrome
super fast “make” equivalent
Go on vacation... comes with depot tools
try
{
command
=
eval('('
+
decodeURIComponent(match[1])
+
')');
}
catch
(e)
{
return;
}
switch
(command.type)
{
default:
break;
}
Add in Hacks
inspector.js persist data
var
saveData
=
function(filePath,
data)
{
filePath
=
'/Users/jarred/qconny/'
+
filePath;
persist data
Web Inspector
Network
Export Network HAR Data
setTimeout(function()
{
var
networkData
=
WebInspector.panels.network._networkLogView._getExportData();
saveData((cmd.filename
||
WebInspector.inspectedPageDomain)
+
'.har',
networkData);
},
cmd.timeout);
};
case
'exportHAR':
exportHAR(command);
break;
Add in Hacks
NetworkPanel.js
export data fn
_getExportData:
function()
{
return
{
log:
(new
WebInspector.HARLog(this._requests)).build()
};
}
Trigger Hack
Trigger Hack
http://localhost:9123/devtools/devtools.html?ws=localhost:9123/devtools/page/
3_1&command={type:'exportHAR',timeout:3000}
HAR Output
{"log":{"version":"1.2","creator":
{"name":"WebInspector","version":"536.5"},"pages":[],"entries":
[{"startedDateTime":"2012-‐06-‐19T18:02:16.852Z","time":8,"request":
{"method":"GET","url":"http://www.google.com/
blank.html","httpVersion":"HTTP/1.1","headers":[],"queryString":
[],"cookies":[],"headersSize":47,"bodySize":0},"response":
{"status":200,"statusText":"OK","httpVersion":"HTTP/1.1","headers":
[],"cookies":[],"content":{"size":0,"mimeType":"text/
html"},"redirectURL":"","headersSize":17,"bodySize":0},"cache":
{},"timings":{"blocked":
0,"dns":-‐1,"connect":-‐1,"send":-‐1,"wait":-‐1,"receive":0,"ssl":-‐1}},
HAR Output
http://www.softwareishard.com/har/viewer/
Demo
Export Timeline Data
Add in Hacks
inspector.js exportTimeline cmd
var
exportTimeline
=
function(cmd)
{
setTimeout(function()
{
//
Start
the
timeline
profiler.
WebInspector.panels.timeline._toggleTimelineButtonClicked();
//
Force
a
reload
of
the
page
to
grab
latest
timeline
stats.
PageAgent.reload(true
/*
bypass
cache
*/);
setTimeout(function()
{
//
Stop
the
timeline
profiler.
WebInspector.panels.timeline._toggleTimelineButtonClicked();
case
'exportTimeline':
exportTimeline(command);
break;
Add in Hacks
TimelineModel.js
export data fn
getExportData:
function()
{
var
records
=
[];
for
(var
i
=
0;
i
<
this._records.length;
i++)
{
records.push(this._records[i]);
}
return
records;
}
Trigger Hack
Trigger Hack
http://localhost:9123/devtools/devtools.html?ws=localhost:9123/devtools/page/
3_1&command={type:'exportTimeline',timeout:3000}
Demo
Command Line
WebKit
Demo
How’d you do that!?
Headless WebKit
“Headless”
Normal Browser
Paint
Layout Display
Headless
Paint
X
Layout Display
What’s in it for me?
What’s in it for me?
Continuous integration
Web scraping
...
PhantomJS
Headless WebKit
Based on QtWebKit port
JavaScript APIs
http://www.phantomjs.org
Demo
Wrap Up
Hacking WebKit
Automation
Page scraping
Behavior/input emulation
Web Inspector hijacking
Thanks!