Updating the Chromium and Google Chrome reference builds on Mac. Synced to revision 41134.

TEST=none
BUG=none

Review URL: http://codereview.chromium.org/1021007

git-svn-id: http://src.chromium.org/svn/trunk/deps/reference_builds/chrome_mac@41963 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
diff --git a/Chromium.app/Contents/Info.plist b/Chromium.app/Contents/Info.plist
index 0d2ac45..9c2f065 100644
--- a/Chromium.app/Contents/Info.plist
+++ b/Chromium.app/Contents/Info.plist
@@ -149,7 +149,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
+	<string>5.0.350.0</string>
 	<key>CFBundleSignature</key>
 	<string>Cr24</string>
 	<key>CFBundleURLTypes</key>
@@ -181,7 +181,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>287.0</string>
+	<string>350.0</string>
 	<key>LSFileQuarantineEnabled</key>
 	<true/>
 	<key>LSHasLocalizedDisplayName</key>
@@ -193,7 +193,7 @@
 	<key>SVNPath</key>
 	<string>/trunk/src</string>
 	<key>SVNRevision</key>
-	<string>35417</string>
+	<string>41134</string>
 	<key>UTExportedTypeDeclarations</key>
 	<array>
 		<dict>
diff --git a/Chromium.app/Contents/MacOS/Chromium b/Chromium.app/Contents/MacOS/Chromium
index 0c0c419..356dff9 100755
--- a/Chromium.app/Contents/MacOS/Chromium
+++ b/Chromium.app/Contents/MacOS/Chromium
Binary files differ
diff --git a/Chromium.app/Contents/Resources/am.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/am.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/am.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/am.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ar.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ar.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ar.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/bg.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/bg.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/bg.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/bn.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/bn.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/bn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ca.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ca.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ca.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/cs.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/cs.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/cs.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/da.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/da.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/da.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/da.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/de.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/de.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/de.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/de.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/el.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/el.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/el.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/el.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/en.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/en.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/en.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/en.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/es.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/es.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/es.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/es.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/es_419.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/es_419.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/es_419.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/et.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/et.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/et.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/et.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/fi.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/fi.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/fi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/fil.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/fil.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/fil.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/fr.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/fr.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/fr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/gu.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/gu.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/gu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/he.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/he.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/he.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/he.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/hi.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/hi.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/hi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/hr.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/hr.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/hr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/hu.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/hu.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/hu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/id.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/id.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/id.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/id.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/it.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/it.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/it.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/it.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ja.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ja.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ja.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/kn.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/kn.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/kn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ko.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ko.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ko.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/lt.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/lt.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/lt.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/lv.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/lv.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/lv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ml.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ml.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ml.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/mr.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/mr.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/mr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/nb.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/nb.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/nb.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/nl.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/nl.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/nl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/or.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/or.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/or.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/or.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/pl.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/pl.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/pl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ro.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ro.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ro.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ru.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ru.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ru.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/sk.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/sk.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/sk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/sl.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/sl.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/sl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/sr.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/sr.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/sr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/sv.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/sv.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/sv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/sw.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/sw.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/sw.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/ta.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/ta.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/ta.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/te.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/te.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/te.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/te.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/th.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/th.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/th.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/th.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/tr.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/tr.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/tr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/uk.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/uk.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/uk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/vi.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/vi.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/vi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Chromium.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
index 39442d8..43a7b17 100644
--- a/Chromium.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
+++ b/Chromium.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Chromium Framework b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Chromium Framework
deleted file mode 100755
index c1cee0c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Chromium Framework
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib
deleted file mode 100755
index 23efd07..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/About.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/About.nib
deleted file mode 100644
index 9a6c6ba..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/About.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/AboutIPC.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/AboutIPC.nib
deleted file mode 100644
index 38fa57d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/AboutIPC.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib
deleted file mode 100644
index 9a5d827..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBar.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBar.nib
deleted file mode 100644
index 5600e2a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBar.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBubble.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBubble.nib
deleted file mode 100644
index d3aa737..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkBubble.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkEditor.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkEditor.nib
deleted file mode 100644
index e526372..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkEditor.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib
deleted file mode 100644
index 0ac1336..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BrowserWindow.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BrowserWindow.nib
deleted file mode 100644
index c3143af..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/BrowserWindow.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib
deleted file mode 100644
index 06d8a16..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadItem.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadItem.nib
deleted file mode 100644
index f8e7b36..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadItem.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadShelf.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadShelf.nib
deleted file mode 100644
index a5da249..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/DownloadShelf.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/EditSearchEngine.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/EditSearchEngine.nib
deleted file mode 100644
index d96ed89..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/EditSearchEngine.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ExtensionShelf.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ExtensionShelf.nib
deleted file mode 100644
index f9b9010..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ExtensionShelf.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FindBar.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FindBar.nib
deleted file mode 100644
index b7357b4..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FindBar.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FirstRunDialog.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FirstRunDialog.nib
deleted file mode 100644
index a9036c7..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FirstRunDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib
deleted file mode 100644
index c95d03a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib
deleted file mode 100644
index 39bec17..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HungRendererDialog.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HungRendererDialog.nib
deleted file mode 100644
index 2543b86..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/HungRendererDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib
deleted file mode 100644
index 7d09c7c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib
deleted file mode 100644
index 03b0605..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Info.plist b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Info.plist
deleted file mode 100644
index 7727f06..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Info.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>Chromium Framework</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.chromium.Chromium.framework</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>287.0</string>
-	<key>SVNPath</key>
-	<string>/trunk/src</string>
-	<key>SVNRevision</key>
-	<string>35417</string>
-</dict>
-</plist>
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBar.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBar.nib
deleted file mode 100644
index 4b4f362..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBar.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBarContainer.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBarContainer.nib
deleted file mode 100644
index 0a672d2..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/InfoBarContainer.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/KeywordEditor.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/KeywordEditor.nib
deleted file mode 100644
index 3a82cde..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/KeywordEditor.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/MainMenu.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/MainMenu.nib
deleted file mode 100644
index b43bd3c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/MainMenu.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/PageInfo.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/PageInfo.nib
deleted file mode 100644
index 83c6284..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/PageInfo.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Preferences.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Preferences.nib
deleted file mode 100644
index e6552bb..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Preferences.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ReportBug.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ReportBug.nib
deleted file mode 100644
index 0a49d09..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ReportBug.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SadTab.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SadTab.nib
deleted file mode 100644
index 3c731f9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SadTab.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib
deleted file mode 100644
index 7bb95bb..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabContents.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabContents.nib
deleted file mode 100644
index 722821e..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabContents.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabView.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabView.nib
deleted file mode 100644
index a2847d8..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TabView.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TaskManager.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TaskManager.nib
deleted file mode 100644
index 99a6d2b..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/TaskManager.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Toolbar.nib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Toolbar.nib
deleted file mode 100644
index 38e2779..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/Toolbar.nib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/am.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/am.lproj/locale.pak
deleted file mode 100644
index 335776d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/am.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak
deleted file mode 100644
index 1e10194..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/back_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/back_Template.pdf
deleted file mode 100644
index 90fe387..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/back_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak
deleted file mode 100644
index 821645e..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak
deleted file mode 100644
index c22b8b0..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak
deleted file mode 100644
index e3138be..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/chrome.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/chrome.pak
deleted file mode 100644
index 42d0420..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/chrome.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar.pdf
deleted file mode 100644
index 0e5b791..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_h.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_h.pdf
deleted file mode 100644
index 7445a6d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_h.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_p.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_p.pdf
deleted file mode 100644
index 138a944..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/close_bar_p.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak
deleted file mode 100644
index 815f87a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/da.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/da.lproj/locale.pak
deleted file mode 100644
index 26a2e2b..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/da.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/de.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/de.lproj/locale.pak
deleted file mode 100644
index 1b343da..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/de.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/el.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/el.lproj/locale.pak
deleted file mode 100644
index 05b1e4e..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/el.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en.lproj/locale.pak
deleted file mode 100644
index ef1fe8a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak
deleted file mode 100644
index f426210..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es.lproj/locale.pak
deleted file mode 100644
index 89b644c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak
deleted file mode 100644
index 6353135..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/et.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/et.lproj/locale.pak
deleted file mode 100644
index fe49161..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/et.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak
deleted file mode 100644
index 216c720..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak
deleted file mode 100644
index e6ea4cd..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_next_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_next_Template.pdf
deleted file mode 100644
index f79a9ce..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_next_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_prev_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_prev_Template.pdf
deleted file mode 100644
index de4cab6..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/find_prev_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/forward_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/forward_Template.pdf
deleted file mode 100644
index 624487b..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/forward_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak
deleted file mode 100644
index 57e04f5..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/go_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/go_Template.pdf
deleted file mode 100644
index 4decb86..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/go_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak
deleted file mode 100644
index e884562..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/he.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/he.lproj/locale.pak
deleted file mode 100644
index 25e66d6..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/he.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak
deleted file mode 100644
index 25a9ef2..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/home_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/home_Template.pdf
deleted file mode 100644
index e6ac966..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/home_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak
deleted file mode 100644
index 51b2f1a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak
deleted file mode 100644
index be6576a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/id.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/id.lproj/locale.pak
deleted file mode 100644
index 3c813c9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/id.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/audits.css b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/audits.css
deleted file mode 100644
index 35db76b..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/audits.css
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-.audits-sidebar-tree-item .icon {
-    content: url(Images/resourcesTimeGraphIcon.png);
-}
-
-.audit-result-sidebar-tree-item .icon {
-    content: url(Images/resourceDocumentIcon.png);
-}
-
-#audit-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-    overflow: auto;
-}
-
-button.clear-audit-results-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#audit-result-view {
-    display: none;
-    overflow: auto;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgb(245, 245, 245);
-    cursor: default;
-    overflow: auto;
-}
-
-#audit-result-view.visible {
-    display: block;
-}
-
-#audit-result-view > .pane img.score {
-    float: left;
-    margin-top: 2px;
-    position: relative;
-    height: 16px;
-    width: 16px;
-    z-index: 100;
-}
-
-#audit-result-view > .pane img.score.red {
-    content: url(Images/errorRedDot.png);
-}
-
-#audit-result-view > .pane img.score.green {
-    content: url(Images/successGreenDot.png);
-}
-
-#audit-result-view > .pane.expanded:nth-last-of-type(1) {
-    border-bottom: 1px solid rgb(189, 189, 189) !important;
-}
-
-#audit-result-view .pane.expanded:nth-last-of-type(1) {
-    border-bottom: 0px transparent none;
-}
-
-#audit-result-view > .pane > .body > .pane > .title {
-    padding-left: 16px;
-    background-image: none;
-    border-bottom: none;
-}
-
-#audit-result-view > .pane > .body > .pane > .body {
-    background-color: transparent;
-}
-
-#audit-result-view > .pane > .body > .pane .section {
-    margin-left: 16px;
-}
-
-#audit-result-view .section .header {
-    border: 0;
-    background-image: none;
-    background-color: transparent;
-}
-
-#audit-result-view .section .header > .title {
-    color: rgb(0, 0, 0);
-}
-
-#audit-result-view .section .section-content {
-    width: 100%;
-    padding-left: 18px;
-    display: none;
-}
-
-#audit-result-view .section.expanded .section-content {
-    display: block;
-}
-
-#audit-result-view .section.expanded .section-content > p:nth-of-type(1) {
-    margin-top: 0;
-}
-
-#audit-result-view .section.expanded .section-content > p:nth-of-type(1) > *:nth-child(1) {
-    margin-top: 0;
-}
-
-#audit-result-view .section .header::before {
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-#audit-result-view .section.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-div.panel.audits .sidebar > ol.sidebar-tree > li:nth-child(1) {
-    height: 0px;
-    padding-top: 0;
-    padding-bottom: 0;
-}
-
-.audit-launcher-view {
-    z-index: 1000;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: white;
-    font-size: 13px;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    display: none;
-}
-
-.audit-launcher-view.visible {
-    display: block;
-}
-
-.audit-launcher-view .audit-launcher-view-content {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    padding: 0 0 0 16px;
-    white-space: nowrap;
-}
-
-.audit-launcher-view h1 {
-    color: rgb(110, 116, 128);
-    font-size: 16px;
-    line-height: 20px;
-    font-weight: normal;
-    padding-top: 15px;
-}
-
-.audit-launcher-view h1.no-audits {
-    text-align: center;
-    font-style: italic;
-    position: relative;
-    left: -8px;
-}
-
-.audit-launcher-view div.button-container {
-    position: absolute;
-    width: 100%;
-    bottom: 16px;
-    padding-top: 16px;
-}
-
-.audit-launcher-view div.audit-categories-container {
-    position: relative;
-    top: 11px;
-    left: 0;
-    width: 100%;
-    overflow-y: auto;
-}
-
-.audit-launcher-view button {
-    color: rgb(6, 6, 6);
-    background-color: transparent;
-    border: 1px solid rgb(165, 165, 165);
-    background-color: rgb(237, 237, 237);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 12px;
-    -webkit-appearance: none;
-}
-
-.audit-launcher-view button {
-    font-size: 13px;
-    padding: 3px 20px;
-    height: 24px;
-    margin: 0 5px 0 0;
-}
-
-.audit-launcher-view button:active {
-    background-color: rgb(215, 215, 215);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-body.inactive .audit-launcher-view button, .audit-launcher-view button:disabled {
-    color: rgb(130, 130, 130);
-    border-color: rgb(212, 212, 212);
-    background-color: rgb(239, 239, 239);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
-}
-
-.audit-launcher-view label {
-    position: relative;
-    display: block;
-    text-align: left;
-    word-break: break-word;
-    padding: 0 0 5px 0;
-}
-
-.audit-launcher-view label.disabled {
-    color: rgb(130, 130, 130);
-}
-
-.audit-launcher-view input[type="checkbox"] {
-    margin-left: 0;
-}
-
-.audit-launcher-view input[type="radio"] {
-    height: 17px;
-    width: 17px;
-    border: 1px solid rgb(165, 165, 165);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 8px;
-    -webkit-appearance: none;
-    vertical-align: middle;
-    margin: 0 5px 5px 0;
-}
-
-.audit-launcher-view input[type="radio"]:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-.audit-launcher-view input[type="radio"]:checked {
-    background: url(Images/radioDot.png) center no-repeat,
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-}
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.css b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.css
deleted file mode 100644
index be00ce4..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.css
+++ /dev/null
@@ -1,203 +0,0 @@
-#scripts-files option.injected {
-    color: rgb(70, 134, 240);
-}
-
-.data-grid table {
-    line-height: 120%;
-}
-
-body.attached #toolbar {
-    height: 34px;
-    border-top: 1px solid rgb(100, 100, 100);
-    cursor: default; /* overriden */
-    padding-left: 0;
-}
-
-
-/* Chrome theme overrides */
-body.platform-windows #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248)));
-}
-
-body.platform-windows.inactive #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237)));
-}
-
-
-/* Heap Profiler Styles */
-
-.heap-snapshot-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.heap-snapshot-sidebar-tree-item .icon {
-    content: url(Images/profileIcon.png);
-}
-
-.heap-snapshot-sidebar-tree-item.small .icon {
-    content: url(Images/profileSmallIcon.png);
-}
-
-.heap-snapshot-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.heap-snapshot-view.visible {
-    display: block;
-}
-
-.heap-snapshot-view .data-grid {
-    border: none;
-    max-height: 100%;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 93px;
-}
-
-.heap-snapshot-view .data-grid th.count-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.count-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.size-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.size-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.countDelta-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.countDelta-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.sizeDelta-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.sizeDelta-column {
-    text-align: right;
-}
-
-#heap-snapshot-summary {
-    position: absolute;
-    padding-top: 20px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: 93px;
-    margin-left: -1px;
-    border-left: 1px solid rgb(102, 102, 102);
-    background-color: rgb(101, 111, 130);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
-    background-repeat: repeat-x;
-    background-position: top;
-    text-align: center;
-    text-shadow: black 0 1px 1px;
-    white-space: nowrap;
-    color: white;
-    -webkit-background-size: 1px 6px;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-body.platform-windows .section > .header {
-    border: 1px solid rgb(92, 116, 157);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157)));
-}
-
-body.platform-windows .console-group-messages .section > .header {
-    padding: 0 8px 0 0;
-    background-image: none;
-    border: none;
-    min-height: 0;
-}
-
-body.platform-windows #resources-filter {
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));
-}
-
-body.platform-windows .crumbs .crumb {
-    -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.end {
-    -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows .crumbs .crumb.selected {
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
-    color: white;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;
-}
-
-body.platform-windows .crumbs .crumb.selected:hover {
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
-    -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows .crumbs .crumb:hover {
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.dimmed:hover {
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.end:hover {
-    -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows body.drawer-visible #main-status-bar {
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);
-}
-
-body.platform-windows .status-bar {
-    background-image: url(Images/statusbarBackgroundChromium.png);
-}
-
-body.platform-windows button.status-bar-item {
-    background-image: url(Images/statusbarButtonsChromium.png);
-}
-
-body.platform-windows select.status-bar-item:active {
-    -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;
-}
-
-body.platform-windows #drawer {
-    background-image: url(Images/statusbarBottomBackgroundChromium.png);
-}
-
-body.platform-windows select.status-bar-item {
-    -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;
-}
-
-.scope-bar li.selected {
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
-}
-
-.scope-bar li:active {
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
-}
-
-.timeline-category-tree-item input {
-    vertical-align: middle;
-}
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.html b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.html
deleted file mode 100644
index 45b5f05..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!--
-Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1.  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-2.  Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-    its contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-    <link rel="stylesheet" type="text/css" href="audits.css">
-    <link rel="stylesheet" type="text/css" href="inspector.css">
-    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
-    <script type="text/javascript" src="utilities.js"></script>
-    <script type="text/javascript" src="treeoutline.js"></script>
-    <script type="text/javascript" src="inspector.js"></script>
-    <script type="text/javascript" src="InspectorBackendStub.js"></script>
-    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
-    <script type="text/javascript" src="Object.js"></script>
-    <script type="text/javascript" src="Settings.js"></script>
-    <script type="text/javascript" src="ContextMenu.js"></script>
-    <script type="text/javascript" src="KeyboardShortcut.js"></script>
-    <script type="text/javascript" src="TextPrompt.js"></script>
-    <script type="text/javascript" src="Popup.js"></script>
-    <script type="text/javascript" src="Placard.js"></script>
-    <script type="text/javascript" src="View.js"></script>
-    <script type="text/javascript" src="Callback.js"></script>
-    <script type="text/javascript" src="Drawer.js"></script>
-    <script type="text/javascript" src="ChangesView.js"></script>
-    <script type="text/javascript" src="ConsoleView.js"></script>
-    <script type="text/javascript" src="Panel.js"></script>
-    <script type="text/javascript" src="TimelineGrid.js"></script>    
-    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
-    <script type="text/javascript" src="Resource.js"></script>
-    <script type="text/javascript" src="ResourceCategory.js"></script>
-    <script type="text/javascript" src="Database.js"></script>
-    <script type="text/javascript" src="DOMStorage.js"></script>
-    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
-    <script type="text/javascript" src="DataGrid.js"></script>
-    <script type="text/javascript" src="CookieItemsView.js"></script>
-    <script type="text/javascript" src="Script.js"></script>
-    <script type="text/javascript" src="Breakpoint.js"></script>
-    <script type="text/javascript" src="SidebarPane.js"></script>
-    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
-    <script type="text/javascript" src="SidebarTreeElement.js"></script>
-    <script type="text/javascript" src="Section.js"></script>
-    <script type="text/javascript" src="PropertiesSection.js"></script>
-    <script type="text/javascript" src="ObjectProxy.js"></script>
-    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
-    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
-    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
-    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
-    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
-    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
-    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
-    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
-    <script type="text/javascript" src="Color.js"></script>
-    <script type="text/javascript" src="StylesSidebarPane.js"></script>
-    <script type="text/javascript" src="PanelEnablerView.js"></script>
-    <script type="text/javascript" src="StatusBarButton.js"></script>
-    <script type="text/javascript" src="SummaryBar.js"></script>
-    <script type="text/javascript" src="ElementsPanel.js"></script>
-    <script type="text/javascript" src="ResourcesPanel.js"></script>
-    <script type="text/javascript" src="ScriptsPanel.js"></script>
-    <script type="text/javascript" src="StoragePanel.js"></script>
-    <script type="text/javascript" src="ProfilesPanel.js"></script>
-    <script type="text/javascript" src="ConsolePanel.js"></script>
-    <script type="text/javascript" src="AuditsPanel.js"></script>
-    <script type="text/javascript" src="AuditResultView.js"></script>
-    <script type="text/javascript" src="AuditLauncherView.js"></script>
-    <script type="text/javascript" src="ResourceView.js"></script>
-    <script type="text/javascript" src="SourceFrame.js"></script>
-    <script type="text/javascript" src="SourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="CSSSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="JavaScriptSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="SourceView.js"></script>
-    <script type="text/javascript" src="FontView.js"></script>
-    <script type="text/javascript" src="ImageView.js"></script>
-    <script type="text/javascript" src="DatabaseTableView.js"></script>
-    <script type="text/javascript" src="DatabaseQueryView.js"></script>
-    <script type="text/javascript" src="ScriptView.js"></script>
-    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="ProfileView.js"></script>
-    <script type="text/javascript" src="DOMAgent.js"></script>
-    <script type="text/javascript" src="InjectedScript.js"></script>
-    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
-    <script type="text/javascript" src="TimelineAgent.js"></script>
-    <script type="text/javascript" src="TimelinePanel.js"></script>
-    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
-    <script type="text/javascript" src="TestController.js"></script>
-
-    <!-- The following lines are added to include DevTools resources -->
-    <link rel="stylesheet" type="text/css" href="devtools.css">
-    <script type="text/javascript" src="base.js"></script>
-    <script type="text/javascript" src="inspector_controller_impl.js"></script>
-    <script type="text/javascript" src="debugger_agent.js"></script>
-    <script type="text/javascript" src="codemap.js"></script>
-    <script type="text/javascript" src="consarray.js"></script>
-    <script type="text/javascript" src="csvparser.js"></script>
-    <script type="text/javascript" src="logreader.js"></script>
-    <script type="text/javascript" src="profile.js"></script>
-    <script type="text/javascript" src="profile_view.js"></script>
-    <script type="text/javascript" src="splaytree.js"></script>
-    <script type="text/javascript" src="profiler_agent.js"></script>
-    <script type="text/javascript" src="profiler_processor.js"></script>
-    <script type="text/javascript" src="heap_profiler_panel.js"></script>
-    <script type="text/javascript" src="devtools.js"></script>
-    <script type="text/javascript" src="devtools_host_stub.js"></script>
-    <script type="text/javascript" src="tests.js"></script>
-    <!-- End of auto-added files list -->
-</head>
-<body class="detached">
-    <div id="toolbar">
-        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
-        <div class="toolbar-item flexable-space"></div>
-        <div class="toolbar-item hidden" id="search-results-matches"></div>
-        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
-        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
-    </div>
-    <div id="main">
-        <div id="main-panels" spellcheck="false"></div>
-        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
-    </div>
-    <div id="drawer">
-        <div id="console-view"><div id="console-messages"><div id="console-prompt" spellcheck="false"><br></div></div></div>
-        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
-    </div>
-</body>
-</html>
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.js b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.js
deleted file mode 100644
index 1a3bc26..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/devtools.js
+++ /dev/null
@@ -1,37815 +0,0 @@
-/* utilities.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-Object.proxyType = function(objectProxy)
-{
-    if (objectProxy === null)
-        return "null";
-
-    var type = typeof objectProxy;
-    if (type !== "object" && type !== "function")
-        return type;
-
-    return objectProxy.type;
-}
-
-Object.properties = function(obj)
-{
-    var properties = [];
-    for (var prop in obj)
-        properties.push(prop);
-    return properties;
-}
-
-Object.sortedProperties = function(obj, sortFunc)
-{
-    return Object.properties(obj).sort(sortFunc);
-}
-
-Function.prototype.bind = function(thisObject)
-{
-    var func = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
-}
-
-Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)
-{
-    var startNode;
-    var startOffset = 0;
-    var endNode;
-    var endOffset = 0;
-
-    if (!stayWithinNode)
-        stayWithinNode = this;
-
-    if (!direction || direction === "backward" || direction === "both") {
-        var node = this;
-        while (node) {
-            if (node === stayWithinNode) {
-                if (!startNode)
-                    startNode = stayWithinNode;
-                break;
-            }
-
-            if (node.nodeType === Node.TEXT_NODE) {
-                var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));
-                for (var i = start; i >= 0; --i) {
-                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
-                        startNode = node;
-                        startOffset = i + 1;
-                        break;
-                    }
-                }
-            }
-
-            if (startNode)
-                break;
-
-            node = node.traversePreviousNode(stayWithinNode);
-        }
-
-        if (!startNode) {
-            startNode = stayWithinNode;
-            startOffset = 0;
-        }
-    } else {
-        startNode = this;
-        startOffset = offset;
-    }
-
-    if (!direction || direction === "forward" || direction === "both") {
-        node = this;
-        while (node) {
-            if (node === stayWithinNode) {
-                if (!endNode)
-                    endNode = stayWithinNode;
-                break;
-            }
-
-            if (node.nodeType === Node.TEXT_NODE) {
-                var start = (node === this ? offset : 0);
-                for (var i = start; i < node.nodeValue.length; ++i) {
-                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
-                        endNode = node;
-                        endOffset = i;
-                        break;
-                    }
-                }
-            }
-
-            if (endNode)
-                break;
-
-            node = node.traverseNextNode(stayWithinNode);
-        }
-
-        if (!endNode) {
-            endNode = stayWithinNode;
-            endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;
-        }
-    } else {
-        endNode = this;
-        endOffset = offset;
-    }
-
-    var result = this.ownerDocument.createRange();
-    result.setStart(startNode, startOffset);
-    result.setEnd(endNode, endOffset);
-
-    return result;
-}
-
-Element.prototype.removeStyleClass = function(className) 
-{
-    // Test for the simple case first.
-    if (this.className === className) {
-        this.className = "";
-        return;
-    }
-
-    var index = this.className.indexOf(className);
-    if (index === -1)
-        return;
-
-    var newClassName = " " + this.className + " ";
-    this.className = newClassName.replace(" " + className + " ", " ");
-}
-
-Element.prototype.removeMatchingStyleClasses = function(classNameRegex)
-{
-    var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");
-    if (regex.test(this.className))
-        this.className = this.className.replace(regex, " ");
-}
-
-Element.prototype.addStyleClass = function(className) 
-{
-    if (className && !this.hasStyleClass(className))
-        this.className += (this.className.length ? " " + className : className);
-}
-
-Element.prototype.hasStyleClass = function(className) 
-{
-    if (!className)
-        return false;
-    // Test for the simple case
-    if (this.className === className)
-        return true;
-
-    var index = this.className.indexOf(className);
-    if (index === -1)
-        return false;
-    var toTest = " " + this.className + " ";
-    return toTest.indexOf(" " + className + " ", index) !== -1;
-}
-
-Element.prototype.positionAt = function(x, y)
-{
-    this.style.left = x + "px";
-    this.style.top = y + "px";
-}
-
-Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
-{
-    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
-        for (var i = 0; i < nameArray.length; ++i)
-            if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
-                return node;
-    return null;
-}
-
-Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
-{
-    return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);
-}
-
-Node.prototype.enclosingNodeOrSelfWithClass = function(className)
-{
-    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
-        if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))
-            return node;
-    return null;
-}
-
-Node.prototype.enclosingNodeWithClass = function(className)
-{
-    if (!this.parentNode)
-        return null;
-    return this.parentNode.enclosingNodeOrSelfWithClass(className);
-}
-
-Element.prototype.query = function(query) 
-{
-    return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
-}
-
-Element.prototype.removeChildren = function()
-{
-    this.innerHTML = "";
-}
-
-Element.prototype.isInsertionCaretInside = function()
-{
-    var selection = window.getSelection();
-    if (!selection.rangeCount || !selection.isCollapsed)
-        return false;
-    var selectionRange = selection.getRangeAt(0);
-    return selectionRange.startContainer === this || selectionRange.startContainer.isDescendant(this);
-}
-
-Element.prototype.__defineGetter__("totalOffsetLeft", function()
-{
-    var total = 0;
-    for (var element = this; element; element = element.offsetParent)
-        total += element.offsetLeft;
-    return total;
-});
-
-Element.prototype.__defineGetter__("totalOffsetTop", function()
-{
-    var total = 0;
-    for (var element = this; element; element = element.offsetParent)
-        total += element.offsetTop;
-    return total;
-});
-
-Element.prototype.offsetRelativeToWindow = function(targetWindow)
-{
-    var elementOffset = {x: 0, y: 0};
-    var curElement = this;
-    var curWindow = this.ownerDocument.defaultView;
-    while (curWindow && curElement) {
-        elementOffset.x += curElement.totalOffsetLeft;
-        elementOffset.y += curElement.totalOffsetTop;
-        if (curWindow === targetWindow)
-            break;
-
-        curElement = curWindow.frameElement;
-        curWindow = curWindow.parent;
-    }
-
-    return elementOffset;
-}
-
-Node.prototype.isWhitespace = isNodeWhitespace;
-Node.prototype.displayName = nodeDisplayName;
-Node.prototype.isAncestor = function(node)
-{
-    return isAncestorNode(this, node);
-};
-Node.prototype.isDescendant = isDescendantNode;
-Node.prototype.traverseNextNode = traverseNextNode;
-Node.prototype.traversePreviousNode = traversePreviousNode;
-Node.prototype.onlyTextChild = onlyTextChild;
-
-String.prototype.hasSubstring = function(string, caseInsensitive)
-{
-    if (!caseInsensitive)
-        return this.indexOf(string) !== -1;
-    return this.match(new RegExp(string.escapeForRegExp(), "i"));
-}
-
-String.prototype.escapeCharacters = function(chars)
-{
-    var foundChar = false;
-    for (var i = 0; i < chars.length; ++i) {
-        if (this.indexOf(chars.charAt(i)) !== -1) {
-            foundChar = true;
-            break;
-        }
-    }
-
-    if (!foundChar)
-        return this;
-
-    var result = "";
-    for (var i = 0; i < this.length; ++i) {
-        if (chars.indexOf(this.charAt(i)) !== -1)
-            result += "\\";
-        result += this.charAt(i);
-    }
-
-    return result;
-}
-
-String.prototype.escapeForRegExp = function()
-{
-    return this.escapeCharacters("^[]{}()\\.$*+?|");
-}
-
-String.prototype.escapeHTML = function()
-{
-    return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
-}
-
-String.prototype.collapseWhitespace = function()
-{
-    return this.replace(/[\s\xA0]+/g, " ");
-}
-
-String.prototype.trimLeadingWhitespace = function()
-{
-    return this.replace(/^[\s\xA0]+/g, "");
-}
-
-String.prototype.trimTrailingWhitespace = function()
-{
-    return this.replace(/[\s\xA0]+$/g, "");
-}
-
-String.prototype.trimWhitespace = function()
-{
-    return this.replace(/^[\s\xA0]+|[\s\xA0]+$/g, "");
-}
-
-String.prototype.trimURL = function(baseURLDomain)
-{
-    var result = this.replace(/^https?:\/\//i, "");
-    if (baseURLDomain)
-        result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");
-    return result;
-}
-
-function isNodeWhitespace()
-{
-    if (!this || this.nodeType !== Node.TEXT_NODE)
-        return false;
-    if (!this.nodeValue.length)
-        return true;
-    return this.nodeValue.match(/^[\s\xA0]+$/);
-}
-
-function nodeDisplayName()
-{
-    if (!this)
-        return "";
-
-    switch (this.nodeType) {
-        case Node.DOCUMENT_NODE:
-            return "Document";
-
-        case Node.ELEMENT_NODE:
-            var name = "<" + this.nodeName.toLowerCase();
-
-            if (this.hasAttributes()) {
-                var value = this.getAttribute("id");
-                if (value)
-                    name += " id=\"" + value + "\"";
-                value = this.getAttribute("class");
-                if (value)
-                    name += " class=\"" + value + "\"";
-                if (this.nodeName.toLowerCase() === "a") {
-                    value = this.getAttribute("name");
-                    if (value)
-                        name += " name=\"" + value + "\"";
-                    value = this.getAttribute("href");
-                    if (value)
-                        name += " href=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "img") {
-                    value = this.getAttribute("src");
-                    if (value)
-                        name += " src=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "iframe") {
-                    value = this.getAttribute("src");
-                    if (value)
-                        name += " src=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "input") {
-                    value = this.getAttribute("name");
-                    if (value)
-                        name += " name=\"" + value + "\"";
-                    value = this.getAttribute("type");
-                    if (value)
-                        name += " type=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "form") {
-                    value = this.getAttribute("action");
-                    if (value)
-                        name += " action=\"" + value + "\"";
-                }
-            }
-
-            return name + ">";
-
-        case Node.TEXT_NODE:
-            if (isNodeWhitespace.call(this))
-                return "(whitespace)";
-            return "\"" + this.nodeValue + "\"";
-
-        case Node.COMMENT_NODE:
-            return "<!--" + this.nodeValue + "-->";
-            
-        case Node.DOCUMENT_TYPE_NODE:
-            var docType = "<!DOCTYPE " + this.nodeName;
-            if (this.publicId) {
-                docType += " PUBLIC \"" + this.publicId + "\"";
-                if (this.systemId)
-                    docType += " \"" + this.systemId + "\"";
-            } else if (this.systemId)
-                docType += " SYSTEM \"" + this.systemId + "\"";
-            if (this.internalSubset)
-                docType += " [" + this.internalSubset + "]";
-            return docType + ">";
-    }
-
-    return this.nodeName.toLowerCase().collapseWhitespace();
-}
-
-function isAncestorNode(ancestor, node)
-{
-    if (!node || !ancestor)
-        return false;
-
-    var currentNode = node.parentNode;
-    while (currentNode) {
-        if (ancestor === currentNode)
-            return true;
-        currentNode = currentNode.parentNode;
-    }
-    return false;
-}
-
-function isDescendantNode(descendant)
-{
-    return isAncestorNode(descendant, this);
-}
-
-function traverseNextNode(stayWithin)
-{
-    if (!this)
-        return;
-
-    var node = this.firstChild;
-    if (node)
-        return node;
-
-    if (stayWithin && this === stayWithin)
-        return null;
-
-    node = this.nextSibling;
-    if (node)
-        return node;
-
-    node = this;
-    while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
-        node = node.parentNode;
-    if (!node)
-        return null;
-
-    return node.nextSibling;
-}
-
-function traversePreviousNode(stayWithin)
-{
-    if (!this)
-        return;
-    if (stayWithin && this === stayWithin)
-        return null;
-    var node = this.previousSibling;
-    while (node && node.lastChild)
-        node = node.lastChild;
-    if (node)
-        return node;
-    return this.parentNode;
-}
-
-function onlyTextChild()
-{
-    if (!this)
-        return null;
-
-    var firstChild = this.firstChild;
-    if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)
-        return null;
-
-    var sibling = firstChild.nextSibling;
-    return sibling ? null : firstChild;
-}
-
-function appropriateSelectorForNode(node, justSelector)
-{
-    if (!node)
-        return "";
-
-    var lowerCaseName = node.localName || node.nodeName.toLowerCase();
-
-    var id = node.getAttribute("id");
-    if (id) {
-        var selector = "#" + id;
-        return (justSelector ? selector : lowerCaseName + selector);
-    }
-
-    var className = node.getAttribute("class");
-    if (className) {
-        var selector = "." + className.replace(/\s+/, ".");
-        return (justSelector ? selector : lowerCaseName + selector);
-    }
-
-    if (lowerCaseName === "input" && node.getAttribute("type"))
-        return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";
-
-    return lowerCaseName;
-}
-
-function getDocumentForNode(node)
-{
-    return node.nodeType == Node.DOCUMENT_NODE ? node : node.ownerDocument;
-}
-
-function parentNode(node)
-{
-    return node.parentNode;
-}
-
-Number.secondsToString = function(seconds, formatterFunction, higherResolution)
-{
-    if (!formatterFunction)
-        formatterFunction = String.sprintf;
-
-    if (seconds === 0)
-        return "0";
-
-    var ms = seconds * 1000;
-    if (higherResolution && ms < 1000)
-        return formatterFunction("%.3fms", ms);
-    else if (ms < 1000)
-        return formatterFunction("%.0fms", ms);
-
-    if (seconds < 60)
-        return formatterFunction("%.2fs", seconds);
-
-    var minutes = seconds / 60;
-    if (minutes < 60)
-        return formatterFunction("%.1fmin", minutes);
-
-    var hours = minutes / 60;
-    if (hours < 24)
-        return formatterFunction("%.1fhrs", hours);
-
-    var days = hours / 24;
-    return formatterFunction("%.1f days", days);
-}
-
-Number.bytesToString = function(bytes, formatterFunction, higherResolution)
-{
-    if (!formatterFunction)
-        formatterFunction = String.sprintf;
-    if (typeof higherResolution === "undefined")
-        higherResolution = true;
-
-    if (bytes < 1024)
-        return formatterFunction("%.0fB", bytes);
-
-    var kilobytes = bytes / 1024;
-    if (higherResolution && kilobytes < 1024)
-        return formatterFunction("%.2fKB", kilobytes);
-    else if (kilobytes < 1024)
-        return formatterFunction("%.0fKB", kilobytes);
-
-    var megabytes = kilobytes / 1024;
-    if (higherResolution)
-        return formatterFunction("%.3fMB", megabytes);
-    else
-        return formatterFunction("%.0fMB", megabytes);
-}
-
-Number.constrain = function(num, min, max)
-{
-    if (num < min)
-        num = min;
-    else if (num > max)
-        num = max;
-    return num;
-}
-
-HTMLTextAreaElement.prototype.moveCursorToEnd = function()
-{
-    var length = this.value.length;
-    this.setSelectionRange(length, length);
-}
-
-Array.prototype.remove = function(value, onlyFirst)
-{
-    if (onlyFirst) {
-        var index = this.indexOf(value);
-        if (index !== -1)
-            this.splice(index, 1);
-        return;
-    }
-
-    var length = this.length;
-    for (var i = 0; i < length; ++i) {
-        if (this[i] === value)
-            this.splice(i, 1);
-    }
-}
-
-Array.prototype.keySet = function()
-{
-    var keys = {};
-    for (var i = 0; i < this.length; ++i)
-        keys[this[i]] = true;
-    return keys;
-}
-
-function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)
-{
-    // indexOf returns (-lowerBound - 1). Taking (-result - 1) works out to lowerBound.
-    return (-indexOfObjectInListSortedByFunction(anObject, aList, aFunction) - 1);
-}
-
-function indexOfObjectInListSortedByFunction(anObject, aList, aFunction)
-{
-    var first = 0;
-    var last = aList.length - 1;
-    var floor = Math.floor;
-    var mid, c;
-
-    while (first <= last) {
-        mid = floor((first + last) / 2);
-        c = aFunction(anObject, aList[mid]);
-
-        if (c > 0)
-            first = mid + 1;
-        else if (c < 0)
-            last = mid - 1;
-        else {
-            // Return the first occurance of an item in the list.
-            while (mid > 0 && aFunction(anObject, aList[mid - 1]) === 0)
-                mid--;
-            first = mid;
-            break;
-        }
-    }
-
-    // By returning 1 less than the negative lower search bound, we can reuse this function
-    // for both indexOf and insertionIndexFor, with some simple arithmetic.
-    return (-first - 1);
-}
-
-String.sprintf = function(format)
-{
-    return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));
-}
-
-String.tokenizeFormatString = function(format)
-{
-    var tokens = [];
-    var substitutionIndex = 0;
-
-    function addStringToken(str)
-    {
-        tokens.push({ type: "string", value: str });
-    }
-
-    function addSpecifierToken(specifier, precision, substitutionIndex)
-    {
-        tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });
-    }
-
-    var index = 0;
-    for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {
-        addStringToken(format.substring(index, precentIndex));
-        index = precentIndex + 1;
-
-        if (format[index] === "%") {
-            addStringToken("%");
-            ++index;
-            continue;
-        }
-
-        if (!isNaN(format[index])) {
-            // The first character is a number, it might be a substitution index.
-            var number = parseInt(format.substring(index));
-            while (!isNaN(format[index]))
-                ++index;
-            // If the number is greater than zero and ends with a "$",
-            // then this is a substitution index.
-            if (number > 0 && format[index] === "$") {
-                substitutionIndex = (number - 1);
-                ++index;
-            }
-        }
-
-        var precision = -1;
-        if (format[index] === ".") {
-            // This is a precision specifier. If no digit follows the ".",
-            // then the precision should be zero.
-            ++index;
-            precision = parseInt(format.substring(index));
-            if (isNaN(precision))
-                precision = 0;
-            while (!isNaN(format[index]))
-                ++index;
-        }
-
-        addSpecifierToken(format[index], precision, substitutionIndex);
-
-        ++substitutionIndex;
-        ++index;
-    }
-
-    addStringToken(format.substring(index));
-
-    return tokens;
-}
-
-String.standardFormatters = {
-    d: function(substitution)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
-            substitution = substitution.description;
-        substitution = parseInt(substitution);
-        return !isNaN(substitution) ? substitution : 0;
-    },
-
-    f: function(substitution, token)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
-            substitution = substitution.description;
-        substitution = parseFloat(substitution);
-        if (substitution && token.precision > -1)
-            substitution = substitution.toFixed(token.precision);
-        return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);
-    },
-
-    s: function(substitution)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) !== "null")
-            substitution = substitution.description;
-        return substitution;
-    },
-};
-
-String.vsprintf = function(format, substitutions)
-{
-    return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;
-}
-
-String.format = function(format, substitutions, formatters, initialValue, append)
-{
-    if (!format || !substitutions || !substitutions.length)
-        return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };
-
-    function prettyFunctionName()
-    {
-        return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";
-    }
-
-    function warn(msg)
-    {
-        console.warn(prettyFunctionName() + ": " + msg);
-    }
-
-    function error(msg)
-    {
-        console.error(prettyFunctionName() + ": " + msg);
-    }
-
-    var result = initialValue;
-    var tokens = String.tokenizeFormatString(format);
-    var usedSubstitutionIndexes = {};
-
-    for (var i = 0; i < tokens.length; ++i) {
-        var token = tokens[i];
-
-        if (token.type === "string") {
-            result = append(result, token.value);
-            continue;
-        }
-
-        if (token.type !== "specifier") {
-            error("Unknown token type \"" + token.type + "\" found.");
-            continue;
-        }
-
-        if (token.substitutionIndex >= substitutions.length) {
-            // If there are not enough substitutions for the current substitutionIndex
-            // just output the format specifier literally and move on.
-            error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");
-            result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);
-            continue;
-        }
-
-        usedSubstitutionIndexes[token.substitutionIndex] = true;
-
-        if (!(token.specifier in formatters)) {
-            // Encountered an unsupported format character, treat as a string.
-            warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");
-            result = append(result, substitutions[token.substitutionIndex]);
-            continue;
-        }
-
-        result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
-    }
-
-    var unusedSubstitutions = [];
-    for (var i = 0; i < substitutions.length; ++i) {
-        if (i in usedSubstitutionIndexes)
-            continue;
-        unusedSubstitutions.push(substitutions[i]);
-    }
-
-    return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
-}
-
-function isEnterKey(event) {
-    // Check if in IME.
-    return event.keyCode !== 229 && event.keyIdentifier === "Enter";
-}
-
-/* treeoutline.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-function TreeOutline(listNode)
-{
-    this.children = [];
-    this.selectedTreeElement = null;
-    this._childrenListNode = listNode;
-    this._childrenListNode.removeChildren();
-    this._knownTreeElements = [];
-    this._treeElementsExpandedState = [];
-    this.expandTreeElementsWhenArrowing = false;
-    this.root = true;
-    this.hasChildren = false;
-    this.expanded = true;
-    this.selected = false;
-    this.treeOutline = this;
-
-    this._childrenListNode.tabIndex = 0;
-    this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
-}
-
-TreeOutline._knownTreeElementNextIdentifier = 1;
-
-TreeOutline._appendChild = function(child)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var lastChild = this.children[this.children.length - 1];
-    if (lastChild) {
-        lastChild.nextSibling = child;
-        child.previousSibling = lastChild;
-    } else {
-        child.previousSibling = null;
-        child.nextSibling = null;
-    }
-
-    this.children.push(child);
-    this.hasChildren = true;
-    child.parent = this;
-    child.treeOutline = this.treeOutline;
-    child.treeOutline._rememberTreeElement(child);
-
-    var current = child.children[0];
-    while (current) {
-        current.treeOutline = this.treeOutline;
-        current.treeOutline._rememberTreeElement(current);
-        current = current.traverseNextTreeElement(false, child, true);
-    }
-
-    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
-        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
-
-    if (!this._childrenListNode) {
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-    }
-
-    child._attach();
-}
-
-TreeOutline._insertChild = function(child, index)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var previousChild = (index > 0 ? this.children[index - 1] : null);
-    if (previousChild) {
-        previousChild.nextSibling = child;
-        child.previousSibling = previousChild;
-    } else {
-        child.previousSibling = null;
-    }
-
-    var nextChild = this.children[index];
-    if (nextChild) {
-        nextChild.previousSibling = child;
-        child.nextSibling = nextChild;
-    } else {
-        child.nextSibling = null;
-    }
-
-    this.children.splice(index, 0, child);
-    this.hasChildren = true;
-    child.parent = this;
-    child.treeOutline = this.treeOutline;
-    child.treeOutline._rememberTreeElement(child);
-
-    var current = child.children[0];
-    while (current) {
-        current.treeOutline = this.treeOutline;
-        current.treeOutline._rememberTreeElement(current);
-        current = current.traverseNextTreeElement(false, child, true);
-    }
-
-    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
-        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
-
-    if (!this._childrenListNode) {
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-    }
-
-    child._attach();
-}
-
-TreeOutline._removeChildAtIndex = function(childIndex)
-{
-    if (childIndex < 0 || childIndex >= this.children.length)
-        throw("childIndex out of range");
-
-    var child = this.children[childIndex];
-    this.children.splice(childIndex, 1);
-
-    var parent = child.parent;
-    if (child.deselect()) {
-        if (child.previousSibling)
-            child.previousSibling.select();
-        else if (child.nextSibling)
-            child.nextSibling.select();
-        else
-            parent.select();
-    }
-
-    if (child.previousSibling)
-        child.previousSibling.nextSibling = child.nextSibling;
-    if (child.nextSibling)
-        child.nextSibling.previousSibling = child.previousSibling;
-
-    if (child.treeOutline) {
-        child.treeOutline._forgetTreeElement(child);
-        child.treeOutline._forgetChildrenRecursive(child);
-    }
-
-    child._detach();
-    child.treeOutline = null;
-    child.parent = null;
-    child.nextSibling = null;
-    child.previousSibling = null;
-}
-
-TreeOutline._removeChild = function(child)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var childIndex = this.children.indexOf(child);
-    if (childIndex === -1)
-        throw("child not found in this node's children");
-
-    TreeOutline._removeChildAtIndex.call(this, childIndex);
-}
-
-TreeOutline._removeChildren = function()
-{
-    for (var i = 0; i < this.children.length; ++i) {
-        var child = this.children[i];
-        child.deselect();
-
-        if (child.treeOutline) {
-            child.treeOutline._forgetTreeElement(child);
-            child.treeOutline._forgetChildrenRecursive(child);
-        }
-
-        child._detach();
-        child.treeOutline = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-    }
-
-    this.children = [];
-}
-
-TreeOutline._removeChildrenRecursive = function()
-{
-    var childrenToRemove = this.children;
-
-    var child = this.children[0];
-    while (child) {
-        if (child.children.length)
-            childrenToRemove = childrenToRemove.concat(child.children);
-        child = child.traverseNextTreeElement(false, this, true);
-    }
-
-    for (var i = 0; i < childrenToRemove.length; ++i) {
-        var child = childrenToRemove[i];
-        child.deselect();
-        if (child.treeOutline)
-            child.treeOutline._forgetTreeElement(child);
-        child._detach();
-        child.children = [];
-        child.treeOutline = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-    }
-
-    this.children = [];
-}
-
-TreeOutline.prototype._rememberTreeElement = function(element)
-{
-    if (!this._knownTreeElements[element.identifier])
-        this._knownTreeElements[element.identifier] = [];
-
-    // check if the element is already known
-    var elements = this._knownTreeElements[element.identifier];
-    if (elements.indexOf(element) !== -1)
-        return;
-
-    // add the element
-    elements.push(element);
-}
-
-TreeOutline.prototype._forgetTreeElement = function(element)
-{
-    if (this._knownTreeElements[element.identifier])
-        this._knownTreeElements[element.identifier].remove(element, true);
-}
-
-TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)
-{
-    var child = parentElement.children[0];
-    while (child) {
-        this._forgetTreeElement(child);
-        child = child.traverseNextTreeElement(false, this, true);
-    }
-}
-
-TreeOutline.prototype.getCachedTreeElement = function(representedObject)
-{
-    if (!representedObject)
-        return null;
-
-    if ("__treeElementIdentifier" in representedObject) {
-        // If this representedObject has a tree element identifier, and it is a known TreeElement
-        // in our tree we can just return that tree element.
-        var elements = this._knownTreeElements[representedObject.__treeElementIdentifier];
-        if (elements) {
-            for (var i = 0; i < elements.length; ++i)
-                if (elements[i].representedObject === representedObject)
-                    return elements[i];
-        }
-    }
-    return null;
-}
-
-TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)
-{
-    if (!representedObject)
-        return null;
-
-    var cachedElement = this.getCachedTreeElement(representedObject);
-    if (cachedElement)
-        return cachedElement;
-
-    // The representedObject isn't know, so we start at the top of the tree and work down to find the first
-    // tree element that represents representedObject or one of its ancestors.
-    var item;
-    var found = false;
-    for (var i = 0; i < this.children.length; ++i) {
-        item = this.children[i];
-        if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
-            found = true;
-            break;
-        }
-    }
-
-    if (!found)
-        return null;
-
-    // Make sure the item that we found is connected to the root of the tree.
-    // Build up a list of representedObject's ancestors that aren't already in our tree.
-    var ancestors = [];
-    var currentObject = representedObject;
-    while (currentObject) {
-        ancestors.unshift(currentObject);
-        if (currentObject === item.representedObject)
-            break;
-        currentObject = getParent(currentObject);
-    }
-
-    // For each of those ancestors we populate them to fill in the tree.
-    for (var i = 0; i < ancestors.length; ++i) {
-        // Make sure we don't call findTreeElement with the same representedObject
-        // again, to prevent infinite recursion.
-        if (ancestors[i] === representedObject)
-            continue;
-        // FIXME: we could do something faster than findTreeElement since we will know the next
-        // ancestor exists in the tree.
-        item = this.findTreeElement(ancestors[i], isAncestor, getParent);
-        if (item && item.onpopulate)
-            item.onpopulate(item);
-    }
-
-    return this.getCachedTreeElement(representedObject);
-}
-
-TreeOutline.prototype.treeElementFromPoint = function(x, y)
-{
-    var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);
-    var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);
-    if (listNode)
-        return listNode.parentTreeElement || listNode.treeElement;
-    return null;
-}
-
-TreeOutline.prototype._treeKeyDown = function(event)
-{
-    if (event.target !== this._childrenListNode)
-        return;
-
-    if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
-        return;
-
-    var handled = false;
-    var nextSelectedElement;
-    if (event.keyIdentifier === "Up" && !event.altKey) {
-        nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
-        while (nextSelectedElement && !nextSelectedElement.selectable)
-            nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
-        handled = nextSelectedElement ? true : false;
-    } else if (event.keyIdentifier === "Down" && !event.altKey) {
-        nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
-        while (nextSelectedElement && !nextSelectedElement.selectable)
-            nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
-        handled = nextSelectedElement ? true : false;
-    } else if (event.keyIdentifier === "Left") {
-        if (this.selectedTreeElement.expanded) {
-            if (event.altKey)
-                this.selectedTreeElement.collapseRecursively();
-            else
-                this.selectedTreeElement.collapse();
-            handled = true;
-        } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {
-            handled = true;
-            if (this.selectedTreeElement.parent.selectable) {
-                nextSelectedElement = this.selectedTreeElement.parent;
-                handled = nextSelectedElement ? true : false;
-            } else if (this.selectedTreeElement.parent)
-                this.selectedTreeElement.parent.collapse();
-        }
-    } else if (event.keyIdentifier === "Right") {
-        if (!this.selectedTreeElement.revealed()) {
-            this.selectedTreeElement.reveal();
-            handled = true;
-        } else if (this.selectedTreeElement.hasChildren) {
-            handled = true;
-            if (this.selectedTreeElement.expanded) {
-                nextSelectedElement = this.selectedTreeElement.children[0];
-                handled = nextSelectedElement ? true : false;
-            } else {
-                if (event.altKey)
-                    this.selectedTreeElement.expandRecursively();
-                else
-                    this.selectedTreeElement.expand();
-            }
-        }
-    }
-
-    if (nextSelectedElement) {
-        nextSelectedElement.reveal();
-        nextSelectedElement.select();
-    }
-
-    if (handled) {
-        event.preventDefault();
-        event.stopPropagation();
-    }
-}
-
-TreeOutline.prototype.expand = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.collapse = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.revealed = function()
-{
-    return true;
-}
-
-TreeOutline.prototype.reveal = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.appendChild = TreeOutline._appendChild;
-TreeOutline.prototype.insertChild = TreeOutline._insertChild;
-TreeOutline.prototype.removeChild = TreeOutline._removeChild;
-TreeOutline.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
-TreeOutline.prototype.removeChildren = TreeOutline._removeChildren;
-TreeOutline.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
-
-function TreeElement(title, representedObject, hasChildren)
-{
-    this._title = title;
-    this.representedObject = (representedObject || {});
-
-    if (this.representedObject.__treeElementIdentifier)
-        this.identifier = this.representedObject.__treeElementIdentifier;
-    else {
-        this.identifier = TreeOutline._knownTreeElementNextIdentifier++;
-        this.representedObject.__treeElementIdentifier = this.identifier;
-    }
-
-    this._hidden = false;
-    this.expanded = false;
-    this.selected = false;
-    this.hasChildren = hasChildren;
-    this.children = [];
-    this.treeOutline = null;
-    this.parent = null;
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this._listItemNode = null;
-}
-
-TreeElement.prototype = {
-    selectable: true,
-    arrowToggleWidth: 10,
-
-    get listItemElement() {
-        return this._listItemNode;
-    },
-
-    get childrenListElement() {
-        return this._childrenListNode;
-    },
-
-    get title() {
-        return this._title;
-    },
-
-    set title(x) {
-        this._title = x;
-        if (this._listItemNode)
-            this._listItemNode.innerHTML = x;
-    },
-
-    get tooltip() {
-        return this._tooltip;
-    },
-
-    set tooltip(x) {
-        this._tooltip = x;
-        if (this._listItemNode)
-            this._listItemNode.title = x ? x : "";
-    },
-
-    get hasChildren() {
-        return this._hasChildren;
-    },
-
-    set hasChildren(x) {
-        if (this._hasChildren === x)
-            return;
-
-        this._hasChildren = x;
-
-        if (!this._listItemNode)
-            return;
-
-        if (x)
-            this._listItemNode.addStyleClass("parent");
-        else {
-            this._listItemNode.removeStyleClass("parent");
-            this.collapse();
-        }
-    },
-
-    get hidden() {
-        return this._hidden;
-    },
-
-    set hidden(x) {
-        if (this._hidden === x)
-            return;
-
-        this._hidden = x;
-
-        if (x) {
-            if (this._listItemNode)
-                this._listItemNode.addStyleClass("hidden");
-            if (this._childrenListNode)
-                this._childrenListNode.addStyleClass("hidden");
-        } else {
-            if (this._listItemNode)
-                this._listItemNode.removeStyleClass("hidden");
-            if (this._childrenListNode)
-                this._childrenListNode.removeStyleClass("hidden");
-        }
-    },
-
-    get shouldRefreshChildren() {
-        return this._shouldRefreshChildren;
-    },
-
-    set shouldRefreshChildren(x) {
-        this._shouldRefreshChildren = x;
-        if (x && this.expanded)
-            this.expand();
-    }
-}
-
-TreeElement.prototype.appendChild = TreeOutline._appendChild;
-TreeElement.prototype.insertChild = TreeOutline._insertChild;
-TreeElement.prototype.removeChild = TreeOutline._removeChild;
-TreeElement.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
-TreeElement.prototype.removeChildren = TreeOutline._removeChildren;
-TreeElement.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
-
-TreeElement.prototype._attach = function()
-{
-    if (!this._listItemNode || this.parent._shouldRefreshChildren) {
-        if (this._listItemNode && this._listItemNode.parentNode)
-            this._listItemNode.parentNode.removeChild(this._listItemNode);
-
-        this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");
-        this._listItemNode.treeElement = this;
-        this._listItemNode.innerHTML = this._title;
-        this._listItemNode.title = this._tooltip ? this._tooltip : "";
-
-        if (this.hidden)
-            this._listItemNode.addStyleClass("hidden");
-        if (this.hasChildren)
-            this._listItemNode.addStyleClass("parent");
-        if (this.expanded)
-            this._listItemNode.addStyleClass("expanded");
-        if (this.selected)
-            this._listItemNode.addStyleClass("selected");
-
-        this._listItemNode.addEventListener("mousedown", TreeElement.treeElementSelected, false);
-        this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);
-        this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);
-
-        if (this.onattach)
-            this.onattach(this);
-    }
-
-    var nextSibling = null;
-    if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)
-        nextSibling = this.nextSibling._listItemNode;
-    this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);
-    if (this._childrenListNode)
-        this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
-    if (this.selected)
-        this.select();
-    if (this.expanded)
-        this.expand();
-}
-
-TreeElement.prototype._detach = function()
-{
-    if (this._listItemNode && this._listItemNode.parentNode)
-        this._listItemNode.parentNode.removeChild(this._listItemNode);
-    if (this._childrenListNode && this._childrenListNode.parentNode)
-        this._childrenListNode.parentNode.removeChild(this._childrenListNode);
-}
-
-TreeElement.treeElementSelected = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement || !element.treeElement.selectable)
-        return;
-
-    if (element.treeElement.isEventWithinDisclosureTriangle(event))
-        return;
-
-    element.treeElement.select();
-}
-
-TreeElement.treeElementToggled = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement)
-        return;
-
-    if (!element.treeElement.isEventWithinDisclosureTriangle(event))
-        return;
-
-    if (element.treeElement.expanded) {
-        if (event.altKey)
-            element.treeElement.collapseRecursively();
-        else
-            element.treeElement.collapse();
-    } else {
-        if (event.altKey)
-            element.treeElement.expandRecursively();
-        else
-            element.treeElement.expand();
-    }
-}
-
-TreeElement.treeElementDoubleClicked = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement)
-        return;
-
-    if (element.treeElement.ondblclick)
-        element.treeElement.ondblclick.call(element.treeElement, event);
-    else if (element.treeElement.hasChildren && !element.treeElement.expanded)
-        element.treeElement.expand();
-}
-
-TreeElement.prototype.collapse = function()
-{
-    if (this._listItemNode)
-        this._listItemNode.removeStyleClass("expanded");
-    if (this._childrenListNode)
-        this._childrenListNode.removeStyleClass("expanded");
-
-    this.expanded = false;
-    if (this.treeOutline)
-        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
-
-    if (this.oncollapse)
-        this.oncollapse(this);
-}
-
-TreeElement.prototype.collapseRecursively = function()
-{
-    var item = this;
-    while (item) {
-        if (item.expanded)
-            item.collapse();
-        item = item.traverseNextTreeElement(false, this, true);
-    }
-}
-
-TreeElement.prototype.expand = function()
-{
-    if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))
-        return;
-
-    if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {
-        if (this._childrenListNode && this._childrenListNode.parentNode)
-            this._childrenListNode.parentNode.removeChild(this._childrenListNode);
-
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-
-        if (this.onpopulate)
-            this.onpopulate(this);
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i]._attach();
-
-        delete this._shouldRefreshChildren;
-    }
-
-    if (this._listItemNode) {
-        this._listItemNode.addStyleClass("expanded");
-        if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)
-            this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
-    }
-
-    if (this._childrenListNode)
-        this._childrenListNode.addStyleClass("expanded");
-
-    this.expanded = true;
-    if (this.treeOutline)
-        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
-
-    if (this.onexpand)
-        this.onexpand(this);
-}
-
-TreeElement.prototype.expandRecursively = function(maxDepth)
-{
-    var item = this;
-    var info = {};
-    var depth = 0;
-
-    // The Inspector uses TreeOutlines to represents object properties, so recursive expansion
-    // in some case can be infinite, since JavaScript objects can hold circular references.
-    // So default to a recursion cap of 3 levels, since that gives fairly good results.
-    if (typeof maxDepth === "undefined" || typeof maxDepth === "null")
-        maxDepth = 3;
-
-    while (item) {
-        if (depth < maxDepth)
-            item.expand();
-        item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);
-        depth += info.depthChange;
-    }
-}
-
-TreeElement.prototype.hasAncestor = function(ancestor) {
-    if (!ancestor)
-        return false;
-
-    var currentNode = this.parent;
-    while (currentNode) {
-        if (ancestor === currentNode)
-            return true;
-        currentNode = currentNode.parent;
-    }
-
-    return false;
-}
-
-TreeElement.prototype.reveal = function()
-{
-    var currentAncestor = this.parent;
-    while (currentAncestor && !currentAncestor.root) {
-        if (!currentAncestor.expanded)
-            currentAncestor.expand();
-        currentAncestor = currentAncestor.parent;
-    }
-
-    if (this.onreveal)
-        this.onreveal(this);
-}
-
-TreeElement.prototype.revealed = function()
-{
-    var currentAncestor = this.parent;
-    while (currentAncestor && !currentAncestor.root) {
-        if (!currentAncestor.expanded)
-            return false;
-        currentAncestor = currentAncestor.parent;
-    }
-
-    return true;
-}
-
-TreeElement.prototype.select = function(supressOnSelect)
-{
-    if (!this.treeOutline || !this.selectable || this.selected)
-        return;
-
-    if (this.treeOutline.selectedTreeElement)
-        this.treeOutline.selectedTreeElement.deselect();
-
-    this.selected = true;
-    this.treeOutline.selectedTreeElement = this;
-    if (this._listItemNode)
-        this._listItemNode.addStyleClass("selected");
-
-    if (this.onselect && !supressOnSelect)
-        this.onselect(this);
-}
-
-TreeElement.prototype.deselect = function(supressOnDeselect)
-{
-    if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
-        return false;
-
-    this.selected = false;
-    this.treeOutline.selectedTreeElement = null;
-    if (this._listItemNode)
-        this._listItemNode.removeStyleClass("selected");
-
-    if (this.ondeselect && !supressOnDeselect)
-        this.ondeselect(this);
-    return true;
-}
-
-TreeElement.prototype.traverseNextTreeElement = function(skipHidden, stayWithin, dontPopulate, info)
-{
-    if (!dontPopulate && this.hasChildren && this.onpopulate)
-        this.onpopulate(this);
-
-    if (info)
-        info.depthChange = 0;
-
-    var element = skipHidden ? (this.revealed() ? this.children[0] : null) : this.children[0];
-    if (element && (!skipHidden || (skipHidden && this.expanded))) {
-        if (info)
-            info.depthChange = 1;
-        return element;
-    }
-
-    if (this === stayWithin)
-        return null;
-
-    element = skipHidden ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;
-    if (element)
-        return element;
-
-    element = this;
-    while (element && !element.root && !(skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {
-        if (info)
-            info.depthChange -= 1;
-        element = element.parent;
-    }
-
-    if (!element)
-        return null;
-
-    return (skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);
-}
-
-TreeElement.prototype.traversePreviousTreeElement = function(skipHidden, dontPopulate)
-{
-    var element = skipHidden ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;
-    if (!dontPopulate && element && element.hasChildren && element.onpopulate)
-        element.onpopulate(element);
-
-    while (element && (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {
-        if (!dontPopulate && element.hasChildren && element.onpopulate)
-            element.onpopulate(element);
-        element = (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);
-    }
-
-    if (element)
-        return element;
-
-    if (!this.parent || this.parent.root)
-        return null;
-
-    return this.parent;
-}
-
-TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
-{
-    var left = this._listItemNode.totalOffsetLeft;
-    return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
-}
-
-/* inspector.js */
-
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2007 Matt Lilek ([email protected]).
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-function preloadImages()
-{
-    (new Image()).src = "Images/clearConsoleButtonGlyph.png";
-    (new Image()).src = "Images/consoleButtonGlyph.png";
-    (new Image()).src = "Images/dockButtonGlyph.png";
-    (new Image()).src = "Images/enableOutlineButtonGlyph.png";
-    (new Image()).src = "Images/enableSolidButtonGlyph.png";
-    (new Image()).src = "Images/excludeButtonGlyph.png";
-    (new Image()).src = "Images/focusButtonGlyph.png";
-    (new Image()).src = "Images/largerResourcesButtonGlyph.png";
-    (new Image()).src = "Images/nodeSearchButtonGlyph.png";
-    (new Image()).src = "Images/pauseOnExceptionButtonGlyph.png";
-    (new Image()).src = "Images/percentButtonGlyph.png";
-    (new Image()).src = "Images/recordButtonGlyph.png";
-    (new Image()).src = "Images/recordToggledButtonGlyph.png";
-    (new Image()).src = "Images/reloadButtonGlyph.png";
-    (new Image()).src = "Images/undockButtonGlyph.png";
-}
-
-preloadImages();
-
-var WebInspector = {
-    resources: {},
-    resourceURLMap: {},
-    cookieDomains: {},
-    missingLocalizedStrings: {},
-    pendingDispatches: 0,
-
-    // RegExp groups:
-    // 1 - scheme
-    // 2 - hostname
-    // 3 - ?port
-    // 4 - ?path
-    // 5 - ?fragment
-    URLRegExp: /^(http[s]?|file):\/\/([^\/:]+)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
-
-    get platform()
-    {
-        if (!("_platform" in this))
-            this._platform = InspectorFrontendHost.platform();
-
-        return this._platform;
-    },
-
-    get port()
-    {
-        if (!("_port" in this))
-            this._port = InspectorFrontendHost.port();
-
-        return this._port;
-    },
-
-    get previousFocusElement()
-    {
-        return this._previousFocusElement;
-    },
-
-    get currentFocusElement()
-    {
-        return this._currentFocusElement;
-    },
-
-    set currentFocusElement(x)
-    {
-        if (this._currentFocusElement !== x)
-            this._previousFocusElement = this._currentFocusElement;
-        this._currentFocusElement = x;
-
-        if (this._currentFocusElement) {
-            this._currentFocusElement.focus();
-
-            // Make a caret selection inside the new element if there isn't a range selection and
-            // there isn't already a caret selection inside.
-            var selection = window.getSelection();
-            if (selection.isCollapsed && !this._currentFocusElement.isInsertionCaretInside()) {
-                var selectionRange = this._currentFocusElement.ownerDocument.createRange();
-                selectionRange.setStart(this._currentFocusElement, 0);
-                selectionRange.setEnd(this._currentFocusElement, 0);
-
-                selection.removeAllRanges();
-                selection.addRange(selectionRange);
-            }
-        } else if (this._previousFocusElement)
-            this._previousFocusElement.blur();
-    },
-
-    get currentPanel()
-    {
-        return this._currentPanel;
-    },
-
-    set currentPanel(x)
-    {
-        if (this._currentPanel === x)
-            return;
-
-        if (this._currentPanel)
-            this._currentPanel.hide();
-
-        this._currentPanel = x;
-
-        this.updateSearchLabel();
-
-        if (x) {
-            x.show();
-
-            if (this.currentQuery) {
-                if (x.performSearch) {
-                    function performPanelSearch()
-                    {
-                        this.updateSearchMatchesCount();
-
-                        x.currentQuery = this.currentQuery;
-                        x.performSearch(this.currentQuery);
-                    }
-
-                    // Perform the search on a timeout so the panel switches fast.
-                    setTimeout(performPanelSearch.bind(this), 0);
-                } else {
-                    // Update to show Not found for panels that can't be searched.
-                    this.updateSearchMatchesCount();
-                }
-            }
-        }
-
-        for (var panelName in WebInspector.panels) {
-            if (WebInspector.panels[panelName] == x)
-                InspectorBackend.storeLastActivePanel(panelName);
-        }
-    },
-
-    _createPanels: function()
-    {
-        var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');
-        if (hiddenPanels.indexOf("elements") === -1)
-            this.panels.elements = new WebInspector.ElementsPanel();
-        if (hiddenPanels.indexOf("resources") === -1)
-            this.panels.resources = new WebInspector.ResourcesPanel();
-        if (hiddenPanels.indexOf("scripts") === -1)
-            this.panels.scripts = new WebInspector.ScriptsPanel();
-        if (hiddenPanels.indexOf("timeline") === -1)
-            this.panels.timeline = new WebInspector.TimelinePanel();
-        if (hiddenPanels.indexOf("profiles") === -1) {
-            this.panels.profiles = new WebInspector.ProfilesPanel();
-            this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());
-        }
-
-        if (hiddenPanels.indexOf("storage") === -1 && hiddenPanels.indexOf("databases") === -1)
-            this.panels.storage = new WebInspector.StoragePanel();
-
-        // FIXME: Uncomment when ready.
-        // if (hiddenPanels.indexOf("audits") === -1)
-        //    this.panels.audits = new WebInspector.AuditsPanel();
-
-        if (hiddenPanels.indexOf("console") === -1)
-            this.panels.console = new WebInspector.ConsolePanel();
-    },
-
-    get attached()
-    {
-        return this._attached;
-    },
-
-    set attached(x)
-    {
-        if (this._attached === x)
-            return;
-
-        this._attached = x;
-
-        this.updateSearchLabel();
-
-        var dockToggleButton = document.getElementById("dock-status-bar-item");
-        var body = document.body;
-
-        if (x) {
-            InspectorFrontendHost.attach();
-            body.removeStyleClass("detached");
-            body.addStyleClass("attached");
-            dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
-        } else {
-            InspectorFrontendHost.detach();
-            body.removeStyleClass("attached");
-            body.addStyleClass("detached");
-            dockToggleButton.title = WebInspector.UIString("Dock to main window.");
-        }
-    },
-
-    get errors()
-    {
-        return this._errors || 0;
-    },
-
-    set errors(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._errors === x)
-            return;
-        this._errors = x;
-        this._updateErrorAndWarningCounts();
-    },
-
-    get warnings()
-    {
-        return this._warnings || 0;
-    },
-
-    set warnings(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._warnings === x)
-            return;
-        this._warnings = x;
-        this._updateErrorAndWarningCounts();
-    },
-
-    _updateErrorAndWarningCounts: function()
-    {
-        var errorWarningElement = document.getElementById("error-warning-count");
-        if (!errorWarningElement)
-            return;
-
-        if (!this.errors && !this.warnings) {
-            errorWarningElement.addStyleClass("hidden");
-            return;
-        }
-
-        errorWarningElement.removeStyleClass("hidden");
-
-        errorWarningElement.removeChildren();
-
-        if (this.errors) {
-            var errorElement = document.createElement("span");
-            errorElement.id = "error-count";
-            errorElement.textContent = this.errors;
-            errorWarningElement.appendChild(errorElement);
-        }
-
-        if (this.warnings) {
-            var warningsElement = document.createElement("span");
-            warningsElement.id = "warning-count";
-            warningsElement.textContent = this.warnings;
-            errorWarningElement.appendChild(warningsElement);
-        }
-
-        if (this.errors) {
-            if (this.warnings) {
-                if (this.errors == 1) {
-                    if (this.warnings == 1)
-                        errorWarningElement.title = WebInspector.UIString("%d error, %d warning", this.errors, this.warnings);
-                    else
-                        errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", this.errors, this.warnings);
-                } else if (this.warnings == 1)
-                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", this.errors, this.warnings);
-                else
-                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", this.errors, this.warnings);
-            } else if (this.errors == 1)
-                errorWarningElement.title = WebInspector.UIString("%d error", this.errors);
-            else
-                errorWarningElement.title = WebInspector.UIString("%d errors", this.errors);
-        } else if (this.warnings == 1)
-            errorWarningElement.title = WebInspector.UIString("%d warning", this.warnings);
-        else if (this.warnings)
-            errorWarningElement.title = WebInspector.UIString("%d warnings", this.warnings);
-        else
-            errorWarningElement.title = null;
-    },
-
-    get styleChanges()
-    {
-        return this._styleChanges;
-    },
-
-    set styleChanges(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._styleChanges === x)
-            return;
-        this._styleChanges = x;
-        this._updateChangesCount();
-    },
-
-    _updateChangesCount: function()
-    {
-        // TODO: Remove immediate return when enabling the Changes Panel
-        return;
-
-        var changesElement = document.getElementById("changes-count");
-        if (!changesElement)
-            return;
-
-        if (!this.styleChanges) {
-            changesElement.addStyleClass("hidden");
-            return;
-        }
-
-        changesElement.removeStyleClass("hidden");
-        changesElement.removeChildren();
-
-        if (this.styleChanges) {
-            var styleChangesElement = document.createElement("span");
-            styleChangesElement.id = "style-changes-count";
-            styleChangesElement.textContent = this.styleChanges;
-            changesElement.appendChild(styleChangesElement);
-        }
-
-        if (this.styleChanges) {
-            if (this.styleChanges === 1)
-                changesElement.title = WebInspector.UIString("%d style change", this.styleChanges);
-            else
-                changesElement.title = WebInspector.UIString("%d style changes", this.styleChanges);
-        }
-    },
-
-    get hoveredDOMNode()
-    {
-        return this._hoveredDOMNode;
-    },
-
-    set hoveredDOMNode(x)
-    {
-        if (this._hoveredDOMNode === x)
-            return;
-
-        this._hoveredDOMNode = x;
-
-        if (this._hoveredDOMNode)
-            this._updateHoverHighlightSoon(this.showingDOMNodeHighlight ? 50 : 500);
-        else
-            this._updateHoverHighlight();
-    },
-
-    _updateHoverHighlightSoon: function(delay)
-    {
-        if ("_updateHoverHighlightTimeout" in this)
-            clearTimeout(this._updateHoverHighlightTimeout);
-        this._updateHoverHighlightTimeout = setTimeout(this._updateHoverHighlight.bind(this), delay);
-    },
-
-    _updateHoverHighlight: function()
-    {
-        if ("_updateHoverHighlightTimeout" in this) {
-            clearTimeout(this._updateHoverHighlightTimeout);
-            delete this._updateHoverHighlightTimeout;
-        }
-
-        if (this._hoveredDOMNode) {
-            InspectorBackend.highlightDOMNode(this._hoveredDOMNode.id);
-            this.showingDOMNodeHighlight = true;
-        } else {
-            InspectorBackend.hideDOMNodeHighlight();
-            this.showingDOMNodeHighlight = false;
-        }
-    }
-}
-
-WebInspector.loaded = function()
-{
-    var platform = WebInspector.platform;
-    document.body.addStyleClass("platform-" + platform);
-    var port = WebInspector.port;
-    document.body.addStyleClass("port-" + port);
-
-    this.settings = new WebInspector.Settings();
-
-    this.drawer = new WebInspector.Drawer();
-    this.console = new WebInspector.ConsoleView(this.drawer);
-    // TODO: Uncomment when enabling the Changes Panel
-    // this.changes = new WebInspector.ChangesView(this.drawer);
-    // TODO: Remove class="hidden" from inspector.html on button#changes-status-bar-item
-    this.drawer.visibleView = this.console;
-    this.domAgent = new WebInspector.DOMAgent();
-
-    this.resourceCategories = {
-        documents: new WebInspector.ResourceCategory("documents", WebInspector.UIString("Documents"), "rgb(47,102,236)"),
-        stylesheets: new WebInspector.ResourceCategory("stylesheets", WebInspector.UIString("Stylesheets"), "rgb(157,231,119)"),
-        images: new WebInspector.ResourceCategory("images", WebInspector.UIString("Images"), "rgb(164,60,255)"),
-        scripts: new WebInspector.ResourceCategory("scripts", WebInspector.UIString("Scripts"), "rgb(255,121,0)"),
-        xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),
-        fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),
-        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
-    };
-
-    this.panels = {};
-    this._createPanels();
-
-    var toolbarElement = document.getElementById("toolbar");
-    var previousToolbarItem = toolbarElement.children[0];
-
-    this.panelOrder = [];
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        var panelToolbarItem = panel.toolbarItem;
-        this.panelOrder.push(panel);
-        panelToolbarItem.addEventListener("click", this._toolbarItemClicked.bind(this));
-        if (previousToolbarItem)
-            toolbarElement.insertBefore(panelToolbarItem, previousToolbarItem.nextSibling);
-        else
-            toolbarElement.insertBefore(panelToolbarItem, toolbarElement.firstChild);
-        previousToolbarItem = panelToolbarItem;
-    }
-
-    this.Tips = {
-        ResourceNotCompressed: {id: 0, message: WebInspector.UIString("You could save bandwidth by having your web server compress this transfer with gzip or zlib.")}
-    };
-
-    this.Warnings = {
-        IncorrectMIMEType: {id: 0, message: WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s.")}
-    };
-
-    this.addMainEventListeners(document);
-
-    window.addEventListener("unload", this.windowUnload.bind(this), true);
-    window.addEventListener("resize", this.windowResize.bind(this), true);
-
-    document.addEventListener("focus", this.focusChanged.bind(this), true);
-    document.addEventListener("keydown", this.documentKeyDown.bind(this), false);
-    document.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);
-    document.addEventListener("copy", this.documentCopy.bind(this), true);
-    document.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);
-
-    var dockToggleButton = document.getElementById("dock-status-bar-item");
-    dockToggleButton.addEventListener("click", this.toggleAttach.bind(this), false);
-
-    if (this.attached)
-        dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
-    else
-        dockToggleButton.title = WebInspector.UIString("Dock to main window.");
-
-    var errorWarningCount = document.getElementById("error-warning-count");
-    errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);
-    this._updateErrorAndWarningCounts();
-
-    this.styleChanges = 0;
-    // TODO: Uncomment when enabling the Changes Panel
-    // var changesElement = document.getElementById("changes-count");
-    // changesElement.addEventListener("click", this.showChanges.bind(this), false);
-    // this._updateErrorAndWarningCounts();
-
-    var searchField = document.getElementById("search");
-    searchField.addEventListener("search", this.performSearch.bind(this), false); // when the search is emptied
-    searchField.addEventListener("mousedown", this._searchFieldManualFocus.bind(this), false); // when the search field is manually selected
-    searchField.addEventListener("keydown", this._searchKeyDown.bind(this), true);
-
-    toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);
-    document.getElementById("close-button-left").addEventListener("click", this.close, true);
-    document.getElementById("close-button-right").addEventListener("click", this.close, true);
-
-    InspectorFrontendHost.loaded();
-}
-
-var windowLoaded = function()
-{
-    var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();
-    if (localizedStringsURL) {
-        var localizedStringsScriptElement = document.createElement("script");
-        localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);
-        localizedStringsScriptElement.type = "text/javascript";
-        localizedStringsScriptElement.src = localizedStringsURL;
-        document.head.appendChild(localizedStringsScriptElement);
-    } else
-        WebInspector.loaded();
-
-    window.removeEventListener("load", windowLoaded, false);
-    delete windowLoaded;
-};
-
-window.addEventListener("load", windowLoaded, false);
-
-WebInspector.dispatch = function() {
-    var methodName = arguments[0];
-    var parameters = Array.prototype.slice.call(arguments, 1);
-
-    // We'd like to enforce asynchronous interaction between the inspector controller and the frontend.
-    // This is important to LayoutTests.
-    function delayDispatch()
-    {
-        WebInspector[methodName].apply(WebInspector, parameters);
-        WebInspector.pendingDispatches--;
-    }
-    WebInspector.pendingDispatches++;
-    setTimeout(delayDispatch, 0);
-}
-
-WebInspector.windowUnload = function(event)
-{
-    InspectorFrontendHost.windowUnloading();
-}
-
-WebInspector.windowResize = function(event)
-{
-    if (this.currentPanel && this.currentPanel.resize)
-        this.currentPanel.resize();
-    this.drawer.resize();
-}
-
-WebInspector.windowFocused = function(event)
-{
-    // Fires after blur, so when focusing on either the main inspector
-    // or an <iframe> within the inspector we should always remove the
-    // "inactive" class.
-    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
-        document.body.removeStyleClass("inactive");
-}
-
-WebInspector.windowBlurred = function(event)
-{
-    // Leaving the main inspector or an <iframe> within the inspector.
-    // We can add "inactive" now, and if we are moving the focus to another
-    // part of the inspector then windowFocused will correct this.
-    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
-        document.body.addStyleClass("inactive");
-}
-
-WebInspector.focusChanged = function(event)
-{
-    this.currentFocusElement = event.target;
-}
-
-WebInspector.setAttachedWindow = function(attached)
-{
-    this.attached = attached;
-}
-
-WebInspector.close = function(event)
-{
-    InspectorFrontendHost.closeWindow();
-}
-
-WebInspector.documentClick = function(event)
-{
-    var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");
-    if (!anchor)
-        return;
-
-    // Prevent the link from navigating, since we don't do any navigation by following links normally.
-    event.preventDefault();
-
-    function followLink()
-    {
-        // FIXME: support webkit-html-external-link links here.
-        if (WebInspector.canShowSourceLineForURL(anchor.href, anchor.preferredPanel)) {
-            if (anchor.hasStyleClass("webkit-html-external-link")) {
-                anchor.removeStyleClass("webkit-html-external-link");
-                anchor.addStyleClass("webkit-html-resource-link");
-            }
-
-            WebInspector.showSourceLineForURL(anchor.href, anchor.lineNumber, anchor.preferredPanel);
-        } else {
-            var profileString = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
-            if (profileString)
-                WebInspector.showProfileForURL(anchor.href);
-        }
-    }
-
-    if (WebInspector.followLinkTimeout)
-        clearTimeout(WebInspector.followLinkTimeout);
-
-    if (anchor.preventFollowOnDoubleClick) {
-        // Start a timeout if this is the first click, if the timeout is canceled
-        // before it fires, then a double clicked happened or another link was clicked.
-        if (event.detail === 1)
-            WebInspector.followLinkTimeout = setTimeout(followLink, 333);
-        return;
-    }
-
-    followLink();
-}
-
-WebInspector.documentKeyDown = function(event)
-{
-    if (this.currentFocusElement && this.currentFocusElement.handleKeyEvent) {
-        this.currentFocusElement.handleKeyEvent(event);
-        if (event.handled) {
-            event.preventDefault();
-            return;
-        }
-    }
-
-    if (this.currentPanel && this.currentPanel.handleShortcut) {
-        this.currentPanel.handleShortcut(event);
-        if (event.handled) {
-            event.preventDefault();
-            return;
-        }
-    }
-
-    var isMac = WebInspector.isMac();
-
-    switch (event.keyIdentifier) {
-        case "U+001B": // Escape key
-            event.preventDefault();
-            if (this.drawer.fullPanel)
-                return;
-
-            this.drawer.visible = !this.drawer.visible;
-            break;
-
-        case "U+0046": // F key
-            if (isMac)
-                var isFindKey = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
-            else
-                var isFindKey = event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;
-
-            if (isFindKey) {
-                var searchField = document.getElementById("search");
-                searchField.focus();
-                searchField.select();
-                event.preventDefault();
-            }
-
-            break;
-
-        case "U+0047": // G key
-            if (isMac)
-                var isFindAgainKey = event.metaKey && !event.ctrlKey && !event.altKey;
-            else
-                var isFindAgainKey = event.ctrlKey && !event.metaKey && !event.altKey;
-
-            if (isFindAgainKey) {
-                if (event.shiftKey) {
-                    if (this.currentPanel.jumpToPreviousSearchResult)
-                        this.currentPanel.jumpToPreviousSearchResult();
-                } else if (this.currentPanel.jumpToNextSearchResult)
-                    this.currentPanel.jumpToNextSearchResult();
-                event.preventDefault();
-            }
-
-            break;
-
-        // Windows and Mac have two different definitions of [, so accept both.
-        case "U+005B":
-        case "U+00DB": // [ key
-            if (isMac)
-                var isRotateLeft = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
-            else
-                var isRotateLeft = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-
-            if (isRotateLeft) {
-                var index = this.panelOrder.indexOf(this.currentPanel);
-                index = (index === 0) ? this.panelOrder.length - 1 : index - 1;
-                this.panelOrder[index].toolbarItem.click();
-                event.preventDefault();
-            }
-
-            break;
-
-        // Windows and Mac have two different definitions of ], so accept both.
-        case "U+005D":
-        case "U+00DD":  // ] key
-            if (isMac)
-                var isRotateRight = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
-            else
-                var isRotateRight = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-
-            if (isRotateRight) {
-                var index = this.panelOrder.indexOf(this.currentPanel);
-                index = (index + 1) % this.panelOrder.length;
-                this.panelOrder[index].toolbarItem.click();
-                event.preventDefault();
-            }
-
-            break;
-    }
-}
-
-WebInspector.documentCanCopy = function(event)
-{
-    if (this.currentPanel && this.currentPanel.handleCopyEvent)
-        event.preventDefault();
-}
-
-WebInspector.documentCopy = function(event)
-{
-    if (this.currentPanel && this.currentPanel.handleCopyEvent)
-        this.currentPanel.handleCopyEvent(event);
-}
-
-WebInspector.contextMenuEventFired = function(event)
-{
-    if (event.handled || event.target.hasStyleClass("popup-glasspane"))
-        event.preventDefault();
-}
-
-WebInspector.animateStyle = function(animations, duration, callback)
-{
-    var interval;
-    var complete = 0;
-
-    const intervalDuration = (1000 / 30); // 30 frames per second.
-    const animationsLength = animations.length;
-    const propertyUnit = {opacity: ""};
-    const defaultUnit = "px";
-
-    function cubicInOut(t, b, c, d)
-    {
-        if ((t/=d/2) < 1) return c/2*t*t*t + b;
-        return c/2*((t-=2)*t*t + 2) + b;
-    }
-
-    // Pre-process animations.
-    for (var i = 0; i < animationsLength; ++i) {
-        var animation = animations[i];
-        var element = null, start = null, end = null, key = null;
-        for (key in animation) {
-            if (key === "element")
-                element = animation[key];
-            else if (key === "start")
-                start = animation[key];
-            else if (key === "end")
-                end = animation[key];
-        }
-
-        if (!element || !end)
-            continue;
-
-        if (!start) {
-            var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);
-            start = {};
-            for (key in end)
-                start[key] = parseInt(computedStyle.getPropertyValue(key));
-            animation.start = start;
-        } else
-            for (key in start)
-                element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-    }
-
-    function animateLoop()
-    {
-        // Advance forward.
-        complete += intervalDuration;
-        var next = complete + intervalDuration;
-
-        // Make style changes.
-        for (var i = 0; i < animationsLength; ++i) {
-            var animation = animations[i];
-            var element = animation.element;
-            var start = animation.start;
-            var end = animation.end;
-            if (!element || !end)
-                continue;
-
-            var style = element.style;
-            for (key in end) {
-                var endValue = end[key];
-                if (next < duration) {
-                    var startValue = start[key];
-                    var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);
-                    style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-                } else
-                    style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-            }
-        }
-
-        // End condition.
-        if (complete >= duration) {
-            clearInterval(interval);
-            if (callback)
-                callback();
-        }
-    }
-
-    interval = setInterval(animateLoop, intervalDuration);
-    return interval;
-}
-
-WebInspector.updateSearchLabel = function()
-{
-    if (!this.currentPanel)
-        return;
-
-    var newLabel = WebInspector.UIString("Search %s", this.currentPanel.toolbarItemLabel);
-    if (this.attached)
-        document.getElementById("search").setAttribute("placeholder", newLabel);
-    else {
-        document.getElementById("search").removeAttribute("placeholder");
-        document.getElementById("search-toolbar-label").textContent = newLabel;
-    }
-}
-
-WebInspector.toggleAttach = function()
-{
-    this.attached = !this.attached;
-    this.drawer.resize();
-}
-
-WebInspector.toolbarDragStart = function(event)
-{
-    if ((!WebInspector.attached && WebInspector.platform !== "mac-leopard") || WebInspector.port == "qt")
-        return;
-
-    var target = event.target;
-    if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))
-        return;
-
-    var toolbar = document.getElementById("toolbar");
-    if (target !== toolbar && !target.hasStyleClass("toolbar-item"))
-        return;
-
-    toolbar.lastScreenX = event.screenX;
-    toolbar.lastScreenY = event.screenY;
-
-    WebInspector.elementDragStart(toolbar, WebInspector.toolbarDrag, WebInspector.toolbarDragEnd, event, (WebInspector.attached ? "row-resize" : "default"));
-}
-
-WebInspector.toolbarDragEnd = function(event)
-{
-    var toolbar = document.getElementById("toolbar");
-
-    WebInspector.elementDragEnd(event);
-
-    delete toolbar.lastScreenX;
-    delete toolbar.lastScreenY;
-}
-
-WebInspector.toolbarDrag = function(event)
-{
-    var toolbar = document.getElementById("toolbar");
-
-    if (WebInspector.attached) {
-        var height = window.innerHeight - (event.screenY - toolbar.lastScreenY);
-
-        InspectorFrontendHost.setAttachedWindowHeight(height);
-    } else {
-        var x = event.screenX - toolbar.lastScreenX;
-        var y = event.screenY - toolbar.lastScreenY;
-
-        // We cannot call window.moveBy here because it restricts the movement
-        // of the window at the edges.
-        InspectorFrontendHost.moveWindowBy(x, y);
-    }
-
-    toolbar.lastScreenX = event.screenX;
-    toolbar.lastScreenY = event.screenY;
-
-    event.preventDefault();
-}
-
-WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)
-{
-    if (this._elementDraggingEventListener || this._elementEndDraggingEventListener)
-        this.elementDragEnd(event);
-
-    this._elementDraggingEventListener = dividerDrag;
-    this._elementEndDraggingEventListener = elementDragEnd;
-
-    document.addEventListener("mousemove", dividerDrag, true);
-    document.addEventListener("mouseup", elementDragEnd, true);
-
-    document.body.style.cursor = cursor;
-
-    event.preventDefault();
-}
-
-WebInspector.elementDragEnd = function(event)
-{
-    document.removeEventListener("mousemove", this._elementDraggingEventListener, true);
-    document.removeEventListener("mouseup", this._elementEndDraggingEventListener, true);
-
-    document.body.style.removeProperty("cursor");
-
-    delete this._elementDraggingEventListener;
-    delete this._elementEndDraggingEventListener;
-
-    event.preventDefault();
-}
-
-WebInspector.showConsole = function()
-{
-    this.drawer.showView(this.console);
-}
-
-WebInspector.showChanges = function()
-{
-    this.drawer.showView(this.changes);
-}
-
-WebInspector.showElementsPanel = function()
-{
-    this.currentPanel = this.panels.elements;
-}
-
-WebInspector.showResourcesPanel = function()
-{
-    this.currentPanel = this.panels.resources;
-}
-
-WebInspector.showScriptsPanel = function()
-{
-    this.currentPanel = this.panels.scripts;
-}
-
-WebInspector.showTimelinePanel = function()
-{
-    this.currentPanel = this.panels.timeline;
-}
-
-WebInspector.showProfilesPanel = function()
-{
-    this.currentPanel = this.panels.profiles;
-}
-
-WebInspector.showStoragePanel = function()
-{
-    this.currentPanel = this.panels.storage;
-}
-
-WebInspector.showConsolePanel = function()
-{
-    this.currentPanel = this.panels.console;
-}
-
-WebInspector.clearConsoleMessages = function()
-{
-    WebInspector.console.clearMessages();
-}
-
-WebInspector.selectDatabase = function(o)
-{
-    WebInspector.showStoragePanel();
-    WebInspector.panels.storage.selectDatabase(o);
-}
-
-WebInspector.selectDOMStorage = function(o)
-{
-    WebInspector.showStoragePanel();
-    WebInspector.panels.storage.selectDOMStorage(o);
-}
-
-WebInspector.updateResource = function(identifier, payload)
-{
-    var resource = this.resources[identifier];
-    if (!resource) {
-        resource = new WebInspector.Resource(identifier, payload.url);
-        this.resources[identifier] = resource;
-        this.resourceURLMap[resource.url] = resource;
-        if (this.panels.resources)
-            this.panels.resources.addResource(resource);
-    }
-
-    if (payload.didRequestChange) {
-        resource.domain = payload.host;
-        resource.path = payload.path;
-        resource.lastPathComponent = payload.lastPathComponent;
-        resource.requestHeaders = payload.requestHeaders;
-        resource.mainResource = payload.mainResource;
-        resource.requestMethod = payload.requestMethod;
-        resource.requestFormData = payload.requestFormData;
-        resource.cached = payload.cached;
-        resource.documentURL = payload.documentURL;
-
-        if (resource.mainResource)
-            this.mainResource = resource;
-
-        var match = payload.documentURL.match(WebInspector.URLRegExp);
-        if (match) {
-            var protocol = match[1].toLowerCase();
-            if (protocol.indexOf("http") === 0 || protocol === "file")
-                this.addCookieDomain(protocol === "file" ? "" : match[2]);
-        }
-    }
-
-    if (payload.didResponseChange) {
-        resource.mimeType = payload.mimeType;
-        resource.suggestedFilename = payload.suggestedFilename;
-        resource.expectedContentLength = payload.expectedContentLength;
-        resource.statusCode = payload.statusCode;
-        resource.suggestedFilename = payload.suggestedFilename;
-        resource.responseHeaders = payload.responseHeaders;
-    }
-
-    if (payload.didTypeChange) {
-        resource.type = payload.type;
-    }
-
-    if (payload.didLengthChange) {
-        resource.contentLength = payload.contentLength;
-    }
-
-    if (payload.didCompletionChange) {
-        resource.failed = payload.failed;
-        resource.finished = payload.finished;
-    }
-
-    if (payload.didTimingChange) {
-        if (payload.startTime)
-            resource.startTime = payload.startTime;
-        if (payload.responseReceivedTime)
-            resource.responseReceivedTime = payload.responseReceivedTime;
-        if (payload.endTime)
-            resource.endTime = payload.endTime;
-
-        if (payload.loadEventTime) {
-            // This loadEventTime is for the main resource, and we want to show it
-            // for all resources on this page. This means we want to set it as a member
-            // of the resources panel instead of the individual resource.
-            if (this.panels.resources)
-                this.panels.resources.mainResourceLoadTime = payload.loadEventTime;
-            if (this.panels.audits)
-                this.panels.audits.mainResourceLoadTime = payload.loadEventTime;
-        }
-
-        if (payload.domContentEventTime) {
-            // This domContentEventTime is for the main resource, so it should go in
-            // the resources panel for the same reasons as above.
-            if (this.panels.resources)
-                this.panels.resources.mainResourceDOMContentTime = payload.domContentEventTime;
-            if (this.panels.audits)
-                this.panels.audits.mainResourceDOMContentTime = payload.domContentEventTime;
-        }
-    }
-}
-
-WebInspector.removeResource = function(identifier)
-{
-    var resource = this.resources[identifier];
-    if (!resource)
-        return;
-
-    resource.category.removeResource(resource);
-    delete this.resourceURLMap[resource.url];
-    delete this.resources[identifier];
-
-    if (this.panels.resources)
-        this.panels.resources.removeResource(resource);
-}
-
-WebInspector.addDatabase = function(payload)
-{
-    if (!this.panels.storage)
-        return;
-    var database = new WebInspector.Database(
-        payload.id,
-        payload.domain,
-        payload.name,
-        payload.version);
-    this.panels.storage.addDatabase(database);
-}
-
-WebInspector.addCookieDomain = function(domain)
-{
-    // Eliminate duplicate domains from the list.
-    if (domain in this.cookieDomains)
-        return;
-    this.cookieDomains[domain] = true;
-
-    if (!this.panels.storage)
-        return;
-    this.panels.storage.addCookieDomain(domain);
-}
-
-WebInspector.addDOMStorage = function(payload)
-{
-    if (!this.panels.storage)
-        return;
-    var domStorage = new WebInspector.DOMStorage(
-        payload.id,
-        payload.host,
-        payload.isLocalStorage);
-    this.panels.storage.addDOMStorage(domStorage);
-}
-
-WebInspector.updateDOMStorage = function(storageId)
-{
-    if (!this.panels.storage)
-        return;
-    this.panels.storage.updateDOMStorage(storageId);
-}
-
-WebInspector.resourceTrackingWasEnabled = function()
-{
-    this.panels.resources.resourceTrackingWasEnabled();
-}
-
-WebInspector.resourceTrackingWasDisabled = function()
-{
-    this.panels.resources.resourceTrackingWasDisabled();
-}
-
-WebInspector.attachDebuggerWhenShown = function()
-{
-    this.panels.scripts.attachDebuggerWhenShown();
-}
-
-WebInspector.debuggerWasEnabled = function()
-{
-    this.panels.scripts.debuggerWasEnabled();
-}
-
-WebInspector.debuggerWasDisabled = function()
-{
-    this.panels.scripts.debuggerWasDisabled();
-}
-
-WebInspector.profilerWasEnabled = function()
-{
-    this.panels.profiles.profilerWasEnabled();
-}
-
-WebInspector.profilerWasDisabled = function()
-{
-    this.panels.profiles.profilerWasDisabled();
-}
-
-WebInspector.parsedScriptSource = function(sourceID, sourceURL, source, startingLine)
-{
-    this.panels.scripts.addScript(sourceID, sourceURL, source, startingLine);
-}
-
-WebInspector.failedToParseScriptSource = function(sourceURL, source, startingLine, errorLine, errorMessage)
-{
-    this.panels.scripts.addScript(null, sourceURL, source, startingLine, errorLine, errorMessage);
-}
-
-WebInspector.pausedScript = function(callFrames)
-{
-    this.panels.scripts.debuggerPaused(callFrames);
-}
-
-WebInspector.resumedScript = function()
-{
-    this.panels.scripts.debuggerResumed();
-}
-
-WebInspector.populateInterface = function()
-{
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        if ("populateInterface" in panel)
-            panel.populateInterface();
-    }
-}
-
-WebInspector.reset = function()
-{
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        if ("reset" in panel)
-            panel.reset();
-    }
-
-    for (var category in this.resourceCategories)
-        this.resourceCategories[category].removeAllResources();
-
-    this.resources = {};
-    this.resourceURLMap = {};
-    this.cookieDomains = {};
-    this.hoveredDOMNode = null;
-
-    delete this.mainResource;
-
-    this.console.clearMessages();
-}
-
-WebInspector.resourceURLChanged = function(resource, oldURL)
-{
-    delete this.resourceURLMap[oldURL];
-    this.resourceURLMap[resource.url] = resource;
-}
-
-WebInspector.didCommitLoad = function()
-{
-    // Cleanup elements panel early on inspected page refresh.
-    WebInspector.setDocument(null);
-}
-
-WebInspector.updateConsoleMessageExpiredCount = function(count)
-{
-    var message = String.sprintf(WebInspector.UIString("%d console messages are not shown."), count);
-    WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(message, WebInspector.ConsoleMessage.MessageLevel.Warning));
-}
-
-WebInspector.addConsoleMessage = function(payload)
-{
-    var consoleMessage = new WebInspector.ConsoleMessage(
-        payload.source,
-        payload.type,
-        payload.level,
-        payload.line,
-        payload.url,
-        payload.groupLevel,
-        payload.repeatCount);
-    consoleMessage.setMessageBody(Array.prototype.slice.call(arguments, 1));
-    this.console.addMessage(consoleMessage);
-}
-
-WebInspector.updateConsoleMessageRepeatCount = function(count)
-{
-    this.console.updateMessageRepeatCount(count);
-}
-
-WebInspector.log = function(message)
-{
-    // remember 'this' for setInterval() callback
-    var self = this;
-
-    // return indication if we can actually log a message
-    function isLogAvailable()
-    {
-        return WebInspector.ConsoleMessage && WebInspector.ObjectProxy && self.console;
-    }
-
-    // flush the queue of pending messages
-    function flushQueue()
-    {
-        var queued = WebInspector.log.queued;
-        if (!queued)
-            return;
-
-        for (var i = 0; i < queued.length; ++i)
-            logMessage(queued[i]);
-
-        delete WebInspector.log.queued;
-    }
-
-    // flush the queue if it console is available
-    // - this function is run on an interval
-    function flushQueueIfAvailable()
-    {
-        if (!isLogAvailable())
-            return;
-
-        clearInterval(WebInspector.log.interval);
-        delete WebInspector.log.interval;
-
-        flushQueue();
-    }
-
-    // actually log the message
-    function logMessage(message)
-    {
-        var repeatCount = 1;
-        if (message == WebInspector.log.lastMessage)
-            repeatCount = WebInspector.log.repeatCount + 1;
-
-        WebInspector.log.lastMessage = message;
-        WebInspector.log.repeatCount = repeatCount;
-
-        // ConsoleMessage expects a proxy object
-        message = new WebInspector.ObjectProxy(null, [], 0, message, false);
-
-        // post the message
-        var msg = new WebInspector.ConsoleMessage(
-            WebInspector.ConsoleMessage.MessageSource.Other,
-            WebInspector.ConsoleMessage.MessageType.Log,
-            WebInspector.ConsoleMessage.MessageLevel.Debug,
-            -1,
-            null,
-            null,
-            repeatCount,
-            message);
-
-        self.console.addMessage(msg);
-    }
-
-    // if we can't log the message, queue it
-    if (!isLogAvailable()) {
-        if (!WebInspector.log.queued)
-            WebInspector.log.queued = [];
-
-        WebInspector.log.queued.push(message);
-
-        if (!WebInspector.log.interval)
-            WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);
-
-        return;
-    }
-
-    // flush the pending queue if any
-    flushQueue();
-
-    // log the message
-    logMessage(message);
-}
-
-WebInspector.addProfileHeader = function(profile)
-{
-    this.panels.profiles.addProfileHeader(profile);
-}
-
-WebInspector.setRecordingProfile = function(isProfiling)
-{
-    this.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);
-    this.panels.profiles.updateProfileTypeButtons();
-}
-
-WebInspector.drawLoadingPieChart = function(canvas, percent) {
-    var g = canvas.getContext("2d");
-    var darkColor = "rgb(122, 168, 218)";
-    var lightColor = "rgb(228, 241, 251)";
-    var cx = 8;
-    var cy = 8;
-    var r = 7;
-
-    g.beginPath();
-    g.arc(cx, cy, r, 0, Math.PI * 2, false);
-    g.closePath();
-
-    g.lineWidth = 1;
-    g.strokeStyle = darkColor;
-    g.fillStyle = lightColor;
-    g.fill();
-    g.stroke();
-
-    var startangle = -Math.PI / 2;
-    var endangle = startangle + (percent * Math.PI * 2);
-
-    g.beginPath();
-    g.moveTo(cx, cy);
-    g.arc(cx, cy, r, startangle, endangle, false);
-    g.closePath();
-
-    g.fillStyle = darkColor;
-    g.fill();
-}
-
-WebInspector.updateFocusedNode = function(nodeId)
-{
-    var node = WebInspector.domAgent.nodeForId(nodeId);
-    if (!node)
-        // FIXME: Should we deselect if null is passed in?
-        return;
-
-    this.currentPanel = this.panels.elements;
-    this.panels.elements.focusedDOMNode = node;
-}
-
-WebInspector.displayNameForURL = function(url)
-{
-    if (!url)
-        return "";
-    var resource = this.resourceURLMap[url];
-    if (resource)
-        return resource.displayName;
-    return url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
-}
-
-WebInspector.resourceForURL = function(url)
-{
-    if (url in this.resourceURLMap)
-        return this.resourceURLMap[url];
-
-    // No direct match found. Search for resources that contain
-    // a substring of the URL.
-    for (var resourceURL in this.resourceURLMap) {
-        if (resourceURL.hasSubstring(url))
-            return this.resourceURLMap[resourceURL];
-    }
-
-    return null;
-}
-
-WebInspector._choosePanelToShowSourceLineForURL = function(url, preferredPanel)
-{
-    preferredPanel = preferredPanel || "resources";
-    var panel = this.panels[preferredPanel];
-    if (panel && panel.canShowSourceLineForURL(url))
-        return panel;
-    panel = this.panels.resources;
-    return panel.canShowSourceLineForURL(url) ? panel : null;
-}
-
-WebInspector.canShowSourceLineForURL = function(url, preferredPanel)
-{
-    return !!this._choosePanelToShowSourceLineForURL(url, preferredPanel);
-}
-
-WebInspector.showSourceLineForURL = function(url, line, preferredPanel)
-{
-    this.currentPanel = this._choosePanelToShowSourceLineForURL(url, preferredPanel);
-    if (!this.currentPanel)
-        return false;
-    this.currentPanel.showSourceLineForURL(url, line);
-    return true;
-}
-
-WebInspector.linkifyStringAsFragment = function(string)
-{
-    var container = document.createDocumentFragment();
-    var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;
-
-    while (string) {
-        var linkString = linkStringRegEx.exec(string);
-        if (!linkString)
-            break;
-
-        linkString = linkString[0];
-        var title = linkString;
-        var linkIndex = string.indexOf(linkString);
-        var nonLink = string.substring(0, linkIndex);
-        container.appendChild(document.createTextNode(nonLink));
-
-        var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);
-        if (profileStringMatches)
-            title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);
-
-        var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);
-        container.appendChild(WebInspector.linkifyURLAsNode(realURL, title, null, (realURL in WebInspector.resourceURLMap)));
-        string = string.substring(linkIndex + linkString.length, string.length);
-    }
-
-    if (string)
-        container.appendChild(document.createTextNode(string));
-
-    return container;
-}
-
-WebInspector.showProfileForURL = function(url)
-{
-    WebInspector.showProfilesPanel();
-    WebInspector.panels.profiles.showProfileForURL(url);
-}
-
-WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
-{
-    if (!linkText)
-        linkText = url;
-    classes = (classes ? classes + " " : "");
-    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";
-
-    var a = document.createElement("a");
-    a.href = url;
-    a.className = classes;
-    a.title = tooltipText || url;
-    a.target = "_blank";
-    a.textContent = linkText;
-
-    return a;
-}
-
-WebInspector.linkifyURL = function(url, linkText, classes, isExternal, tooltipText)
-{
-    // Use the DOM version of this function so as to avoid needing to escape attributes.
-    // FIXME:  Get rid of linkifyURL entirely.
-    return WebInspector.linkifyURLAsNode(url, linkText, classes, isExternal, tooltipText).outerHTML;
-}
-
-WebInspector.addMainEventListeners = function(doc)
-{
-    doc.defaultView.addEventListener("focus", this.windowFocused.bind(this), false);
-    doc.defaultView.addEventListener("blur", this.windowBlurred.bind(this), false);
-    doc.addEventListener("click", this.documentClick.bind(this), true);
-}
-
-WebInspector._searchFieldManualFocus = function(event)
-{
-    this.currentFocusElement = event.target;
-    this._previousFocusElement = event.target;
-}
-
-WebInspector._searchKeyDown = function(event)
-{
-    // Escape Key will clear the field and clear the search results
-    if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
-        // If focus belongs here and text is empty - nothing to do, return unhandled.
-        if (event.target.value === "" && this.currentFocusElement === this.previousFocusElement)
-            return;
-        event.preventDefault();
-        event.stopPropagation();
-        // When search was selected manually and is currently blank, we'd like Esc stay unhandled
-        // and hit console drawer handler.
-        event.target.value = "";
-
-        this.performSearch(event);
-        this.currentFocusElement = this.previousFocusElement;
-        if (this.currentFocusElement === event.target)
-            this.currentFocusElement.select();
-        return false;
-    }
-
-    if (!isEnterKey(event))
-        return false;
-
-    // Select all of the text so the user can easily type an entirely new query.
-    event.target.select();
-
-    // Only call performSearch if the Enter key was pressed. Otherwise the search
-    // performance is poor because of searching on every key. The search field has
-    // the incremental attribute set, so we still get incremental searches.
-    this.performSearch(event);
-
-    // Call preventDefault since this was the Enter key. This prevents a "search" event
-    // from firing for key down. This stops performSearch from being called twice in a row.
-    event.preventDefault();
-}
-
-WebInspector.performSearch = function(event)
-{
-    var query = event.target.value;
-    var forceSearch = event.keyIdentifier === "Enter";
-    var isShortSearch = (query.length < 3);
-
-    // Clear a leftover short search flag due to a non-conflicting forced search.
-    if (isShortSearch && this.shortSearchWasForcedByKeyEvent && this.currentQuery !== query)
-        delete this.shortSearchWasForcedByKeyEvent;
-
-    // Indicate this was a forced search on a short query.
-    if (isShortSearch && forceSearch)
-        this.shortSearchWasForcedByKeyEvent = true;
-
-    if (!query || !query.length || (!forceSearch && isShortSearch)) {
-        // Prevent clobbering a short search forced by the user.
-        if (this.shortSearchWasForcedByKeyEvent) {
-            delete this.shortSearchWasForcedByKeyEvent;
-            return;
-        }
-
-        delete this.currentQuery;
-
-        for (var panelName in this.panels) {
-            var panel = this.panels[panelName];
-            if (panel.currentQuery && panel.searchCanceled)
-                panel.searchCanceled();
-            delete panel.currentQuery;
-        }
-
-        this.updateSearchMatchesCount();
-
-        return;
-    }
-
-    if (query === this.currentPanel.currentQuery && this.currentPanel.currentQuery === this.currentQuery) {
-        // When this is the same query and a forced search, jump to the next
-        // search result for a good user experience.
-        if (forceSearch && this.currentPanel.jumpToNextSearchResult)
-            this.currentPanel.jumpToNextSearchResult();
-        return;
-    }
-
-    this.currentQuery = query;
-
-    this.updateSearchMatchesCount();
-
-    if (!this.currentPanel.performSearch)
-        return;
-
-    this.currentPanel.currentQuery = query;
-    this.currentPanel.performSearch(query);
-}
-
-WebInspector.addNodesToSearchResult = function(nodeIds)
-{
-    WebInspector.panels.elements.addNodesToSearchResult(nodeIds);
-}
-
-WebInspector.updateSearchMatchesCount = function(matches, panel)
-{
-    if (!panel)
-        panel = this.currentPanel;
-
-    panel.currentSearchMatches = matches;
-
-    if (panel !== this.currentPanel)
-        return;
-
-    if (!this.currentPanel.currentQuery) {
-        document.getElementById("search-results-matches").addStyleClass("hidden");
-        return;
-    }
-
-    if (matches) {
-        if (matches === 1)
-            var matchesString = WebInspector.UIString("1 match");
-        else
-            var matchesString = WebInspector.UIString("%d matches", matches);
-    } else
-        var matchesString = WebInspector.UIString("Not Found");
-
-    var matchesToolbarElement = document.getElementById("search-results-matches");
-    matchesToolbarElement.removeStyleClass("hidden");
-    matchesToolbarElement.textContent = matchesString;
-}
-
-WebInspector.UIString = function(string)
-{
-    if (window.localizedStrings && string in window.localizedStrings)
-        string = window.localizedStrings[string];
-    else {
-        if (!(string in this.missingLocalizedStrings)) {
-            if (!WebInspector.InspectorBackendStub)
-                console.error("Localized string \"" + string + "\" not found.");
-            this.missingLocalizedStrings[string] = true;
-        }
-
-        if (Preferences.showMissingLocalizedStrings)
-            string += " (not localized)";
-    }
-
-    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
-}
-
-WebInspector.isMac = function()
-{
-    if (!("_isMac" in this))
-        this._isMac = WebInspector.platform.indexOf("mac-") === 0;
-
-    return this._isMac;
-}
-
-WebInspector.isBeingEdited = function(element)
-{
-    return element.__editing;
-}
-
-WebInspector.startEditing = function(element, committedCallback, cancelledCallback, context, multiline)
-{
-    if (element.__editing)
-        return;
-    element.__editing = true;
-
-    var oldText = getContent(element);
-    var moveDirection = "";
-
-    element.addStyleClass("editing");
-
-    var oldTabIndex = element.tabIndex;
-    if (element.tabIndex < 0)
-        element.tabIndex = 0;
-
-    function blurEventListener() {
-        editingCommitted.call(element);
-    }
-
-    function getContent(element) {
-        if (element.tagName === "INPUT" && element.type === "text")
-            return element.value;
-        else
-            return element.textContent;
-    }
-
-    function cleanUpAfterEditing() {
-        delete this.__editing;
-
-        this.removeStyleClass("editing");
-        this.tabIndex = oldTabIndex;
-        this.scrollTop = 0;
-        this.scrollLeft = 0;
-
-        element.removeEventListener("blur", blurEventListener, false);
-        element.removeEventListener("keydown", keyDownEventListener, true);
-
-        if (element === WebInspector.currentFocusElement || element.isAncestor(WebInspector.currentFocusElement))
-            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
-    }
-
-    function editingCancelled() {
-        if (this.tagName === "INPUT" && this.type === "text")
-            this.value = oldText;
-        else
-            this.textContent = oldText;
-
-        cleanUpAfterEditing.call(this);
-
-        if (cancelledCallback)
-            cancelledCallback(this, context);
-    }
-
-    function editingCommitted() {
-        cleanUpAfterEditing.call(this);
-
-        if (committedCallback)
-            committedCallback(this, getContent(this), oldText, context, moveDirection);
-    }
-
-    function keyDownEventListener(event) {
-        var isMetaOrCtrl = WebInspector.isMac() ?
-            event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
-            event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-        if (isEnterKey(event) && (!multiline || isMetaOrCtrl)) {
-            editingCommitted.call(element);
-            event.preventDefault();
-            event.stopPropagation();
-        } else if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
-            editingCancelled.call(element);
-            event.preventDefault();
-            event.stopPropagation();
-        } else if (event.keyIdentifier === "U+0009") // Tab key
-            moveDirection = (event.shiftKey ? "backward" : "forward");
-    }
-
-    element.addEventListener("blur", blurEventListener, false);
-    element.addEventListener("keydown", keyDownEventListener, true);
-
-    WebInspector.currentFocusElement = element;
-}
-
-WebInspector._toolbarItemClicked = function(event)
-{
-    var toolbarItem = event.currentTarget;
-    this.currentPanel = toolbarItem.panel;
-}
-
-// This table maps MIME types to the Resource.Types which are valid for them.
-// The following line:
-//    "text/html":                {0: 1},
-// means that text/html is a valid MIME type for resources that have type
-// WebInspector.Resource.Type.Document (which has a value of 0).
-WebInspector.MIMETypes = {
-    "text/html":                   {0: true},
-    "text/xml":                    {0: true},
-    "text/plain":                  {0: true},
-    "application/xhtml+xml":       {0: true},
-    "text/css":                    {1: true},
-    "text/xsl":                    {1: true},
-    "image/jpeg":                  {2: true},
-    "image/png":                   {2: true},
-    "image/gif":                   {2: true},
-    "image/bmp":                   {2: true},
-    "image/vnd.microsoft.icon":    {2: true},
-    "image/x-icon":                {2: true},
-    "image/x-xbitmap":             {2: true},
-    "font/ttf":                    {3: true},
-    "font/opentype":               {3: true},
-    "application/x-font-type1":    {3: true},
-    "application/x-font-ttf":      {3: true},
-    "application/x-truetype-font": {3: true},
-    "text/javascript":             {4: true},
-    "text/ecmascript":             {4: true},
-    "application/javascript":      {4: true},
-    "application/ecmascript":      {4: true},
-    "application/x-javascript":    {4: true},
-    "text/javascript1.1":          {4: true},
-    "text/javascript1.2":          {4: true},
-    "text/javascript1.3":          {4: true},
-    "text/jscript":                {4: true},
-    "text/livescript":             {4: true},
-}
-
-/* InspectorBackendStub.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-if (!window.InspectorBackend) {
-
-WebInspector.InspectorBackendStub = function()
-{
-    this._searchingForNode = false;
-    this._attachedWindowHeight = 0;
-    this._debuggerEnabled = true;
-    this._profilerEnabled = true;
-    this._resourceTrackingEnabled = false;
-    this._timelineEnabled = false;
-}
-
-WebInspector.InspectorBackendStub.prototype = {
-    wrapCallback: function(func)
-    {
-        return func;
-    },
-
-    platform: function()
-    {
-        return "mac-leopard";
-    },
-
-    port: function()
-    {
-        return "unknown";
-    },
-
-
-    closeWindow: function()
-    {
-        this._windowVisible = false;
-    },
-
-    attach: function()
-    {
-    },
-
-    detach: function()
-    {
-    },
-
-    storeLastActivePanel: function(panel)
-    {
-    },
-
-    clearMessages: function()
-    {
-    },
-
-    searchingForNode: function()
-    {
-        return this._searchingForNode;
-    },
-
-    search: function(sourceRow, query)
-    {
-    },
-
-    toggleNodeSearch: function()
-    {
-        this._searchingForNode = !this._searchingForNode;
-    },
-
-    setAttachedWindowHeight: function(height)
-    {
-    },
-
-    moveByUnrestricted: function(x, y)
-    {
-    },
-
-
-    addResourceSourceToFrame: function(identifier, element)
-    {
-    },
-
-    addSourceToFrame: function(mimeType, source, element)
-    {
-        return false;
-    },
-
-    getResourceDocumentNode: function(identifier)
-    {
-        return undefined;
-    },
-
-    highlightDOMNode: function(node)
-    {
-    },
-
-    hideDOMNodeHighlight: function()
-    {
-    },
-
-    inspectedWindow: function()
-    {
-        return window;
-    },
-
-    loaded: function()
-    {
-    },
-
-    localizedStringsURL: function()
-    {
-        return undefined;
-    },
-
-    windowUnloading: function()
-    {
-        return false;
-    },
-
-    hiddenPanels: function()
-    {
-        return "";
-    },
-
-    debuggerEnabled: function()
-    {
-        return this._debuggerEnabled;
-    },
-
-    enableResourceTracking: function()
-    {
-        this._resourceTrackingEnabled = true;
-        WebInspector.resourceTrackingWasEnabled();
-    },
-
-    disableResourceTracking: function()
-    {
-        this._resourceTrackingEnabled = false;
-        WebInspector.resourceTrackingWasDisabled();
-    },
-
-    resourceTrackingEnabled: function()
-    {
-        return this._resourceTrackingEnabled;
-    },
-
-    enableDebugger: function()
-    {
-        this._debuggerEnabled = true;
-    },
-
-    disableDebugger: function()
-    {
-        this._debuggerEnabled = false;
-    },
-
-    addBreakpoint: function(sourceID, line, condition)
-    {
-    },
-
-    removeBreakpoint: function(sourceID, line)
-    {
-    },
-
-    updateBreakpoint: function(sourceID, line, condition)
-    {
-    },
-
-    pauseInDebugger: function()
-    {
-    },
-
-    pauseOnExceptions: function()
-    {
-        return false;
-    },
-
-    setPauseOnExceptions: function(value)
-    {
-    },
-
-    resumeDebugger: function()
-    {
-    },
-
-    profilerEnabled: function()
-    {
-        return true;
-    },
-
-    enableProfiler: function()
-    {
-        this._profilerEnabled = true;
-    },
-
-    disableProfiler: function()
-    {
-        this._profilerEnabled = false;
-    },
-
-    startProfiling: function()
-    {
-    },
-
-    stopProfiling: function()
-    {
-    },
-
-    getProfileHeaders: function(callId)
-    {
-        WebInspector.didGetProfileHeaders(callId, []);
-    },
-
-    getProfile: function(callId, uid)
-    {
-        if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
-        {
-            WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
-        }
-    },
-
-    takeHeapSnapshot: function()
-    {
-    },
-
-    databaseTableNames: function(database)
-    {
-        return [];
-    },
-
-    stepIntoStatementInDebugger: function()
-    {
-    },
-
-    stepOutOfFunctionInDebugger: function()
-    {
-    },
-
-    stepOverStatementInDebugger: function()
-    {
-    },
-
-    saveFrontendSettings: function()
-    {
-    },
-
-    dispatchOnInjectedScript: function()
-    {
-    },
-
-    releaseWrapperObjectGroup: function()
-    {
-    }
-}
-
-InspectorBackend = new WebInspector.InspectorBackendStub();
-
-}
-
-/* InspectorFrontendHostStub.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-if (!window.InspectorFrontendHost) {
-
-WebInspector.InspectorFrontendHostStub = function()
-{
-    this._attachedWindowHeight = 0;
-}
-
-WebInspector.InspectorFrontendHostStub.prototype = {
-    platform: function()
-    {
-        return "mac-leopard";
-    },
-
-    port: function()
-    {
-        return "unknown";
-    },
-
-    closeWindow: function()
-    {
-        this._windowVisible = false;
-    },
-
-    attach: function()
-    {
-    },
-
-    detach: function()
-    {
-    },
-
-    search: function(sourceRow, query)
-    {
-    },
-
-    setAttachedWindowHeight: function(height)
-    {
-    },
-
-    moveWindowBy: function(x, y)
-    {
-    },
-
-    addResourceSourceToFrame: function(identifier, element)
-    {
-    },
-
-    addSourceToFrame: function(mimeType, source, element)
-    {
-        return false;
-    },
-
-    loaded: function()
-    {
-    },
-
-    localizedStringsURL: function()
-    {
-        return undefined;
-    },
-
-    hiddenPanels: function()
-    {
-        return "";
-    },
-
-    windowUnloading: function()
-    {
-    }
-}
-
-InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
-
-}
-
-/* Object.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Object = function() {
-}
-
-WebInspector.Object.prototype = {
-    addEventListener: function(eventType, listener, thisObject) {
-        if (!("_listeners" in this))
-            this._listeners = {};
-        if (!(eventType in this._listeners))
-            this._listeners[eventType] = [];
-        this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
-    },
-
-    removeEventListener: function(eventType, listener, thisObject) {
-        if (!("_listeners" in this) || !(eventType in this._listeners))
-            return;
-        var listeners = this._listeners[eventType];
-        for (var i = 0; i < listeners.length; ++i) {
-            if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
-                listeners.splice(i, 1);
-            else if (!listener && thisObject && listeners[i].thisObject === thisObject)
-                listeners.splice(i, 1);
-        }
-
-        if (!listeners.length)
-            delete this._listeners[eventType];
-    },
-
-    dispatchEventToListeners: function(eventType) {
-        if (!("_listeners" in this) || !(eventType in this._listeners))
-            return;
-
-        var stoppedPropagation = false;
-
-        function stopPropagation()
-        {
-            stoppedPropagation = true;
-        }
-
-        function preventDefault()
-        {
-            this.defaultPrevented = true;
-        }
-
-        var event = {target: this, type: eventType, defaultPrevented: false};
-        event.stopPropagation = stopPropagation;
-        event.preventDefault = preventDefault;
-
-        var listeners = this._listeners[eventType].slice(0);
-        for (var i = 0; i < listeners.length; ++i) {
-            listeners[i].listener.call(listeners[i].thisObject, event);
-            if (stoppedPropagation)
-                break;
-        }
-
-        return event.defaultPrevented;
-    }
-}
-
-/* Settings.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-var Preferences = {
-    maxInlineTextChildLength: 80,
-    minConsoleHeight: 75,
-    minSidebarWidth: 100,
-    minElementsSidebarWidth: 200,
-    minScriptsSidebarWidth: 200,
-    styleRulesExpandedState: {},
-    showMissingLocalizedStrings: false,
-    heapProfilerPresent: false,
-    samplingCPUProfiler: false,
-    showColorNicknames: true
-}
-
-WebInspector.populateFrontendSettings = function(settingsString)
-{
-    WebInspector.settings._load(settingsString);
-}
-
-WebInspector.Settings = function()
-{
-}
-
-WebInspector.Settings.prototype = {
-    _load: function(settingsString)
-    {
-        try {
-            this._store = JSON.parse(settingsString);
-        } catch (e) {
-            // May fail;
-            this._store = {};
-        }
-
-        this._installSetting("eventListenersFilter", "event-listeners-filter", "all");
-        this._installSetting("colorFormat", "color-format", "hex");
-        this._installSetting("resourcesLargeRows", "resources-large-rows", true);
-        this._installSetting("watchExpressions", "watch-expressions", []);
-        this._installSetting("lastViewedScriptFile", "last-viewed-script-file");
-        this._installSetting("showInheritedComputedStyleProperties", "show-inherited-computed-style-properties", false);
-        this._installSetting("showUserAgentStyles", "show-user-agent-styles", true);
-        this.dispatchEventToListeners("loaded");
-    },
-
-    _installSetting: function(name, propertyName, defaultValue)
-    {
-        this.__defineGetter__(name, this._get.bind(this, propertyName));
-        this.__defineSetter__(name, this._set.bind(this, propertyName));
-        if (!(propertyName in this._store)) {
-            this._store[propertyName] = defaultValue;
-        }
-    },
-
-    _get: function(propertyName)
-    {
-        return this._store[propertyName];
-    },
-
-    _set: function(propertyName, newValue)
-    {
-        this._store[propertyName] = newValue;
-        try {
-            InspectorBackend.saveFrontendSettings(JSON.stringify(this._store));
-        } catch (e) {
-            // May fail;
-        }
-    }
-}
-
-WebInspector.Settings.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ContextMenu.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ContextMenu = function() {
-    this._items = [];
-    this._handlers = {};
-}
-
-WebInspector.ContextMenu.prototype = {
-    show: function(event)
-    {
-        // Remove trailing separator.
-        while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))
-            this._items.splice(this._items.length - 1, 1);
-
-        if (this._items.length) {
-            WebInspector._contextMenu = this;
-            InspectorFrontendHost.showContextMenu(event, this._items);
-        }
-    },
-
-    appendItem: function(label, handler)
-    {
-        var id = this._items.length;
-        this._items.push({id: id, label: label});
-        this._handlers[id] = handler;
-    },
-
-    appendSeparator: function()
-    {
-        // No separator dupes allowed.
-        if (this._items.length === 0)
-            return;
-        if (!("id" in this._items[this._items.length - 1]))
-            return;
-        this._items.push({});
-    },
-
-    _itemSelected: function(id)
-    {
-        if (this._handlers[id])
-            this._handlers[id].call(this);
-    }
-}
-
-WebInspector.contextMenuItemSelected = function(id)
-{
-    if (WebInspector._contextMenu)
-        WebInspector._contextMenu._itemSelected(id);
-}
-
-WebInspector.contextMenuCleared = function()
-{
-    // FIXME: Unfortunately, contextMenuCleared is invoked between show and item selected
-    // so we can't delete last menu object from WebInspector. Fix the contract.
-}
-
-/* KeyboardShortcut.js */
-
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.KeyboardShortcut = function()
-{
-};
-
-/**
- * Constants for encoding modifier key set as a bit mask.
- * @see #_makeKeyFromCodeAndModifiers
- */
-WebInspector.KeyboardShortcut.Modifiers = {
-    None: 0,   // Constant for empty modifiers set.
-    Shift: 1,
-    Ctrl: 2,
-    Alt: 4,
-    Meta: 8    // Command key on Mac, Win key on other platforms.
-};
-
-WebInspector.KeyboardShortcut.KeyCodes = {
-    Backspace: 8,
-    Esc: 27,
-    Space: 32,
-    PageUp: 33,      // also NUM_NORTH_EAST
-    PageDown: 34,    // also NUM_SOUTH_EAST
-    End: 35,         // also NUM_SOUTH_WEST
-    Home: 36,        // also NUM_NORTH_WEST
-    Left: 37,        // also NUM_WEST
-    Up: 38,          // also NUM_NORTH
-    Right: 39,       // also NUM_EAST
-    Down: 40,        // also NUM_SOUTH
-    Delete: 46,
-    F1: 112,
-    F2: 113,
-    F3: 114,
-    F4: 115,
-    F5: 116,
-    F6: 117,
-    F7: 118,
-    F8: 119,
-    F9: 120,
-    F10: 121,
-    F11: 122,
-    F12: 123,
-    Semicolon: 186,    // ;
-    Comma: 188,        // ,
-    Period: 190,       // .
-    Slash: 191,        // /
-    Apostrophe: 192,   // `
-    SingleQuote: 222,  // '
-};
-
-/**
- * Creates a number encoding keyCode in the lower 8 bits and modifiers mask in the higher 8 bits.
- * It is useful for matching pressed keys.
- * keyCode is the Code of the key, or a character "a-z" which is converted to a keyCode value.
- * optModifiers is an Optional list of modifiers passed as additional paramerters.
- */
-WebInspector.KeyboardShortcut.makeKey = function(keyCode, optModifiers)
-{
-    if (typeof keyCode === "string")
-        keyCode = keyCode.charCodeAt(0) - 32;
-    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
-    for (var i = 1; i < arguments.length; i++)
-        modifiers |= arguments[i];
-    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);
-};
-
-WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)
-{
-    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
-    if (keyboardEvent.shiftKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;
-    if (keyboardEvent.ctrlKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-    if (keyboardEvent.altKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;
-    if (keyboardEvent.metaKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;
-    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);
-};
-
-WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)
-{
-    return (keyCode & 255) | (modifiers << 8);
-};
-
-/* TextPrompt.js */
-
-/*
- * Copyright (C) 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TextPrompt = function(element, completions, stopCharacters)
-{
-    this.element = element;
-    this.completions = completions;
-    this.completionStopCharacters = stopCharacters;
-    this.history = [];
-    this.historyOffset = 0;
-    this.element.addEventListener("keydown", this._onKeyDown.bind(this), true);
-}
-
-WebInspector.TextPrompt.prototype = {
-    get text()
-    {
-        return this.element.textContent;
-    },
-
-    set text(x)
-    {
-        if (!x) {
-            // Append a break element instead of setting textContent to make sure the selection is inside the prompt.
-            this.element.removeChildren();
-            this.element.appendChild(document.createElement("br"));
-        } else
-            this.element.textContent = x;
-
-        this.moveCaretToEndOfPrompt();
-    },
-
-    _onKeyDown: function(event)
-    {
-        function defaultAction()
-        {
-            this.clearAutoComplete();
-            this.autoCompleteSoon();
-        }
-
-        var handled = false;
-        switch (event.keyIdentifier) {
-            case "Up":
-                this._upKeyPressed(event);
-                break;
-            case "Down":
-                this._downKeyPressed(event);
-                break;
-            case "U+0009": // Tab
-                this._tabKeyPressed(event);
-                break;
-            case "Right":
-            case "End":
-                if (!this.acceptAutoComplete())
-                    this.autoCompleteSoon();
-                break;
-            case "Alt":
-            case "Meta":
-            case "Shift":
-            case "Control":
-                break;
-            case "U+0050": // Ctrl+P = Previous
-                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
-                    handled = true;
-                    this._moveBackInHistory();
-                    break;
-                }
-                defaultAction.call(this);
-                break;
-            case "U+004E": // Ctrl+N = Next
-                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
-                    handled = true;
-                    this._moveForwardInHistory();
-                    break;
-                }
-                defaultAction.call(this);
-                break;
-            default:
-                defaultAction.call(this);
-                break;
-        }
-
-        if (handled) {
-            event.preventDefault();
-            event.stopPropagation();
-        }
-    },
-
-    acceptAutoComplete: function()
-    {
-        if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)
-            return false;
-
-        var text = this.autoCompleteElement.textContent;
-        var textNode = document.createTextNode(text);
-        this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);
-        delete this.autoCompleteElement;
-
-        var finalSelectionRange = document.createRange();
-        finalSelectionRange.setStart(textNode, text.length);
-        finalSelectionRange.setEnd(textNode, text.length);
-
-        var selection = window.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-
-        return true;
-    },
-
-    clearAutoComplete: function(includeTimeout)
-    {
-        if (includeTimeout && "_completeTimeout" in this) {
-            clearTimeout(this._completeTimeout);
-            delete this._completeTimeout;
-        }
-
-        if (!this.autoCompleteElement)
-            return;
-
-        if (this.autoCompleteElement.parentNode)
-            this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
-        delete this.autoCompleteElement;
-
-        if (!this._userEnteredRange || !this._userEnteredText)
-            return;
-
-        this._userEnteredRange.deleteContents();
-
-        var userTextNode = document.createTextNode(this._userEnteredText);
-        this._userEnteredRange.insertNode(userTextNode);
-
-        var selectionRange = document.createRange();
-        selectionRange.setStart(userTextNode, this._userEnteredText.length);
-        selectionRange.setEnd(userTextNode, this._userEnteredText.length);
-
-        var selection = window.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(selectionRange);
-
-        delete this._userEnteredRange;
-        delete this._userEnteredText;
-    },
-
-    autoCompleteSoon: function()
-    {
-        if (!("_completeTimeout" in this))
-            this._completeTimeout = setTimeout(this.complete.bind(this, true), 250);
-    },
-
-    complete: function(auto)
-    {
-        this.clearAutoComplete(true);
-        var selection = window.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-        if (!selectionRange.commonAncestorContainer.isDescendant(this.element))
-            return;
-        if (auto && !this.isCaretAtEndOfPrompt())
-            return;
-        var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this.completionStopCharacters, this.element, "backward");
-        this.completions(wordPrefixRange, auto, this._completionsReady.bind(this, selection, auto, wordPrefixRange));
-    },
-
-    _completionsReady: function(selection, auto, originalWordPrefixRange, completions)
-    {
-        if (!completions || !completions.length)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-
-        var fullWordRange = document.createRange();
-        fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);
-        fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);
-
-        if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())
-            return;
-
-        if (completions.length === 1 || selection.isCollapsed || auto) {
-            var completionText = completions[0];
-        } else {
-            var currentText = fullWordRange.toString();
-
-            var foundIndex = null;
-            for (var i = 0; i < completions.length; ++i)
-                if (completions[i] === currentText)
-                    foundIndex = i;
-
-            if (foundIndex === null || (foundIndex + 1) >= completions.length)
-                var completionText = completions[0];
-            else
-                var completionText = completions[foundIndex + 1];
-        }
-
-        var wordPrefixLength = originalWordPrefixRange.toString().length;
-
-        this._userEnteredRange = fullWordRange;
-        this._userEnteredText = fullWordRange.toString();
-
-        fullWordRange.deleteContents();
-
-        var finalSelectionRange = document.createRange();
-
-        if (auto) {
-            var prefixText = completionText.substring(0, wordPrefixLength);
-            var suffixText = completionText.substring(wordPrefixLength);
-
-            var prefixTextNode = document.createTextNode(prefixText);
-            fullWordRange.insertNode(prefixTextNode);
-
-            this.autoCompleteElement = document.createElement("span");
-            this.autoCompleteElement.className = "auto-complete-text";
-            this.autoCompleteElement.textContent = suffixText;
-
-            prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);
-
-            finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);
-            finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);
-        } else {
-            var completionTextNode = document.createTextNode(completionText);
-            fullWordRange.insertNode(completionTextNode);
-
-            if (completions.length > 1)
-                finalSelectionRange.setStart(completionTextNode, wordPrefixLength);
-            else
-                finalSelectionRange.setStart(completionTextNode, completionText.length);
-
-            finalSelectionRange.setEnd(completionTextNode, completionText.length);
-        }
-
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-    },
-
-    isCaretInsidePrompt: function()
-    {
-        return this.element.isInsertionCaretInside();
-    },
-
-    isCaretAtEndOfPrompt: function()
-    {
-        var selection = window.getSelection();
-        if (!selection.rangeCount || !selection.isCollapsed)
-            return false;
-
-        var selectionRange = selection.getRangeAt(0);
-        var node = selectionRange.startContainer;
-        if (node !== this.element && !node.isDescendant(this.element))
-            return false;
-
-        if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)
-            return false;
-
-        var foundNextText = false;
-        while (node) {
-            if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {
-                if (foundNextText)
-                    return false;
-                foundNextText = true;
-            }
-
-            node = node.traverseNextNode(this.element);
-        }
-
-        return true;
-    },
-
-    isCaretOnFirstLine: function()
-    {
-        var selection = window.getSelection();
-        var focusNode = selection.focusNode;
-        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
-            return true;
-
-        if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)
-            return false;
-        focusNode = focusNode.previousSibling;
-
-        while (focusNode) {
-            if (focusNode.nodeType !== Node.TEXT_NODE)
-                return true;
-            if (focusNode.textContent.indexOf("\n") !== -1)
-                return false;
-            focusNode = focusNode.previousSibling;
-        }
-
-        return true;
-    },
-
-    isCaretOnLastLine: function()
-    {
-        var selection = window.getSelection();
-        var focusNode = selection.focusNode;
-        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
-            return true;
-
-        if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)
-            return false;
-        focusNode = focusNode.nextSibling;
-
-        while (focusNode) {
-            if (focusNode.nodeType !== Node.TEXT_NODE)
-                return true;
-            if (focusNode.textContent.indexOf("\n") !== -1)
-                return false;
-            focusNode = focusNode.nextSibling;
-        }
-
-        return true;
-    },
-
-    moveCaretToEndOfPrompt: function()
-    {
-        var selection = window.getSelection();
-        var selectionRange = document.createRange();
-
-        var offset = this.element.childNodes.length;
-        selectionRange.setStart(this.element, offset);
-        selectionRange.setEnd(this.element, offset);
-
-        selection.removeAllRanges();
-        selection.addRange(selectionRange);
-    },
-
-    _tabKeyPressed: function(event)
-    {
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.complete();
-    },
-
-    _upKeyPressed: function(event)
-    {
-        if (!this.isCaretOnFirstLine())
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this._moveBackInHistory();
-    },
-
-    _downKeyPressed: function(event)
-    {
-        if (!this.isCaretOnLastLine())
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this._moveForwardInHistory();
-    },
-
-    _moveBackInHistory: function()
-    {
-        if (this.historyOffset == this.history.length)
-            return;
-
-        this.clearAutoComplete(true);
-
-        if (this.historyOffset === 0)
-            this.tempSavedCommand = this.text;
-
-        ++this.historyOffset;
-        this.text = this.history[this.history.length - this.historyOffset];
-
-        this.element.scrollIntoViewIfNeeded();
-        var firstNewlineIndex = this.text.indexOf("\n");
-        if (firstNewlineIndex === -1)
-            this.moveCaretToEndOfPrompt();
-        else {
-            var selection = window.getSelection();
-            var selectionRange = document.createRange();
-
-            selectionRange.setStart(this.element.firstChild, firstNewlineIndex);
-            selectionRange.setEnd(this.element.firstChild, firstNewlineIndex);
-
-            selection.removeAllRanges();
-            selection.addRange(selectionRange);
-        }
-    },
-
-    _moveForwardInHistory: function()
-    {
-        if (this.historyOffset === 0)
-            return;
-
-        this.clearAutoComplete(true);
-
-        --this.historyOffset;
-
-        if (this.historyOffset === 0) {
-            this.text = this.tempSavedCommand;
-            delete this.tempSavedCommand;
-            return;
-        }
-
-        this.text = this.history[this.history.length - this.historyOffset];
-        this.element.scrollIntoViewIfNeeded();
-    }
-}
-
-/* Popup.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * This class provides a popup that can be shown relative to an anchor element
- * or at an arbitrary absolute position.
- * Points are Objects: {x: xValue, y: yValue}.
- * Rectangles are Objects: {x: xValue, y: yValue, width: widthValue, height: heightValue}.
- *
- * element is an optional unparented visible element (style.display != "none" AND style.visibility != "hidden").
- * If the element is absent/undefined, it must have been set with the element(x) setter before the show() method invocation.
- */
-WebInspector.Popup = function(element)
-{
-    if (element)
-        this.element = element;
-    this._keyHandler = this._keyEventHandler.bind(this);
-    this._mouseDownHandler = this._mouseDownEventHandler.bind(this);
-    this._visible = false;
-    this._autoHide = true;
-}
-
-WebInspector.Popup.prototype = {
-    show: function()
-    {
-        if (this.visible)
-            return;
-        var ownerDocument = this._contentElement.ownerDocument;
-        if (!ownerDocument)
-            return;
-
-        this._glasspaneElement = ownerDocument.createElement("div");
-        this._glasspaneElement.className = "popup-glasspane";
-        ownerDocument.body.appendChild(this._glasspaneElement);
-
-        this._contentElement.positionAt(0, 0);
-        this._contentElement.removeStyleClass("hidden");
-        ownerDocument.body.appendChild(this._contentElement);
-
-        this.positionElement();
-        this._visible = true;
-        ownerDocument.addEventListener("keydown", this._keyHandler, false);
-        ownerDocument.addEventListener("mousedown", this._mouseDownHandler, false);
-    },
-
-    hide: function()
-    {
-        if (this.visible) {
-            this._visible = false;
-            this._contentElement.ownerDocument.removeEventListener("keydown", this._keyHandler, false);
-            this._contentElement.ownerDocument.removeEventListener("mousedown", this._mouseDownHandler, false);
-            this._glasspaneElement.parentElement.removeChild(this._glasspaneElement);
-            this._contentElement.parentElement.removeChild(this._contentElement);
-        }
-    },
-
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set element(x)
-    {
-        this._checkNotVisible();
-        this._contentElement = x;
-        this._contentElement.addStyleClass("hidden");
-    },
-
-    get element()
-    {
-        return this._contentElement;
-    },
-
-    positionElement: function()
-    {
-        var element = this._contentElement;
-        var anchorElement = this._anchorElement;
-
-        var targetDocument = element.ownerDocument;
-        var targetDocumentBody = targetDocument.body;
-        var targetDocumentElement = targetDocument.documentElement;
-        var clippingBox = {x: 0, y: 0, width: targetDocumentElement.clientWidth, height: targetDocumentElement.clientHeight};
-        var parentElement = element.offsetParent || element.parentElement;
-
-        var anchorPosition = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop};
-
-        // FIXME([email protected]): Translate anchorPosition to the element.ownerDocument frame when https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed.
-        var anchorBox = {x: anchorPosition.x, y: anchorPosition.y, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};
-        var elementBox = {x: element.totalOffsetLeft, y: element.totalOffsetTop, width: element.offsetWidth, height: element.offsetHeight};
-        var newElementPosition = {x: 0, y: 0};
-
-        if (anchorBox.y - elementBox.height >= clippingBox.y)
-            newElementPosition.y = anchorBox.y - elementBox.height;
-        else
-            newElementPosition.y = Math.min(anchorBox.y + anchorBox.height, Math.max(clippingBox.y, clippingBox.y + clippingBox.height - elementBox.height));
-
-        if (anchorBox.x + elementBox.height <= clippingBox.x + clippingBox.height)
-            newElementPosition.x = anchorBox.x;
-        else
-            newElementPosition.x = Math.max(clippingBox.x, clippingBox.x + clippingBox.height - elementBox.height);
-        element.positionAt(newElementPosition.x, newElementPosition.y);
-    },
-
-    set anchor(x)
-    {
-        this._checkNotVisible();
-        this._anchorElement = x;
-    },
-
-    get anchor()
-    {
-        return this._anchorElement;
-    },
-
-    set autoHide(x)
-    {
-        this._autoHide = x;
-    },
-
-    _checkNotVisible: function()
-    {
-        if (this.visible)
-            throw new Error("The popup must not be visible.");
-    },
-
-    _keyEventHandler: function(event)
-    {
-        // Escape hides the popup.
-        if (event.keyIdentifier == "U+001B") {
-            this.hide();
-            event.preventDefault();
-            event.handled = true;
-        }
-    },
-
-    _mouseDownEventHandler: function(event)
-    {
-        if (this._autoHide && event.originalTarget === this._glasspaneElement)
-            this.hide();
-    }
-}
-
-/* Placard.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Placard = function(title, subtitle)
-{
-    this.element = document.createElement("div");
-    this.element.className = "placard";
-    this.element.placard = this;
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-
-    this.subtitleElement = document.createElement("div");
-    this.subtitleElement.className = "subtitle";
-
-    this.element.appendChild(this.subtitleElement);
-    this.element.appendChild(this.titleElement);
-
-    this.title = title;
-    this.subtitle = subtitle;
-    this.selected = false;
-}
-
-WebInspector.Placard.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.titleElement.textContent = x;
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        if (this._subtitle === x)
-            return;
-        this._subtitle = x;
-        this.subtitleElement.innerHTML = x;
-    },
-
-    get selected()
-    {
-        return this._selected;
-    },
-
-    set selected(x)
-    {
-        if (x)
-            this.select();
-        else
-            this.deselect();
-    },
-
-    select: function()
-    {
-        if (this._selected)
-            return;
-        this._selected = true;
-        this.element.addStyleClass("selected");
-    },
-
-    deselect: function()
-    {
-        if (!this._selected)
-            return;
-        this._selected = false;
-        this.element.removeStyleClass("selected");
-    },
-
-    toggleSelected: function()
-    {
-        this.selected = !this.selected;
-    }
-}
-
-/* View.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.View = function(element)
-{
-    this.element = element || document.createElement("div");
-    this._visible = false;
-}
-
-WebInspector.View.prototype = {
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set visible(x)
-    {
-        if (this._visible === x)
-            return;
-
-        if (x)
-            this.show();
-        else
-            this.hide();
-    },
-
-    show: function(parentElement)
-    {
-        this._visible = true;
-        if (parentElement && parentElement !== this.element.parentNode) {
-            this.detach();
-            parentElement.appendChild(this.element);
-        }
-        if (!this.element.parentNode && this.attach)
-            this.attach();
-        this.element.addStyleClass("visible");
-    },
-
-    hide: function()
-    {
-        this.element.removeStyleClass("visible");
-        this._visible = false;
-    },
-
-    detach: function()
-    {
-        if (this.element.parentNode)
-            this.element.parentNode.removeChild(this.element);
-    }
-}
-
-WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* Callback.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Callback = function()
-{
-    this._lastCallbackId = 1;
-    this._callbacks = {};
-}
-
-WebInspector.Callback.prototype = {
-    wrap: function(callback)
-    {
-        var callbackId = this._lastCallbackId++;
-        this._callbacks[callbackId] = callback || function() {};
-        return callbackId;
-    },
-
-    processCallback: function(callbackId, opt_vararg)
-    {
-        var args = Array.prototype.slice.call(arguments, 1);
-        var callback = this._callbacks[callbackId];
-        callback.apply(null, args);
-        delete this._callbacks[callbackId];
-    }
-}
-
-WebInspector.Callback._INSTANCE = new WebInspector.Callback();
-WebInspector.Callback.wrap = WebInspector.Callback._INSTANCE.wrap.bind(WebInspector.Callback._INSTANCE);
-WebInspector.Callback.processCallback = WebInspector.Callback._INSTANCE.processCallback.bind(WebInspector.Callback._INSTANCE);
-
-/* Drawer.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Drawer = function()
-{
-    WebInspector.View.call(this, document.getElementById("drawer"));
-
-    this._savedHeight = 200; // Default.
-    this.state = WebInspector.Drawer.State.Hidden;
-    this.fullPanel = false;
-
-    this.mainElement = document.getElementById("main");
-    this.toolbarElement = document.getElementById("toolbar");
-    this.mainStatusBar = document.getElementById("main-status-bar");
-    this.mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
-    this.viewStatusBar = document.getElementById("other-drawer-status-bar-items");
-}
-
-WebInspector.Drawer.prototype = {
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    set visibleView(x)
-    {
-        if (this._visibleView === x) {
-            if (this.visible && this.fullPanel)
-                return;
-            this.visible = !this.visible;
-            return;
-        }
-
-        var firstTime = !this._visibleView;
-        if (this._visibleView)
-            this._visibleView.hide();
-
-        this._visibleView = x;
-
-        if (x && !firstTime) {
-            this._safelyRemoveChildren();
-            this.viewStatusBar.removeChildren(); // optimize this? call old.detach()
-            x.attach(this.element, this.viewStatusBar);
-            x.show();
-            this.visible = true;
-        }
-    },
-
-    get savedHeight()
-    {
-        var height = this._savedHeight || this.element.offsetHeight;
-        return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this.mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-    },
-
-    showView: function(view)
-    {
-        if (!this.visible || this.visibleView !== view)
-            this.visibleView = view;
-    },
-
-    show: function()
-    {
-        if (this._animating || this.visible)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.show();
-
-        WebInspector.View.prototype.show.call(this);
-
-        this._animating = true;
-
-        document.body.addStyleClass("drawer-visible");
-
-        var anchoredItems = document.getElementById("anchored-status-bar-items");
-        var height = (this.fullPanel ? window.innerHeight - this.toolbarElement.offsetHeight : this.savedHeight);
-        var animations = [
-            {element: this.element, end: {height: height}},
-            {element: document.getElementById("main"), end: {bottom: height}},
-            {element: document.getElementById("main-status-bar"), start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
-            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 0}, end: {opacity: 1}}
-        ];
-
-        var drawerStatusBar = document.getElementById("drawer-status-bar");
-        drawerStatusBar.insertBefore(anchoredItems, drawerStatusBar.firstChild);
-
-        function animationFinished()
-        {
-            if ("updateStatusBarItems" in WebInspector.currentPanel)
-                WebInspector.currentPanel.updateStatusBarItems();
-            if (this.visibleView.afterShow)
-                this.visibleView.afterShow();
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    hide: function()
-    {
-        if (this._animating || !this.visible)
-            return;
-
-        WebInspector.View.prototype.hide.call(this);
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        this._animating = true;
-
-        if (!this.fullPanel)
-            this._savedHeight = this.element.offsetHeight;
-
-        if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))
-            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
-
-        var anchoredItems = document.getElementById("anchored-status-bar-items");
-
-        // Temporarily set properties and classes to mimic the post-animation values so panels
-        // like Elements in their updateStatusBarItems call will size things to fit the final location.
-        this.mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
-        document.body.removeStyleClass("drawer-visible");
-        if ("updateStatusBarItems" in WebInspector.currentPanel)
-            WebInspector.currentPanel.updateStatusBarItems();
-        document.body.addStyleClass("drawer-visible");
-
-        var animations = [
-            {element: document.getElementById("main"), end: {bottom: 0}},
-            {element: document.getElementById("main-status-bar"), start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
-            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 1}, end: {opacity: 0}}
-        ];
-
-        function animationFinished()
-        {
-            var mainStatusBar = document.getElementById("main-status-bar");
-            mainStatusBar.insertBefore(anchoredItems, mainStatusBar.firstChild);
-            mainStatusBar.style.removeProperty("padding-left");
-            document.body.removeStyleClass("drawer-visible");
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = WebInspector.Drawer.State.Hidden;
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    resize: function()
-    {
-        if (this.state === WebInspector.Drawer.State.Hidden)
-            return;
-
-        var height;
-        var mainElement = document.getElementById("main");
-        if (this.state === WebInspector.Drawer.State.Variable) {
-            height = parseInt(this.element.style.height);
-            height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-        } else
-            height = window.innerHeight - this.toolbarElement.offsetHeight;
-
-        mainElement.style.bottom = height + "px";
-        this.element.style.height = height + "px";
-    },
-
-    enterPanelMode: function()
-    {
-        this._cancelAnimationIfNeeded();
-        this.fullPanel = true;
-        
-        if (this.visible) {
-            this._savedHeight = this.element.offsetHeight;
-            var height = window.innerHeight - this.toolbarElement.offsetHeight;
-            this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);
-        }
-    },
-
-    exitPanelMode: function()
-    {
-        this._cancelAnimationIfNeeded();
-        this.fullPanel = false;
-
-        if (this.visible) {
-            // If this animation gets cancelled, we want the state of the drawer to be Variable,
-            // so that the new animation can't do an immediate transition between Hidden/Full states.
-            this.state = WebInspector.Drawer.State.Variable;
-            var height = this.savedHeight;
-            this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);
-        }
-    },
-
-    immediatelyExitPanelMode: function()
-    {
-        this.visible = false;
-        this.fullPanel = false;
-    },
-
-    _cancelAnimationIfNeeded: function()
-    {
-        if (this._animating) {
-            clearInterval(this._currentAnimationInterval);
-            delete this._animating;
-            delete this._currentAnimationInterval;
-        }
-    },
-
-    _animateDrawerHeight: function(height, finalState)
-    {
-        this._animating = true;
-        var animations = [
-            {element: this.element, end: {height: height}},
-            {element: document.getElementById("main"), end: {bottom: height}}
-        ];
-
-        function animationFinished()
-        {
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = finalState;
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    _animationDuration: function()
-    {
-        // Immediate if going between Hidden and Full in full panel mode
-        if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))
-            return 0;
-
-        return (window.event && window.event.shiftKey ? 2000 : 250);
-    },
-
-    _safelyRemoveChildren: function()
-    {
-        var child = this.element.firstChild;
-        while (child) {
-            if (child.id !== "drawer-status-bar") {
-                var moveTo = child.nextSibling;
-                this.element.removeChild(child);
-                child = moveTo;
-            } else
-                child = child.nextSibling;
-        }
-    },
-
-    _startStatusBarDragging: function(event)
-    {
-        if (!this.visible || event.target !== this.mainStatusBar)
-            return;
-
-        WebInspector.elementDragStart(this.mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
-
-        this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;
-
-        event.stopPropagation();
-    },
-
-    _statusBarDragging: function(event)
-    {
-        var mainElement = document.getElementById("main");
-        var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
-        height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-
-        mainElement.style.bottom = height + "px";
-        this.element.style.height = height + "px";
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    _endStatusBarDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-
-        this._savedHeight = this.element.offsetHeight;
-        delete this._statusBarDragOffset;
-
-        event.stopPropagation();
-    }
-}
-
-WebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.Drawer.State = {
-    Hidden: 0,
-    Variable: 1,
-    Full: 2
-};
-
-/* ChangesView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ChangesView = function(drawer)
-{
-    WebInspector.View.call(this);
-    this.element.innerHTML = "<div style=\"bottom:25%;color:rgb(192,192,192);font-size:12px;height:65px;left:0px;margin:auto;position:absolute;right:0px;text-align:center;top:0px;\"><h1>Not Implemented Yet</h1></div>";
-
-    this.drawer = drawer;
-
-    this.clearButton = document.createElement("button");
-    this.clearButton.id = "clear-changes-status-bar-item";
-    this.clearButton.title = WebInspector.UIString("Clear changes log.");
-    this.clearButton.className = "status-bar-item";
-    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.toggleChangesButton = document.getElementById("changes-status-bar-item");
-    this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
-    this.toggleChangesButton.addEventListener("click", this._toggleChangesButtonClicked.bind(this), false);
-    var anchoredStatusBar = document.getElementById("anchored-status-bar-items");
-    anchoredStatusBar.appendChild(this.toggleChangesButton);
-}
-
-WebInspector.ChangesView.prototype = {
-    _clearButtonClicked: function()
-    {
-        // Not Implemented Yet
-    },
-
-    _toggleChangesButtonClicked: function()
-    {
-        this.drawer.visibleView = this;
-    },
-
-    attach: function(mainElement, statusBarElement)
-    {
-        mainElement.appendChild(this.element);
-        statusBarElement.appendChild(this.clearButton);
-    },
-
-    show: function()
-    {
-        this.toggleChangesButton.addStyleClass("toggled-on");
-        this.toggleChangesButton.title = WebInspector.UIString("Hide changes view.");
-    },
-
-    hide: function()
-    {
-        this.toggleChangesButton.removeStyleClass("toggled-on");
-        this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
-    }
-}
-
-WebInspector.ChangesView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ConsoleView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
-
-WebInspector.ConsoleView = function(drawer)
-{
-    WebInspector.View.call(this, document.getElementById("console-view"));
-
-    this.messages = [];
-    this.drawer = drawer;
-
-    this.clearButton = document.getElementById("clear-console-status-bar-item");
-    this.clearButton.title = WebInspector.UIString("Clear console log.");
-    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.messagesElement = document.getElementById("console-messages");
-    this.messagesElement.addEventListener("selectstart", this._messagesSelectStart.bind(this), false);
-    this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);
-
-    this.promptElement = document.getElementById("console-prompt");
-    this.promptElement.className = "source-code";
-    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
-    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");
-
-    this.topGroup = new WebInspector.ConsoleGroup(null, 0);
-    this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
-    this.groupLevel = 0;
-    this.currentGroup = this.topGroup;
-
-    this.toggleConsoleButton = document.getElementById("console-status-bar-item");
-    this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
-    this.toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);
-
-    // Will hold the list of filter elements
-    this.filterBarElement = document.getElementById("console-filter");
-
-    function createDividerElement() {
-        var dividerElement = document.createElement("div");
-        dividerElement.addStyleClass("divider");
-        this.filterBarElement.appendChild(dividerElement);
-    }
-
-    var updateFilterHandler = this._updateFilter.bind(this);
-    function createFilterElement(category) {
-        var categoryElement = document.createElement("li");
-        categoryElement.category = category;
-        categoryElement.addStyleClass(categoryElement.category);            
-        categoryElement.addEventListener("click", updateFilterHandler, false);
-
-        var label = category.toString();
-        categoryElement.appendChild(document.createTextNode(label));
-
-        this.filterBarElement.appendChild(categoryElement);
-        return categoryElement;
-    }
-    
-    this.allElement = createFilterElement.call(this, "All");
-    createDividerElement.call(this);
-    this.errorElement = createFilterElement.call(this, "Errors");
-    this.warningElement = createFilterElement.call(this, "Warnings");
-    this.logElement = createFilterElement.call(this, "Logs");
-
-    this.filter(this.allElement, false);
-
-    this._shortcuts = {};
-
-    var shortcut;
-    var clearConsoleHandler = this.requestClearMessages.bind(this);
-
-    shortcut = WebInspector.KeyboardShortcut.makeKey("k", WebInspector.KeyboardShortcut.Modifiers.Meta);
-    this._shortcuts[shortcut] = clearConsoleHandler;
-    this._shortcuts[shortcut].isMacOnly = true;
-    shortcut = WebInspector.KeyboardShortcut.makeKey("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = clearConsoleHandler;
-
-    // Since the Context Menu for the Console View will always be the same, we can create it in
-    // the constructor.
-    this._contextMenu = new WebInspector.ContextMenu();
-    this._contextMenu.appendItem(WebInspector.UIString("Clear Console"), clearConsoleHandler);
-    this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);
-    
-    this._customFormatters = {
-        "object": this._formatobject,
-        "array":  this._formatarray,
-        "node":   this._formatnode,
-        "string": this._formatstring
-    };
-}
-
-WebInspector.ConsoleView.prototype = {
-    
-    _updateFilter: function(e)
-    {
-        var isMac = WebInspector.isMac();
-        var selectMultiple = false;
-        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-
-        this.filter(e.target, selectMultiple);
-    },
-    
-    filter: function(target, selectMultiple)
-    {
-        function unselectAll()
-        {
-            this.allElement.removeStyleClass("selected");
-            this.errorElement.removeStyleClass("selected");
-            this.warningElement.removeStyleClass("selected");
-            this.logElement.removeStyleClass("selected");
-            
-            this.messagesElement.removeStyleClass("filter-all");
-            this.messagesElement.removeStyleClass("filter-errors");
-            this.messagesElement.removeStyleClass("filter-warnings");
-            this.messagesElement.removeStyleClass("filter-logs");
-        }
-        
-        var targetFilterClass = "filter-" + target.category.toLowerCase();
-
-        if (target.category == "All") {
-            if (target.hasStyleClass("selected")) {
-                // We can't unselect all, so we break early here
-                return;
-            }
-
-            unselectAll.call(this);
-        } else {
-            // Something other than all is being selected, so we want to unselect all
-            if (this.allElement.hasStyleClass("selected")) {
-                this.allElement.removeStyleClass("selected");
-                this.messagesElement.removeStyleClass("filter-all");
-            }
-        }
-        
-        if (!selectMultiple) {
-            // If multiple selection is off, we want to unselect everything else
-            // and just select ourselves.
-            unselectAll.call(this);
-            
-            target.addStyleClass("selected");
-            this.messagesElement.addStyleClass(targetFilterClass);
-            
-            return;
-        }
-        
-        if (target.hasStyleClass("selected")) {
-            // If selectMultiple is turned on, and we were selected, we just
-            // want to unselect ourselves.
-            target.removeStyleClass("selected");
-            this.messagesElement.removeStyleClass(targetFilterClass);
-        } else {
-            // If selectMultiple is turned on, and we weren't selected, we just
-            // want to select ourselves.
-            target.addStyleClass("selected");
-            this.messagesElement.addStyleClass(targetFilterClass);
-        }
-    },
-    
-    _toggleConsoleButtonClicked: function()
-    {
-        this.drawer.visibleView = this;
-    },
-
-    attach: function(mainElement, statusBarElement)
-    {
-        mainElement.appendChild(this.element);
-        statusBarElement.appendChild(this.clearButton);
-        statusBarElement.appendChild(this.filterBarElement);
-    },
-
-    show: function()
-    {
-        this.toggleConsoleButton.addStyleClass("toggled-on");
-        this.toggleConsoleButton.title = WebInspector.UIString("Hide console.");
-        if (!this.prompt.isCaretInsidePrompt())
-            this.prompt.moveCaretToEndOfPrompt();
-    },
-
-    afterShow: function()
-    {
-        WebInspector.currentFocusElement = this.promptElement;  
-    },
-
-    hide: function()
-    {
-        this.toggleConsoleButton.removeStyleClass("toggled-on");
-        this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
-    },
-
-    addMessage: function(msg)
-    {
-        if (msg instanceof WebInspector.ConsoleMessage && !(msg instanceof WebInspector.ConsoleCommandResult)) {
-            this._incrementErrorWarningCount(msg);
-
-            // Add message to the resource panel
-            if (msg.url in WebInspector.resourceURLMap) {
-                msg.resource = WebInspector.resourceURLMap[msg.url];
-                if (WebInspector.panels.resources)
-                    WebInspector.panels.resources.addMessageToResource(msg.resource, msg);
-            }
-
-            this.commandSincePreviousMessage = false;
-            this.previousMessage = msg;
-        } else if (msg instanceof WebInspector.ConsoleCommand) {
-            if (this.previousMessage) {
-                this.commandSincePreviousMessage = true;
-            }
-        }
-
-        this.messages.push(msg);
-
-        if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
-            if (this.groupLevel < 1)
-                return;
-
-            this.groupLevel--;
-
-            this.currentGroup = this.currentGroup.parentGroup;
-        } else {
-            if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
-                this.groupLevel++;
-
-                var group = new WebInspector.ConsoleGroup(this.currentGroup, this.groupLevel);
-                this.currentGroup.messagesElement.appendChild(group.element);
-                this.currentGroup = group;
-            }
-
-            this.currentGroup.addMessage(msg);
-        }
-
-        this.promptElement.scrollIntoView(false);
-    },
-
-    updateMessageRepeatCount: function(count)
-    {
-        var msg = this.previousMessage;
-        var prevRepeatCount = msg.totalRepeatCount;
-        
-        if (!this.commandSincePreviousMessage) {
-            msg.repeatDelta = count - prevRepeatCount;
-            msg.repeatCount = msg.repeatCount + msg.repeatDelta;
-            msg.totalRepeatCount = count;
-            msg._updateRepeatCount();
-            this._incrementErrorWarningCount(msg);
-        } else {
-            msgCopy = new WebInspector.ConsoleMessage(msg.source, msg.type, msg.level, msg.line, msg.url, msg.groupLevel, count - prevRepeatCount);
-            msgCopy.totalRepeatCount = count;
-            msgCopy.setMessageBody(msg.args);
-            this.addMessage(msgCopy);
-        }
-    },
-
-    _incrementErrorWarningCount: function(msg)
-    {
-        switch (msg.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                WebInspector.warnings += msg.repeatDelta;
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                WebInspector.errors += msg.repeatDelta;
-                break;
-        }
-    },
-
-    requestClearMessages: function()
-    {
-        InjectedScriptAccess.clearConsoleMessages(function() {});
-    },
-
-    clearMessages: function()
-    {
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.clearMessages();
-
-        this.messages = [];
-
-        this.groupLevel = 0;
-        this.currentGroup = this.topGroup;
-        this.topGroup.messagesElement.removeChildren();
-
-        WebInspector.errors = 0;
-        WebInspector.warnings = 0;
-
-        delete this.commandSincePreviousMessage;
-        delete this.previousMessage;
-    },
-
-    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
-    {
-        // Pass less stop characters to rangeOfWord so the range will be a more complete expression.
-        var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");
-        var expressionString = expressionRange.toString();
-        var lastIndex = expressionString.length - 1;
-
-        var dotNotation = (expressionString[lastIndex] === ".");
-        var bracketNotation = (expressionString[lastIndex] === "[");
-
-        if (dotNotation || bracketNotation)
-            expressionString = expressionString.substr(0, lastIndex);
-
-        var prefix = wordRange.toString();
-        if (!expressionString && !prefix)
-            return;
-
-        var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);
-        // Collect comma separated object properties for the completion.
-
-        var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);
-        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused)
-            var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();
-        InjectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);
-    },
-
-    _reportCompletions: function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
-        if (isException)
-            return;
-
-        if (bracketNotation) {
-            if (prefix.length && prefix[0] === "'")
-                var quoteUsed = "'";
-            else
-                var quoteUsed = "\"";
-        }
-
-        var results = [];
-        var properties = Object.sortedProperties(result);
-
-        for (var i = 0; i < properties.length; ++i) {
-            var property = properties[i];
-
-            if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
-                continue;
-
-            if (bracketNotation) {
-                if (!/^[0-9]+$/.test(property))
-                    property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;
-                property += "]";
-            }
-
-            if (property.length < prefix.length)
-                continue;
-            if (property.indexOf(prefix) !== 0)
-                continue;
-
-            results.push(property);
-            if (bestMatchOnly)
-                break;
-        }
-        completionsReadyCallback(results);
-    },
-
-    _clearButtonClicked: function()
-    {
-        this.requestClearMessages();
-    },
-
-    _handleContextMenuEvent: function(event)
-    {
-        if (!window.getSelection().isCollapsed) {
-            // If there is a selection, we want to show our normal context menu
-            // (with Copy, etc.), and not Clear Console.
-            return;
-        }
-
-        this._contextMenu.show(event);
-    },
-
-    _messagesSelectStart: function(event)
-    {
-        if (this._selectionTimeout)
-            clearTimeout(this._selectionTimeout);
-
-        this.prompt.clearAutoComplete();
-
-        function moveBackIfOutside()
-        {
-            delete this._selectionTimeout;
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-            this.prompt.autoCompleteSoon();
-        }
-
-        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
-    },
-
-    _messagesClicked: function(event)
-    {
-        var link = event.target.enclosingNodeOrSelfWithNodeName("a");
-        if (!link || !link.representedNode)
-            return;
-
-        WebInspector.updateFocusedNode(link.representedNode.id);
-        event.stopPropagation();
-        event.preventDefault();
-    },
-
-    _promptKeyDown: function(event)
-    {
-        if (isEnterKey(event)) {
-            this._enterKeyPressed(event);
-            return;
-        }
-
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            if (!this._shortcuts[shortcut].isMacOnly || WebInspector.isMac()) {
-                handler();
-                event.preventDefault();
-                return;
-            }
-        }
-    },
-
-    evalInInspectedWindow: function(expression, objectGroup, callback)
-    {
-        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
-            WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);
-            return;
-        }
-        this.doEvalInWindow(expression, objectGroup, callback);
-    },
-
-    doEvalInWindow: function(expression, objectGroup, callback)
-    {
-        if (!expression) {
-            // There is no expression, so the completion should happen against global properties.
-            expression = "this";
-        }
-
-        function evalCallback(result)
-        {
-            callback(result.value, result.isException);
-        };
-        InjectedScriptAccess.evaluate(expression, objectGroup, evalCallback);
-    },
-
-    _enterKeyPressed: function(event)
-    {
-        if (event.altKey)
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.prompt.clearAutoComplete(true);
-
-        var str = this.prompt.text;
-        if (!str.length)
-            return;
-
-        var commandMessage = new WebInspector.ConsoleCommand(str);
-        this.addMessage(commandMessage);
-
-        var self = this;
-        function printResult(result, exception)
-        {
-            self.prompt.history.push(str);
-            self.prompt.historyOffset = 0;
-            self.prompt.text = "";
-            self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
-        }
-        this.evalInInspectedWindow(str, "console", printResult);
-    },
-
-    _format: function(output, forceObjectFormat)
-    {
-        var isProxy = (output != null && typeof output === "object");
-        var type = (forceObjectFormat ? "object" : Object.proxyType(output));
-
-        var formatter = this._customFormatters[type];
-        if (!formatter || !isProxy) {
-            formatter = this._formatvalue;
-            output = output.description || output;
-        }
-
-        var span = document.createElement("span");
-        span.className = "console-formatted-" + type + " source-code";
-        formatter.call(this, output, span);
-        return span;
-    },
-
-    _formatvalue: function(val, elem)
-    {
-        elem.appendChild(document.createTextNode(val));
-    },
-
-    _formatobject: function(obj, elem)
-    {
-        elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description, null, true).element);
-    },
-
-    _formatnode: function(object, elem)
-    {
-        function printNode(nodeId)
-        {
-            if (!nodeId)
-                return;
-            var treeOutline = new WebInspector.ElementsTreeOutline();
-            treeOutline.showInElementsPanelEnabled = true;
-            treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);
-            treeOutline.element.addStyleClass("outline-disclosure");
-            if (!treeOutline.children[0].hasChildren)
-                treeOutline.element.addStyleClass("single-node");
-            elem.appendChild(treeOutline.element);
-        }
-
-        InjectedScriptAccess.pushNodeToFrontend(object, printNode);
-    },
-
-    _formatarray: function(arr, elem)
-    {
-        InjectedScriptAccess.getProperties(arr, false, false, this._printArray.bind(this, elem));
-    },
-
-    _formatstring: function(output, elem)
-    {
-        var span = document.createElement("span");
-        span.className = "console-formatted-string source-code";
-        span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
-
-        // Make black quotes.
-        elem.removeStyleClass("console-formatted-string");
-        elem.appendChild(document.createTextNode("\""));
-        elem.appendChild(span);
-        elem.appendChild(document.createTextNode("\""));
-    },
-
-    _printArray: function(elem, properties)
-    {
-        if (!properties)
-            return;
-
-        var elements = [];
-        for (var i = 0; i < properties.length; ++i) {
-            var name = properties[i].name;
-            if (name == parseInt(name))
-                elements[name] = this._format(properties[i].value);
-        }
-
-        elem.appendChild(document.createTextNode("["));
-        for (var i = 0; i < elements.length; ++i) {
-            var element = elements[i];
-            if (element)
-                elem.appendChild(element);
-            else
-                elem.appendChild(document.createTextNode("undefined"))
-            if (i < elements.length - 1)
-                elem.appendChild(document.createTextNode(", "));
-        }
-        elem.appendChild(document.createTextNode("]"));
-    }
-}
-
-WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.ConsoleMessage = function(source, type, level, line, url, groupLevel, repeatCount)
-{
-    this.source = source;
-    this.type = type;
-    this.level = level;
-    this.line = line;
-    this.url = url;
-    this.groupLevel = groupLevel;
-    this.repeatCount = repeatCount;
-    this.repeatDelta = repeatCount;
-    this.totalRepeatCount = repeatCount;
-    if (arguments.length > 7)
-        this.setMessageBody(Array.prototype.slice.call(arguments, 7));
-}
-
-WebInspector.ConsoleMessage.prototype = {
-    setMessageBody: function(args)
-    {
-        this.args = args;
-        switch (this.type) {
-            case WebInspector.ConsoleMessage.MessageType.Trace:
-                var span = document.createElement("span");
-                span.className = "console-formatted-trace source-code";
-                var stack = Array.prototype.slice.call(args);
-                var funcNames = stack.map(function(f) {
-                    return f || WebInspector.UIString("(anonymous function)");
-                });
-                span.appendChild(document.createTextNode(funcNames.join("\n")));
-                this.formattedMessage = span;
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Object:
-                this.formattedMessage = this._format(["%O", args[0]]);
-                break;
-            default:
-                this.formattedMessage = this._format(args);
-                break;
-        }
-
-        // This is used for inline message bubbles in SourceFrames, or other plain-text representations.
-        this.message = this.formattedMessage.textContent;
-    },
-
-    isErrorOrWarning: function()
-    {
-        return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
-    },
-
-    _format: function(parameters)
-    {
-        // This node is used like a Builder. Values are contintually appended onto it.
-        var formattedResult = document.createElement("span");
-        if (!parameters.length)
-            return formattedResult;
-
-        // Formatting code below assumes that parameters are all wrappers whereas frontend console
-        // API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here.
-        for (var i = 0; i < parameters.length; ++i)
-            if (typeof parameters[i] !== "object" && typeof parameters[i] !== "function")
-                parameters[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(parameters[i]);
-
-        // There can be string log and string eval result. We distinguish between them based on message type.
-        var shouldFormatMessage = Object.proxyType(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
-
-        // Multiple parameters with the first being a format string. Save unused substitutions.
-        if (shouldFormatMessage) {
-            // Multiple parameters with the first being a format string. Save unused substitutions.
-            var result = this._formatWithSubstitutionString(parameters, formattedResult);
-            parameters = result.unusedSubstitutions;
-            if (parameters.length)
-                formattedResult.appendChild(document.createTextNode(" "));
-        }
-
-        // Single parameter, or unused substitutions from above.
-        for (var i = 0; i < parameters.length; ++i) {
-            // Inline strings when formatting.
-            if (shouldFormatMessage && parameters[i].type === "string")
-                formattedResult.appendChild(document.createTextNode(parameters[i].description));
-            else
-                formattedResult.appendChild(WebInspector.console._format(parameters[i]));
-            if (i < parameters.length - 1)
-                formattedResult.appendChild(document.createTextNode(" "));
-        }
-        return formattedResult;
-    },
-
-    _formatWithSubstitutionString: function(parameters, formattedResult)
-    {
-        var formatters = {}
-        for (var i in String.standardFormatters)
-            formatters[i] = String.standardFormatters[i];
-
-        function consoleFormatWrapper(force)
-        {
-            return function(obj) {
-                return WebInspector.console._format(obj, force);
-            };
-        }
-
-        // Firebug uses %o for formatting objects.
-        formatters.o = consoleFormatWrapper();
-        // Firebug allows both %i and %d for formatting integers.
-        formatters.i = formatters.d;
-        // Support %O to force object formating, instead of the type-based %o formatting.
-        formatters.O = consoleFormatWrapper(true);
-
-        function append(a, b)
-        {
-            if (!(b instanceof Node))
-                a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));
-            else
-                a.appendChild(b);
-            return a;
-        }
-
-        // String.format does treat formattedResult like a Builder, result is an object.
-        return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);
-    },
-
-    toMessageElement: function()
-    {
-        if (this._element)
-            return this._element;
-
-        var element = document.createElement("div");
-        element.message = this;
-        element.className = "console-message";
-
-        this._element = element;
-
-        switch (this.source) {
-            case WebInspector.ConsoleMessage.MessageSource.HTML:
-                element.addStyleClass("console-html-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.WML:
-                element.addStyleClass("console-wml-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.XML:
-                element.addStyleClass("console-xml-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.JS:
-                element.addStyleClass("console-js-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.CSS:
-                element.addStyleClass("console-css-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.Other:
-                element.addStyleClass("console-other-source");
-                break;
-        }
-
-        switch (this.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Tip:
-                element.addStyleClass("console-tip-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Log:
-                element.addStyleClass("console-log-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Debug:
-                element.addStyleClass("console-debug-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                element.addStyleClass("console-warning-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                element.addStyleClass("console-error-level");
-                break;
-        }
-        
-        if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup)
-            element.addStyleClass("console-group-title");
-
-        if (this.elementsTreeOutline) {
-            element.addStyleClass("outline-disclosure");
-            element.appendChild(this.elementsTreeOutline.element);
-            return element;
-        }
-
-        if (this.url && this.url !== "undefined") {
-            var urlElement = document.createElement("a");
-            urlElement.className = "console-message-url webkit-html-resource-link";
-            urlElement.href = this.url;
-            urlElement.lineNumber = this.line;
-
-            if (this.source === WebInspector.ConsoleMessage.MessageSource.JS)
-                urlElement.preferredPanel = "scripts";
-
-            if (this.line > 0)
-                urlElement.textContent = WebInspector.displayNameForURL(this.url) + ":" + this.line;
-            else
-                urlElement.textContent = WebInspector.displayNameForURL(this.url);
-
-            element.appendChild(urlElement);
-        }
-
-        var messageTextElement = document.createElement("span");
-        messageTextElement.className = "console-message-text source-code";
-        if (this.type === WebInspector.ConsoleMessage.MessageType.Assert)
-            messageTextElement.appendChild(document.createTextNode(WebInspector.UIString("Assertion failed: ")));
-        messageTextElement.appendChild(this.formattedMessage);
-        element.appendChild(messageTextElement);
-
-        if (this.repeatCount > 1)
-            this._updateRepeatCount();
-
-        return element;
-    },
-
-    _updateRepeatCount: function() {
-        if (!this.repeatCountElement) {
-            this.repeatCountElement = document.createElement("span");
-            this.repeatCountElement.className = "bubble";
-    
-            this._element.insertBefore(this.repeatCountElement, this._element.firstChild);
-            this._element.addStyleClass("repeated-message");
-        }
-        this.repeatCountElement.textContent = this.repeatCount;
-    },
-
-    toString: function()
-    {
-        var sourceString;
-        switch (this.source) {
-            case WebInspector.ConsoleMessage.MessageSource.HTML:
-                sourceString = "HTML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.WML:
-                sourceString = "WML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.XML:
-                sourceString = "XML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.JS:
-                sourceString = "JS";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.CSS:
-                sourceString = "CSS";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.Other:
-                sourceString = "Other";
-                break;
-        }
-
-        var typeString;
-        switch (this.type) {
-            case WebInspector.ConsoleMessage.MessageType.Log:
-                typeString = "Log";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Object:
-                typeString = "Object";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Trace:
-                typeString = "Trace";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.StartGroup:
-                typeString = "Start Group";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.EndGroup:
-                typeString = "End Group";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Assert:
-                typeString = "Assert";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Result:
-                typeString = "Result";
-                break;
-        }
-        
-        var levelString;
-        switch (this.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Tip:
-                levelString = "Tip";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Log:
-                levelString = "Log";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                levelString = "Warning";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Debug:
-                levelString = "Debug";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                levelString = "Error";
-                break;
-        }
-
-        return sourceString + " " + typeString + " " + levelString + ": " + this.formattedMessage.textContent + "\n" + this.url + " line " + this.line;
-    },
-
-    isEqual: function(msg, disreguardGroup)
-    {
-        if (!msg)
-            return false;
-
-        var ret = (this.source == msg.source)
-            && (this.type == msg.type)
-            && (this.level == msg.level)
-            && (this.line == msg.line)
-            && (this.url == msg.url)
-            && (this.message == msg.message);
-
-        return (disreguardGroup ? ret : (ret && (this.groupLevel == msg.groupLevel)));
-    }
-}
-
-// Note: Keep these constants in sync with the ones in Console.h
-WebInspector.ConsoleMessage.MessageSource = {
-    HTML: 0,
-    WML: 1,
-    XML: 2,
-    JS: 3,
-    CSS: 4,
-    Other: 5
-}
-
-WebInspector.ConsoleMessage.MessageType = {
-    Log: 0,
-    Object: 1,
-    Trace: 2,
-    StartGroup: 3,
-    EndGroup: 4,
-    Assert: 5,
-    Result: 6
-}
-
-WebInspector.ConsoleMessage.MessageLevel = {
-    Tip: 0,
-    Log: 1,
-    Warning: 2,
-    Error: 3,
-    Debug: 4
-}
-
-WebInspector.ConsoleCommand = function(command)
-{
-    this.command = command;
-}
-
-WebInspector.ConsoleCommand.prototype = {
-    toMessageElement: function()
-    {
-        var element = document.createElement("div");
-        element.command = this;
-        element.className = "console-user-command";
-
-        var commandTextElement = document.createElement("span");
-        commandTextElement.className = "console-message-text source-code";
-        commandTextElement.textContent = this.command;
-        element.appendChild(commandTextElement);
-
-        return element;
-    }
-}
-
-WebInspector.ConsoleTextMessage = function(text, level)
-{
-    level = level || WebInspector.ConsoleMessage.MessageLevel.Log;
-    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Log, level, 0, null, null, 1, text);
-}
-
-WebInspector.ConsoleTextMessage.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
-
-WebInspector.ConsoleCommandResult = function(result, exception, originatingCommand)
-{
-    var level = (exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
-    var message = result;
-    if (exception) {
-        // Distinguish between strings and errors (no need to quote latter).
-        message = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
-        message.type = "error";
-    }
-    var line = (exception ? result.line : -1);
-    var url = (exception ? result.sourceURL : null);
-
-    this.originatingCommand = originatingCommand;
-
-    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, line, url, null, 1, message);
-}
-
-WebInspector.ConsoleCommandResult.prototype = {
-    toMessageElement: function()
-    {
-        var element = WebInspector.ConsoleMessage.prototype.toMessageElement.call(this);
-        element.addStyleClass("console-user-command-result");
-        return element;
-    }
-}
-
-WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
-
-WebInspector.ConsoleGroup = function(parentGroup, level)
-{
-    this.parentGroup = parentGroup;
-    this.level = level;
-
-    var element = document.createElement("div");
-    element.className = "console-group";
-    element.group = this;
-    this.element = element;
-
-    var messagesElement = document.createElement("div");
-    messagesElement.className = "console-group-messages";
-    element.appendChild(messagesElement);
-    this.messagesElement = messagesElement;
-}
-
-WebInspector.ConsoleGroup.prototype = {
-    addMessage: function(msg)
-    {
-        var element = msg.toMessageElement();
-        
-        if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
-            this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
-            element.addEventListener("click", this._titleClicked.bind(this), true);
-        } else
-            this.messagesElement.appendChild(element);
-
-        if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
-            element.previousSibling.addStyleClass("console-adjacent-user-command-result");
-    },
-
-    _titleClicked: function(event)
-    {
-        var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");
-        if (groupTitleElement) {
-            var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");
-            if (groupElement)
-                if (groupElement.hasStyleClass("collapsed"))
-                    groupElement.removeStyleClass("collapsed");
-                else
-                    groupElement.addStyleClass("collapsed");
-            groupTitleElement.scrollIntoViewIfNeeded(true);
-        }
-
-        event.stopPropagation();
-        event.preventDefault();
-    }
-}
-
-/* Panel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Panel = function()
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("panel");
-}
-
-WebInspector.Panel.prototype = {
-    get toolbarItem()
-    {
-        if (this._toolbarItem)
-            return this._toolbarItem;
-
-        // Sample toolbar item as markup:
-        // <button class="toolbar-item resources toggleable">
-        // <div class="toolbar-icon"></div>
-        // <div class="toolbar-label">Resources</div>
-        // </button>
-
-        this._toolbarItem = document.createElement("button");
-        this._toolbarItem.className = "toolbar-item toggleable";
-        this._toolbarItem.panel = this;
-
-        if ("toolbarItemClass" in this)
-            this._toolbarItem.addStyleClass(this.toolbarItemClass);
-
-        var iconElement = document.createElement("div");
-        iconElement.className = "toolbar-icon";
-        this._toolbarItem.appendChild(iconElement);
-
-        if ("toolbarItemLabel" in this) {
-            var labelElement = document.createElement("div");
-            labelElement.className = "toolbar-label";
-            labelElement.textContent = this.toolbarItemLabel;
-            this._toolbarItem.appendChild(labelElement);
-        }
-
-        return this._toolbarItem;
-    },
-
-    show: function()
-    {
-        WebInspector.View.prototype.show.call(this);
-
-        var statusBarItems = this.statusBarItems;
-        if (statusBarItems) {
-            this._statusBarItemContainer = document.createElement("div");
-            for (var i = 0; i < statusBarItems.length; ++i)
-                this._statusBarItemContainer.appendChild(statusBarItems[i]);
-            document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
-        }
-
-        if ("_toolbarItem" in this)
-            this._toolbarItem.addStyleClass("toggled-on");
-
-        WebInspector.currentFocusElement = this.defaultFocusedElement;
-
-        this.updateSidebarWidth();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-
-        if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)
-            this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);
-        delete this._statusBarItemContainer;
-        if ("_toolbarItem" in this)
-            this._toolbarItem.removeStyleClass("toggled-on");
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.sidebarTreeElement || this.element;
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode)
-            document.getElementById("main-panels").appendChild(this.element);
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var view = this._searchResults[i];
-                if (view.searchCanceled)
-                    view.searchCanceled();
-                delete view.currentQuery;
-            }
-        }
-
-        WebInspector.updateSearchMatchesCount(0, this);
-
-        if (this._currentSearchChunkIntervalIdentifier) {
-            clearInterval(this._currentSearchChunkIntervalIdentifier);
-            delete this._currentSearchChunkIntervalIdentifier;
-        }
-
-        this._totalSearchMatches = 0;
-        this._currentSearchResultIndex = 0;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled(true);
-
-        var searchableViews = this.searchableViews;
-        if (!searchableViews || !searchableViews.length)
-            return;
-
-        var parentElement = this.viewsContainerElement;
-        var visibleView = this.visibleView;
-        var sortFuction = this.searchResultsSortFunction;
-
-        var matchesCountUpdateTimeout = null;
-
-        function updateMatchesCount()
-        {
-            WebInspector.updateSearchMatchesCount(this._totalSearchMatches, this);
-            matchesCountUpdateTimeout = null;
-        }
-
-        function updateMatchesCountSoon()
-        {
-            if (matchesCountUpdateTimeout)
-                return;
-            // Update the matches count every half-second so it doesn't feel twitchy.
-            matchesCountUpdateTimeout = setTimeout(updateMatchesCount.bind(this), 500);
-        }
-
-        function finishedCallback(view, searchMatches)
-        {
-            if (!searchMatches)
-                return;
-
-            this._totalSearchMatches += searchMatches;
-            this._searchResults.push(view);
-
-            if (sortFuction)
-                this._searchResults.sort(sortFuction);
-
-            if (this.searchMatchFound)
-                this.searchMatchFound(view, searchMatches);
-
-            updateMatchesCountSoon.call(this);
-
-            if (view === visibleView)
-                view.jumpToFirstSearchResult();
-        }
-
-        var i = 0;
-        var panel = this;
-        var boundFinishedCallback = finishedCallback.bind(this);
-        var chunkIntervalIdentifier = null;
-
-        // Split up the work into chunks so we don't block the
-        // UI thread while processing.
-
-        function processChunk()
-        {
-            var view = searchableViews[i];
-
-            if (++i >= searchableViews.length) {
-                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
-                    delete panel._currentSearchChunkIntervalIdentifier;
-                clearInterval(chunkIntervalIdentifier);
-            }
-
-            if (!view)
-                return;
-
-            if (view.element.parentNode !== parentElement && view.element.parentNode && parentElement)
-                view.detach();
-
-            view.currentQuery = query;
-            view.performSearch(query, boundFinishedCallback);
-        }
-
-        processChunk();
-
-        chunkIntervalIdentifier = setInterval(processChunk, 25);
-        this._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this.showView || !this._searchResults || !this._searchResults.length)
-            return;
-
-        var showFirstResult = false;
-
-        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
-        if (this._currentSearchResultIndex === -1) {
-            this._currentSearchResultIndex = 0;
-            showFirstResult = true;
-        }
-
-        var currentView = this._searchResults[this._currentSearchResultIndex];
-
-        if (currentView.showingLastSearchResult()) {
-            if (++this._currentSearchResultIndex >= this._searchResults.length)
-                this._currentSearchResultIndex = 0;
-            currentView = this._searchResults[this._currentSearchResultIndex];
-            showFirstResult = true;
-        }
-
-        if (currentView !== this.visibleView) {
-            currentView = this.visibleView;
-            this._currentSearchResultIndex = 0;
-            showFirstResult = true;
-        }
-
-        if (showFirstResult)
-            currentView.jumpToFirstSearchResult();
-        else
-            currentView.jumpToNextSearchResult();
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this.showView || !this._searchResults || !this._searchResults.length)
-            return;
-
-        var showLastResult = false;
-
-        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
-        if (this._currentSearchResultIndex === -1) {
-            this._currentSearchResultIndex = 0;
-            showLastResult = true;
-        }
-
-        var currentView = this._searchResults[this._currentSearchResultIndex];
-
-        if (currentView.showingFirstSearchResult()) {
-            if (--this._currentSearchResultIndex < 0)
-                this._currentSearchResultIndex = (this._searchResults.length - 1);
-            currentView = this._searchResults[this._currentSearchResultIndex];
-            showLastResult = true;
-        }
-
-        if (currentView !== this.visibleView)
-            this.showView(currentView);
-
-        if (showLastResult)
-            currentView.jumpToLastSearchResult();
-        else
-            currentView.jumpToPreviousSearchResult();
-    },
-
-    createSidebar: function(parentElement, resizerParentElement)
-    {
-        if (this.hasSidebar)
-            return;
-
-        if (!parentElement)
-            parentElement = this.element;
-
-        if (!resizerParentElement)
-            resizerParentElement = parentElement;
-
-        this.hasSidebar = true;
-
-        this.sidebarElement = document.createElement("div");
-        this.sidebarElement.className = "sidebar";
-        parentElement.appendChild(this.sidebarElement);
-
-        this.sidebarResizeElement = document.createElement("div");
-        this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-        this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
-        resizerParentElement.appendChild(this.sidebarResizeElement);
-
-        this.sidebarTreeElement = document.createElement("ol");
-        this.sidebarTreeElement.className = "sidebar-tree";
-        this.sidebarElement.appendChild(this.sidebarTreeElement);
-
-        this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
-    },
-
-    _startSidebarDragging: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
-    },
-
-    _sidebarDragging: function(event)
-    {
-        this.updateSidebarWidth(event.pageX);
-
-        event.preventDefault();
-    },
-
-    _endSidebarDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    },
-
-    updateSidebarWidth: function(width)
-    {
-        if (!this.hasSidebar)
-            return;
-
-        if (this.sidebarElement.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        if (!("_currentSidebarWidth" in this))
-            this._currentSidebarWidth = this.sidebarElement.offsetWidth;
-
-        if (typeof width === "undefined")
-            width = this._currentSidebarWidth;
-
-        width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
-
-        this._currentSidebarWidth = width;
-        this.setSidebarWidth(width);
-
-        this.updateMainViewWidth(width);
-
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    setSidebarWidth: function(width)
-    {
-        this.sidebarElement.style.width = width + "px";
-        this.sidebarResizeElement.style.left = (width - 3) + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        // Should be implemented by ancestors.
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return false;
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        return false;
-    }
-}
-
-WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;
-
-/* TimelineGrid.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineGrid = function()
-{
-    this.element = document.createElement("div");
-
-    this._itemsGraphsElement = document.createElement("div");
-    this._itemsGraphsElement.id = "resources-graphs";
-    this.element.appendChild(this._itemsGraphsElement);
-
-    this._dividersElement = document.createElement("div");
-    this._dividersElement.id = "resources-dividers";
-    this.element.appendChild(this._dividersElement);
-
-    this._eventDividersElement = document.createElement("div");
-    this._eventDividersElement.id = "resources-event-dividers";
-    this.element.appendChild(this._eventDividersElement);
-
-    this._dividersLabelBarElement = document.createElement("div");
-    this._dividersLabelBarElement.id = "resources-dividers-label-bar";
-    this.element.appendChild(this._dividersLabelBarElement);
-}
-
-WebInspector.TimelineGrid.prototype = {
-    get itemsGraphsElement()
-    {
-        return this._itemsGraphsElement;
-    },
-
-    updateDividers: function(force, calculator, paddingLeft)
-    {
-        var dividerCount = Math.round(this._dividersElement.offsetWidth / 64);
-        var slice = calculator.boundarySpan / dividerCount;
-        if (!force && this._currentDividerSlice === slice)
-            return false;
-
-        if (!(typeof paddingLeft === "number"))
-            paddingLeft = 0;
-        this._currentDividerSlice = slice;
-
-        this._eventDividersElement.removeChildren();
-        // Reuse divider elements and labels.
-        var divider = this._dividersElement.firstChild;
-        var dividerLabelBar = this._dividersLabelBarElement.firstChild;
-
-        var clientWidth = this._dividersLabelBarElement.clientWidth - paddingLeft;
-        for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {
-            if (!divider) {
-                divider = document.createElement("div");
-                divider.className = "resources-divider";
-                this._dividersElement.appendChild(divider);
-
-                dividerLabelBar = document.createElement("div");
-                dividerLabelBar.className = "resources-divider";
-                var label = document.createElement("div");
-                label.className = "resources-divider-label";
-                dividerLabelBar._labelElement = label;
-                dividerLabelBar.appendChild(label);
-                this._dividersLabelBarElement.appendChild(dividerLabelBar);
-            }
-
-            if (i === dividerCount)
-                divider.addStyleClass("last");
-            else
-                divider.removeStyleClass("last");
-
-            var left = paddingLeft + clientWidth * (i / dividerCount);
-            var percentLeft = 100 * left / this._dividersLabelBarElement.clientWidth + "%";
-            divider.style.left = percentLeft;
-            dividerLabelBar.style.left = percentLeft;
-
-            if (!isNaN(slice))
-                dividerLabelBar._labelElement.textContent = calculator.formatValue(slice * i);
-
-            divider = divider.nextSibling;
-            dividerLabelBar = dividerLabelBar.nextSibling;
-        }
-
-        // Remove extras.
-        while (divider) {
-            var nextDivider = divider.nextSibling;
-            this._dividersElement.removeChild(divider);
-            divider = nextDivider;
-        }
-        while (dividerLabelBar) {
-            var nextDivider = dividerLabelBar.nextSibling;
-            this._dividersLabelBarElement.removeChild(dividerLabelBar);
-            dividerLabelBar = nextDivider;
-        }
-        return true;
-    },
-
-    addEventDivider: function(divider)
-    {
-        this._eventDividersElement.appendChild(divider);
-    },
-
-    setScrollAndDividerTop: function(scrollTop, dividersTop)
-    {
-        this._dividersElement.style.top = scrollTop + "px";
-        this._eventDividersElement.style.top = scrollTop + "px";
-        this._dividersLabelBarElement.style.top = dividersTop + "px";
-    }
-}
-
-/* AbstractTimelinePanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AbstractTimelinePanel = function()
-{
-    WebInspector.Panel.call(this);
-    this._items = [];
-    this._staleItems = [];
-}
-
-WebInspector.AbstractTimelinePanel.prototype = {
-    get categories()
-    {
-        // Should be implemented by the concrete subclasses.
-        return {};
-    },
-
-    populateSidebar: function()
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    createItemTreeElement: function(item)
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    createItemGraph: function(item)
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    get items()
-    {
-        return this._items;
-    },
-
-    createInterface: function()
-    {
-        this.containerElement = document.createElement("div");
-        this.containerElement.id = "resources-container";
-        this.containerElement.addEventListener("scroll", this._updateDividersLabelBarPosition.bind(this), false);
-        this.element.appendChild(this.containerElement);
-
-        this.createSidebar(this.containerElement, this.element);
-        this.sidebarElement.id = "resources-sidebar";
-        this.populateSidebar();
-
-        this._containerContentElement = document.createElement("div");
-        this._containerContentElement.id = "resources-container-content";
-        this.containerElement.appendChild(this._containerContentElement);
-
-        this.summaryBar = new WebInspector.SummaryBar(this.categories);
-        this.summaryBar.element.id = "resources-summary";
-        this._containerContentElement.appendChild(this.summaryBar.element);
-
-        this._timelineGrid = new WebInspector.TimelineGrid();
-        this._containerContentElement.appendChild(this._timelineGrid.element);
-        this.itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
-    },
-
-    createFilterPanel: function()
-    {
-        this.filterBarElement = document.createElement("div");
-        this.filterBarElement.id = "resources-filter";
-        this.filterBarElement.className = "scope-bar";
-        this.element.appendChild(this.filterBarElement);
-
-        function createFilterElement(category)
-        {
-            if (category === "all")
-                var label = WebInspector.UIString("All");
-            else if (this.categories[category])
-                var label = this.categories[category].title;
-
-            var categoryElement = document.createElement("li");
-            categoryElement.category = category;
-            categoryElement.addStyleClass(category);
-            categoryElement.appendChild(document.createTextNode(label));
-            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
-            this.filterBarElement.appendChild(categoryElement);
-
-            return categoryElement;
-        }
-
-        this.filterAllElement = createFilterElement.call(this, "all");
-
-        // Add a divider
-        var dividerElement = document.createElement("div");
-        dividerElement.addStyleClass("divider");
-        this.filterBarElement.appendChild(dividerElement);
-
-        for (var category in this.categories)
-            createFilterElement.call(this, category);
-    },
-
-    showCategory: function(category)
-    {
-        var filterClass = "filter-" + category.toLowerCase();
-        this.itemsGraphsElement.addStyleClass(filterClass);
-        this.itemsTreeElement.childrenListElement.addStyleClass(filterClass);
-    },
-
-    hideCategory: function(category)
-    {
-        var filterClass = "filter-" + category.toLowerCase();
-        this.itemsGraphsElement.removeStyleClass(filterClass);
-        this.itemsTreeElement.childrenListElement.removeStyleClass(filterClass);
-    },
-
-    filter: function(target, selectMultiple)
-    {
-        function unselectAll()
-        {
-            for (var i = 0; i < this.filterBarElement.childNodes.length; ++i) {
-                var child = this.filterBarElement.childNodes[i];
-                if (!child.category)
-                    continue;
-
-                child.removeStyleClass("selected");
-                this.hideCategory(child.category);
-            }
-        }
-
-        if (target === this.filterAllElement) {
-            if (target.hasStyleClass("selected")) {
-                // We can't unselect All, so we break early here
-                return;
-            }
-
-            // If All wasn't selected, and now is, unselect everything else.
-            unselectAll.call(this);
-        } else {
-            // Something other than All is being selected, so we want to unselect All.
-            if (this.filterAllElement.hasStyleClass("selected")) {
-                this.filterAllElement.removeStyleClass("selected");
-                this.hideCategory("all");
-            }
-        }
-
-        if (!selectMultiple) {
-            // If multiple selection is off, we want to unselect everything else
-            // and just select ourselves.
-            unselectAll.call(this);
-
-            target.addStyleClass("selected");
-            this.showCategory(target.category);
-            return;
-        }
-
-        if (target.hasStyleClass("selected")) {
-            // If selectMultiple is turned on, and we were selected, we just
-            // want to unselect ourselves.
-            target.removeStyleClass("selected");
-            this.hideCategory(target.category);
-        } else {
-            // If selectMultiple is turned on, and we weren't selected, we just
-            // want to select ourselves.
-            target.addStyleClass("selected");
-            this.showCategory(target.category);
-        }
-    },
-
-    _updateFilter: function(e)
-    {
-        var isMac = WebInspector.isMac();
-        var selectMultiple = false;
-        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-
-        this.filter(e.target, selectMultiple);
-
-        // When we are updating our filtering, scroll to the top so we don't end up
-        // in blank graph under all the resources.
-        this.containerElement.scrollTop = 0;
-    },
-
-    updateGraphDividersIfNeeded: function(force)
-    {
-        if (!this.visible) {
-            this.needsRefresh = true;
-            return false;
-        }
-        return this._timelineGrid.updateDividers(force, this.calculator);
-    },
-
-    _updateDividersLabelBarPosition: function()
-    {
-        var scrollTop = this.containerElement.scrollTop;
-        var dividersTop = (scrollTop < this.summaryBar.element.offsetHeight ? this.summaryBar.element.offsetHeight : scrollTop);
-        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
-    },
-
-    get needsRefresh()
-    {
-        return this._needsRefresh;
-    },
-
-    set needsRefresh(x)
-    {
-        if (this._needsRefresh === x)
-            return;
-
-        this._needsRefresh = x;
-
-        if (x) {
-            if (this.visible && !("_refreshTimeout" in this))
-                this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
-        } else {
-            if ("_refreshTimeout" in this) {
-                clearTimeout(this._refreshTimeout);
-                delete this._refreshTimeout;
-            }
-        }
-    },
-
-    refreshIfNeeded: function()
-    {
-        if (this.needsRefresh)
-            this.refresh();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this._updateDividersLabelBarPosition();
-        this.refreshIfNeeded();
-    },
-
-    resize: function()
-    {
-        this.updateGraphDividersIfNeeded();
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._containerContentElement.style.left = width + "px";
-        this.updateGraphDividersIfNeeded();
-    },
-
-    invalidateAllItems: function()
-    {
-        this._staleItems = this._items.slice();
-    },
-
-    refresh: function()
-    {
-        this.needsRefresh = false;
-
-        var staleItemsLength = this._staleItems.length;
-
-        var boundariesChanged = false;
-
-        for (var i = 0; i < staleItemsLength; ++i) {
-            var item = this._staleItems[i];
-            if (!item._itemsTreeElement) {
-                // Create the timeline tree element and graph.
-                item._itemsTreeElement = this.createItemTreeElement(item);
-                item._itemsTreeElement._itemGraph = this.createItemGraph(item);
-
-                this.itemsTreeElement.appendChild(item._itemsTreeElement);
-                this.itemsGraphsElement.appendChild(item._itemsTreeElement._itemGraph.graphElement);
-            }
-
-            if (item._itemsTreeElement.refresh)
-                item._itemsTreeElement.refresh();
-
-            if (this.calculator.updateBoundaries(item))
-                boundariesChanged = true;
-        }
-
-        if (boundariesChanged) {
-            // The boundaries changed, so all item graphs are stale.
-            this._staleItems = this._items.slice();
-            staleItemsLength = this._staleItems.length;
-        }
-
-        for (var i = 0; i < staleItemsLength; ++i)
-            this._staleItems[i]._itemsTreeElement._itemGraph.refresh(this.calculator);
-
-        this._staleItems = [];
-
-        this.updateGraphDividersIfNeeded();
-    },
-
-    reset: function()
-    {
-        this.containerElement.scrollTop = 0;
-
-        if (this._calculator)
-            this._calculator.reset();
-
-        if (this._items) {
-            var itemsLength = this._items.length;
-            for (var i = 0; i < itemsLength; ++i) {
-                var item = this._items[i];
-                delete item._itemsTreeElement;
-            }
-        }
-
-        this._items = [];
-        this._staleItems = [];
-
-        this.itemsTreeElement.removeChildren();
-        this.itemsGraphsElement.removeChildren();
-
-        this.updateGraphDividersIfNeeded(true);
-    },
-
-    get calculator()
-    {
-        return this._calculator;
-    },
-
-    set calculator(x)
-    {
-        if (!x || this._calculator === x)
-            return;
-
-        this._calculator = x;
-        this._calculator.reset();
-
-        this._staleItems = this._items.slice();
-        this.refresh();
-    },
-
-    addItem: function(item)
-    {
-        this._items.push(item);
-        this.refreshItem(item);
-    },
-
-    removeItem: function(item)
-    {
-        this._items.remove(item, true);
-
-        if (item._itemsTreeElement) {
-            this.itemsTreeElement.removeChild(item._itemsTreeElement);
-            this.itemsGraphsElement.removeChild(item._itemsTreeElement._itemGraph.graphElement);
-        }
-
-        delete item._itemsTreeElement;
-        this.adjustScrollPosition();
-    },
-
-    refreshItem: function(item)
-    {
-        this._staleItems.push(item);
-        this.needsRefresh = true;
-    },
-
-    revealAndSelectItem: function(item)
-    {
-        if (item._itemsTreeElement) {
-            item._itemsTreeElement.reveal();
-            item._itemsTreeElement.select(true);
-        }
-    },
-
-    sortItems: function(sortingFunction)
-    {
-        var sortedElements = [].concat(this.itemsTreeElement.children);
-        sortedElements.sort(sortingFunction);
-
-        var sortedElementsLength = sortedElements.length;
-        for (var i = 0; i < sortedElementsLength; ++i) {
-            var treeElement = sortedElements[i];
-            if (treeElement === this.itemsTreeElement.children[i])
-                continue;
-
-            var wasSelected = treeElement.selected;
-            this.itemsTreeElement.removeChild(treeElement);
-            this.itemsTreeElement.insertChild(treeElement, i);
-            if (wasSelected)
-                treeElement.select(true);
-
-            var graphElement = treeElement._itemGraph.graphElement;
-            this.itemsGraphsElement.insertBefore(graphElement, this.itemsGraphsElement.children[i]);
-        }
-    },
-
-    adjustScrollPosition: function()
-    {
-        // Prevent the container from being scrolled off the end.
-        if ((this.containerElement.scrollTop + this.containerElement.offsetHeight) > this.sidebarElement.offsetHeight)
-            this.containerElement.scrollTop = (this.sidebarElement.offsetHeight - this.containerElement.offsetHeight);
-    },
-
-    addEventDivider: function(divider)
-    {
-        this._timelineGrid.addEventDivider(divider);
-    }
-}
-
-WebInspector.AbstractTimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.AbstractTimelineCalculator = function()
-{
-}
-
-WebInspector.AbstractTimelineCalculator.prototype = {
-    computeSummaryValues: function(items)
-    {
-        var total = 0;
-        var categoryValues = {};
-
-        var itemsLength = items.length;
-        for (var i = 0; i < itemsLength; ++i) {
-            var item = items[i];
-            var value = this._value(item);
-            if (typeof value === "undefined")
-                continue;
-            if (!(item.category.name in categoryValues))
-                categoryValues[item.category.name] = 0;
-            categoryValues[item.category.name] += value;
-            total += value;
-        }
-
-        return {categoryValues: categoryValues, total: total};
-    },
-
-    computeBarGraphPercentages: function(item)
-    {
-        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
-    },
-
-    computeBarGraphLabels: function(item)
-    {
-        const label = this.formatValue(this._value(item));
-        return {left: label, right: label, tooltip: label};
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    updateBoundaries: function(item)
-    {
-        this.minimumBoundary = 0;
-
-        var value = this._value(item);
-        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
-            this.maximumBoundary = value;
-            return true;
-        }
-        return false;
-    },
-
-    reset: function()
-    {
-        delete this.minimumBoundary;
-        delete this.maximumBoundary;
-    },
-
-    _value: function(item)
-    {
-        return 0;
-    },
-
-    formatValue: function(value)
-    {
-        return value.toString();
-    }
-}
-
-WebInspector.AbstractTimelineCategory = function(name, title, color)
-{
-    this.name = name;
-    this.title = title;
-    this.color = color;
-}
-
-WebInspector.AbstractTimelineCategory.prototype = {
-    toString: function()
-    {
-        return this.title;
-    }
-}
-
-/* Resource.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Resource = function(identifier, url)
-{
-    this.identifier = identifier;
-    this._url = url;
-    this._startTime = -1;
-    this._endTime = -1;
-    this._requestMethod = "";
-    this._requestFormData = "";
-    this._category = WebInspector.resourceCategories.other;
-}
-
-WebInspector.Resource.StatusText = {
-    100: "Continue",
-    101: "Switching Protocols",
-    102: "Processing (WebDav)",
-    200: "OK",
-    201: "Created",
-    202: "Accepted",
-    203: "Non-Authoritative Information",
-    204: "No Content",
-    205: "Reset Content",
-    206: "Partial Content",
-    207: "Multi-Status (WebDav)",
-    300: "Multiple Choices",
-    301: "Moved Permanently",
-    302: "Found",
-    303: "See Other",
-    304: "Not Modified",
-    305: "Use Proxy",
-    306: "Switch Proxy",
-    307: "Temporary",
-    400: "Bad Request",
-    401: "Unauthorized",
-    402: "Payment Required",
-    403: "Forbidden",
-    404: "Not Found",
-    405: "Method Not Allowed",
-    406: "Not Acceptable",
-    407: "Proxy Authentication Required",
-    408: "Request Timeout",
-    409: "Conflict",
-    410: "Gone",
-    411: "Length Required",
-    412: "Precondition Failed",
-    413: "Request Entity Too Large",
-    414: "Request-URI Too Long",
-    415: "Unsupported Media Type",
-    416: "Requested Range Not Satisfiable",
-    417: "Expectation Failed",
-    418: "I'm a teapot",
-    422: "Unprocessable Entity (WebDav)",
-    423: "Locked (WebDav)",
-    424: "Failed Dependency (WebDav)",
-    425: "Unordered Collection",
-    426: "Upgrade Required",
-    449: "Retry With",
-    500: "Internal Server Error",
-    501: "Not Implemented",
-    502: "Bad Gateway",
-    503: "Service Unavailable",
-    504: "Gateway Timeout",
-    505: "HTTP Version Not Supported",
-    506: "Variant Also Negotiates",
-    507: "Insufficient Storage (WebDav)",
-    509: "Bandwidth Limit Exceeded",
-    510: "Not Extended"
-};
-
-// Keep these in sync with WebCore::InspectorResource::Type
-WebInspector.Resource.Type = {
-    Document:   0,
-    Stylesheet: 1,
-    Image:      2,
-    Font:       3,
-    Script:     4,
-    XHR:        5,
-    Media:      6,
-    Other:      7,
-
-    isTextType: function(type)
-    {
-        return (type === this.Document) || (type === this.Stylesheet) || (type === this.Script) || (type === this.XHR);
-    },
-
-    toString: function(type)
-    {
-        switch (type) {
-            case this.Document:
-                return WebInspector.UIString("document");
-            case this.Stylesheet:
-                return WebInspector.UIString("stylesheet");
-            case this.Image:
-                return WebInspector.UIString("image");
-            case this.Font:
-                return WebInspector.UIString("font");
-            case this.Script:
-                return WebInspector.UIString("script");
-            case this.XHR:
-                return WebInspector.UIString("XHR");
-            case this.Other:
-            default:
-                return WebInspector.UIString("other");
-        }
-    }
-}
-
-WebInspector.Resource.prototype = {
-    get url()
-    {
-        return this._url;
-    },
-
-    set url(x)
-    {
-        if (this._url === x)
-            return;
-
-        var oldURL = this._url;
-        this._url = x;
-
-        // FIXME: We should make the WebInspector object listen for the "url changed" event.
-        // Then resourceURLChanged can be removed.
-        WebInspector.resourceURLChanged(this, oldURL);
-
-        this.dispatchEventToListeners("url changed");
-    },
-
-    get documentURL()
-    {
-        return this._documentURL;
-    },
-
-    set documentURL(x)
-    {
-        if (this._documentURL === x)
-            return;
-        this._documentURL = x;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    set domain(x)
-    {
-        if (this._domain === x)
-            return;
-        this._domain = x;
-    },
-
-    get lastPathComponent()
-    {
-        return this._lastPathComponent;
-    },
-
-    set lastPathComponent(x)
-    {
-        if (this._lastPathComponent === x)
-            return;
-        this._lastPathComponent = x;
-        this._lastPathComponentLowerCase = x ? x.toLowerCase() : null;
-    },
-
-    get displayName()
-    {
-        var title = this.lastPathComponent;
-        if (!title)
-            title = this.displayDomain;
-        if (!title && this.url)
-            title = this.url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
-        if (title === "/")
-            title = this.url;
-        return title;
-    },
-
-    get displayDomain()
-    {
-        // WebInspector.Database calls this, so don't access more than this.domain.
-        if (this.domain && (!WebInspector.mainResource || (WebInspector.mainResource && this.domain !== WebInspector.mainResource.domain)))
-            return this.domain;
-        return "";
-    },
-
-    get startTime()
-    {
-        return this._startTime || -1;
-    },
-
-    set startTime(x)
-    {
-        if (this._startTime === x)
-            return;
-
-        this._startTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get responseReceivedTime()
-    {
-        return this._responseReceivedTime || -1;
-    },
-
-    set responseReceivedTime(x)
-    {
-        if (this._responseReceivedTime === x)
-            return;
-
-        this._responseReceivedTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get endTime()
-    {
-        return this._endTime || -1;
-    },
-
-    set endTime(x)
-    {
-        if (this._endTime === x)
-            return;
-
-        this._endTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get duration()
-    {
-        if (this._endTime === -1 || this._startTime === -1)
-            return -1;
-        return this._endTime - this._startTime;
-    },
-
-    get latency()
-    {
-        if (this._responseReceivedTime === -1 || this._startTime === -1)
-            return -1;
-        return this._responseReceivedTime - this._startTime;
-    },
-
-    get contentLength()
-    {
-        return this._contentLength || 0;
-    },
-
-    set contentLength(x)
-    {
-        if (this._contentLength === x)
-            return;
-
-        this._contentLength = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get expectedContentLength()
-    {
-        return this._expectedContentLength || 0;
-    },
-
-    set expectedContentLength(x)
-    {
-        if (this._expectedContentLength === x)
-            return;
-        this._expectedContentLength = x;
-    },
-
-    get finished()
-    {
-        return this._finished;
-    },
-
-    set finished(x)
-    {
-        if (this._finished === x)
-            return;
-
-        this._finished = x;
-
-        if (x) {
-            this._checkWarnings();
-            this.dispatchEventToListeners("finished");
-        }
-    },
-
-    get failed()
-    {
-        return this._failed;
-    },
-
-    set failed(x)
-    {
-        this._failed = x;
-    },
-
-    get category()
-    {
-        return this._category;
-    },
-
-    set category(x)
-    {
-        if (this._category === x)
-            return;
-
-        var oldCategory = this._category;
-        if (oldCategory)
-            oldCategory.removeResource(this);
-
-        this._category = x;
-
-        if (this._category)
-            this._category.addResource(this);
-
-        if (WebInspector.panels.resources) {
-            WebInspector.panels.resources.refreshResource(this);
-            WebInspector.panels.resources.recreateViewForResourceIfNeeded(this);
-        }
-    },
-
-    get mimeType()
-    {
-        return this._mimeType;
-    },
-
-    set mimeType(x)
-    {
-        if (this._mimeType === x)
-            return;
-
-        this._mimeType = x;
-    },
-
-    get type()
-    {
-        return this._type;
-    },
-
-    set type(x)
-    {
-        if (this._type === x)
-            return;
-
-        this._type = x;
-
-        switch (x) {
-            case WebInspector.Resource.Type.Document:
-                this.category = WebInspector.resourceCategories.documents;
-                break;
-            case WebInspector.Resource.Type.Stylesheet:
-                this.category = WebInspector.resourceCategories.stylesheets;
-                break;
-            case WebInspector.Resource.Type.Script:
-                this.category = WebInspector.resourceCategories.scripts;
-                break;
-            case WebInspector.Resource.Type.Image:
-                this.category = WebInspector.resourceCategories.images;
-                break;
-            case WebInspector.Resource.Type.Font:
-                this.category = WebInspector.resourceCategories.fonts;
-                break;
-            case WebInspector.Resource.Type.XHR:
-                this.category = WebInspector.resourceCategories.xhr;
-                break;
-            case WebInspector.Resource.Type.Other:
-            default:
-                this.category = WebInspector.resourceCategories.other;
-                break;
-        }
-    },
-
-    get requestHeaders()
-    {
-        if (this._requestHeaders === undefined)
-            this._requestHeaders = {};
-        return this._requestHeaders;
-    },
-
-    set requestHeaders(x)
-    {
-        if (this._requestHeaders === x)
-            return;
-
-        this._requestHeaders = x;
-        delete this._sortedRequestHeaders;
-
-        this.dispatchEventToListeners("requestHeaders changed");
-    },
-
-    get sortedRequestHeaders()
-    {
-        if (this._sortedRequestHeaders !== undefined)
-            return this._sortedRequestHeaders;
-
-        this._sortedRequestHeaders = [];
-        for (var key in this.requestHeaders)
-            this._sortedRequestHeaders.push({header: key, value: this.requestHeaders[key]});
-        this._sortedRequestHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
-
-        return this._sortedRequestHeaders;
-    },
-
-    get responseHeaders()
-    {
-        if (this._responseHeaders === undefined)
-            this._responseHeaders = {};
-        return this._responseHeaders;
-    },
-
-    set responseHeaders(x)
-    {
-        if (this._responseHeaders === x)
-            return;
-
-        this._responseHeaders = x;
-        delete this._sortedResponseHeaders;
-
-        this.dispatchEventToListeners("responseHeaders changed");
-    },
-
-    get sortedResponseHeaders()
-    {
-        if (this._sortedResponseHeaders !== undefined)
-            return this._sortedResponseHeaders;
-
-        this._sortedResponseHeaders = [];
-        for (var key in this.responseHeaders)
-            this._sortedResponseHeaders.push({header: key, value: this.responseHeaders[key]});
-        this._sortedResponseHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
-
-        return this._sortedResponseHeaders;
-    },
-
-    get scripts()
-    {
-        if (!("_scripts" in this))
-            this._scripts = [];
-        return this._scripts;
-    },
-
-    addScript: function(script)
-    {
-        if (!script)
-            return;
-        this.scripts.unshift(script);
-        script.resource = this;
-    },
-
-    removeAllScripts: function()
-    {
-        if (!this._scripts)
-            return;
-
-        for (var i = 0; i < this._scripts.length; ++i) {
-            if (this._scripts[i].resource === this)
-                delete this._scripts[i].resource;
-        }
-
-        delete this._scripts;
-    },
-
-    removeScript: function(script)
-    {
-        if (!script)
-            return;
-
-        if (script.resource === this)
-            delete script.resource;
-
-        if (!this._scripts)
-            return;
-
-        this._scripts.remove(script);
-    },
-
-    get errors()
-    {
-        return this._errors || 0;
-    },
-
-    set errors(x)
-    {
-        this._errors = x;
-    },
-
-    get warnings()
-    {
-        return this._warnings || 0;
-    },
-
-    set warnings(x)
-    {
-        this._warnings = x;
-    },
-
-    _mimeTypeIsConsistentWithType: function()
-    {
-        if (typeof this.type === "undefined"
-         || this.type === WebInspector.Resource.Type.Other
-         || this.type === WebInspector.Resource.Type.XHR)
-            return true;
-
-        if (this.mimeType in WebInspector.MIMETypes)
-            return this.type in WebInspector.MIMETypes[this.mimeType];
-
-        return false;
-    },
-
-    _checkWarnings: function()
-    {
-        for (var warning in WebInspector.Warnings)
-            this._checkWarning(WebInspector.Warnings[warning]);
-    },
-
-    _checkWarning: function(warning)
-    {
-        var msg;
-        switch (warning.id) {
-            case WebInspector.Warnings.IncorrectMIMEType.id:
-                if (!this._mimeTypeIsConsistentWithType())
-                    msg = new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,
-                        WebInspector.ConsoleMessage.MessageType.Log, 
-                        WebInspector.ConsoleMessage.MessageLevel.Warning, -1, this.url, null, 1,
-                        String.sprintf(WebInspector.Warnings.IncorrectMIMEType.message,
-                        WebInspector.Resource.Type.toString(this.type), this.mimeType));
-                break;
-        }
-
-        if (msg)
-            WebInspector.console.addMessage(msg);
-    }
-}
-
-WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.Resource.CompareByStartTime = function(a, b)
-{
-    if (a.startTime < b.startTime)
-        return -1;
-    if (a.startTime > b.startTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByResponseReceivedTime = function(a, b)
-{
-    if (a.responseReceivedTime === -1 && b.responseReceivedTime !== -1)
-        return 1;
-    if (a.responseReceivedTime !== -1 && b.responseReceivedTime === -1)
-        return -1;
-    if (a.responseReceivedTime < b.responseReceivedTime)
-        return -1;
-    if (a.responseReceivedTime > b.responseReceivedTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByEndTime = function(a, b)
-{
-    if (a.endTime === -1 && b.endTime !== -1)
-        return 1;
-    if (a.endTime !== -1 && b.endTime === -1)
-        return -1;
-    if (a.endTime < b.endTime)
-        return -1;
-    if (a.endTime > b.endTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByDuration = function(a, b)
-{
-    if (a.duration < b.duration)
-        return -1;
-    if (a.duration > b.duration)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByLatency = function(a, b)
-{
-    if (a.latency < b.latency)
-        return -1;
-    if (a.latency > b.latency)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareBySize = function(a, b)
-{
-    if (a.contentLength < b.contentLength)
-        return -1;
-    if (a.contentLength > b.contentLength)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.StatusTextForCode = function(code)
-{
-    return code ? code + " " + WebInspector.Resource.StatusText[code] : "";
-}
-
-/* ResourceCategory.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourceCategory = function(name, title, color)
-{
-    WebInspector.AbstractTimelineCategory.call(this, name, title, color);
-    this.resources = [];
-}
-
-WebInspector.ResourceCategory.prototype = {
-
-    addResource: function(resource)
-    {
-        var a = resource;
-        var resourcesLength = this.resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var b = this.resources[i];
-            if (a._lastPathComponentLowerCase && b._lastPathComponentLowerCase)
-                if (a._lastPathComponentLowerCase < b._lastPathComponentLowerCase)
-                    break;
-            else if (a.name && b.name)
-                if (a.name < b.name)
-                    break;
-        }
-
-        this.resources.splice(i, 0, resource);
-    },
-
-    removeResource: function(resource)
-    {
-        this.resources.remove(resource, true);
-    },
-
-    removeAllResources: function(resource)
-    {
-        this.resources = [];
-    }
-}
-
-WebInspector.ResourceCategory.prototype.__proto__ = WebInspector.AbstractTimelineCategory.prototype;
-
-/* Database.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Database = function(id, domain, name, version)
-{
-    this._id = id;
-    this._domain = domain;
-    this._name = name;
-    this._version = version;
-}
-
-WebInspector.Database.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get name()
-    {
-        return this._name;
-    },
-
-    set name(x)
-    {
-        this._name = x;
-    },
-
-    get version()
-    {
-        return this._version;
-    },
-
-    set version(x)
-    {
-        this._version = x;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    set domain(x)
-    {
-        this._domain = x;
-    },
-
-    get displayDomain()
-    {
-        return WebInspector.Resource.prototype.__lookupGetter__("displayDomain").call(this);
-    },
-
-    getTableNames: function(callback)
-    {
-        function sortingCallback(names)
-        {
-            callback(names.sort());
-        }
-        var callId = WebInspector.Callback.wrap(sortingCallback);
-        InspectorBackend.getDatabaseTableNames(callId, this._id);
-    },
-    
-    executeSql: function(query, onSuccess, onError)
-    {
-        function callback(result)
-        {
-            if (!(result instanceof Array)) {
-                onError(result);
-                return;
-            }
-            onSuccess(result);
-        }
-        InjectedScriptAccess.executeSql(this._id, query, callback);
-    }
-}
-
-WebInspector.didGetDatabaseTableNames = WebInspector.Callback.processCallback;
-
-/* DOMStorage.js */
-
-/*
- * Copyright (C) 2008 Nokia Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMStorage = function(id, domain, isLocalStorage)
-{
-    this._id = id;
-    this._domain = domain;
-    this._isLocalStorage = isLocalStorage;
-}
-
-WebInspector.DOMStorage.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get domStorage()
-    {
-        return this._domStorage;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    get isLocalStorage()
-    {
-        return this._isLocalStorage;
-    },
-
-    getEntries: function(callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.getDOMStorageEntries(callId, this._id);
-    },
-    
-    setItem: function(key, value, callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.setDOMStorageItem(callId, this._id, key, value);
-    },
-    
-    removeItem: function(key, callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.removeDOMStorageItem(callId, this._id, key);
-    }
-}
-
-WebInspector.didGetDOMStorageEntries = WebInspector.Callback.processCallback;
-WebInspector.didSetDOMStorageItem = WebInspector.Callback.processCallback;
-WebInspector.didRemoveDOMStorageItem = WebInspector.Callback.processCallback;
-
-/* DOMStorageItemsView.js */
-
-/*
- * Copyright (C) 2008 Nokia Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMStorageItemsView = function(domStorage)
-{
-    WebInspector.View.call(this);
-
-    this.domStorage = domStorage;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
-    this.deleteButton.visible = false;
-    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-}
-
-WebInspector.DOMStorageItemsView.prototype = {
-    get statusBarItems()
-    {
-        return [this.refreshButton.element, this.deleteButton.element];
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this.deleteButton.visible = false;
-    },
-
-    update: function()
-    {
-        this.element.removeChildren();
-        var callback = this._showDOMStorageEntries.bind(this);
-        this.domStorage.getEntries(callback);
-    },
-
-    _showDOMStorageEntries: function(entries)
-    {
-        this._dataGrid = this._dataGridForDOMStorageEntries(entries);
-        this.element.appendChild(this._dataGrid.element);
-        this._dataGrid.updateWidths();
-        this.deleteButton.visible = true;
-    },
-
-    resize: function()
-    {
-        if (this._dataGrid)
-            this._dataGrid.updateWidths();
-    },
-
-    _dataGridForDOMStorageEntries: function(entries)
-    {
-        var columns = {};
-        columns[0] = {};
-        columns[1] = {};
-        columns[0].title = WebInspector.UIString("Key");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-
-        var nodes = [];
-
-        var keys = [];
-        var length = entries.length;
-        for (var i = 0; i < entries.length; i++) {
-            var data = {};
-
-            var key = entries[i][0];
-            data[0] = key;
-            if (key.length > columns[0].width)
-                columns[0].width = key.length;
-
-            var value = entries[i][1];
-            data[1] = value;
-            if (value.length > columns[1].width)
-                columns[1].width = value.length;
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = true;
-            nodes.push(node);
-            keys.push(key);
-        }
-
-        var totalColumnWidths = columns[0].width + columns[1].width;
-        var width = Math.round((columns[0].width * 100) / totalColumnWidths);
-        const minimumPrecent = 10;
-        if (width < minimumPrecent)
-            width = minimumPrecent;
-        if (width > 100 - minimumPrecent)
-            width = 100 - minimumPrecent;
-        columns[0].width = width;
-        columns[1].width = 100 - width;
-        columns[0].width += "%";
-        columns[1].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        dataGrid.addCreationNode(false);
-        if (length > 0)
-            nodes[0].selected = true;
-        return dataGrid;
-    },
-
-    _deleteButtonClicked: function(event)
-    {
-        if (!this._dataGrid || !this._dataGrid.selectedNode)
-            return;
-
-        this._deleteCallback(this._dataGrid.selectedNode);
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    },
-    
-    _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
-    {
-        var domStorage = this.domStorage;
-        if (columnIdentifier === 0) {
-            if (oldText)
-                domStorage.removeItem(oldText);
-
-            domStorage.setItem(newText, editingNode.data[1]);
-        } else {
-            domStorage.setItem(editingNode.data[0], newText);
-        }
-        
-        this.update();
-    },
-    
-    _deleteCallback: function(node)
-    {
-        if (!node || node.isCreationNode)
-            return;
-
-        if (this.domStorage)
-            this.domStorage.removeItem(node.data[0]);
-            
-        this.update();
-    }
-}
-
-WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* DataGrid.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *        notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *        notice, this list of conditions and the following disclaimer in the
- *        documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.         IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DataGrid = function(columns, editCallback, deleteCallback)
-{
-    this.element = document.createElement("div");
-    this.element.className = "data-grid";
-    this.element.tabIndex = 0;
-    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
-
-    this._headerTable = document.createElement("table");
-    this._headerTable.className = "header";
-
-    this._dataTable = document.createElement("table");
-    this._dataTable.className = "data";
-
-    this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
-    this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
-    
-    this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
-    
-    // FIXME: Add a createCallback which is different from editCallback and has different
-    // behavior when creating a new node.
-    if (editCallback) {
-        this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
-        this._editCallback = editCallback;
-    }
-    if (deleteCallback)
-        this._deleteCallback = deleteCallback;
-    
-    this.aligned = {};
-
-    var scrollContainer = document.createElement("div");
-    scrollContainer.className = "data-container";
-    scrollContainer.appendChild(this._dataTable);
-
-    this.element.appendChild(this._headerTable);
-    this.element.appendChild(scrollContainer);
-
-    var headerRow = document.createElement("tr");
-    var columnGroup = document.createElement("colgroup");
-    var columnCount = 0;
-
-    for (var columnIdentifier in columns) {
-        var column = columns[columnIdentifier];
-        if (column.disclosure)
-            this.disclosureColumnIdentifier = columnIdentifier;
-
-        var col = document.createElement("col");
-        if (column.width)
-            col.style.width = column.width;
-        columnGroup.appendChild(col);
-
-        var cell = document.createElement("th");
-        cell.className = columnIdentifier + "-column";
-        cell.columnIdentifier = columnIdentifier;
-
-        var div = document.createElement("div");
-        div.textContent = column.title;
-        cell.appendChild(div);
-
-        if (column.sort) {
-            cell.addStyleClass("sort-" + column.sort);
-            this._sortColumnCell = cell;
-        }
-
-        if (column.sortable) {
-            cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
-            cell.addStyleClass("sortable");
-        }
-
-        if (column.aligned) {
-            cell.addStyleClass(column.aligned);
-            this.aligned[columnIdentifier] = column.aligned;
-        }
-
-        headerRow.appendChild(cell);
-
-        ++columnCount;
-    }
-
-    columnGroup.span = columnCount;
-
-    var cell = document.createElement("th");
-    cell.className = "corner";
-    headerRow.appendChild(cell);
-
-    this._headerTableColumnGroup = columnGroup;
-    this._headerTable.appendChild(this._headerTableColumnGroup);
-    this.headerTableBody.appendChild(headerRow);
-
-    var fillerRow = document.createElement("tr");
-    fillerRow.className = "filler";
-
-    for (var i = 0; i < columnCount; ++i) {
-        var cell = document.createElement("td");
-        fillerRow.appendChild(cell);
-    }
-    
-    this._dataTableColumnGroup = columnGroup.cloneNode(true);
-    this._dataTable.appendChild(this._dataTableColumnGroup);
-    this.dataTableBody.appendChild(fillerRow);
-
-    this.columns = columns || {};
-    this.children = [];
-    this.selectedNode = null;
-    this.expandNodesWhenArrowing = false;
-    this.root = true;
-    this.hasChildren = false;
-    this.expanded = true;
-    this.revealed = true;
-    this.selected = false;
-    this.dataGrid = this;
-    this.indentWidth = 15;
-    this.resizers = [];
-    this.columnWidthsInitialized = false;
-}
-
-WebInspector.DataGrid.prototype = {
-    _ondblclick: function(event)
-    {
-        if (this._editing || this._editingNode)
-            return;
-
-        this._startEditing(event.target);
-    },
-
-    _startEditingColumnOfDataGridNode: function(node, column)
-    {
-        this._editing = true;
-        this._editingNode = node;
-        this._editingNode.select();
-
-        var element = this._editingNode._element.children[column];
-        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    _startEditing: function(target)
-    {
-        var element = target.enclosingNodeOrSelfWithNodeName("td");
-        if (!element)
-            return;
-
-        this._editingNode = this.dataGridNodeFromNode(target);
-        if (!this._editingNode) {
-            if (!this.creationNode)
-                return;
-            this._editingNode = this.creationNode;
-        }
-
-        // Force editing the 1st column when editing the creation node
-        if (this._editingNode.isCreationNode)
-            return this._startEditingColumnOfDataGridNode(this._editingNode, 0);
-
-        this._editing = true;
-        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    _editingCommitted: function(element, newText, oldText, context, moveDirection)
-    {
-        // FIXME: We need more column identifiers here throughout this function.
-        // Not needed yet since only editable DataGrid is DOM Storage, which is Key - Value.
-        
-        // FIXME: Better way to do this than regular expressions?
-        var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1]);
-
-        var textBeforeEditing = this._editingNode.data[columnIdentifier];
-        var currentEditingNode = this._editingNode;
-
-        function moveToNextIfNeeded(wasChange) {
-            if (!moveDirection)
-                return;
-
-            if (moveDirection === "forward") {
-                if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)
-                    return;
-
-                if (columnIdentifier === 0)
-                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);
-
-                var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
-                if (nextDataGridNode)
-                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);
-                if (currentEditingNode.isCreationNode && wasChange) {
-                    addCreationNode(false);
-                    return this._startEditingColumnOfDataGridNode(this.creationNode, 0);
-                }
-                return;
-            }
-
-            if (moveDirection === "backward") {
-                if (columnIdentifier === 1)
-                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);
-                    var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);
-
-                if (nextDataGridNode)
-                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);
-                return;
-            }
-        }
-
-        if (textBeforeEditing == newText) {
-            this._editingCancelled(element);
-            moveToNextIfNeeded.call(this, false);
-            return;
-        }
-
-        // Update the text in the datagrid that we typed
-        this._editingNode.data[columnIdentifier] = newText;
-        
-        // Make the callback - expects an editing node (table row), the column number that is being edited,
-        // the text that used to be there, and the new text.
-        this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
-
-        if (this._editingNode.isCreationNode)
-            this.addCreationNode(false);
-
-        this._editingCancelled(element);
-        moveToNextIfNeeded.call(this, true);
-    },
-
-    _editingCancelled: function(element, context)
-    {
-        delete this._editing;
-        this._editingNode = null;
-    },
-    
-    get sortColumnIdentifier()
-    {
-        if (!this._sortColumnCell)
-            return null;
-        return this._sortColumnCell.columnIdentifier;
-    },
-
-    get sortOrder()
-    {
-        if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))
-            return "ascending";
-        if (this._sortColumnCell.hasStyleClass("sort-descending"))
-            return "descending";
-        return null;
-    },
-
-    get headerTableBody()
-    {
-        if ("_headerTableBody" in this)
-            return this._headerTableBody;
-
-        this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
-        if (!this._headerTableBody) {
-            this._headerTableBody = this.element.ownerDocument.createElement("tbody");
-            this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
-        }
-
-        return this._headerTableBody;
-    },
-
-    get dataTableBody()
-    {
-        if ("_dataTableBody" in this)
-            return this._dataTableBody;
-
-        this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
-        if (!this._dataTableBody) {
-            this._dataTableBody = this.element.ownerDocument.createElement("tbody");
-            this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
-        }
-
-        return this._dataTableBody;
-    },
- 
-    // Updates the widths of the table, including the positions of the column
-    // resizers.
-    //
-    // IMPORTANT: This function MUST be called once after the element of the
-    // DataGrid is attached to its parent element and every subsequent time the
-    // width of the parent element is changed in order to make it possible to
-    // resize the columns.
-    //
-    // If this function is not called after the DataGrid is attached to its
-    // parent element, then the DataGrid's columns will not be resizable.
-    updateWidths: function()
-    {
-        var headerTableColumns = this._headerTableColumnGroup.children;
-        
-        var left = 0;
-        var tableWidth = this._dataTable.offsetWidth;
-        var numColumns = headerTableColumns.length;
-        
-        if (!this.columnWidthsInitialized) {
-            // Give all the columns initial widths now so that during a resize,
-            // when the two columns that get resized get a percent value for
-            // their widths, all the other columns already have percent values
-            // for their widths.
-            for (var i = 0; i < numColumns; i++) {
-                var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
-                var percentWidth = ((columnWidth / tableWidth) * 100) + "%";
-                this._headerTableColumnGroup.children[i].style.width = percentWidth;
-                this._dataTableColumnGroup.children[i].style.width = percentWidth;
-            }
-            this.columnWidthsInitialized = true;
-        }
-        
-        // Make n - 1 resizers for n columns. 
-        for (var i = 0; i < numColumns - 1; i++) {
-            var resizer = this.resizers[i];
-
-            if (!resizer) {
-                // This is the first call to updateWidth, so the resizers need
-                // to be created.
-                resizer = document.createElement("div");
-                resizer.addStyleClass("data-grid-resizer");
-                // This resizer is associated with the column to its right.
-                resizer.rightNeighboringColumnID = i + 1;
-                resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);
-                this.element.appendChild(resizer);
-                this.resizers[i] = resizer;
-            }
-
-            // Get the width of the cell in the first (and only) row of the
-            // header table in order to determine the width of the column, since
-            // it is not possible to query a column for its width.
-            left += this.headerTableBody.rows[0].cells[i].offsetWidth;
-            
-            resizer.style.left = left + "px";
-        }
-    },
-
-    addCreationNode: function(hasChildren)
-    {
-        if (this.creationNode)
-            this.creationNode.makeNormal();
-
-        var emptyData = {};
-        for (var column in this.columns)
-            emptyData[column] = '';
-        this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
-        this.appendChild(this.creationNode);
-    },
-
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        if (!child)
-            throw("insertChild: Node can't be undefined or null.");
-        if (child.parent === this)
-            throw("insertChild: Node is already a child of this node.");
-
-        if (child.parent)
-            child.parent.removeChild(child);
-
-        this.children.splice(index, 0, child);
-        this.hasChildren = true;
-
-        child.parent = this;
-        child.dataGrid = this.dataGrid;
-        child._recalculateSiblings(index);
-
-        delete child._depth;
-        delete child._revealed;
-        delete child._attached;
-        child._shouldRefreshChildren = true;
-
-        var current = child.children[0];
-        while (current) {
-            current.dataGrid = this.dataGrid;
-            delete current._depth;
-            delete current._revealed;
-            delete current._attached;
-            current._shouldRefreshChildren = true;
-            current = current.traverseNextNode(false, child, true);
-        }
-
-        if (this.expanded)
-            child._attach();
-    },
-
-    removeChild: function(child)
-    {
-        if (!child)
-            throw("removeChild: Node can't be undefined or null.");
-        if (child.parent !== this)
-            throw("removeChild: Node is not a child of this node.");
-
-        child.deselect();
-
-        this.children.remove(child, true);
-
-        if (child.previousSibling)
-            child.previousSibling.nextSibling = child.nextSibling;
-        if (child.nextSibling)
-            child.nextSibling.previousSibling = child.previousSibling;
-
-        child.dataGrid = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-
-        if (this.children.length <= 0)
-            this.hasChildren = false;
-    },
-
-    removeChildren: function()
-    {
-        for (var i = 0; i < this.children.length; ++i) {
-            var child = this.children[i];
-            child.deselect();
-            child._detach();
-
-            child.dataGrid = null;
-            child.parent = null;
-            child.nextSibling = null;
-            child.previousSibling = null;
-        }
-
-        this.children = [];
-        this.hasChildren = false;
-    },
-
-    removeChildrenRecursive: function()
-    {
-        var childrenToRemove = this.children;
-
-        var child = this.children[0];
-        while (child) {
-            if (child.children.length)
-                childrenToRemove = childrenToRemove.concat(child.children);
-            child = child.traverseNextNode(false, this, true);
-        }
-
-        for (var i = 0; i < childrenToRemove.length; ++i) {
-            var child = childrenToRemove[i];
-            child.deselect();
-            child._detach();
-
-            child.children = [];
-            child.dataGrid = null;
-            child.parent = null;
-            child.nextSibling = null;
-            child.previousSibling = null;
-        }
-
-        this.children = [];
-    },
-
-
-    _keyDown: function(event)
-    {
-        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
-            return;
-
-        var handled = false;
-        var nextSelectedNode;
-        if (event.keyIdentifier === "Up" && !event.altKey) {
-            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
-            while (nextSelectedNode && !nextSelectedNode.selectable)
-                nextSelectedNode = nextSelectedNode.traversePreviousNode(!this.expandTreeNodesWhenArrowing);
-            handled = nextSelectedNode ? true : false;
-        } else if (event.keyIdentifier === "Down" && !event.altKey) {
-            nextSelectedNode = this.selectedNode.traverseNextNode(true);
-            while (nextSelectedNode && !nextSelectedNode.selectable)
-                nextSelectedNode = nextSelectedNode.traverseNextNode(!this.expandTreeNodesWhenArrowing);
-            handled = nextSelectedNode ? true : false;
-        } else if (event.keyIdentifier === "Left") {
-            if (this.selectedNode.expanded) {
-                if (event.altKey)
-                    this.selectedNode.collapseRecursively();
-                else
-                    this.selectedNode.collapse();
-                handled = true;
-            } else if (this.selectedNode.parent && !this.selectedNode.parent.root) {
-                handled = true;
-                if (this.selectedNode.parent.selectable) {
-                    nextSelectedNode = this.selectedNode.parent;
-                    handled = nextSelectedNode ? true : false;
-                } else if (this.selectedNode.parent)
-                    this.selectedNode.parent.collapse();
-            }
-        } else if (event.keyIdentifier === "Right") {
-            if (!this.selectedNode.revealed) {
-                this.selectedNode.reveal();
-                handled = true;
-            } else if (this.selectedNode.hasChildren) {
-                handled = true;
-                if (this.selectedNode.expanded) {
-                    nextSelectedNode = this.selectedNode.children[0];
-                    handled = nextSelectedNode ? true : false;
-                } else {
-                    if (event.altKey)
-                        this.selectedNode.expandRecursively();
-                    else
-                        this.selectedNode.expand();
-                }
-            }
-        } else if (event.keyCode === 8 || event.keyCode === 46) {
-            if (this._deleteCallback) {
-                handled = true;
-                this._deleteCallback(this.selectedNode);
-            }
-        } else if (isEnterKey(event)) {
-            if (this._editCallback) {
-                handled = true;
-                // The first child of the selected element is the <td class="0-column">,
-                // and that's what we want to edit.
-                this._startEditing(this.selectedNode._element.children[0]);
-            }
-        }
-
-        if (nextSelectedNode) {
-            nextSelectedNode.reveal();
-            nextSelectedNode.select();
-        }
-
-        if (handled) {
-            event.preventDefault();
-            event.stopPropagation();
-        }
-    },
-
-    expand: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    collapse: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    reveal: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    dataGridNodeFromNode: function(target)
-    {
-        var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
-        return rowElement._dataGridNode;
-    },
-
-    dataGridNodeFromPoint: function(x, y)
-    {
-        var node = this._dataTable.ownerDocument.elementFromPoint(x, y);
-        var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");
-        return rowElement._dataGridNode;
-    },
-
-    _clickInHeaderCell: function(event)
-    {
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
-        if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))
-            return;
-
-        var sortOrder = this.sortOrder;
-
-        if (this._sortColumnCell) {
-            this._sortColumnCell.removeStyleClass("sort-ascending");
-            this._sortColumnCell.removeStyleClass("sort-descending");
-        }
-
-        if (cell == this._sortColumnCell) {
-            if (sortOrder == "ascending")
-                sortOrder = "descending";
-            else
-                sortOrder = "ascending";
-        }
-
-        this._sortColumnCell = cell;
-
-        cell.addStyleClass("sort-" + sortOrder);
-
-        this.dispatchEventToListeners("sorting changed");
-    },
-
-    _mouseDownInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.selectable)
-            return;
-
-        if (gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (event.metaKey) {
-            if (gridNode.selected)
-                gridNode.deselect();
-            else
-                gridNode.select();
-        } else
-            gridNode.select();
-    },
-    
-    _contextMenuInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.selectable)
-            return;
-        
-        if (gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-      
-        var contextMenu = new WebInspector.ContextMenu();
-        
-        // FIXME: Use the column names for Editing, instead of just "Edit".
-        if (this.dataGrid._editCallback) {
-            if (gridNode === this.creationNode)
-                contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));
-            else
-                contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));
-        }
-        if (this.dataGrid._deleteCallback && gridNode !== this.creationNode)
-            contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
-        
-        contextMenu.show(event);
-    },
-
-    _clickInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.hasChildren)
-            return;
-
-        if (!gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (gridNode.expanded) {
-            if (event.altKey)
-                gridNode.collapseRecursively();
-            else
-                gridNode.collapse();
-        } else {
-            if (event.altKey)
-                gridNode.expandRecursively();
-            else
-                gridNode.expand();
-        }
-    },
-    
-    _startResizerDragging: function(event)
-    {
-        this.currentResizer = event.target;
-        if (!this.currentResizer.rightNeighboringColumnID)
-            return;
-        WebInspector.elementDragStart(this.lastResizer, this._resizerDragging.bind(this),
-            this._endResizerDragging.bind(this), event, "col-resize");
-    },
-    
-    _resizerDragging: function(event)
-    {
-        var resizer = this.currentResizer;
-        if (!resizer)
-            return;
-        
-        // Constrain the dragpoint to be within the containing div of the
-        // datagrid.
-        var dragPoint = event.clientX - this.element.totalOffsetLeft;
-        // Constrain the dragpoint to be within the space made up by the
-        // column directly to the left and the column directly to the right.
-        var leftEdgeOfPreviousColumn = 0;
-        var firstRowCells = this.headerTableBody.rows[0].cells;
-        for (var i = 0; i < resizer.rightNeighboringColumnID - 1; i++)
-            leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
-            
-        var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.rightNeighboringColumnID - 1].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth;
-        
-        // Give each column some padding so that they don't disappear.               
-        var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
-        var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
-        
-        dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
-        
-        resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";
-        
-        var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";
-        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
-        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
-        
-        var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";
-        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width =  percentRightColumn;
-        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn;
-        
-        event.preventDefault();
-    },
-    
-    _endResizerDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-        this.currentResizer = null;
-    },
-    
-    ColumnResizePadding: 10,
-    
-    CenterResizerOverBorderAdjustment: 3,
-}
-
-WebInspector.DataGrid.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.DataGridNode = function(data, hasChildren)
-{
-    this._expanded = false;
-    this._selected = false;
-    this._shouldRefreshChildren = true;
-    this._data = data || {};
-    this.hasChildren = hasChildren || false;
-    this.children = [];
-    this.dataGrid = null;
-    this.parent = null;
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.disclosureToggleWidth = 10;
-}
-
-WebInspector.DataGridNode.prototype = {
-    selectable: true,
-
-    get element()
-    {
-        if (this._element)
-            return this._element;
-
-        if (!this.dataGrid)
-            return null;
-
-        this._element = document.createElement("tr");
-        this._element._dataGridNode = this;
-
-        if (this.hasChildren)
-            this._element.addStyleClass("parent");
-        if (this.expanded)
-            this._element.addStyleClass("expanded");
-        if (this.selected)
-            this._element.addStyleClass("selected");
-        if (this.revealed)
-            this._element.addStyleClass("revealed");
-
-        for (var columnIdentifier in this.dataGrid.columns) {
-            var cell = this.createCell(columnIdentifier);
-            this._element.appendChild(cell);
-        }
-
-        return this._element;
-    },
-
-    get data()
-    {
-        return this._data;
-    },
-
-    set data(x)
-    {
-        this._data = x || {};
-        this.refresh();
-    },
-
-    get revealed()
-    {
-        if ("_revealed" in this)
-            return this._revealed;
-
-        var currentAncestor = this.parent;
-        while (currentAncestor && !currentAncestor.root) {
-            if (!currentAncestor.expanded) {
-                this._revealed = false;
-                return false;
-            }
-
-            currentAncestor = currentAncestor.parent;
-        }
-
-        this._revealed = true;
-        return true;
-    },
-
-    set hasChildren(x)
-    {
-        if (this._hasChildren === x)
-            return;
-
-        this._hasChildren = x;
-
-        if (!this._element)
-            return;
-
-        if (this._hasChildren)
-        {
-            this._element.addStyleClass("parent");
-            if (this.expanded)
-                this._element.addStyleClass("expanded");
-        }
-        else
-        {
-            this._element.removeStyleClass("parent");
-            this._element.removeStyleClass("expanded");
-        }
-    },
-
-    get hasChildren()
-    {
-        return this._hasChildren;
-    },
-
-    set revealed(x)
-    {
-        if (this._revealed === x)
-            return;
-
-        this._revealed = x;
-
-        if (this._element) {
-            if (this._revealed)
-                this._element.addStyleClass("revealed");
-            else
-                this._element.removeStyleClass("revealed");
-        }
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i].revealed = x && this.expanded;
-    },
-
-    get depth()
-    {
-        if ("_depth" in this)
-            return this._depth;
-        if (this.parent && !this.parent.root)
-            this._depth = this.parent.depth + 1;
-        else
-            this._depth = 0;
-        return this._depth;
-    },
-
-    get shouldRefreshChildren()
-    {
-        return this._shouldRefreshChildren;
-    },
-
-    set shouldRefreshChildren(x)
-    {
-        this._shouldRefreshChildren = x;
-        if (x && this.expanded)
-            this.expand();
-    },
-
-    get selected()
-    {
-        return this._selected;
-    },
-
-    set selected(x)
-    {
-        if (x)
-            this.select();
-        else
-            this.deselect();
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    refresh: function()
-    {
-        if (!this._element || !this.dataGrid)
-            return;
-
-        this._element.removeChildren();
-
-        for (var columnIdentifier in this.dataGrid.columns) {
-            var cell = this.createCell(columnIdentifier);
-            this._element.appendChild(cell);
-        }
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = document.createElement("td");
-        cell.className = columnIdentifier + "-column";
-
-        var alignment = this.dataGrid.aligned[columnIdentifier];
-        if (alignment)
-            cell.addStyleClass(alignment);
-
-        var div = document.createElement("div");
-        div.textContent = this.data[columnIdentifier];
-        cell.appendChild(div);
-
-        if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
-            cell.addStyleClass("disclosure");
-            if (this.depth)
-                cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
-        }
-
-        return cell;
-    },
-
-    // Share these functions with DataGrid. They are written to work with a DataGridNode this object.
-    appendChild: WebInspector.DataGrid.prototype.appendChild,
-    insertChild: WebInspector.DataGrid.prototype.insertChild,
-    removeChild: WebInspector.DataGrid.prototype.removeChild,
-    removeChildren: WebInspector.DataGrid.prototype.removeChildren,
-    removeChildrenRecursive: WebInspector.DataGrid.prototype.removeChildrenRecursive,
-
-    _recalculateSiblings: function(myIndex)
-    {
-        if (!this.parent)
-            return;
-
-        var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);
-
-        if (previousChild) {
-            previousChild.nextSibling = this;
-            this.previousSibling = previousChild;
-        } else
-            this.previousSibling = null;
-
-        var nextChild = this.parent.children[myIndex + 1];
-
-        if (nextChild) {
-            nextChild.previousSibling = this;
-            this.nextSibling = nextChild;
-        } else
-            this.nextSibling = null;
-    },
-
-    collapse: function()
-    {
-        if (this._element)
-            this._element.removeStyleClass("expanded");
-
-        this._expanded = false;
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i].revealed = false;
-
-        this.dispatchEventToListeners("collapsed");
-    },
-
-    collapseRecursively: function()
-    {
-        var item = this;
-        while (item) {
-            if (item.expanded)
-                item.collapse();
-            item = item.traverseNextNode(false, this, true);
-        }
-    },
-
-    expand: function()
-    {
-        if (!this.hasChildren || this.expanded)
-            return;
-
-        if (this.revealed && !this._shouldRefreshChildren)
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i].revealed = true;
-
-        if (this._shouldRefreshChildren) {
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i]._detach();
-
-            this.dispatchEventToListeners("populate");
-
-            if (this._attached) {
-                for (var i = 0; i < this.children.length; ++i) {
-                    var child = this.children[i];
-                    if (this.revealed)
-                        child.revealed = true;
-                    child._attach();
-                }
-            }
-
-            delete this._shouldRefreshChildren;
-        }
-
-        if (this._element)
-            this._element.addStyleClass("expanded");
-
-        this._expanded = true;
-
-        this.dispatchEventToListeners("expanded");
-    },
-
-    expandRecursively: function()
-    {
-        var item = this;
-        while (item) {
-            item.expand();
-            item = item.traverseNextNode(false, this);
-        }
-    },
-
-    reveal: function()
-    {
-        var currentAncestor = this.parent;
-        while (currentAncestor && !currentAncestor.root) {
-            if (!currentAncestor.expanded)
-                currentAncestor.expand();
-            currentAncestor = currentAncestor.parent;
-        }
-
-        this.element.scrollIntoViewIfNeeded(false);
-
-        this.dispatchEventToListeners("revealed");
-    },
-
-    select: function(supressSelectedEvent)
-    {
-        if (!this.dataGrid || !this.selectable || this.selected)
-            return;
-
-        if (this.dataGrid.selectedNode)
-            this.dataGrid.selectedNode.deselect();
-
-        this._selected = true;
-        this.dataGrid.selectedNode = this;
-
-        if (this._element)
-            this._element.addStyleClass("selected");
-
-        if (!supressSelectedEvent)
-            this.dispatchEventToListeners("selected");
-    },
-
-    deselect: function(supressDeselectedEvent)
-    {
-        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
-            return;
-
-        this._selected = false;
-        this.dataGrid.selectedNode = null;
-
-        if (this._element)
-            this._element.removeStyleClass("selected");
-
-        if (!supressDeselectedEvent)
-            this.dispatchEventToListeners("deselected");
-    },
-
-    traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
-    {
-        if (!dontPopulate && this.hasChildren)
-            this.dispatchEventToListeners("populate");
-
-        if (info)
-            info.depthChange = 0;
-
-        var node = (!skipHidden || this.revealed) ? this.children[0] : null;
-        if (node && (!skipHidden || this.expanded)) {
-            if (info)
-                info.depthChange = 1;
-            return node;
-        }
-
-        if (this === stayWithin)
-            return null;
-
-        node = (!skipHidden || this.revealed) ? this.nextSibling : null;
-        if (node)
-            return node;
-
-        node = this;
-        while (node && !node.root && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
-            if (info)
-                info.depthChange -= 1;
-            node = node.parent;
-        }
-
-        if (!node)
-            return null;
-
-        return (!skipHidden || node.revealed) ? node.nextSibling : null;
-    },
-
-    traversePreviousNode: function(skipHidden, dontPopulate)
-    {
-        var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
-        if (!dontPopulate && node && node.hasChildren)
-            node.dispatchEventToListeners("populate");
-
-        while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
-            if (!dontPopulate && node.hasChildren)
-                node.dispatchEventToListeners("populate");
-            node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
-        }
-
-        if (node)
-            return node;
-
-        if (!this.parent || this.parent.root)
-            return null;
-
-        return this.parent;
-    },
-
-    isEventWithinDisclosureTriangle: function(event)
-    {
-        if (!this.hasChildren)
-            return false;
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell.hasStyleClass("disclosure"))
-            return false;
-        var computedLeftPadding = window.getComputedStyle(cell).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
-        var left = cell.totalOffsetLeft + computedLeftPadding;
-        return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
-    },
-
-    _attach: function()
-    {
-        if (!this.dataGrid || this._attached)
-            return;
-
-        this._attached = true;
-
-        var nextNode = null;
-        var previousNode = this.traversePreviousNode(true, true);
-        if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)
-            var nextNode = previousNode.element.nextSibling;
-        if (!nextNode)
-            nextNode = this.dataGrid.dataTableBody.lastChild;
-        this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);
-
-        if (this.expanded)
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i]._attach();
-    },
-
-    _detach: function()
-    {
-        if (!this._attached)
-            return;
-
-        this._attached = false;
-
-        if (this._element && this._element.parentNode)
-            this._element.parentNode.removeChild(this._element);
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i]._detach();
-    },
-
-    savePosition: function()
-    {
-        if (this._savedPosition)
-            return;
-
-        if (!this.parent)
-            throw("savePosition: Node must have a parent.");
-        this._savedPosition = {
-            parent: this.parent,
-            index: this.parent.children.indexOf(this)
-        };
-    },
-
-    restorePosition: function()
-    {
-        if (!this._savedPosition)
-            return;
-
-        if (this.parent !== this._savedPosition.parent)
-            this._savedPosition.parent.insertChild(this, this._savedPosition.index);
-
-        delete this._savedPosition;
-    }
-}
-
-WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.CreationDataGridNode = function(data, hasChildren)
-{
-    WebInspector.DataGridNode.call(this, data, hasChildren);
-    this.isCreationNode = true;
-}
-
-WebInspector.CreationDataGridNode.prototype = {
-    makeNormal: function()
-    {
-        delete this.isCreationNode;
-        delete this.makeNormal;
-    }
-}
-
-WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-/* CookieItemsView.js */
-
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CookieItemsView = function(cookieDomain)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
-    this.deleteButton.visible = false;
-    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-    
-    this._cookieDomain = cookieDomain;
-}
-
-WebInspector.CookieItemsView.prototype = {
-    get statusBarItems()
-    {
-        return [this.refreshButton.element, this.deleteButton.element];
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this.deleteButton.visible = false;
-    },
-
-    update: function()
-    {
-        this.element.removeChildren();
-
-        var self = this;
-        function callback(allCookies, isAdvanced) {
-            var cookies = self._cookiesForDomain(allCookies);
-            var dataGrid = (isAdvanced ? self.dataGridForCookies(cookies) : self.simpleDataGridForCookies(cookies));
-            if (dataGrid) {
-                self._dataGrid = dataGrid;
-                self.element.appendChild(dataGrid.element);
-                self._dataGrid.updateWidths();
-                if (isAdvanced)
-                    self.deleteButton.visible = true;
-            } else {
-                var emptyMsgElement = document.createElement("div");
-                emptyMsgElement.className = "storage-table-empty";
-                emptyMsgElement.textContent = WebInspector.UIString("This site has no cookies.");
-                self.element.appendChild(emptyMsgElement);
-                self._dataGrid = null;
-                self.deleteButton.visible = false;
-            }
-        }
-
-        WebInspector.Cookies.getCookiesAsync(callback);
-    },
-
-    _cookiesForDomain: function(allCookies)
-    {
-        var cookiesForDomain = [];
-        var resourceURLsForDocumentURL = [];
-
-        for (var id in WebInspector.resources) {
-            var resource = WebInspector.resources[id];
-            var match = resource.documentURL.match(WebInspector.URLRegExp);
-            if (match && match[2] === this._cookieDomain)
-                resourceURLsForDocumentURL.push(resource.url);
-        }
-
-        for (var i = 0; i < allCookies.length; ++i) {
-            for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {
-                var resourceURL = resourceURLsForDocumentURL[j];
-                if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {
-                    cookiesForDomain.push(allCookies[i]);
-                    break;
-                }
-            }
-        }
-        return cookiesForDomain;
-    },
-
-    dataGridForCookies: function(cookies)
-    {
-        if (!cookies.length)
-            return null;
-
-        for (var i = 0; i < cookies.length; ++i)
-            cookies[i].expires = new Date(cookies[i].expires);
-
-        var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };
-        columns[0].title = WebInspector.UIString("Name");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-        columns[2].title = WebInspector.UIString("Domain");
-        columns[2].width = columns[2].title.length;
-        columns[3].title = WebInspector.UIString("Path");
-        columns[3].width = columns[3].title.length;
-        columns[4].title = WebInspector.UIString("Expires");
-        columns[4].width = columns[4].title.length;
-        columns[5].title = WebInspector.UIString("Size");
-        columns[5].width = columns[5].title.length;
-        columns[5].aligned = "right";
-        columns[6].title = WebInspector.UIString("HTTP");
-        columns[6].width = columns[6].title.length;
-        columns[6].aligned = "centered";
-        columns[7].title = WebInspector.UIString("Secure");
-        columns[7].width = columns[7].title.length;
-        columns[7].aligned = "centered";
-
-        function updateDataAndColumn(index, value) {
-            data[index] = value;
-            if (value.length > columns[index].width)
-                columns[index].width = value.length;
-        }
-
-        var data;
-        var nodes = [];
-        for (var i = 0; i < cookies.length; ++i) {
-            var cookie = cookies[i];
-            data = {};
-
-            updateDataAndColumn(0, cookie.name);
-            updateDataAndColumn(1, cookie.value);
-            updateDataAndColumn(2, cookie.domain);
-            updateDataAndColumn(3, cookie.path);
-            updateDataAndColumn(4, (cookie.session ? WebInspector.UIString("Session") : cookie.expires.toGMTString()));
-            updateDataAndColumn(5, Number.bytesToString(cookie.size, WebInspector.UIString));
-            updateDataAndColumn(6, (cookie.httpOnly ? "\u2713" : "")); // Checkmark
-            updateDataAndColumn(7, (cookie.secure ? "\u2713" : "")); // Checkmark
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.cookie = cookie;
-            node.selectable = true;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = 0;
-        for (var columnIdentifier in columns)
-            totalColumnWidths += columns[columnIdentifier].width;
-
-        // Enforce the Value column (the 2nd column) to be a max of 33%
-        // tweaking the raw total width because may massively outshadow the others
-        var valueColumnWidth = columns[1].width;
-        if (valueColumnWidth / totalColumnWidths > 0.33) {
-            totalColumnWidths -= valueColumnWidth;
-            totalColumnWidths *= 1.33;
-            columns[1].width = totalColumnWidths * 0.33;
-        }
-
-        // Calculate the percentage width for the columns.
-        const minimumPrecent = 6;
-        var recoupPercent = 0;
-        for (var columnIdentifier in columns) {
-            var width = columns[columnIdentifier].width;
-            width = Math.round((width / totalColumnWidths) * 100);
-            if (width < minimumPrecent) {
-                recoupPercent += (minimumPrecent - width);
-                width = minimumPrecent;
-            }
-            columns[columnIdentifier].width = width;
-        }
-
-        // Enforce the minimum percentage width. (need to narrow total percentage due to earlier additions)
-        while (recoupPercent > 0) {
-            for (var columnIdentifier in columns) {
-                if (columns[columnIdentifier].width > minimumPrecent) {
-                    --columns[columnIdentifier].width;
-                    --recoupPercent;
-                    if (!recoupPercent)
-                        break;
-                }
-            }
-        }
-
-        for (var columnIdentifier in columns)
-            columns[columnIdentifier].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns, null, this._deleteCookieCallback.bind(this));
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        if (length > 0)
-            nodes[0].selected = true;
-
-        return dataGrid;
-    },
-
-    simpleDataGridForCookies: function(cookies)
-    {
-        if (!cookies.length)
-            return null;
-
-        var columns = {};
-        columns[0] = {};
-        columns[1] = {};
-        columns[0].title = WebInspector.UIString("Name");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-
-        var nodes = [];
-        for (var i = 0; i < cookies.length; ++i) {
-            var cookie = cookies[i];
-            var data = {};
-
-            var name = cookie.name;
-            data[0] = name;
-            if (name.length > columns[0].width)
-                columns[0].width = name.length;
-
-            var value = cookie.value;
-            data[1] = value;
-            if (value.length > columns[1].width)
-                columns[1].width = value.length;
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = true;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = columns[0].width + columns[1].width;
-        var width = Math.round((columns[0].width * 100) / totalColumnWidths);
-        const minimumPrecent = 20;
-        if (width < minimumPrecent)
-            width = minimumPrecent;
-        if (width > 100 - minimumPrecent)
-            width = 100 - minimumPrecent;
-        columns[0].width = width;
-        columns[1].width = 100 - width;
-        columns[0].width += "%";
-        columns[1].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns);
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        if (length > 0)
-            nodes[0].selected = true;
-
-        return dataGrid;
-    },
-    
-    resize: function()
-    {
-        if (this._dataGrid)
-            this._dataGrid.updateWidths();
-    },
-
-    _deleteButtonClicked: function(event)
-    {
-        if (!this._dataGrid || !this._dataGrid.selectedNode)
-            return;
-
-        this._deleteCookieCallback(this._dataGrid.selectedNode);
-    },
-    
-    _deleteCookieCallback: function(node)
-    {
-        var cookie = node.cookie;
-        InspectorBackend.deleteCookie(cookie.name, this._cookieDomain);
-        this.update();
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    }
-}
-
-WebInspector.CookieItemsView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* Script.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
-{
-    this.sourceID = sourceID;
-    this.sourceURL = sourceURL;
-    this.source = source;
-    this.startingLine = startingLine;
-    this.errorLine = errorLine;
-    this.errorMessage = errorMessage;
-
-    // if no URL, look for "//@ sourceURL=" decorator
-    // note that this sourceURL comment decorator is behavior that FireBug added
-    // in it's 1.1 release as noted in the release notes:
-    // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
-    if (!sourceURL) {
-        // use of [ \t] rather than \s is to prevent \n from matching
-        var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
-        var match = pattern.exec(source);
-
-        if (match)
-            this.sourceURL = WebInspector.UIString("(program): %s", match[1]);
-    }
-}
-
-WebInspector.Script.prototype = {
-}
-
-/* Breakpoint.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Breakpoint = function(url, line, sourceID, condition)
-{
-    this.url = url;
-    this.line = line;
-    this.sourceID = sourceID;
-    this._enabled = true;
-    this._sourceText = "";
-    this._condition = condition || "";
-}
-
-WebInspector.Breakpoint.prototype = {
-    get enabled()
-    {
-        return this._enabled;
-    },
-
-    set enabled(x)
-    {
-        if (this._enabled === x)
-            return;
-
-        this._enabled = x;
-
-        if (this._enabled)
-            this.dispatchEventToListeners("enabled");
-        else
-            this.dispatchEventToListeners("disabled");
-    },
-
-    get sourceText()
-    {
-        return this._sourceText;
-    },
-
-    set sourceText(text)
-    {
-        this._sourceText = text;
-        this.dispatchEventToListeners("text-changed");
-    },
-
-    get label()
-    {
-        var displayName = (this.url ? WebInspector.displayNameForURL(this.url) : WebInspector.UIString("(program)"));
-        return displayName + ":" + this.line;
-    },
-
-    get id()
-    {
-        return this.sourceID + ":" + this.line;
-    },
-
-    get condition()
-    {
-        return this._condition;
-    },
-
-    set condition(c)
-    {
-        c = c || "";
-        if (this._condition === c)
-            return;
-
-        this._condition = c;
-        this.dispatchEventToListeners("condition-changed");
-
-        if (this.enabled)
-            InspectorBackend.updateBreakpoint(this.sourceID, this.line, c);
-    }
-}
-
-WebInspector.Breakpoint.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SidebarPane = function(title)
-{
-    this.element = document.createElement("div");
-    this.element.className = "pane";
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-    this.titleElement.tabIndex = 0;
-    this.titleElement.addEventListener("click", this.toggleExpanded.bind(this), false);
-    this.titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
-
-    this.bodyElement = document.createElement("div");
-    this.bodyElement.className = "body";
-
-    this.element.appendChild(this.titleElement);
-    this.element.appendChild(this.bodyElement);
-
-    this.title = title;
-    this.growbarVisible = false;
-    this.expanded = false;
-}
-
-WebInspector.SidebarPane.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.titleElement.textContent = x;
-    },
-
-    get growbarVisible()
-    {
-        return this._growbarVisible;
-    },
-
-    set growbarVisible(x)
-    {
-        if (this._growbarVisible === x)
-            return;
-
-        this._growbarVisible = x;
-
-        if (x && !this._growbarElement) {
-            this._growbarElement = document.createElement("div");
-            this._growbarElement.className = "growbar";
-            this.element.appendChild(this._growbarElement);
-        } else if (!x && this._growbarElement) {
-            if (this._growbarElement.parentNode)
-                this._growbarElement.parentNode(this._growbarElement);
-            delete this._growbarElement;
-        }
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    expand: function()
-    {
-        if (this._expanded)
-            return;
-        this._expanded = true;
-        this.element.addStyleClass("expanded");
-        if (this.onexpand)
-            this.onexpand(this);
-    },
-
-    collapse: function()
-    {
-        if (!this._expanded)
-            return;
-        this._expanded = false;
-        this.element.removeStyleClass("expanded");
-        if (this.oncollapse)
-            this.oncollapse(this);
-    },
-
-    toggleExpanded: function()
-    {
-        this.expanded = !this.expanded;
-    },
-
-    _onTitleKeyDown: function(event)
-    {
-        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Space)
-            this.toggleExpanded();
-    }
-}
-
-WebInspector.SidebarPane.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ElementsTreeOutline.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008 Matt Lilek <[email protected]>
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ElementsTreeOutline = function() {
-    this.element = document.createElement("ol");
-    this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);
-    this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);
-    this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);
-
-    TreeOutline.call(this, this.element);
-
-    this.includeRootDOMNode = true;
-    this.selectEnabled = false;
-    this.showInElementsPanelEnabled = false;
-    this.rootDOMNode = null;
-    this.focusedDOMNode = null;
-
-    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);
-    this.element.addEventListener("keydown", this._keyDown.bind(this), true);
-}
-
-WebInspector.ElementsTreeOutline.prototype = {
-    get rootDOMNode()
-    {
-        return this._rootDOMNode;
-    },
-
-    set rootDOMNode(x)
-    {
-        if (this._rootDOMNode === x)
-            return;
-
-        this._rootDOMNode = x;
-
-        this.update();
-    },
-
-    get focusedDOMNode()
-    {
-        return this._focusedDOMNode;
-    },
-
-    set focusedDOMNode(x)
-    {
-        if (this._focusedDOMNode === x) {
-            this.revealAndSelectNode(x);
-            return;
-        }
-
-        this._focusedDOMNode = x;
-
-        this.revealAndSelectNode(x);
-
-        // The revealAndSelectNode() method might find a different element if there is inlined text,
-        // and the select() call would change the focusedDOMNode and reenter this setter. So to
-        // avoid calling focusedNodeChanged() twice, first check if _focusedDOMNode is the same
-        // node as the one passed in.
-        if (this._focusedDOMNode === x) {
-            this.focusedNodeChanged();
-
-            if (x && !this.suppressSelectHighlight) {
-                InspectorBackend.highlightDOMNode(x.id);
-
-                if ("_restorePreviousHighlightNodeTimeout" in this)
-                    clearTimeout(this._restorePreviousHighlightNodeTimeout);
-
-                function restoreHighlightToHoveredNode()
-                {
-                    var hoveredNode = WebInspector.hoveredDOMNode;
-                    if (hoveredNode)
-                        InspectorBackend.highlightDOMNode(hoveredNode.id);
-                    else
-                        InspectorBackend.hideDOMNodeHighlight();
-                }
-
-                this._restorePreviousHighlightNodeTimeout = setTimeout(restoreHighlightToHoveredNode, 2000);
-            }
-        }
-    },
-
-    update: function()
-    {
-        var selectedNode = this.selectedTreeElement ? this.selectedTreeElement.representedObject : null;
-
-        this.removeChildren();
-
-        if (!this.rootDOMNode)
-            return;
-
-        var treeElement;
-        if (this.includeRootDOMNode) {
-            treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);
-            treeElement.selectable = this.selectEnabled;
-            this.appendChild(treeElement);
-        } else {
-            // FIXME: this could use findTreeElement to reuse a tree element if it already exists
-            var node = this.rootDOMNode.firstChild;
-            while (node) {
-                treeElement = new WebInspector.ElementsTreeElement(node);
-                treeElement.selectable = this.selectEnabled;
-                this.appendChild(treeElement);
-                node = node.nextSibling;
-            }
-        }
-
-        if (selectedNode)
-            this.revealAndSelectNode(selectedNode);
-    },
-
-    updateSelection: function()
-    {
-        if (!this.selectedTreeElement)
-            return;
-        var element = this.treeOutline.selectedTreeElement;
-        element.updateSelection();
-    },
-
-    focusedNodeChanged: function(forceUpdate) {},
-
-    findTreeElement: function(node)
-    {
-        var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestorNode, parentNode);
-        if (!treeElement && node.nodeType === Node.TEXT_NODE) {
-            // The text node might have been inlined if it was short, so try to find the parent element.
-            treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestorNode, parentNode);
-        }
-
-        return treeElement;
-    },
-
-    revealAndSelectNode: function(node)
-    {
-        if (!node)
-            return;
-
-        var treeElement = this.findTreeElement(node);
-        if (!treeElement)
-            return;
-
-        treeElement.reveal();
-        treeElement.select();
-    },
-
-    _treeElementFromEvent: function(event)
-    {
-        var root = this.element;
-
-        // We choose this X coordinate based on the knowledge that our list
-        // items extend nearly to the right edge of the outer <ol>.
-        var x = root.totalOffsetLeft + root.offsetWidth - 20;
-
-        var y = event.pageY;
-
-        // Our list items have 1-pixel cracks between them vertically. We avoid
-        // the cracks by checking slightly above and slightly below the mouse
-        // and seeing if we hit the same element each time.
-        var elementUnderMouse = this.treeElementFromPoint(x, y);
-        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);
-        var element;
-        if (elementUnderMouse === elementAboveMouse)
-            element = elementUnderMouse;
-        else
-            element = this.treeElementFromPoint(x, y + 2);
-
-        return element;
-    },
-    
-    _keyDown: function(event)
-    {
-        if (event.target !== this.treeOutline.element)
-            return;
-
-        var selectedElement = this.selectedTreeElement;
-        if (!selectedElement)
-            return;
-
-        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Backspace ||
-                event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Delete) {
-            selectedElement.remove();
-            event.preventDefault();
-            event.stopPropagation();
-            return;
-        }
-
-        // On Enter or Return start editing the first attribute
-        // or create a new attribute on the selected element.
-        if (isEnterKey(event)) {
-            if (this._editing)
-                return;
-
-            selectedElement._startEditing();
-
-            // prevent a newline from being immediately inserted
-            event.preventDefault();
-            event.stopPropagation();
-            return;
-        }
-    },
-
-    _onmousedown: function(event)
-    {
-        var element = this._treeElementFromEvent(event);
-
-        if (!element || element.isEventWithinDisclosureTriangle(event))
-            return;
-
-        element.select();
-    },
-
-    _onmousemove: function(event)
-    {
-        var element = this._treeElementFromEvent(event);
-        if (element && this._previousHoveredElement === element)
-            return;
-
-        if (this._previousHoveredElement) {
-            this._previousHoveredElement.hovered = false;
-            delete this._previousHoveredElement;
-        }
-
-        if (element && !element.elementCloseTag) {
-            element.hovered = true;
-            this._previousHoveredElement = element;
-        }
-
-        WebInspector.hoveredDOMNode = (element && !element.elementCloseTag ? element.representedObject : null);
-    },
-
-    _onmouseout: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.element))
-            return;
-
-        if (this._previousHoveredElement) {
-            this._previousHoveredElement.hovered = false;
-            delete this._previousHoveredElement;
-        }
-
-        WebInspector.hoveredDOMNode = null;
-    },
-
-    _contextMenuEventFired: function(event)
-    {
-        var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");
-        if (!listItem || !listItem.treeElement)
-            return;
-
-        var contextMenu = new WebInspector.ContextMenu();
-
-        var tag = event.target.enclosingNodeOrSelfWithClass("webkit-html-tag");
-        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
-        if (tag)
-            listItem.treeElement._populateTagContextMenu(contextMenu, event);
-        else if (textNode)
-            listItem.treeElement._populateTextContextMenu(contextMenu, textNode);
-        contextMenu.show(event);
-    }
-}
-
-WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;
-
-WebInspector.ElementsTreeElement = function(node)
-{
-    var hasChildrenOverride = node.hasChildNodes() && !this._showInlineText(node);
-
-    // The title will be updated in onattach.
-    TreeElement.call(this, "", node, hasChildrenOverride);
-
-    if (this.representedObject.nodeType == Node.ELEMENT_NODE)
-        this._canAddAttributes = true;
-}
-
-WebInspector.ElementsTreeElement.prototype = {
-    get highlighted()
-    {
-        return this._highlighted;
-    },
-
-    set highlighted(x)
-    {
-        if (this._highlighted === x)
-            return;
-
-        this._highlighted = x;
-
-        if (this.listItemElement) {
-            if (x)
-                this.listItemElement.addStyleClass("highlighted");
-            else
-                this.listItemElement.removeStyleClass("highlighted");
-        }
-    },
-
-    get hovered()
-    {
-        return this._hovered;
-    },
-
-    set hovered(x)
-    {
-        if (this._hovered === x)
-            return;
-
-        this._hovered = x;
-
-        if (this.listItemElement) {
-            if (x) {
-                this.updateSelection();
-                this.listItemElement.addStyleClass("hovered");
-            } else {
-                this.listItemElement.removeStyleClass("hovered");
-            }
-        }
-    },
-
-    createTooltipForImageNode: function(node, callback)
-    {
-        function createTooltipThenCallback(properties)
-        {
-            if (!properties) {
-                callback();
-                return;
-            }
-
-            var tooltipText = null;
-            if (properties.offsetHeight === properties.naturalHeight && properties.offsetWidth === properties.naturalWidth)
-                tooltipText = WebInspector.UIString("%d × %d pixels", properties.offsetWidth, properties.offsetHeight);
-            else
-                tooltipText = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);
-            callback(tooltipText);
-        }
-        var objectProxy = new WebInspector.ObjectProxy(node.id);
-        WebInspector.ObjectProxy.getPropertiesAsync(objectProxy, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], createTooltipThenCallback);
-    },
-
-    updateSelection: function()
-    {
-        var listItemElement = this.listItemElement;
-        if (!listItemElement)
-            return;
-
-        if (document.body.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        if (!this.selectionElement) {
-            this.selectionElement = document.createElement("div");
-            this.selectionElement.className = "selection selected";
-            listItemElement.insertBefore(this.selectionElement, listItemElement.firstChild);
-        }
-
-        this.selectionElement.style.height = listItemElement.offsetHeight + "px";
-    },
-
-    onattach: function()
-    {
-        this.listItemElement.addEventListener("mousedown", this.onmousedown.bind(this), false);
-
-        if (this._highlighted)
-            this.listItemElement.addStyleClass("highlighted");
-
-        if (this._hovered) {
-            this.updateSelection();
-            this.listItemElement.addStyleClass("hovered");
-        }
-
-        this._updateTitle();
-
-        this._preventFollowingLinksOnDoubleClick();
-    },
-
-    _preventFollowingLinksOnDoubleClick: function()
-    {
-        var links = this.listItemElement.querySelectorAll("li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");
-        if (!links)
-            return;
-
-        for (var i = 0; i < links.length; ++i)
-            links[i].preventFollowOnDoubleClick = true;
-    },
-
-    onpopulate: function()
-    {
-        if (this.children.length || this._showInlineText(this.representedObject))
-            return;
-
-        this.updateChildren();
-    },
-    
-    updateChildren: function(fullRefresh)
-    {
-        WebInspector.domAgent.getChildNodesAsync(this.representedObject, this._updateChildren.bind(this, fullRefresh));
-    },
-
-    _updateChildren: function(fullRefresh)
-    {
-        if (fullRefresh) {
-            var selectedTreeElement = this.treeOutline.selectedTreeElement;
-            if (selectedTreeElement && selectedTreeElement.hasAncestor(this))
-                this.select();
-            this.removeChildren();
-        }
-
-        var treeElement = this;
-        var treeChildIndex = 0;
-
-        function updateChildrenOfNode(node)
-        {
-            var treeOutline = treeElement.treeOutline;
-            var child = node.firstChild;
-            while (child) {
-                var currentTreeElement = treeElement.children[treeChildIndex];
-                if (!currentTreeElement || currentTreeElement.representedObject !== child) {
-                    // Find any existing element that is later in the children list.
-                    var existingTreeElement = null;
-                    for (var i = (treeChildIndex + 1); i < treeElement.children.length; ++i) {
-                        if (treeElement.children[i].representedObject === child) {
-                            existingTreeElement = treeElement.children[i];
-                            break;
-                        }
-                    }
-
-                    if (existingTreeElement && existingTreeElement.parent === treeElement) {
-                        // If an existing element was found and it has the same parent, just move it.
-                        var wasSelected = existingTreeElement.selected;
-                        treeElement.removeChild(existingTreeElement);
-                        treeElement.insertChild(existingTreeElement, treeChildIndex);
-                        if (wasSelected)
-                            existingTreeElement.select();
-                    } else {
-                        // No existing element found, insert a new element.
-                        var newElement = new WebInspector.ElementsTreeElement(child);
-                        newElement.selectable = treeOutline.selectEnabled;
-                        treeElement.insertChild(newElement, treeChildIndex);
-                    }
-                }
-
-                child = child.nextSibling;
-                ++treeChildIndex;
-            }
-        }
-
-        // Remove any tree elements that no longer have this node (or this node's contentDocument) as their parent.
-        for (var i = (this.children.length - 1); i >= 0; --i) {
-            if ("elementCloseTag" in this.children[i])
-                continue;
-
-            var currentChild = this.children[i];
-            var currentNode = currentChild.representedObject;
-            var currentParentNode = currentNode.parentNode;
-
-            if (currentParentNode === this.representedObject)
-                continue;
-
-            var selectedTreeElement = this.treeOutline.selectedTreeElement;
-            if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild)))
-                this.select();
-
-            this.removeChildAtIndex(i);
-        }
-
-        updateChildrenOfNode(this.representedObject);
-
-        var lastChild = this.children[this.children.length - 1];
-        if (this.representedObject.nodeType == Node.ELEMENT_NODE && (!lastChild || !lastChild.elementCloseTag)) {
-            var title = "<span class=\"webkit-html-tag close\">&lt;/" + this.representedObject.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
-            var item = new TreeElement(title, null, false);
-            item.selectable = false;
-            item.elementCloseTag = true;
-            this.appendChild(item);
-        }
-    },
-
-    onexpand: function()
-    {
-        this.treeOutline.updateSelection();
-    },
-
-    oncollapse: function()
-    {
-        this.treeOutline.updateSelection();
-    },
-
-    onreveal: function()
-    {
-        if (this.listItemElement)
-            this.listItemElement.scrollIntoViewIfNeeded(false);
-    },
-
-    onselect: function()
-    {
-        this.treeOutline.focusedDOMNode = this.representedObject;
-        this.updateSelection();
-    },
-
-    onmousedown: function(event)
-    {
-        if (this._editing)
-            return;
-
-        if (this.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (this.treeOutline.showInElementsPanelEnabled) {    
-            WebInspector.showElementsPanel();
-            WebInspector.panels.elements.focusedDOMNode = this.representedObject;
-        }
-
-        // Prevent selecting the nearest word on double click.
-        if (event.detail >= 2)
-            event.preventDefault();
-    },
-
-    ondblclick: function(event)
-    {
-        if (this._editing)
-            return;
-
-        if (this._startEditingFromEvent(event))
-            return;
-
-        if (this.hasChildren && !this.expanded)
-            this.expand();
-    },
-
-    _insertInLastAttributePosition: function(tag, node)
-    {
-        if (tag.getElementsByClassName("webkit-html-attribute").length > 0)
-            tag.insertBefore(node, tag.lastChild);
-        else {
-            var nodeName = tag.textContent.match(/^<(.*?)>$/)[1];
-            tag.textContent = '';
-            tag.appendChild(document.createTextNode('<'+nodeName));
-            tag.appendChild(node);
-            tag.appendChild(document.createTextNode('>'));
-        }
-
-        this.updateSelection();
-    },
-
-    _startEditingFromEvent: function(event)
-    {
-        if (this.treeOutline.focusedDOMNode != this.representedObject)
-            return;
-
-        if (this.representedObject.nodeType != Node.ELEMENT_NODE && this.representedObject.nodeType != Node.TEXT_NODE)
-            return false;
-
-        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
-        if (textNode)
-            return this._startEditingTextNode(textNode);
-
-        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
-        if (attribute)
-            return this._startEditingAttribute(attribute, event.target);
-
-        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
-        if (newAttribute)
-            return this._addNewAttribute();
-
-        return false;
-    },
-
-    _populateTagContextMenu: function(contextMenu, event)
-    {
-        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
-        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
-
-        // Add attribute-related actions.
-        contextMenu.appendItem(WebInspector.UIString("Add Attribute"), this._addNewAttribute.bind(this));
-        if (attribute && !newAttribute)
-            contextMenu.appendItem(WebInspector.UIString("Edit Attribute"), this._startEditingAttribute.bind(this, attribute, event.target));
-        contextMenu.appendSeparator();
-
-        // Add node-related actions.
-        contextMenu.appendItem(WebInspector.UIString("Edit as HTML"), this._editAsHTML.bind(this));
-        contextMenu.appendItem(WebInspector.UIString("Copy as HTML"), this._copyHTML.bind(this));
-        contextMenu.appendItem(WebInspector.UIString("Delete Node"), this.remove.bind(this));
-    },
-
-    _populateTextContextMenu: function(contextMenu, textNode)
-    {
-        contextMenu.appendItem(WebInspector.UIString("Edit Text"), this._startEditingTextNode.bind(this, textNode));
-    },
-
-    _startEditing: function()
-    {
-        if (this.treeOutline.focusedDOMNode !== this.representedObject)
-            return;
-
-        var listItem = this._listItemNode;
-
-        if (this._canAddAttributes) {
-            var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];
-            if (attribute)
-                return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-value")[0]);
-
-            return this._addNewAttribute();
-        }
-
-        if (this.representedObject.nodeType === Node.TEXT_NODE) {
-            var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];
-            if (textNode)
-                return this._startEditingTextNode(textNode);
-            return;
-        }
-    },
-
-    _addNewAttribute: function()
-    {
-        var attr = document.createElement("span");
-        attr.className = "webkit-html-attribute";
-        attr.style.marginLeft = "2px"; // overrides the .editing margin rule
-        attr.style.marginRight = "2px"; // overrides the .editing margin rule
-        var name = document.createElement("span");
-        name.className = "webkit-html-attribute-name new-attribute";
-        name.textContent = " ";
-        var value = document.createElement("span");
-        value.className = "webkit-html-attribute-value";
-        attr.appendChild(name);
-        attr.appendChild(value);
-
-        var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];
-        this._insertInLastAttributePosition(tag, attr);
-        return this._startEditingAttribute(attr, attr);
-    },
-
-    _triggerEditAttribute: function(attributeName)
-    {
-        var attributeElements = this.listItemElement.getElementsByClassName("webkit-html-attribute-name");
-        for (var i = 0, len = attributeElements.length; i < len; ++i) {
-            if (attributeElements[i].textContent === attributeName) {
-                for (var elem = attributeElements[i].nextSibling; elem; elem = elem.nextSibling) {
-                    if (elem.nodeType !== Node.ELEMENT_NODE)
-                        continue;
-
-                    if (elem.hasStyleClass("webkit-html-attribute-value"))
-                        return this._startEditingAttribute(attributeElements[i].parentNode, elem);
-                }
-            }
-        }
-    },
-
-    _startEditingAttribute: function(attribute, elementForSelection)
-    {
-        if (WebInspector.isBeingEdited(attribute))
-            return true;
-
-        var attributeNameElement = attribute.getElementsByClassName("webkit-html-attribute-name")[0];
-        if (!attributeNameElement)
-            return false;
-
-        var attributeName = attributeNameElement.innerText;
-
-        function removeZeroWidthSpaceRecursive(node)
-        {
-            if (node.nodeType === Node.TEXT_NODE) {
-                node.nodeValue = node.nodeValue.replace(/\u200B/g, "");
-                return;
-            }
-
-            if (node.nodeType !== Node.ELEMENT_NODE)
-                return;
-
-            for (var child = node.firstChild; child; child = child.nextSibling)
-                removeZeroWidthSpaceRecursive(child);
-        }
-
-        // Remove zero-width spaces that were added by nodeTitleInfo.
-        removeZeroWidthSpaceRecursive(attribute);
-
-        this._editing = true;
-
-        WebInspector.startEditing(attribute, this._attributeEditingCommitted.bind(this), this._editingCancelled.bind(this), attributeName);
-        window.getSelection().setBaseAndExtent(elementForSelection, 0, elementForSelection, 1);
-
-        return true;
-    },
-
-    _startEditingTextNode: function(textNode)
-    {
-        if (WebInspector.isBeingEdited(textNode))
-            return true;
-
-        this._editing = true;
-
-        WebInspector.startEditing(textNode, this._textNodeEditingCommitted.bind(this), this._editingCancelled.bind(this));
-        window.getSelection().setBaseAndExtent(textNode, 0, textNode, 1);
-
-        return true;
-    },
-
-    _startEditingAsHTML: function(commitCallback, initialValue)
-    {
-        if (this._htmlEditElement && WebInspector.isBeingEdited(this._htmlEditElement))
-            return true;
-
-        this._editing = true;
-
-        this._htmlEditElement = document.createElement("div");
-        this._htmlEditElement.className = "source-code elements-tree-editor";
-        this._htmlEditElement.textContent = initialValue;
-
-        // Hide header items.
-        var child = this.listItemElement.firstChild;
-        while (child) {
-            child.style.display = "none";
-            child = child.nextSibling;
-        }
-        // Hide children item.
-        if (this._childrenListNode)
-            this._childrenListNode.style.display = "none";
-        // Append editor.
-        this.listItemElement.appendChild(this._htmlEditElement);
-
-        this.updateSelection();
-
-        function commit()
-        {
-            commitCallback(this._htmlEditElement.textContent);
-            dispose.call(this);
-        }
-
-        function dispose()
-        {
-            delete this._editing;
-
-            // Remove editor.
-            this.listItemElement.removeChild(this._htmlEditElement);
-            delete this._htmlEditElement;
-            // Unhide children item.
-            if (this._childrenListNode)
-                this._childrenListNode.style.removeProperty("display");
-            // Unhide header items.
-            var child = this.listItemElement.firstChild;
-            while (child) {
-                child.style.removeProperty("display");
-                child = child.nextSibling;
-            }
-
-            this.updateSelection();
-        }
-
-        WebInspector.startEditing(this._htmlEditElement, commit.bind(this), dispose.bind(this), null, true);
-    },
-
-    _attributeEditingCommitted: function(element, newText, oldText, attributeName, moveDirection)
-    {
-        delete this._editing;
-
-        // Before we do anything, determine where we should move
-        // next based on the current element's settings
-        var moveToAttribute;
-        var newAttribute;
-        if (moveDirection) {
-            var found = false;
-            var attributes = this.representedObject.attributes;
-            for (var i = 0, len = attributes.length; i < len; ++i) {
-                if (attributes[i].name === attributeName) {
-                    found = true;
-                    if (moveDirection === "backward" && i > 0)
-                        moveToAttribute = attributes[i - 1].name;
-                    else if (moveDirection === "forward" && i < attributes.length - 1)
-                        moveToAttribute = attributes[i + 1].name;
-                    else if (moveDirection === "forward" && i === attributes.length - 1)
-                        newAttribute = true;
-                }
-            }
-
-            if (!found && moveDirection === "backward" && attributes.length > 0)
-                moveToAttribute = attributes[attributes.length - 1].name;
-            else if (!found && moveDirection === "forward" && !/^\s*$/.test(newText))
-                newAttribute = true;
-        }
-
-        function moveToNextAttributeIfNeeded() {
-            if (moveToAttribute)
-                this._triggerEditAttribute(moveToAttribute);
-            else if (newAttribute)
-                this._addNewAttribute(this.listItemElement);
-        }
-
-        var parseContainerElement = document.createElement("span");
-        parseContainerElement.innerHTML = "<span " + newText + "></span>";
-        var parseElement = parseContainerElement.firstChild;
-
-        if (!parseElement) {
-            this._editingCancelled(element, attributeName);
-            moveToNextAttributeIfNeeded.call(this);
-            return;
-        }
-
-        if (!parseElement.hasAttributes()) {
-            this.representedObject.removeAttribute(attributeName);
-            moveToNextAttributeIfNeeded.call(this);
-            return;
-        }
-
-        var foundOriginalAttribute = false;
-        for (var i = 0; i < parseElement.attributes.length; ++i) {
-            var attr = parseElement.attributes[i];
-            foundOriginalAttribute = foundOriginalAttribute || attr.name === attributeName;
-            try {
-                this.representedObject.setAttribute(attr.name, attr.value);
-            } catch(e) {} // ignore invalid attribute (innerHTML doesn't throw errors, but this can)
-        }
-
-        if (!foundOriginalAttribute)
-            this.representedObject.removeAttribute(attributeName);
-
-        this.treeOutline.focusedNodeChanged(true);
-
-        moveToNextAttributeIfNeeded.call(this);
-    },
-
-    _textNodeEditingCommitted: function(element, newText)
-    {
-        delete this._editing;
-
-        var textNode;
-        if (this.representedObject.nodeType == Node.ELEMENT_NODE) {
-            // We only show text nodes inline in elements if the element only
-            // has a single child, and that child is a text node.
-            textNode = this.representedObject.firstChild;
-        } else if (this.representedObject.nodeType == Node.TEXT_NODE)
-            textNode = this.representedObject;
-
-        textNode.nodeValue = newText;
-
-        // Need to restore attributes / node structure.
-        this._updateTitle();
-    },
-
-    _editingCancelled: function(element, context)
-    {
-        delete this._editing;
-
-        // Need to restore attributes structure.
-        this._updateTitle();
-    },
-
-    _updateTitle: function()
-    {
-        // If we are editing, return early to prevent canceling the edit.
-        // After editing is committed _updateTitle will be called.
-        if (this._editing)
-            return;
-
-        var self = this;
-        function callback(tooltipText)
-        {
-            var title = self._nodeTitleInfo(self.representedObject, self.hasChildren, WebInspector.linkifyURL, tooltipText).title;
-            self.title = "<span class=\"highlight\">" + title + "</span>";
-            delete self.selectionElement;
-            self.updateSelection();
-            self._preventFollowingLinksOnDoubleClick();
-        };
-
-        // TODO: Replace with InjectedScriptAccess.getBasicProperties(obj, [names]).
-        if (this.representedObject.nodeName.toLowerCase() !== "img")
-            callback();
-        else
-            this.createTooltipForImageNode(this.representedObject, callback);
-    },
-
-    _nodeTitleInfo: function(node, hasChildren, linkify, tooltipText)
-    {
-        var info = {title: "", hasChildren: hasChildren};
-        
-        switch (node.nodeType) {
-            case Node.DOCUMENT_NODE:
-                info.title = "Document";
-                break;
-                
-            case Node.ELEMENT_NODE:
-                info.title = "<span class=\"webkit-html-tag\">&lt;" + node.nodeName.toLowerCase().escapeHTML();
-                
-                if (node.hasAttributes()) {
-                    for (var i = 0; i < node.attributes.length; ++i) {
-                        var attr = node.attributes[i];
-                        info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
-                        
-                        var value = attr.value;
-                        if (linkify && (attr.name === "src" || attr.name === "href")) {
-                            var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
-                            info.title += linkify(attr.value, value, "webkit-html-attribute-value", node.nodeName.toLowerCase() == "a", tooltipText);
-                        } else {
-                            var value = value.escapeHTML();
-                            value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
-                            info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
-                        }
-                        info.title += "\"</span>";
-                    }
-                }
-                info.title += "&gt;</span>&#8203;";
-                
-                // If this element only has a single child that is a text node,
-                // just show that text and the closing tag inline rather than
-                // create a subtree for them
-                
-                var textChild = onlyTextChild.call(node);
-                var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
-                
-                if (showInlineText) {
-                    info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;<span class=\"webkit-html-tag\">&lt;/" + node.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
-                    info.hasChildren = false;
-                }
-                break;
-                
-            case Node.TEXT_NODE:
-                if (isNodeWhitespace.call(node))
-                    info.title = "(whitespace)";
-                else {
-                    if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "script") {
-                        var newNode = document.createElement("span");
-                        newNode.textContent = node.textContent;
-
-                        var javascriptSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(null, null);
-                        javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);
-                        
-                        info.title = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
-                    } else if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "style") {
-                        var newNode = document.createElement("span");
-                        newNode.textContent = node.textContent;
-                        
-                        var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighlighter(null, null);
-                        cssSyntaxHighlighter.syntaxHighlightNode(newNode);
-                        
-                        info.title = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
-                    } else {
-                        info.title = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\""; 
-                    }
-                } 
-                break;
-                
-            case Node.COMMENT_NODE:
-                info.title = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";
-                break;
-                
-            case Node.DOCUMENT_TYPE_NODE:
-                info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;
-                if (node.publicId) {
-                    info.title += " PUBLIC \"" + node.publicId + "\"";
-                    if (node.systemId)
-                        info.title += " \"" + node.systemId + "\"";
-                } else if (node.systemId)
-                    info.title += " SYSTEM \"" + node.systemId + "\"";
-                if (node.internalSubset)
-                    info.title += " [" + node.internalSubset + "]";
-                info.title += "&gt;</span>";
-                break;
-            default:
-                info.title = node.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
-        }
-        
-        return info;
-    },
-
-    _showInlineText: function(node)
-    {
-        if (node.nodeType === Node.ELEMENT_NODE) {
-            var textChild = onlyTextChild.call(node);
-            if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)
-                return true;
-        }
-        return false;
-    },
-    
-    remove: function()
-    {
-        var parentElement = this.parent;
-        if (!parentElement)
-            return;
-
-        var self = this;
-        function removeNodeCallback(removedNodeId)
-        {
-            // -1 is an error code, which means removing the node from the DOM failed,
-            // so we shouldn't remove it from the tree.
-            if (removedNodeId === -1)
-                return;
-
-            parentElement.removeChild(self);
-        }
-
-        var callId = WebInspector.Callback.wrap(removeNodeCallback);
-        InspectorBackend.removeNode(callId, this.representedObject.id);
-    },
-
-    _editAsHTML: function()
-    {
-        var treeOutline = this.treeOutline;
-        var node = this.representedObject;
-        var wasExpanded = this.expanded;
-
-        function selectNode(nodeId)
-        {
-            if (!nodeId)
-                return;
-
-            // Select it and expand if necessary. We force tree update so that it processes dom events and is up to date.
-            WebInspector.panels.elements.updateModifiedNodes();
-
-            WebInspector.updateFocusedNode(nodeId);
-            if (wasExpanded) {
-                var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));
-                if (newTreeItem)
-                    newTreeItem.expand();
-            }
-        }
-
-        function commitChange(value)
-        {
-            InjectedScriptAccess.setOuterHTML(node.id, value, wasExpanded, selectNode.bind(this));
-        }
-
-        InjectedScriptAccess.getNodePropertyValue(node.id, "outerHTML", this._startEditingAsHTML.bind(this, commitChange));
-    },
-
-    _copyHTML: function()
-    {
-        InspectorBackend.copyNode(this.representedObject.id);
-    }
-}
-
-WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.didRemoveNode = WebInspector.Callback.processCallback;
-
-/* SidebarTreeElement.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)
-{
-    TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);
-}
-
-WebInspector.SidebarSectionTreeElement.prototype = {
-    selectable: false,
-
-    get smallChildren()
-    {
-        return this._smallChildren;
-    },
-
-    set smallChildren(x)
-    {
-        if (this._smallChildren === x)
-            return;
-
-        this._smallChildren = x;
-
-        if (this._smallChildren)
-            this._childrenListNode.addStyleClass("small");
-        else
-            this._childrenListNode.removeStyleClass("small");
-    },
-
-    onattach: function()
-    {
-        this._listItemNode.addStyleClass("sidebar-tree-section");
-    },
-
-    onreveal: function()
-    {
-        if (this.listItemElement)
-            this.listItemElement.scrollIntoViewIfNeeded(false);
-    }
-}
-
-WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)
-{
-    TreeElement.call(this, "", representedObject || {}, hasChildren);
-
-    if (hasChildren) {
-        this.disclosureButton = document.createElement("button");
-        this.disclosureButton.className = "disclosure-button";
-    }
-
-    if (!this.iconElement) {
-        this.iconElement = document.createElement("img");
-        this.iconElement.className = "icon";
-    }
-
-    this.statusElement = document.createElement("div");
-    this.statusElement.className = "status";
-
-    this.titlesElement = document.createElement("div");
-    this.titlesElement.className = "titles";
-
-    this.titleElement = document.createElement("span");
-    this.titleElement.className = "title";
-    this.titlesElement.appendChild(this.titleElement);
-
-    this.subtitleElement = document.createElement("span");
-    this.subtitleElement.className = "subtitle";
-    this.titlesElement.appendChild(this.subtitleElement);
-
-    this.className = className;
-    this.mainTitle = title;
-    this.subtitle = subtitle;
-}
-
-WebInspector.SidebarTreeElement.prototype = {
-    get small()
-    {
-        return this._small;
-    },
-
-    set small(x)
-    {
-        this._small = x;
-
-        if (this._listItemNode) {
-            if (this._small)
-                this._listItemNode.addStyleClass("small");
-            else
-                this._listItemNode.removeStyleClass("small");
-        }
-    },
-
-    get mainTitle()
-    {
-        return this._mainTitle;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        this._subtitle = x;
-        this.refreshTitles();
-    },
-
-    get bubbleText()
-    {
-        return this._bubbleText;
-    },
-
-    set bubbleText(x)
-    {
-        if (!this.bubbleElement) {
-            this.bubbleElement = document.createElement("div");
-            this.bubbleElement.className = "bubble";
-            this.statusElement.appendChild(this.bubbleElement);
-        }
-
-        this._bubbleText = x;
-        this.bubbleElement.textContent = x;
-    },
-
-    refreshTitles: function()
-    {
-        var mainTitle = this.mainTitle;
-        if (this.titleElement.textContent !== mainTitle)
-            this.titleElement.textContent = mainTitle;
-
-        var subtitle = this.subtitle;
-        if (subtitle) {
-            if (this.subtitleElement.textContent !== subtitle)
-                this.subtitleElement.textContent = subtitle;
-            this.titlesElement.removeStyleClass("no-subtitle");
-        } else
-            this.titlesElement.addStyleClass("no-subtitle");
-    },
-
-    isEventWithinDisclosureTriangle: function(event)
-    {
-        return event.target === this.disclosureButton;
-    },
-
-    onattach: function()
-    {
-        this._listItemNode.addStyleClass("sidebar-tree-item");
-
-        if (this.className)
-            this._listItemNode.addStyleClass(this.className);
-
-        if (this.small)
-            this._listItemNode.addStyleClass("small");
-
-        if (this.hasChildren && this.disclosureButton)
-            this._listItemNode.appendChild(this.disclosureButton);
-
-        this._listItemNode.appendChild(this.iconElement);
-        this._listItemNode.appendChild(this.statusElement);
-        this._listItemNode.appendChild(this.titlesElement);
-    },
-
-    onreveal: function()
-    {
-        if (this._listItemNode)
-            this._listItemNode.scrollIntoViewIfNeeded(false);
-    }
-}
-
-WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* Section.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Section = function(title, subtitle)
-{
-    this.element = document.createElement("div");
-    this.element.className = "section";
-
-    this.headerElement = document.createElement("div");
-    this.headerElement.className = "header";
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-
-    this.subtitleElement = document.createElement("div");
-    this.subtitleElement.className = "subtitle";
-
-    this.headerElement.appendChild(this.subtitleElement);
-    this.headerElement.appendChild(this.titleElement);
-
-    this.headerElement.addEventListener("click", this.toggleExpanded.bind(this), false);
-    this.element.appendChild(this.headerElement);
-
-    this.title = title;
-    this.subtitle = subtitle;
-    this._expanded = false;
-}
-
-WebInspector.Section.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-
-        if (x instanceof Node) {
-            this.titleElement.removeChildren();
-            this.titleElement.appendChild(x);
-        } else
-          this.titleElement.textContent = x;
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        if (this._subtitle === x)
-            return;
-        this._subtitle = x;
-        this.subtitleElement.innerHTML = x;
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    get populated()
-    {
-        return this._populated;
-    },
-
-    set populated(x)
-    {
-        this._populated = x;
-        if (!x && this.onpopulate && this._expanded) {
-            this.onpopulate(this);
-            this._populated = true;
-        }
-    },
-
-    expand: function()
-    {
-        if (this._expanded)
-            return;
-        this._expanded = true;
-        this.element.addStyleClass("expanded");
-
-        if (!this._populated && this.onpopulate) {
-            this.onpopulate(this);
-            this._populated = true;
-        }
-    },
-
-    collapse: function()
-    {
-        if (!this._expanded)
-            return;
-        this._expanded = false;
-        this.element.removeStyleClass("expanded");
-    },
-
-    toggleExpanded: function()
-    {
-        this.expanded = !this.expanded;
-    }
-}
-
-/* PropertiesSection.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PropertiesSection = function(title, subtitle)
-{
-    WebInspector.Section.call(this, title, subtitle);
-
-    this.propertiesElement = document.createElement("ol");
-    this.propertiesElement.className = "properties source-code";
-    this.propertiesElement.tabIndex = 0;
-    this.propertiesTreeOutline = new TreeOutline(this.propertiesElement);
-    this.propertiesTreeOutline.section = this;
-
-    this.element.appendChild(this.propertiesElement);
-}
-
-WebInspector.PropertiesSection.prototype.__proto__ = WebInspector.Section.prototype;
-
-/* ObjectProxy.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ObjectProxy = function(objectId, path, protoDepth, description, hasChildren)
-{
-    this.objectId = objectId;
-    this.path = path || [];
-    this.protoDepth = protoDepth || 0;
-    this.description = description;
-    this.hasChildren = hasChildren;
-}
-
-WebInspector.ObjectProxy.wrapPrimitiveValue = function(value)
-{
-    var proxy = new WebInspector.ObjectProxy();
-    proxy.type = typeof value;
-    proxy.description = value;
-    return proxy;
-}
-
-WebInspector.ObjectProxy.getPropertiesAsync = function(objectProxy, propertiesToQueryFor, callback)
-{
-    function createPropertiesMapThenCallback(propertiesPayload)
-    {
-        if (!propertiesPayload) {
-            callback();
-            return;
-        }
-
-        var result = [];
-        for (var i = 0; i < propertiesPayload.length; ++i)
-            if (propertiesToQueryFor.indexOf(propertiesPayload[i].name) !== -1)
-                result[propertiesPayload[i].name] = propertiesPayload[i].value.description;
-        callback(result);
-    };
-    InjectedScriptAccess.getProperties(objectProxy, true, false, createPropertiesMapThenCallback);
-}
-
-WebInspector.ObjectPropertyProxy = function(name, value)
-{
-    this.name = name;
-    this.value = value;
-}
-
-/* ObjectPropertiesSection.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ObjectPropertiesSection = function(object, title, subtitle, emptyPlaceholder, ignoreHasOwnProperty, extraProperties, treeElementConstructor)
-{
-    this.emptyPlaceholder = (emptyPlaceholder || WebInspector.UIString("No Properties"));
-    this.object = object;
-    this.ignoreHasOwnProperty = ignoreHasOwnProperty;
-    this.extraProperties = extraProperties;
-    this.treeElementConstructor = treeElementConstructor || WebInspector.ObjectPropertyTreeElement;
-    this.editable = true;
-
-    WebInspector.PropertiesSection.call(this, title, subtitle);
-}
-
-WebInspector.ObjectPropertiesSection.prototype = {
-    onpopulate: function()
-    {
-        this.update();
-    },
-
-    update: function()
-    {
-        var self = this;
-        var callback = function(properties) {
-            if (!properties)
-                return;
-            self.updateProperties(properties);
-        };
-        InjectedScriptAccess.getProperties(this.object, this.ignoreHasOwnProperty, true, callback);
-    },
-
-    updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)
-    {
-        if (!rootTreeElementConstructor)
-            rootTreeElementConstructor = this.treeElementConstructor;
-            
-        if (!rootPropertyComparer)
-            rootPropertyComparer = WebInspector.ObjectPropertiesSection.CompareProperties;
-            
-        if (this.extraProperties)
-            for (var i = 0; i < this.extraProperties.length; ++i)
-                properties.push(this.extraProperties[i]);
-                
-        properties.sort(rootPropertyComparer);
-
-        this.propertiesTreeOutline.removeChildren();
-
-        for (var i = 0; i < properties.length; ++i)
-            this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));
-
-        if (!this.propertiesTreeOutline.children.length) {
-            var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";
-            var infoElement = new TreeElement(title, null, false);
-            this.propertiesTreeOutline.appendChild(infoElement);
-        }
-    }
-}
-
-WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) 
-{
-    var a = propertyA.name;
-    var b = propertyB.name;
-
-    // if used elsewhere make sure to
-    //  - convert a and b to strings (not needed here, properties are all strings)
-    //  - check if a == b (not needed here, no two properties can be the same)
-
-    var diff = 0;
-    var chunk = /^\d+|^\D+/;
-    var chunka, chunkb, anum, bnum;
-    while (diff === 0) {
-        if (!a && b)
-            return -1;
-        if (!b && a)
-            return 1;
-        chunka = a.match(chunk)[0];
-        chunkb = b.match(chunk)[0];
-        anum = !isNaN(chunka);
-        bnum = !isNaN(chunkb);
-        if (anum && !bnum)
-            return -1;
-        if (bnum && !anum)
-            return 1;
-        if (anum && bnum) {
-            diff = chunka - chunkb;
-            if (diff === 0 && chunka.length !== chunkb.length) {
-                if (!+chunka && !+chunkb) // chunks are strings of all 0s (special case)
-                    return chunka.length - chunkb.length;
-                else
-                    return chunkb.length - chunka.length;
-            }
-        } else if (chunka !== chunkb)
-            return (chunka < chunkb) ? -1 : 1;
-        a = a.substring(chunka.length);
-        b = b.substring(chunkb.length);
-    }
-    return diff;
-}
-
-WebInspector.ObjectPropertyTreeElement = function(property)
-{
-    this.property = property;
-
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, false);
-}
-
-WebInspector.ObjectPropertyTreeElement.prototype = {
-    onpopulate: function()
-    {
-        if (this.children.length && !this.shouldRefreshChildren)
-            return;
-
-        var callback = function(properties) {
-            this.removeChildren();
-            if (!properties)
-                return;
-
-            properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);
-            for (var i = 0; i < properties.length; ++i) {
-                this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));
-            }
-        };
-        InjectedScriptAccess.getProperties(this.property.value, false, true, callback.bind(this));
-    },
-
-    ondblclick: function(event)
-    {
-        this.startEditing();
-    },
-
-    onattach: function()
-    {
-        this.update();
-    },
-
-    update: function()
-    {
-        this.nameElement = document.createElement("span");
-        this.nameElement.className = "name";
-        this.nameElement.textContent = this.property.name;
-
-        var separatorElement = document.createElement("span");
-        separatorElement.className = "separator";
-        separatorElement.textContent = ": ";
-        
-        this.valueElement = document.createElement("span");
-        this.valueElement.className = "value";
-        this.valueElement.textContent = this.property.value.description;
-        if (this.property.isGetter)
-           this.valueElement.addStyleClass("dimmed");
-
-        this.listItemElement.removeChildren();
-
-        this.listItemElement.appendChild(this.nameElement);
-        this.listItemElement.appendChild(separatorElement);
-        this.listItemElement.appendChild(this.valueElement);
-        this.hasChildren = this.property.value.hasChildren;
-    },
-
-    updateSiblings: function()
-    {
-        if (this.parent.root)
-            this.treeOutline.section.update();
-        else
-            this.parent.shouldRefreshChildren = true;
-    },
-
-    startEditing: function()
-    {
-        if (WebInspector.isBeingEdited(this.valueElement) || !this.treeOutline.section.editable)
-            return;
-
-        var context = { expanded: this.expanded };
-
-        // Lie about our children to prevent expanding on double click and to collapse subproperties.
-        this.hasChildren = false;
-
-        this.listItemElement.addStyleClass("editing-sub-part");
-
-        WebInspector.startEditing(this.valueElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingEnded: function(context)
-    {
-        this.listItemElement.scrollLeft = 0;
-        this.listItemElement.removeStyleClass("editing-sub-part");
-        if (context.expanded)
-            this.expand();
-    },
-
-    editingCancelled: function(element, context)
-    {
-        this.update();
-        this.editingEnded(context);
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context)
-    {
-        if (userInput === previousContent)
-            return this.editingCancelled(element, context); // nothing changed, so cancel
-
-        this.applyExpression(userInput, true);
-
-        this.editingEnded(context);
-    },
-
-    applyExpression: function(expression, updateInterface)
-    {
-        expression = expression.trimWhitespace();
-        var expressionLength = expression.length;
-        var self = this;
-        var callback = function(success) {
-            if (!updateInterface)
-                return;
-
-            if (!success)
-                self.update();
-
-            if (!expressionLength) {
-                // The property was deleted, so remove this tree element.
-                self.parent.removeChild(this);
-            } else {
-                // Call updateSiblings since their value might be based on the value that just changed.
-                self.updateSiblings();
-            }
-        };
-        InjectedScriptAccess.setPropertyValue(this.property.parentObjectProxy, this.property.name, expression.trimWhitespace(), callback);
-    }
-}
-
-WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* BreakpointsSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.BreakpointsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
-
-    this.breakpoints = {};
-
-    this.listElement = document.createElement("ol");
-    this.listElement.className = "breakpoint-list";
-
-    this.emptyElement = document.createElement("div");
-    this.emptyElement.className = "info";
-    this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
-
-    this.bodyElement.appendChild(this.emptyElement);
-}
-
-WebInspector.BreakpointsSidebarPane.prototype = {
-    addBreakpoint: function(breakpoint)
-    {
-        if (this.breakpoints[breakpoint.id])
-            return;
-
-        this.breakpoints[breakpoint.id] = breakpoint;
-
-        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("text-changed", this._breakpointTextChanged, this);
-
-        this._appendBreakpointElement(breakpoint);
-
-        if (this.emptyElement.parentElement) {
-            this.bodyElement.removeChild(this.emptyElement);
-            this.bodyElement.appendChild(this.listElement);
-        }
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        if (breakpoint.enabled)
-            InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-    },
-
-    _appendBreakpointElement: function(breakpoint)
-    {
-        function checkboxClicked(event)
-        {
-            breakpoint.enabled = !breakpoint.enabled;
-
-            // without this, we'd switch to the source of the clicked breakpoint
-            event.stopPropagation();
-        }
-
-        function breakpointClicked()
-        {
-            var script = WebInspector.panels.scripts.scriptOrResourceForID(breakpoint.sourceID);
-            if (script)
-                WebInspector.panels.scripts.showScript(script, breakpoint.line);
-        }
-
-        var breakpointElement = document.createElement("li");
-        breakpoint._breakpointListElement = breakpointElement;
-        breakpointElement._breakpointObject = breakpoint;
-        breakpointElement.addEventListener("click", breakpointClicked, false);
-
-        var checkboxElement = document.createElement("input");
-        checkboxElement.className = "checkbox-elem";
-        checkboxElement.type = "checkbox";
-        checkboxElement.checked = breakpoint.enabled;
-        checkboxElement.addEventListener("click", checkboxClicked, false);
-        breakpointElement.appendChild(checkboxElement);
-
-        var labelElement = document.createTextNode(breakpoint.label);
-        breakpointElement.appendChild(labelElement);
-
-        var sourceTextElement = document.createElement("div");
-        sourceTextElement.textContent = breakpoint.sourceText;
-        sourceTextElement.className = "source-text";
-        breakpointElement.appendChild(sourceTextElement);
-
-        var currentElement = this.listElement.firstChild;
-        while (currentElement) {
-            var currentBreak = currentElement._breakpointObject;
-            if (currentBreak.url > breakpoint.url) {
-                this.listElement.insertBefore(breakpointElement, currentElement);
-                return;
-            } else if (currentBreak.url == breakpoint.url && currentBreak.line > breakpoint.line) {
-                this.listElement.insertBefore(breakpointElement, currentElement);
-                return;
-            }
-            currentElement = currentElement.nextSibling;
-        }
-        this.listElement.appendChild(breakpointElement);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        if (!this.breakpoints[breakpoint.id])
-            return;
-        delete this.breakpoints[breakpoint.id];
-
-        breakpoint.removeEventListener("enabled", null, this);
-        breakpoint.removeEventListener("disabled", null, this);
-        breakpoint.removeEventListener("text-changed", null, this);
-
-        var element = breakpoint._breakpointListElement;
-        element.parentElement.removeChild(element);
-
-        if (!this.listElement.firstChild) {
-            this.bodyElement.removeChild(this.listElement);
-            this.bodyElement.appendChild(this.emptyElement);
-        }
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
-    },
-
-    _breakpointEnableChanged: function(event)
-    {
-        var breakpoint = event.target;
-
-        var checkbox = breakpoint._breakpointListElement.firstChild;
-        checkbox.checked = breakpoint.enabled;
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        if (breakpoint.enabled)
-            InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-        else
-            InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
-    },
-
-    _breakpointTextChanged: function(event)
-    {
-        var breakpoint = event.target;
-
-        var sourceTextElement = breakpoint._breakpointListElement.firstChild.nextSibling.nextSibling;
-        sourceTextElement.textContent = breakpoint.sourceText;
-    }
-}
-
-WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* CallStackSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CallStackSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
-    
-    this._shortcuts = {};
-
-    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Period,
-                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = this._selectNextCallFrameOnStack.bind(this);
-
-    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Comma,
-                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = this._selectPreviousCallFrameOnStack.bind(this);
-}
-
-WebInspector.CallStackSidebarPane.prototype = {
-    update: function(callFrames, sourceIDMap)
-    {
-        this.bodyElement.removeChildren();
-
-        this.placards = [];
-        delete this._selectedCallFrame;
-
-        if (!callFrames) {
-            var infoElement = document.createElement("div");
-            infoElement.className = "info";
-            infoElement.textContent = WebInspector.UIString("Not Paused");
-            this.bodyElement.appendChild(infoElement);
-            return;
-        }
-
-        var title;
-        var subtitle;
-        var scriptOrResource;
-
-        for (var i = 0; i < callFrames.length; ++i) {
-            var callFrame = callFrames[i];
-            switch (callFrame.type) {
-            case "function":
-                title = callFrame.functionName || WebInspector.UIString("(anonymous function)");
-                break;
-            case "program":
-                title = WebInspector.UIString("(program)");
-                break;
-            }
-
-            scriptOrResource = sourceIDMap[callFrame.sourceID];
-            subtitle = WebInspector.displayNameForURL(scriptOrResource.sourceURL || scriptOrResource.url);
-
-            if (callFrame.line > 0) {
-                if (subtitle)
-                    subtitle += ":" + callFrame.line;
-                else
-                    subtitle = WebInspector.UIString("line %d", callFrame.line);
-            }
-
-            var placard = new WebInspector.Placard(title, subtitle);
-            placard.callFrame = callFrame;
-
-            placard.element.addEventListener("click", this._placardSelected.bind(this), false);
-
-            this.placards.push(placard);
-            this.bodyElement.appendChild(placard.element);
-        }
-    },
-
-    get selectedCallFrame()
-    {
-        return this._selectedCallFrame;
-    },
-
-    set selectedCallFrame(x)
-    {
-        if (this._selectedCallFrame === x)
-            return;
-
-        this._selectedCallFrame = x;
-
-        for (var i = 0; i < this.placards.length; ++i) {
-            var placard = this.placards[i];
-            placard.selected = (placard.callFrame === this._selectedCallFrame);
-        }
-
-        this.dispatchEventToListeners("call frame selected");
-    },
-
-    handleShortcut: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.handled = true;
-        }
-    },
-
-    _selectNextCallFrameOnStack: function()
-    {
-        var index = this._selectedCallFrameIndex();
-        if (index == -1)
-            return;
-        this._selectedPlacardByIndex(index + 1);
-    },
-
-    _selectPreviousCallFrameOnStack: function()
-    {
-        var index = this._selectedCallFrameIndex();
-        if (index == -1)
-            return;
-        this._selectedPlacardByIndex(index - 1);
-    },
-
-    _selectedPlacardByIndex: function(index)
-    {
-        if (index < 0 || index >= this.placards.length)
-            return;
-        var placard = this.placards[index];
-        this.selectedCallFrame = placard.callFrame
-    },
-
-    _selectedCallFrameIndex: function()
-    {
-        if (!this._selectedCallFrame)
-            return -1;
-        for (var i = 0; i < this.placards.length; ++i) {
-            var placard = this.placards[i];
-            if (placard.callFrame === this._selectedCallFrame)
-                return i;
-        }
-        return -1;
-    },
-
-    _placardSelected: function(event)
-    {
-        var placardElement = event.target.enclosingNodeOrSelfWithClass("placard");
-        this.selectedCallFrame = placardElement.placard.callFrame;
-    }
-}
-
-WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* ScopeChainSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScopeChainSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Scope Variables"));
-    this._expandedProperties = [];
-}
-
-WebInspector.ScopeChainSidebarPane.prototype = {
-    update: function(callFrame)
-    {
-        this.bodyElement.removeChildren();
-
-        this.sections = [];
-        this.callFrame = callFrame;
-
-        if (!callFrame) {
-            var infoElement = document.createElement("div");
-            infoElement.className = "info";
-            infoElement.textContent = WebInspector.UIString("Not Paused");
-            this.bodyElement.appendChild(infoElement);
-            return;
-        }
-
-        var foundLocalScope = false;
-        var scopeChain = callFrame.scopeChain;
-        for (var i = 0; i < scopeChain.length; ++i) {
-            var scopeObjectProxy = scopeChain[i];
-            var title = null;
-            var subtitle = scopeObjectProxy.description;
-            var emptyPlaceholder = null;
-            var extraProperties = null;
-
-            if (scopeObjectProxy.isLocal) {
-                foundLocalScope = true;
-                title = WebInspector.UIString("Local");
-                emptyPlaceholder = WebInspector.UIString("No Variables");
-                subtitle = null;
-                if (scopeObjectProxy.thisObject)
-                    extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
-            } else if (scopeObjectProxy.isClosure) {
-                title = WebInspector.UIString("Closure");
-                emptyPlaceholder = WebInspector.UIString("No Variables");
-                subtitle = null;
-            } else if (i === (scopeChain.length - 1))
-                title = WebInspector.UIString("Global");
-            else if (scopeObjectProxy.isElement)
-                title = WebInspector.UIString("Event Target");
-            else if (scopeObjectProxy.isDocument)
-                title = WebInspector.UIString("Event Document");
-            else if (scopeObjectProxy.isWithBlock)
-                title = WebInspector.UIString("With Block");
-
-            if (!title || title === subtitle)
-                subtitle = null;
-
-            var section = new WebInspector.ObjectPropertiesSection(scopeObjectProxy, title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
-            section.editInSelectedCallFrameWhenPaused = true;
-            section.pane = this;
-
-            if (!foundLocalScope || scopeObjectProxy.isLocal)
-                section.expanded = true;
-
-            this.sections.push(section);
-            this.bodyElement.appendChild(section.element);
-        }
-    }
-}
-
-WebInspector.ScopeChainSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.ScopeVariableTreeElement = function(property)
-{
-    WebInspector.ObjectPropertyTreeElement.call(this, property);
-}
-
-WebInspector.ScopeVariableTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);
-        if (this.hasChildren && this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)
-            this.expand();
-    },
-
-    onexpand: function()
-    {
-        this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier] = true;
-    },
-
-    oncollapse: function()
-    {
-        delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];
-    },
-
-    get propertyIdentifier()
-    {
-        if ("_propertyIdentifier" in this)
-            return this._propertyIdentifier;
-        var section = this.treeOutline.section;
-        this._propertyIdentifier = section.title + ":" + (section.subtitle ? section.subtitle + ":" : "") + this.propertyPath;
-        return this._propertyIdentifier;
-    },
-
-    get propertyPath()
-    {
-        if ("_propertyPath" in this)
-            return this._propertyPath;
-
-        var current = this;
-        var result;
-
-        do {
-            if (result)
-                result = current.property.name + "." + result;
-            else
-                result = current.property.name;
-            current = current.parent;
-        } while (current && !current.root);
-
-        this._propertyPath = result;
-        return result;
-    }
-}
-
-WebInspector.ScopeVariableTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
-
-/* WatchExpressionsSidebarPane.js */
-
-/*
- * Copyright (C) IBM Corp. 2009  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of IBM Corp. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.WatchExpressionsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-}
-
-WebInspector.WatchExpressionsSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        this.expanded = WebInspector.settings.watchExpressions.length > 0;
-        this.section = new WebInspector.WatchExpressionsSection();
-        this.bodyElement.appendChild(this.section.element);
-
-        var addElement = document.createElement("button");
-        addElement.setAttribute("type", "button");
-        addElement.textContent = WebInspector.UIString("Add");
-        addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);
-
-        var refreshElement = document.createElement("button");
-        refreshElement.setAttribute("type", "button");
-        refreshElement.textContent = WebInspector.UIString("Refresh");
-        refreshElement.addEventListener("click", this.section.update.bind(this.section), false);
-
-        var centerElement = document.createElement("div");
-        centerElement.addStyleClass("watch-expressions-buttons-container");
-        centerElement.appendChild(addElement);
-        centerElement.appendChild(refreshElement);
-        this.bodyElement.appendChild(centerElement);
-
-        this.onexpand = this.refreshExpressions.bind(this);
-    },
-
-    refreshExpressions: function()
-    {
-        if (this.section)
-            this.section.update();
-    }
-}
-
-WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.WatchExpressionsSection = function()
-{
-    this._watchObjectGroupId = "watch-group";
-
-    WebInspector.ObjectPropertiesSection.call(this);
-
-    this.watchExpressions = WebInspector.settings.watchExpressions;
-
-    this.headerElement.className = "hidden";
-    this.editable = true;
-    this.expanded = true;
-    this.propertiesElement.addStyleClass("watch-expressions");
-}
-
-WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
-
-WebInspector.WatchExpressionsSection.prototype = {
-    update: function()
-    {
-        function appendResult(expression, watchIndex, result, exception)
-        {
-            if (exception) {
-                // Exception results are not wrappers, but text messages.
-                result = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
-            } else if (result.type === "string") {
-                // Evaluation result is intentionally not abbreviated. However, we'd like to distinguish between null and "null"
-                result.description = "\"" + result.description + "\"";
-            }
-
-            var property = new WebInspector.ObjectPropertyProxy(expression, result);
-            property.watchIndex = watchIndex;
-            property.isException = exception;
-
-            // For newly added, empty expressions, set description to "",
-            // since otherwise you get DOMWindow
-            if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) 
-                property.value.description = "";
-
-            // To clarify what's going on here: 
-            // In the outer function, we calculate the number of properties
-            // that we're going to be updating, and set that in the
-            // propertyCount variable.  
-            // In this function, we test to see when we are processing the 
-            // last property, and then call the superclass's updateProperties() 
-            // method to get all the properties refreshed at once.
-            properties.push(property);
-            
-            if (properties.length == propertyCount) {
-                this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
-
-                // check to see if we just added a new watch expression,
-                // which will always be the last property
-                if (this._newExpressionAdded) {
-                    delete this._newExpressionAdded;
-
-                    treeElement = this.findAddedTreeElement();
-                    if (treeElement)
-                        treeElement.startEditing();
-                }
-            }
-        }
-
-        InspectorBackend.releaseWrapperObjectGroup(this._watchObjectGroupId)
-        var properties = [];
-
-        // Count the properties, so we known when to call this.updateProperties()
-        // in appendResult()
-        var propertyCount = 0;
-        for (var i = 0; i < this.watchExpressions.length; ++i) {
-            if (!this.watchExpressions[i]) 
-                continue;
-            ++propertyCount;
-        }
-
-        // Now process all the expressions, since we have the actual count,
-        // which is checked in the appendResult inner function.
-        for (var i = 0; i < this.watchExpressions.length; ++i) {
-            var expression = this.watchExpressions[i];
-            if (!expression)
-                continue;
-
-            WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));
-        }
-
-        // note this is setting the expansion of the tree, not the section;
-        // with no expressions, and expanded tree, we get some extra vertical
-        // white space
-        // FIXME: should change to use header buttons instead of the buttons
-        // at the bottom of the section, then we can add a "No Watch Expressions
-        // element when there are no watch expressions, and this issue should
-        // go away.
-        this.expanded = (propertyCount != 0);
-    },
-
-    addExpression: function()
-    {
-        this._newExpressionAdded = true;
-        this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);
-        this.update();
-    },
-
-    updateExpression: function(element, value)
-    {
-        this.watchExpressions[element.property.watchIndex] = value;
-        this.saveExpressions();
-        this.update();
-    },
-
-    findAddedTreeElement: function()
-    {
-        var children = this.propertiesTreeOutline.children;
-        for (var i = 0; i < children.length; ++i)
-            if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
-                return children[i];
-    },
-
-    saveExpressions: function()
-    {
-        var toSave = [];
-        for (var i = 0; i < this.watchExpressions.length; i++)
-            if (this.watchExpressions[i])
-                toSave.push(this.watchExpressions[i]);
-
-        WebInspector.settings.watchExpressions = toSave;
-        return toSave.length;
-    }
-}
-
-WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
-
-WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) 
-{
-    if (propertyA.watchIndex == propertyB.watchIndex)
-        return 0;
-    else if (propertyA.watchIndex < propertyB.watchIndex)
-        return -1;
-    else
-        return 1;
-}
-
-WebInspector.WatchExpressionTreeElement = function(property)
-{
-    WebInspector.ObjectPropertyTreeElement.call(this, property);
-}
-
-WebInspector.WatchExpressionTreeElement.prototype = {
-    update: function()
-    {
-        WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
-
-        if (this.property.isException)
-            this.valueElement.addStyleClass("watch-expressions-error-level");
-
-        var deleteButton = document.createElement("input");
-        deleteButton.type = "button";
-        deleteButton.title = WebInspector.UIString("Delete watch expression.");
-        deleteButton.addStyleClass("enabled-button");
-        deleteButton.addStyleClass("delete-button");
-        deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-        this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);
-    },
-
-    _deleteButtonClicked: function()
-    {
-        this.treeOutline.section.updateExpression(this, null);
-    },
-
-    startEditing: function()
-    {
-        if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)
-            return;
-
-        this.nameElement.textContent = this.property.name.trimWhitespace();
-
-        var context = { expanded: this.expanded };
-
-        // collapse temporarily, if required
-        this.hasChildren = false;
-
-        this.listItemElement.addStyleClass("editing-sub-part");
-
-        WebInspector.startEditing(this.nameElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingCancelled: function(element, context)
-    {
-        if (!this.nameElement.textContent)
-            this.treeOutline.section.updateExpression(this, null);
-            
-        this.update();
-        this.editingEnded(context);
-    },
-
-    applyExpression: function(expression, updateInterface)
-    {
-        expression = expression.trimWhitespace();
-
-        if (!expression)
-            expression = null;
-
-        this.property.name = expression;
-        this.treeOutline.section.updateExpression(this, expression);
-    }
-}
-
-WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
-
-/* MetricsSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.MetricsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));
-    this._inlineStyleId = null;
-}
-
-WebInspector.MetricsSidebarPane.prototype = {
-    update: function(node)
-    {
-        if (node)
-            this.node = node;
-        else
-            node = this.node;
-
-        if (!node || !node.ownerDocument.defaultView || node.nodeType !== Node.ELEMENT_NODE) {
-            this.bodyElement.removeChildren();
-            return;
-        }
-
-        var self = this;
-        var callback = function(stylePayload) {
-            if (!stylePayload)
-                return;
-            var style = WebInspector.CSSStyleDeclaration.parseStyle(stylePayload);
-            self._update(style);
-        };
-        InjectedScriptAccess.getComputedStyle(node.id, callback);
-
-        var inlineStyleCallback = function(stylePayload) {
-            if (!stylePayload)
-                return;
-            self._inlineStyleId = stylePayload.id;
-        };
-        InjectedScriptAccess.getInlineStyle(node.id, inlineStyleCallback);
-    },
-
-    _update: function(style)
-    {
-        var metricsElement = document.createElement("div");
-        metricsElement.className = "metrics";
-
-        function createBoxPartElement(style, name, side, suffix)
-        {
-            var propertyName = (name !== "position" ? name + "-" : "") + side + suffix;
-            var value = style.getPropertyValue(propertyName);
-            if (value === "" || (name !== "position" && value === "0px"))
-                value = "\u2012";
-            else if (name === "position" && value === "auto")
-                value = "\u2012";
-            value = value.replace(/px$/, "");
-
-            var element = document.createElement("div");
-            element.className = side;
-            element.textContent = value;
-            element.addEventListener("dblclick", this.startEditing.bind(this, element, name, propertyName), false);
-            return element;
-        }
-
-        // Display types for which margin is ignored.
-        var noMarginDisplayType = {
-            "table-cell": true,
-            "table-column": true,
-            "table-column-group": true,
-            "table-footer-group": true,
-            "table-header-group": true,
-            "table-row": true,
-            "table-row-group": true
-        };
-
-        // Display types for which padding is ignored.
-        var noPaddingDisplayType = {
-            "table-column": true,
-            "table-column-group": true,
-            "table-footer-group": true,
-            "table-header-group": true,
-            "table-row": true,
-            "table-row-group": true
-        };
-
-        // Position types for which top, left, bottom and right are ignored.
-        var noPositionType = {
-            "static": true
-        };
-
-        var boxes = ["content", "padding", "border", "margin", "position"];
-        var boxLabels = [WebInspector.UIString("content"), WebInspector.UIString("padding"), WebInspector.UIString("border"), WebInspector.UIString("margin"), WebInspector.UIString("position")];
-        var previousBox;
-        for (var i = 0; i < boxes.length; ++i) {
-            var name = boxes[i];
-
-            if (name === "margin" && noMarginDisplayType[style.display])
-                continue;
-            if (name === "padding" && noPaddingDisplayType[style.display])
-                continue;
-            if (name === "position" && noPositionType[style.position])
-                continue;
-
-            var boxElement = document.createElement("div");
-            boxElement.className = name;
-
-            if (name === "content") {
-                var width = style.width.replace(/px$/, "");
-                var widthElement = document.createElement("span");
-                widthElement.textContent = width;
-                widthElement.addEventListener("dblclick", this.startEditing.bind(this, widthElement, "width", "width"), false);
-
-                var height = style.height.replace(/px$/, "");
-                var heightElement = document.createElement("span");
-                heightElement.textContent = height;
-                heightElement.addEventListener("dblclick", this.startEditing.bind(this, heightElement, "height", "height"), false);
-
-                boxElement.appendChild(widthElement);
-                boxElement.appendChild(document.createTextNode(" \u00D7 "));
-                boxElement.appendChild(heightElement);
-            } else {
-                var suffix = (name === "border" ? "-width" : "");
-
-                var labelElement = document.createElement("div");
-                labelElement.className = "label";
-                labelElement.textContent = boxLabels[i];
-                boxElement.appendChild(labelElement);
-
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "top", suffix));
-                boxElement.appendChild(document.createElement("br"));
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "left", suffix));
-
-                if (previousBox)
-                    boxElement.appendChild(previousBox);
-
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "right", suffix));
-                boxElement.appendChild(document.createElement("br"));
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "bottom", suffix));
-            }
-
-            previousBox = boxElement;
-        }
-
-        metricsElement.appendChild(previousBox);
-        this.bodyElement.removeChildren();
-        this.bodyElement.appendChild(metricsElement);
-    },
-
-    startEditing: function(targetElement, box, styleProperty)
-    {
-        if (WebInspector.isBeingEdited(targetElement))
-            return;
-
-        var context = { box: box, styleProperty: styleProperty };
-
-        WebInspector.startEditing(targetElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingCancelled: function(element, context)
-    {
-        this.update();
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context)
-    {
-        if (userInput === previousContent)
-            return this.editingCancelled(element, context); // nothing changed, so cancel
-
-        if (context.box !== "position" && (!userInput || userInput === "\u2012"))
-            userInput = "0px";
-        else if (context.box === "position" && (!userInput || userInput === "\u2012"))
-            userInput = "auto";
-
-        // Append a "px" unit if the user input was just a number.
-        if (/^\d+$/.test(userInput))
-            userInput += "px";
-
-        var self = this;
-        var callback = function(success) {
-            if (!success)
-                return;
-            self.dispatchEventToListeners("metrics edited");
-            self.update();
-        };
-        InjectedScriptAccess.setStyleProperty(this._inlineStyleId, context.styleProperty, userInput, callback);
-    }
-}
-
-WebInspector.MetricsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* PropertiesSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PropertiesSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Properties"));
-}
-
-WebInspector.PropertiesSidebarPane.prototype = {
-    update: function(node)
-    {
-        var body = this.bodyElement;
-
-        if (!node) {
-            body.removeChildren();
-            this.sections = [];
-            return;
-        }
-
-        var self = this;
-        var callback = function(prototypes) {
-            var body = self.bodyElement;
-            body.removeChildren();
-            self.sections = [];
-
-            // Get array of prototype user-friendly names.
-            for (var i = 0; i < prototypes.length; ++i) {
-                var prototype = new WebInspector.ObjectProxy(node.id, [], i);
-                var section = new WebInspector.ObjectPropertiesSection(prototype, prototypes[i], WebInspector.UIString("Prototype"));
-                self.sections.push(section);
-                body.appendChild(section.element);
-            }
-        };
-        InjectedScriptAccess.getPrototypes(node.id, callback);
-    }
-}
-
-WebInspector.PropertiesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* EventListenersSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.EventListenersSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners"));
-    this.bodyElement.addStyleClass("events-pane");
-
-    this.sections = [];
-
-    this.settingsSelectElement = document.createElement("select");
-
-    var option = document.createElement("option");
-    option.value = "all";
-    option.label = WebInspector.UIString("All Nodes");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "selected";
-    option.label = WebInspector.UIString("Selected Node Only");
-    this.settingsSelectElement.appendChild(option);
-
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
-    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
-
-    this.titleElement.appendChild(this.settingsSelectElement);
-}
-
-WebInspector.EventListenersSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        var filter = WebInspector.settings.eventListenersFilter;
-        if (filter === "all")
-            this.settingsSelectElement[0].selected = true;
-        if (filter === "selected")
-            this.settingsSelectElement[1].selected = true;
-    },
-
-    update: function(node)
-    {
-        var body = this.bodyElement;
-        body.removeChildren();
-        this.sections = [];
-
-        var self = this;
-        function callback(nodeId, eventListeners) {
-            var sectionNames = [];
-            var sectionMap = {};
-            for (var i = 0; i < eventListeners.length; ++i) {
-                var eventListener = eventListeners[i];
-                eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);
-                delete eventListener.nodeId; // no longer needed
-                if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString()))
-                    continue; // ignore event listeners generated by monitorEvent
-                var type = eventListener.type;
-                var section = sectionMap[type];
-                if (!section) {
-                    section = new WebInspector.EventListenersSection(type, nodeId);
-                    sectionMap[type] = section;
-                    sectionNames.push(type);
-                    self.sections.push(section);
-                }
-                section.addListener(eventListener);
-            }
-            
-            if (sectionNames.length === 0) {
-                var div = document.createElement("div");
-                div.className = "info";
-                div.textContent = WebInspector.UIString("No Event Listeners");
-                body.appendChild(div);
-                return;
-            }
-
-            sectionNames.sort();
-            for (var i = 0; i < sectionNames.length; ++i) {
-                var section = sectionMap[sectionNames[i]];
-                section.update();
-                body.appendChild(section.element);
-            }
-        }
-
-        WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback);
-    },
-
-    _changeSetting: function(event)
-    {
-        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
-        WebInspector.settings.eventListenersFilter = selectedOption.value;
-
-        for (var i = 0; i < this.sections.length; ++i)
-            this.sections[i].update();
-    }
-}
-
-WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.EventListenersSection = function(title, nodeId)
-{
-    this.eventListeners = [];
-    this._nodeId = nodeId;
-    WebInspector.PropertiesSection.call(this, title);
-
-    // Changed from a Properties List
-    this.propertiesElement.parentNode.removeChild(this.propertiesElement);
-    delete this.propertiesElement;
-    delete this.propertiesTreeOutline;
-
-    this.eventBars = document.createElement("div");
-    this.eventBars.className = "event-bars";
-    this.element.appendChild(this.eventBars);
-}
-
-WebInspector.EventListenersSection.prototype = {
-    update: function()
-    {
-        // A Filtered Array simplifies when to create connectors
-        var filteredEventListeners = this.eventListeners;
-        if (WebInspector.settings.eventListenersFilter === "selected") {
-            filteredEventListeners = [];
-            for (var i = 0; i < this.eventListeners.length; ++i) {
-                var eventListener = this.eventListeners[i];
-                if (eventListener.node.id === this._nodeId)
-                    filteredEventListeners.push(eventListener);
-            }
-        }
-
-        this.eventBars.removeChildren();
-        var length = filteredEventListeners.length;
-        for (var i = 0; i < length; ++i) {
-            var eventListener = filteredEventListeners[i];
-            var eventListenerBar = new WebInspector.EventListenerBar(eventListener);
-            if (i < length - 1) {
-                var connector = document.createElement("div");
-                connector.className = "event-bar-connector";
-                eventListenerBar.element.appendChild(connector);
-            }
-
-            this.eventBars.appendChild(eventListenerBar.element);
-        }
-    },
-
-    addListener: function(eventListener)
-    {
-        this.eventListeners.push(eventListener);
-    }
-}
-
-WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.EventListenerBar = function(eventListener)
-{
-    this.eventListener = eventListener;
-    WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName());
-    this.editable = false;
-    this.element.className = "event-bar"; /* Changed from "section" */
-    this.propertiesElement.className = "event-properties"; /* Changed from "properties" */
-}
-
-WebInspector.EventListenerBar.prototype = {
-    update: function()
-    {
-        var properties = [];
-        for (var propertyName in this.eventListener) {
-            // Just build properties in place - no need to reach out for injected script.
-            var value = this.eventListener[propertyName];
-            if (value instanceof WebInspector.DOMNode)
-                value = new WebInspector.ObjectProxy(value.id, [], 0, appropriateSelectorForNode(value), true);
-            else
-                value = WebInspector.ObjectProxy.wrapPrimitiveValue(value);
-            properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value));
-        }
-        this.updateProperties(properties);
-    },
-
-    _getNodeDisplayName: function()
-    {
-        var node = this.eventListener.node;
-        if (!node)
-            return "";
-
-        if (node.nodeType === Node.DOCUMENT_NODE)
-            return "document";
-
-        return appropriateSelectorForNode(node);
-    },
-
-    _getFunctionDisplayName: function()
-    {
-        // Requires that Function.toString() return at least the function's signature.
-        var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/);
-        return (match ? match[1] : WebInspector.UIString("(anonymous function)"));
-    }
-}
-
-WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
-
-/* Color.js */
-
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Color = function(str)
-{
-    this.value = str;
-    this._parse();
-}
-
-WebInspector.Color.prototype = {
-    get shorthex()
-    {
-        if ("_short" in this)
-            return this._short;
-
-        if (!this.simple)
-            return null;
-
-        var hex = this.hex;
-        if (hex.charAt(0) === hex.charAt(1) && hex.charAt(2) === hex.charAt(3) && hex.charAt(4) === hex.charAt(5))
-            this._short = hex.charAt(0) + hex.charAt(2) + hex.charAt(4);
-        else
-            this._short = hex;
-
-        return this._short;
-    },
-
-    get hex()
-    {
-        if (!this.simple)
-            return null;
-
-        return this._hex;
-    },
-
-    set hex(x)
-    {
-        this._hex = x;
-    },
-
-    get rgb()
-    {
-        if ("_rgb" in this)
-            return this._rgb;
-
-        if (this.simple)
-            this._rgb = this._hexToRGB(this.hex);
-        else {
-            var rgba = this.rgba;
-            this._rgb = [rgba[0], rgba[1], rgba[2]];
-        }
-
-        return this._rgb;
-    },
-
-    set rgb(x)
-    {
-        this._rgb = x;
-    },
-
-    get hsl()
-    {
-        if ("_hsl" in this)
-            return this._hsl;
-
-        this._hsl = this._rgbToHSL(this.rgb);
-        return this._hsl;
-    },
-
-    set hsl(x)
-    {
-        this._hsl = x;
-    },
-
-    get nickname()
-    {
-        if (typeof this._nickname !== "undefined") // would be set on parse if there was a nickname
-            return this._nickname;
-        else
-            return null;
-    },
-
-    set nickname(x)
-    {
-        this._nickname = x;
-    },
-
-    get rgba()
-    {
-        return this._rgba;
-    },
-
-    set rgba(x)
-    {
-        this._rgba = x;
-    },
-
-    get hsla()
-    {
-        return this._hsla;
-    },
-
-    set hsla(x)
-    {
-        this._hsla = x;
-    },
-
-    hasShortHex: function()
-    {
-        var shorthex = this.shorthex;
-        return (shorthex && shorthex.length === 3);
-    },
-
-    toString: function(format)
-    {
-        if (!format)
-            format = this.format;
-
-        switch (format) {
-            case "rgb":
-                return "rgb(" + this.rgb.join(", ") + ")";
-            case "rgba":
-                return "rgba(" + this.rgba.join(", ") + ")";
-            case "hsl":
-                var hsl = this.hsl;
-                return "hsl(" + hsl[0] + ", " + hsl[1] + "%, " + hsl[2] + "%)";
-            case "hsla":
-                var hsla = this.hsla;
-                return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
-            case "hex":
-                return "#" + this.hex;
-            case "shorthex":
-                return "#" + this.shorthex;
-            case "nickname":
-                return this.nickname;
-        }
-
-        throw "invalid color format";
-    },
-
-    _rgbToHex: function(rgb)
-    {
-        var r = parseInt(rgb[0]).toString(16);
-        var g = parseInt(rgb[1]).toString(16);
-        var b = parseInt(rgb[2]).toString(16);
-        if (r.length === 1)
-            r = "0" + r;
-        if (g.length === 1)
-            g = "0" + g;
-        if (b.length === 1)
-            b = "0" + b;
-
-        return (r + g + b).toUpperCase();
-    },
-
-    _hexToRGB: function(hex)
-    {
-        var r = parseInt(hex.substring(0,2), 16);
-        var g = parseInt(hex.substring(2,4), 16);
-        var b = parseInt(hex.substring(4,6), 16);
-
-        return [r, g, b];
-    },
-
-    _rgbToHSL: function(rgb)
-    {
-        var r = parseInt(rgb[0]) / 255;
-        var g = parseInt(rgb[1]) / 255;
-        var b = parseInt(rgb[2]) / 255;
-        var max = Math.max(r, g, b);
-        var min = Math.min(r, g, b);
-        var diff = max - min;
-        var add = max + min;
-
-        if (min === max)
-            var h = 0;
-        else if (r === max)
-            var h = ((60 * (g - b) / diff) + 360) % 360;
-        else if (g === max)
-            var h = (60 * (b - r) / diff) + 120;
-        else
-            var h = (60 * (r - g) / diff) + 240;
-
-        var l = 0.5 * add;
-
-        if (l === 0)
-            var s = 0;
-        else if (l === 1)
-            var s = 1;
-        else if (l <= 0.5)
-            var s = diff / add;
-        else
-            var s = diff / (2 - add);
-
-        h = Math.round(h);
-        s = Math.round(s*100);
-        l = Math.round(l*100);
-
-        return [h, s, l];
-    },
-
-    _hslToRGB: function(hsl)
-    {
-        var h = parseFloat(hsl[0]) / 360;
-        var s = parseFloat(hsl[1]) / 100;
-        var l = parseFloat(hsl[2]) / 100;
-
-        if (l <= 0.5)
-            var q = l * (1 + s);
-        else
-            var q = l + s - (l * s);
-
-        var p = 2 * l - q;
-
-        var tr = h + (1 / 3);
-        var tg = h;
-        var tb = h - (1 / 3);
-
-        var r = Math.round(hueToRGB(p, q, tr) * 255);
-        var g = Math.round(hueToRGB(p, q, tg) * 255);
-        var b = Math.round(hueToRGB(p, q, tb) * 255);
-        return [r, g, b];
-
-        function hueToRGB(p, q, h) {
-            if (h < 0)
-                h += 1;
-            else if (h > 1)
-                h -= 1;
-
-            if ((h * 6) < 1)
-                return p + (q - p) * h * 6;
-            else if ((h * 2) < 1)
-                return q;
-            else if ((h * 3) < 2)
-                return p + (q - p) * ((2 / 3) - h) * 6;
-            else
-                return p;
-        }
-    },
-
-    _rgbaToHSLA: function(rgba)
-    {
-        var alpha = rgba[3];
-        var hsl = this._rgbToHSL(rgba)
-        hsl.push(alpha);
-        return hsl;
-    },
-
-    _hslaToRGBA: function(hsla)
-    {
-        var alpha = hsla[3];
-        var rgb = this._hslToRGB(hsla);
-        rgb.push(alpha);
-        return rgb;
-    },
-
-    _parse: function()
-    {
-        // Special Values - Advanced but Must Be Parsed First - transparent
-        var value = this.value.toLowerCase().replace(/%|\s+/g, "");
-        if (value in WebInspector.Color.AdvancedNickNames) {
-            this.format = "nickname";
-            var set = WebInspector.Color.AdvancedNickNames[value];
-            this.simple = false;
-            this.rgba = set[0];
-            this.hsla = set[1];
-            this.nickname = set[2];
-            this.alpha = set[0][3];
-            return;
-        }
-
-        // Simple - #hex, rgb(), nickname, hsl()
-        var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;
-        var match = this.value.match(simple);
-        if (match) {
-            this.simple = true;
-
-            if (match[1]) { // hex
-                var hex = match[1].toUpperCase();
-                if (hex.length === 3) {
-                    this.format = "shorthex";
-                    this.hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
-                } else {
-                    this.format = "hex";
-                    this.hex = hex;
-                }
-            } else if (match[2]) { // rgb
-                this.format = "rgb";
-                var rgb = match[2].split(/\s*,\s*/);
-                this.rgb = rgb;
-                this.hex = this._rgbToHex(rgb);
-            } else if (match[3]) { // nickname
-                var nickname = match[3].toLowerCase();
-                if (nickname in WebInspector.Color.Nicknames) {
-                    this.format = "nickname";
-                    this.hex = WebInspector.Color.Nicknames[nickname];
-                } else // unknown name
-                    throw "unknown color name";
-            } else if (match[4]) { // hsl
-                this.format = "hsl";
-                var hsl = match[4].replace(/%g/, "").split(/\s*,\s*/);
-                this.hsl = hsl;
-                this.rgb = this._hslToRGB(hsl);
-                this.hex = this._rgbToHex(this.rgb);
-            }
-
-            // Fill in the values if this is a known hex color
-            var hex = this.hex;
-            if (hex && hex in WebInspector.Color.HexTable) {
-                var set = WebInspector.Color.HexTable[hex];
-                this.rgb = set[0];
-                this.hsl = set[1];
-                this.nickname = set[2];
-            }
-
-            return;
-        }
-
-        // Advanced - rgba(), hsla()
-        var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;
-        match = this.value.match(advanced);
-        if (match) {
-            this.simple = false;
-            if (match[1]) { // rgba
-                this.format = "rgba";
-                this.rgba = match[1].split(/\s*,\s*/);
-                this.hsla = this._rgbaToHSLA(this.rgba);
-                this.alpha = this.rgba[3];
-            } else if (match[2]) { // hsla
-                this.format = "hsla";
-                this.hsla = match[2].replace(/%/g, "").split(/\s*,\s*/);
-                this.rgba = this._hslaToRGBA(this.hsla);
-                this.alpha = this.hsla[3];
-            }
-
-            return;
-        }
-
-        // Could not parse as a valid color
-        throw "could not parse color";
-    }
-}
-
-// Simple Values: [rgb, hsl, nickname]
-WebInspector.Color.HexTable = {
-    "000000": [[0, 0, 0], [0, 0, 0], "black"],
-    "000080": [[0, 0, 128], [240, 100, 25], "navy"],
-    "00008B": [[0, 0, 139], [240, 100, 27], "darkBlue"],
-    "0000CD": [[0, 0, 205], [240, 100, 40], "mediumBlue"],
-    "0000FF": [[0, 0, 255], [240, 100, 50], "blue"],
-    "006400": [[0, 100, 0], [120, 100, 20], "darkGreen"],
-    "008000": [[0, 128, 0], [120, 100, 25], "green"],
-    "008080": [[0, 128, 128], [180, 100, 25], "teal"],
-    "008B8B": [[0, 139, 139], [180, 100, 27], "darkCyan"],
-    "00BFFF": [[0, 191, 255], [195, 100, 50], "deepSkyBlue"],
-    "00CED1": [[0, 206, 209], [181, 100, 41], "darkTurquoise"],
-    "00FA9A": [[0, 250, 154], [157, 100, 49], "mediumSpringGreen"],
-    "00FF00": [[0, 255, 0], [120, 100, 50], "lime"],
-    "00FF7F": [[0, 255, 127], [150, 100, 50], "springGreen"],
-    "00FFFF": [[0, 255, 255], [180, 100, 50], "cyan"],
-    "191970": [[25, 25, 112], [240, 64, 27], "midnightBlue"],
-    "1E90FF": [[30, 144, 255], [210, 100, 56], "dodgerBlue"],
-    "20B2AA": [[32, 178, 170], [177, 70, 41], "lightSeaGreen"],
-    "228B22": [[34, 139, 34], [120, 61, 34], "forestGreen"],
-    "2E8B57": [[46, 139, 87], [146, 50, 36], "seaGreen"],
-    "2F4F4F": [[47, 79, 79], [180, 25, 25], "darkSlateGray"],
-    "32CD32": [[50, 205, 50], [120, 61, 50], "limeGreen"],
-    "3CB371": [[60, 179, 113], [147, 50, 47], "mediumSeaGreen"],
-    "40E0D0": [[64, 224, 208], [174, 72, 56], "turquoise"],
-    "4169E1": [[65, 105, 225], [225, 73, 57], "royalBlue"],
-    "4682B4": [[70, 130, 180], [207, 44, 49], "steelBlue"],
-    "483D8B": [[72, 61, 139], [248, 39, 39], "darkSlateBlue"],
-    "48D1CC": [[72, 209, 204], [178, 60, 55], "mediumTurquoise"],
-    "4B0082": [[75, 0, 130], [275, 100, 25], "indigo"],
-    "556B2F": [[85, 107, 47], [82, 39, 30], "darkOliveGreen"],
-    "5F9EA0": [[95, 158, 160], [182, 25, 50], "cadetBlue"],
-    "6495ED": [[100, 149, 237], [219, 79, 66], "cornflowerBlue"],
-    "66CDAA": [[102, 205, 170], [160, 51, 60], "mediumAquaMarine"],
-    "696969": [[105, 105, 105], [0, 0, 41], "dimGray"],
-    "6A5ACD": [[106, 90, 205], [248, 53, 58], "slateBlue"],
-    "6B8E23": [[107, 142, 35], [80, 60, 35], "oliveDrab"],
-    "708090": [[112, 128, 144], [210, 13, 50], "slateGray"],
-    "778899": [[119, 136, 153], [210, 14, 53], "lightSlateGray"],
-    "7B68EE": [[123, 104, 238], [249, 80, 67], "mediumSlateBlue"],
-    "7CFC00": [[124, 252, 0], [90, 100, 49], "lawnGreen"],
-    "7FFF00": [[127, 255, 0], [90, 100, 50], "chartreuse"],
-    "7FFFD4": [[127, 255, 212], [160, 100, 75], "aquamarine"],
-    "800000": [[128, 0, 0], [0, 100, 25], "maroon"],
-    "800080": [[128, 0, 128], [300, 100, 25], "purple"],
-    "808000": [[128, 128, 0], [60, 100, 25], "olive"],
-    "808080": [[128, 128, 128], [0, 0, 50], "gray"],
-    "87CEEB": [[135, 206, 235], [197, 71, 73], "skyBlue"],
-    "87CEFA": [[135, 206, 250], [203, 92, 75], "lightSkyBlue"],
-    "8A2BE2": [[138, 43, 226], [271, 76, 53], "blueViolet"],
-    "8B0000": [[139, 0, 0], [0, 100, 27], "darkRed"],
-    "8B008B": [[139, 0, 139], [300, 100, 27], "darkMagenta"],
-    "8B4513": [[139, 69, 19], [25, 76, 31], "saddleBrown"],
-    "8FBC8F": [[143, 188, 143], [120, 25, 65], "darkSeaGreen"],
-    "90EE90": [[144, 238, 144], [120, 73, 75], "lightGreen"],
-    "9370D8": [[147, 112, 219], [260, 60, 65], "mediumPurple"],
-    "9400D3": [[148, 0, 211], [282, 100, 41], "darkViolet"],
-    "98FB98": [[152, 251, 152], [120, 93, 79], "paleGreen"],
-    "9932CC": [[153, 50, 204], [280, 61, 50], "darkOrchid"],
-    "9ACD32": [[154, 205, 50], [80, 61, 50], "yellowGreen"],
-    "A0522D": [[160, 82, 45], [19, 56, 40], "sienna"],
-    "A52A2A": [[165, 42, 42], [0, 59, 41], "brown"],
-    "A9A9A9": [[169, 169, 169], [0, 0, 66], "darkGray"],
-    "ADD8E6": [[173, 216, 230], [195, 53, 79], "lightBlue"],
-    "ADFF2F": [[173, 255, 47], [84, 100, 59], "greenYellow"],
-    "AFEEEE": [[175, 238, 238], [180, 65, 81], "paleTurquoise"],
-    "B0C4DE": [[176, 196, 222], [214, 41, 78], "lightSteelBlue"],
-    "B0E0E6": [[176, 224, 230], [187, 52, 80], "powderBlue"],
-    "B22222": [[178, 34, 34], [0, 68, 42], "fireBrick"],
-    "B8860B": [[184, 134, 11], [43, 89, 38], "darkGoldenrod"],
-    "BA55D3": [[186, 85, 211], [288, 59, 58], "mediumOrchid"],
-    "BC8F8F": [[188, 143, 143], [0, 25, 65], "rosyBrown"],
-    "BDB76B": [[189, 183, 107], [56, 38, 58], "darkKhaki"],
-    "C0C0C0": [[192, 192, 192], [0, 0, 75], "silver"],
-    "C71585": [[199, 21, 133], [322, 81, 43], "mediumVioletRed"],
-    "CD5C5C": [[205, 92, 92], [0, 53, 58], "indianRed"],
-    "CD853F": [[205, 133, 63], [30, 59, 53], "peru"],
-    "D2691E": [[210, 105, 30], [25, 75, 47], "chocolate"],
-    "D2B48C": [[210, 180, 140], [34, 44, 69], "tan"],
-    "D3D3D3": [[211, 211, 211], [0, 0, 83], "lightGrey"],
-    "D87093": [[219, 112, 147], [340, 60, 65], "paleVioletRed"],
-    "D8BFD8": [[216, 191, 216], [300, 24, 80], "thistle"],
-    "DA70D6": [[218, 112, 214], [302, 59, 65], "orchid"],
-    "DAA520": [[218, 165, 32], [43, 74, 49], "goldenrod"],
-    "DC143C": [[237, 164, 61], [35, 83, 58], "crimson"],
-    "DCDCDC": [[220, 220, 220], [0, 0, 86], "gainsboro"],
-    "DDA0DD": [[221, 160, 221], [300, 47, 75], "plum"],
-    "DEB887": [[222, 184, 135], [34, 57, 70], "burlyWood"],
-    "E0FFFF": [[224, 255, 255], [180, 100, 94], "lightCyan"],
-    "E6E6FA": [[230, 230, 250], [240, 67, 94], "lavender"],
-    "E9967A": [[233, 150, 122], [15, 72, 70], "darkSalmon"],
-    "EE82EE": [[238, 130, 238], [300, 76, 72], "violet"],
-    "EEE8AA": [[238, 232, 170], [55, 67, 80], "paleGoldenrod"],
-    "F08080": [[240, 128, 128], [0, 79, 72], "lightCoral"],
-    "F0E68C": [[240, 230, 140], [54, 77, 75], "khaki"],
-    "F0F8FF": [[240, 248, 255], [208, 100, 97], "aliceBlue"],
-    "F0FFF0": [[240, 255, 240], [120, 100, 97], "honeyDew"],
-    "F0FFFF": [[240, 255, 255], [180, 100, 97], "azure"],
-    "F4A460": [[244, 164, 96], [28, 87, 67], "sandyBrown"],
-    "F5DEB3": [[245, 222, 179], [39, 77, 83], "wheat"],
-    "F5F5DC": [[245, 245, 220], [60, 56, 91], "beige"],
-    "F5F5F5": [[245, 245, 245], [0, 0, 96], "whiteSmoke"],
-    "F5FFFA": [[245, 255, 250], [150, 100, 98], "mintCream"],
-    "F8F8FF": [[248, 248, 255], [240, 100, 99], "ghostWhite"],
-    "FA8072": [[250, 128, 114], [6, 93, 71], "salmon"],
-    "FAEBD7": [[250, 235, 215], [34, 78, 91], "antiqueWhite"],
-    "FAF0E6": [[250, 240, 230], [30, 67, 94], "linen"],
-    "FAFAD2": [[250, 250, 210], [60, 80, 90], "lightGoldenrodYellow"],
-    "FDF5E6": [[253, 245, 230], [39, 85, 95], "oldLace"],
-    "FF0000": [[255, 0, 0], [0, 100, 50], "red"],
-    "FF00FF": [[255, 0, 255], [300, 100, 50], "magenta"],
-    "FF1493": [[255, 20, 147], [328, 100, 54], "deepPink"],
-    "FF4500": [[255, 69, 0], [16, 100, 50], "orangeRed"],
-    "FF6347": [[255, 99, 71], [9, 100, 64], "tomato"],
-    "FF69B4": [[255, 105, 180], [330, 100, 71], "hotPink"],
-    "FF7F50": [[255, 127, 80], [16, 100, 66], "coral"],
-    "FF8C00": [[255, 140, 0], [33, 100, 50], "darkOrange"],
-    "FFA07A": [[255, 160, 122], [17, 100, 74], "lightSalmon"],
-    "FFA500": [[255, 165, 0], [39, 100, 50], "orange"],
-    "FFB6C1": [[255, 182, 193], [351, 100, 86], "lightPink"],
-    "FFC0CB": [[255, 192, 203], [350, 100, 88], "pink"],
-    "FFD700": [[255, 215, 0], [51, 100, 50], "gold"],
-    "FFDAB9": [[255, 218, 185], [28, 100, 86], "peachPuff"],
-    "FFDEAD": [[255, 222, 173], [36, 100, 84], "navajoWhite"],
-    "FFE4B5": [[255, 228, 181], [38, 100, 85], "moccasin"],
-    "FFE4C4": [[255, 228, 196], [33, 100, 88], "bisque"],
-    "FFE4E1": [[255, 228, 225], [6, 100, 94], "mistyRose"],
-    "FFEBCD": [[255, 235, 205], [36, 100, 90], "blanchedAlmond"],
-    "FFEFD5": [[255, 239, 213], [37, 100, 92], "papayaWhip"],
-    "FFF0F5": [[255, 240, 245], [340, 100, 97], "lavenderBlush"],
-    "FFF5EE": [[255, 245, 238], [25, 100, 97], "seaShell"],
-    "FFF8DC": [[255, 248, 220], [48, 100, 93], "cornsilk"],
-    "FFFACD": [[255, 250, 205], [54, 100, 90], "lemonChiffon"],
-    "FFFAF0": [[255, 250, 240], [40, 100, 97], "floralWhite"],
-    "FFFAFA": [[255, 250, 250], [0, 100, 99], "snow"],
-    "FFFF00": [[255, 255, 0], [60, 100, 50], "yellow"],
-    "FFFFE0": [[255, 255, 224], [60, 100, 94], "lightYellow"],
-    "FFFFF0": [[255, 255, 240], [60, 100, 97], "ivory"],
-    "FFFFFF": [[255, 255, 255], [0, 100, 100], "white"]
-};
-
-// Simple Values
-WebInspector.Color.Nicknames = {
-    "aliceblue": "F0F8FF",
-    "antiquewhite": "FAEBD7",
-    "aqua": "00FFFF",
-    "aquamarine": "7FFFD4",
-    "azure": "F0FFFF",
-    "beige": "F5F5DC",
-    "bisque": "FFE4C4",
-    "black": "000000",
-    "blanchedalmond": "FFEBCD",
-    "blue": "0000FF",
-    "blueviolet": "8A2BE2",
-    "brown": "A52A2A",
-    "burlywood": "DEB887",
-    "cadetblue": "5F9EA0",
-    "chartreuse": "7FFF00",
-    "chocolate": "D2691E",
-    "coral": "FF7F50",
-    "cornflowerblue": "6495ED",
-    "cornsilk": "FFF8DC",
-    "crimson": "DC143C",
-    "cyan": "00FFFF",
-    "darkblue": "00008B",
-    "darkcyan": "008B8B",
-    "darkgoldenrod": "B8860B",
-    "darkgray": "A9A9A9",
-    "darkgreen": "006400",
-    "darkkhaki": "BDB76B",
-    "darkmagenta": "8B008B",
-    "darkolivegreen": "556B2F",
-    "darkorange": "FF8C00",
-    "darkorchid": "9932CC",
-    "darkred": "8B0000",
-    "darksalmon": "E9967A",
-    "darkseagreen": "8FBC8F",
-    "darkslateblue": "483D8B",
-    "darkslategray": "2F4F4F",
-    "darkturquoise": "00CED1",
-    "darkviolet": "9400D3",
-    "deeppink": "FF1493",
-    "deepskyblue": "00BFFF",
-    "dimgray": "696969",
-    "dodgerblue": "1E90FF",
-    "firebrick": "B22222",
-    "floralwhite": "FFFAF0",
-    "forestgreen": "228B22",
-    "fuchsia": "FF00FF",
-    "gainsboro": "DCDCDC",
-    "ghostwhite": "F8F8FF",
-    "gold": "FFD700",
-    "goldenrod": "DAA520",
-    "gray": "808080",
-    "green": "008000",
-    "greenyellow": "ADFF2F",
-    "honeydew": "F0FFF0",
-    "hotpink": "FF69B4",
-    "indianred": "CD5C5C",
-    "indigo": "4B0082",
-    "ivory": "FFFFF0",
-    "khaki": "F0E68C",
-    "lavender": "E6E6FA",
-    "lavenderblush": "FFF0F5",
-    "lawngreen": "7CFC00",
-    "lemonchiffon": "FFFACD",
-    "lightblue": "ADD8E6",
-    "lightcoral": "F08080",
-    "lightcyan": "E0FFFF",
-    "lightgoldenrodyellow": "FAFAD2",
-    "lightgreen": "90EE90",
-    "lightgrey": "D3D3D3",
-    "lightpink": "FFB6C1",
-    "lightsalmon": "FFA07A",
-    "lightseagreen": "20B2AA",
-    "lightskyblue": "87CEFA",
-    "lightslategray": "778899",
-    "lightsteelblue": "B0C4DE",
-    "lightyellow": "FFFFE0",
-    "lime": "00FF00",
-    "limegreen": "32CD32",
-    "linen": "FAF0E6",
-    "magenta": "FF00FF",
-    "maroon": "800000",
-    "mediumaquamarine": "66CDAA",
-    "mediumblue": "0000CD",
-    "mediumorchid": "BA55D3",
-    "mediumpurple": "9370D8",
-    "mediumseagreen": "3CB371",
-    "mediumslateblue": "7B68EE",
-    "mediumspringgreen": "00FA9A",
-    "mediumturquoise": "48D1CC",
-    "mediumvioletred": "C71585",
-    "midnightblue": "191970",
-    "mintcream": "F5FFFA",
-    "mistyrose": "FFE4E1",
-    "moccasin": "FFE4B5",
-    "navajowhite": "FFDEAD",
-    "navy": "000080",
-    "oldlace": "FDF5E6",
-    "olive": "808000",
-    "olivedrab": "6B8E23",
-    "orange": "FFA500",
-    "orangered": "FF4500",
-    "orchid": "DA70D6",
-    "palegoldenrod": "EEE8AA",
-    "palegreen": "98FB98",
-    "paleturquoise": "AFEEEE",
-    "palevioletred": "D87093",
-    "papayawhip": "FFEFD5",
-    "peachpuff": "FFDAB9",
-    "peru": "CD853F",
-    "pink": "FFC0CB",
-    "plum": "DDA0DD",
-    "powderblue": "B0E0E6",
-    "purple": "800080",
-    "red": "FF0000",
-    "rosybrown": "BC8F8F",
-    "royalblue": "4169E1",
-    "saddlebrown": "8B4513",
-    "salmon": "FA8072",
-    "sandybrown": "F4A460",
-    "seagreen": "2E8B57",
-    "seashell": "FFF5EE",
-    "sienna": "A0522D",
-    "silver": "C0C0C0",
-    "skyblue": "87CEEB",
-    "slateblue": "6A5ACD",
-    "slategray": "708090",
-    "snow": "FFFAFA",
-    "springgreen": "00FF7F",
-    "steelblue": "4682B4",
-    "tan": "D2B48C",
-    "teal": "008080",
-    "thistle": "D8BFD8",
-    "tomato": "FF6347",
-    "turquoise": "40E0D0",
-    "violet": "EE82EE",
-    "wheat": "F5DEB3",
-    "white": "FFFFFF",
-    "whitesmoke": "F5F5F5",
-    "yellow": "FFFF00",
-    "yellowgreen": "9ACD32"
-};
-
-// Advanced Values [rgba, hsla, nickname]
-WebInspector.Color.AdvancedNickNames = {
-    "transparent": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-    "rgba(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-    "hsla(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-};
-
-/* StylesSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StylesSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Styles"));
-
-    this.settingsSelectElement = document.createElement("select");
-
-    var option = document.createElement("option");
-    option.value = "hex";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("Hex Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "rgb";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("RGB Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "hsl";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("HSL Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    this.settingsSelectElement.appendChild(document.createElement("hr"));
-
-    option = document.createElement("option");
-    option.action = this._createNewRule.bind(this);
-    option.label = WebInspector.UIString("New Style Rule");
-    this.settingsSelectElement.appendChild(option);
-
-    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
-    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);        
-    
-    this.titleElement.appendChild(this.settingsSelectElement);
-}
-
-WebInspector.StylesSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        var format = WebInspector.settings.colorFormat;
-        if (format === "hex")
-            this.settingsSelectElement[0].selected = true;
-        if (format === "rgb")
-            this.settingsSelectElement[1].selected = true;
-        if (format === "hsl")
-            this.settingsSelectElement[2].selected = true;
-    },
-
-    update: function(node, editedSection, forceUpdate)
-    {
-        var refresh = false;
-
-        if (forceUpdate)
-            delete this.node;
-
-        if (!forceUpdate && (!node || node === this.node))
-            refresh = true;
-
-        if (node && node.nodeType === Node.TEXT_NODE && node.parentNode)
-            node = node.parentNode;
-
-        if (node && node.nodeType !== Node.ELEMENT_NODE)
-            node = null;
-
-        if (node)
-            this.node = node;
-        else
-            node = this.node;
-
-        var body = this.bodyElement;
-
-        if (!node) {
-            body.removeChildren();
-            this.sections = [];
-            return;
-        }
-
-        var self = this;
-        function callback(styles)
-        {
-            if (!styles)
-                return;
-            node._setStyles(styles.computedStyle, styles.inlineStyle, styles.styleAttributes, styles.matchedCSSRules);
-            self._update(refresh, body, node, editedSection, forceUpdate);
-        }
-
-        InjectedScriptAccess.getStyles(node.id, !WebInspector.settings.showUserAgentStyles, callback);
-    },
-
-    _update: function(refresh, body, node, editedSection, forceUpdate)
-    {
-        if (!refresh) {
-            body.removeChildren();
-            this.sections = [];
-        }
-
-        var styleRules = [];
-
-        if (refresh) {
-            for (var i = 0; i < this.sections.length; ++i) {
-                var section = this.sections[i];
-                if (section instanceof WebInspector.BlankStylePropertiesSection)
-                    continue;
-                if (section.computedStyle)
-                    section.styleRule.style = node.ownerDocument.defaultView.getComputedStyle(node);
-                var styleRule = { section: section, style: section.styleRule.style, computedStyle: section.computedStyle, rule: section.rule };
-                styleRules.push(styleRule);
-            }
-        } else {
-            var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);
-            styleRules.push({ computedStyle: true, selectorText: WebInspector.UIString("Computed Style"), style: computedStyle, editable: false });
-
-            var nodeName = node.nodeName.toLowerCase();
-            for (var i = 0; i < node.attributes.length; ++i) {
-                var attr = node.attributes[i];
-                if (attr.style) {
-                    var attrStyle = { style: attr.style, editable: false };
-                    attrStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", attr.name);
-                    attrStyle.selectorText = nodeName + "[" + attr.name;
-                    if (attr.value.length)
-                        attrStyle.selectorText += "=" + attr.value;
-                    attrStyle.selectorText += "]";
-                    styleRules.push(attrStyle);
-                }
-            }
-
-            // Always Show element's Style Attributes
-            if (node.nodeType === Node.ELEMENT_NODE) {
-                var inlineStyle = { selectorText: WebInspector.UIString("Style Attribute"), style: node.style, isAttribute: true };
-                inlineStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", "style");
-                styleRules.push(inlineStyle);
-            }
-
-            var matchedStyleRules = node.ownerDocument.defaultView.getMatchedCSSRules(node, "", !WebInspector.settings.showUserAgentStyles);
-            if (matchedStyleRules) {
-                // Add rules in reverse order to match the cascade order.
-                for (var i = (matchedStyleRules.length - 1); i >= 0; --i) {
-                    var rule = matchedStyleRules[i];
-                    styleRules.push({ style: rule.style, selectorText: rule.selectorText, parentStyleSheet: rule.parentStyleSheet, rule: rule });
-                }
-            }
-        }
-
-        function deleteDisabledProperty(style, name)
-        {
-            if (!style || !name)
-                return;
-            if (style.__disabledPropertyValues)
-                delete style.__disabledPropertyValues[name];
-            if (style.__disabledPropertyPriorities)
-                delete style.__disabledPropertyPriorities[name];
-            if (style.__disabledProperties)
-                delete style.__disabledProperties[name];
-        }
-
-        var usedProperties = {};
-        var disabledComputedProperties = {};
-        var priorityUsed = false;
-
-        // Walk the style rules and make a list of all used and overloaded properties.
-        for (var i = 0; i < styleRules.length; ++i) {
-            var styleRule = styleRules[i];
-            if (styleRule.computedStyle)
-                continue;
-            if (styleRule.section && styleRule.section.noAffect)
-                continue;
-
-            styleRule.usedProperties = {};
-
-            var style = styleRule.style;
-            for (var j = 0; j < style.length; ++j) {
-                var name = style[j];
-
-                if (!priorityUsed && style.getPropertyPriority(name).length)
-                    priorityUsed = true;
-
-                // If the property name is already used by another rule then this rule's
-                // property is overloaded, so don't add it to the rule's usedProperties.
-                if (!(name in usedProperties))
-                    styleRule.usedProperties[name] = true;
-
-                if (name === "font") {
-                    // The font property is not reported as a shorthand. Report finding the individual
-                    // properties so they are visible in computed style.
-                    // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15598 is fixed.
-                    styleRule.usedProperties["font-family"] = true;
-                    styleRule.usedProperties["font-size"] = true;
-                    styleRule.usedProperties["font-style"] = true;
-                    styleRule.usedProperties["font-variant"] = true;
-                    styleRule.usedProperties["font-weight"] = true;
-                    styleRule.usedProperties["line-height"] = true;
-                }
-
-                // Delete any disabled properties, since the property does exist.
-                // This prevents it from showing twice.
-                deleteDisabledProperty(style, name);
-                deleteDisabledProperty(style, style.getPropertyShorthand(name));
-            }
-
-            // Add all the properties found in this style to the used properties list.
-            // Do this here so only future rules are affect by properties used in this rule.
-            for (var name in styleRules[i].usedProperties)
-                usedProperties[name] = true;
-
-            // Remember all disabled properties so they show up in computed style.
-            if (style.__disabledProperties)
-                for (var name in style.__disabledProperties)
-                    disabledComputedProperties[name] = true;
-        }
-
-        if (priorityUsed) {
-            // Walk the properties again and account for !important.
-            var foundPriorityProperties = [];
-
-            // Walk in reverse to match the order !important overrides.
-            for (var i = (styleRules.length - 1); i >= 0; --i) {
-                if (styleRules[i].computedStyle)
-                    continue;
-
-                var style = styleRules[i].style;
-                var uniqueProperties = style.uniqueStyleProperties;
-                for (var j = 0; j < uniqueProperties.length; ++j) {
-                    var name = uniqueProperties[j];
-                    if (style.getPropertyPriority(name).length) {
-                        if (!(name in foundPriorityProperties))
-                            styleRules[i].usedProperties[name] = true;
-                        else
-                            delete styleRules[i].usedProperties[name];
-                        foundPriorityProperties[name] = true;
-                    } else if (name in foundPriorityProperties)
-                        delete styleRules[i].usedProperties[name];
-                }
-            }
-        }
-
-        if (refresh) {
-            // Walk the style rules and update the sections with new overloaded and used properties.
-            for (var i = 0; i < styleRules.length; ++i) {
-                var styleRule = styleRules[i];
-                var section = styleRule.section;
-                if (styleRule.computedStyle)
-                    section.disabledComputedProperties = disabledComputedProperties;
-                section._usedProperties = (styleRule.usedProperties || usedProperties);
-                section.update((section === editedSection) || styleRule.computedStyle);
-            }
-        } else {
-            // Make a property section for each style rule.
-            for (var i = 0; i < styleRules.length; ++i) {
-                var styleRule = styleRules[i];
-                var subtitle = styleRule.subtitle;
-                delete styleRule.subtitle;
-
-                var computedStyle = styleRule.computedStyle;
-                delete styleRule.computedStyle;
-
-                var ruleUsedProperties = styleRule.usedProperties;
-                delete styleRule.usedProperties;
-
-                var editable = styleRule.editable;
-                delete styleRule.editable;
-
-                var isAttribute = styleRule.isAttribute;
-                delete styleRule.isAttribute;
-
-                // Default editable to true if it was omitted.
-                if (typeof editable === "undefined")
-                    editable = true;
-
-                var section = new WebInspector.StylePropertiesSection(styleRule, subtitle, computedStyle, (ruleUsedProperties || usedProperties), editable);
-                if (computedStyle)
-                    section.disabledComputedProperties = disabledComputedProperties;
-                section.pane = this;
-
-                if (Preferences.styleRulesExpandedState && section.identifier in Preferences.styleRulesExpandedState)
-                    section.expanded = Preferences.styleRulesExpandedState[section.identifier];
-                else if (computedStyle)
-                    section.collapse(true);
-                else if (isAttribute && styleRule.style.length === 0)
-                    section.collapse(true);
-                else
-                    section.expand(true);
-
-                body.appendChild(section.element);
-                this.sections.push(section);
-            }
-        }
-    },
-
-    _changeSetting: function(event)
-    {
-        var options = this.settingsSelectElement.options;
-        var selectedOption = options[this.settingsSelectElement.selectedIndex];
-        selectedOption.action(event);
-
-        // Select the correct color format setting again, since it needs to be selected.
-        var selectedIndex = 0;
-        for (var i = 0; i < options.length; ++i) {
-            if (options[i].value === WebInspector.settings.colorFormat) {
-                selectedIndex = i;
-                break;
-            }
-        }
-
-        this.settingsSelectElement.selectedIndex = selectedIndex;
-    },
-
-    _changeColorFormat: function(event)
-    {
-        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
-        WebInspector.settings.colorFormat = selectedOption.value;
-
-        for (var i = 0; i < this.sections.length; ++i)
-            this.sections[i].update(true);
-    },
-
-    _createNewRule: function(event)
-    {
-        this.addBlankSection().startEditingSelector();
-    },
-
-    addBlankSection: function()
-    {
-        var blankSection = new WebInspector.BlankStylePropertiesSection(appropriateSelectorForNode(this.node, true));
-        blankSection.pane = this;
-
-        var elementStyleSection = this.sections[1];        
-        this.bodyElement.insertBefore(blankSection.element, elementStyleSection.element.nextSibling);
-
-        this.sections.splice(2, 0, blankSection);
-
-        return blankSection;
-    },
-
-    removeSection: function(section)
-    {
-        var index = this.sections.indexOf(section);
-        if (index === -1)
-            return;
-        this.sections.splice(index, 1);
-        if (section.element.parentNode)
-            section.element.parentNode.removeChild(section.element);
-    }
-}
-
-WebInspector.StylesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.StylePropertiesSection = function(styleRule, subtitle, computedStyle, usedProperties, editable)
-{
-    WebInspector.PropertiesSection.call(this, styleRule.selectorText);
-
-    this.titleElement.addEventListener("click", this._clickSelector.bind(this), false);
-    this.titleElement.addEventListener("dblclick", this._dblclickSelector.bind(this), false);
-    this.element.addEventListener("dblclick", this._dblclickEmptySpace.bind(this), false);
-
-    this.styleRule = styleRule;
-    this.rule = this.styleRule.rule;
-    this.computedStyle = computedStyle;
-    this.editable = (editable && !computedStyle);
-
-    // Prevent editing the user agent and user rules.
-    var isUserAgent = this.rule && this.rule.isUserAgent;
-    var isUser = this.rule && this.rule.isUser;
-    var isViaInspector = this.rule && this.rule.isViaInspector;
-
-    if (isUserAgent || isUser)
-        this.editable = false;
-
-    this._usedProperties = usedProperties;
-
-    if (computedStyle) {
-        this.element.addStyleClass("computed-style");
-
-        if (WebInspector.settings.showInheritedComputedStyleProperties)
-            this.element.addStyleClass("show-inherited");
-
-        var showInheritedLabel = document.createElement("label");
-        var showInheritedInput = document.createElement("input");
-        showInheritedInput.type = "checkbox";
-        showInheritedInput.checked = WebInspector.settings.showInheritedComputedStyleProperties;
-
-        var computedStyleSection = this;
-        var showInheritedToggleFunction = function(event) {
-            WebInspector.settings.showInheritedComputedStyleProperties = showInheritedInput.checked;
-            if (WebInspector.settings.showInheritedComputedStyleProperties)
-                computedStyleSection.element.addStyleClass("show-inherited");
-            else
-                computedStyleSection.element.removeStyleClass("show-inherited");
-            event.stopPropagation();
-        };
-
-        showInheritedLabel.addEventListener("click", showInheritedToggleFunction, false);
-
-        showInheritedLabel.appendChild(showInheritedInput);
-        showInheritedLabel.appendChild(document.createTextNode(WebInspector.UIString("Show inherited")));
-        this.subtitleElement.appendChild(showInheritedLabel);
-    } else {
-        if (!subtitle) {
-            if (this.styleRule.parentStyleSheet && this.styleRule.parentStyleSheet.href) {
-                var url = this.styleRule.parentStyleSheet.href;
-                subtitle = WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));
-                this.subtitleElement.addStyleClass("file");
-            } else if (isUserAgent)
-                subtitle = WebInspector.UIString("user agent stylesheet");
-            else if (isUser)
-                subtitle = WebInspector.UIString("user stylesheet");
-            else if (isViaInspector)
-                subtitle = WebInspector.UIString("via inspector");
-            else
-                subtitle = WebInspector.UIString("inline stylesheet");
-        }
-
-        this.subtitle = subtitle;
-    }
-
-    this.identifier = styleRule.selectorText;
-    if (this.subtitle)
-        this.identifier += ":" + this.subtitleElement.textContent;    
-}
-
-WebInspector.StylePropertiesSection.prototype = {
-    get usedProperties()
-    {
-        return this._usedProperties || {};
-    },
-
-    set usedProperties(x)
-    {
-        this._usedProperties = x;
-        this.update();
-    },
-
-    expand: function(dontRememberState)
-    {
-        WebInspector.PropertiesSection.prototype.expand.call(this);
-        if (dontRememberState)
-            return;
-
-        if (!Preferences.styleRulesExpandedState)
-            Preferences.styleRulesExpandedState = {};
-        Preferences.styleRulesExpandedState[this.identifier] = true;
-    },
-
-    collapse: function(dontRememberState)
-    {
-        WebInspector.PropertiesSection.prototype.collapse.call(this);
-        if (dontRememberState)
-            return;
-
-        if (!Preferences.styleRulesExpandedState)
-            Preferences.styleRulesExpandedState = {};
-        Preferences.styleRulesExpandedState[this.identifier] = false;
-    },
-
-    isPropertyInherited: function(property)
-    {
-        if (!this.computedStyle || !this._usedProperties || this.noAffect)
-            return false;
-        // These properties should always show for Computed Style.
-        var alwaysShowComputedProperties = { "display": true, "height": true, "width": true };
-        return !(property in this.usedProperties) && !(property in alwaysShowComputedProperties) && !(property in this.disabledComputedProperties);
-    },
-
-    isPropertyOverloaded: function(property, shorthand)
-    {
-        if (this.computedStyle || !this._usedProperties || this.noAffect)
-            return false;
-
-        var used = (property in this.usedProperties);
-        if (used || !shorthand)
-            return !used;
-
-        // Find out if any of the individual longhand properties of the shorthand
-        // are used, if none are then the shorthand is overloaded too.
-        var longhandProperties = this.styleRule.style.getLonghandProperties(property);
-        for (var j = 0; j < longhandProperties.length; ++j) {
-            var individualProperty = longhandProperties[j];
-            if (individualProperty in this.usedProperties)
-                return false;
-        }
-
-        return true;
-    },
-
-    isInspectorStylesheet: function()
-    {
-        return (this.styleRule.parentStyleSheet === WebInspector.panels.elements.stylesheet);
-    },
-
-    update: function(full)
-    {
-        if (full || this.computedStyle) {
-            this.propertiesTreeOutline.removeChildren();
-            this.populated = false;
-        } else {
-            var child = this.propertiesTreeOutline.children[0];
-            while (child) {
-                child.overloaded = this.isPropertyOverloaded(child.name, child.shorthand);
-                child = child.traverseNextTreeElement(false, null, true);
-            }
-        }
-
-        if (this._afterUpdate) {
-            this._afterUpdate(this);
-            delete this._afterUpdate;
-        }
-    },
-
-    onpopulate: function()
-    {
-        var style = this.styleRule.style;
-
-        var foundShorthands = {};
-        var uniqueProperties = style.uniqueStyleProperties;
-        var disabledProperties = style.__disabledPropertyValues || {};
-
-        for (var name in disabledProperties)
-            uniqueProperties.push(name);
-
-        uniqueProperties.sort();
-
-        for (var i = 0; i < uniqueProperties.length; ++i) {
-            var name = uniqueProperties[i];
-            var disabled = name in disabledProperties;
-            if (!disabled && this.disabledComputedProperties && !(name in this.usedProperties) && name in this.disabledComputedProperties)
-                disabled = true;
-
-            var shorthand = !disabled ? style.getPropertyShorthand(name) : null;
-
-            if (shorthand && shorthand in foundShorthands)
-                continue;
-
-            if (shorthand) {
-                foundShorthands[shorthand] = true;
-                name = shorthand;
-            }
-
-            var isShorthand = (shorthand ? true : false);
-            var inherited = this.isPropertyInherited(name);
-            var overloaded = this.isPropertyOverloaded(name, isShorthand);
-
-            var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, name, isShorthand, inherited, overloaded, disabled);
-            this.propertiesTreeOutline.appendChild(item);
-        }
-    },
-
-    findTreeElementWithName: function(name)
-    {
-        var treeElement = this.propertiesTreeOutline.children[0];
-        while (treeElement) {
-            if (treeElement.name === name)
-                return treeElement;
-            treeElement = treeElement.traverseNextTreeElement(true, null, true);
-        }
-        return null;
-    },
-
-    addNewBlankProperty: function()
-    {
-        var item = new WebInspector.StylePropertyTreeElement(this.styleRule, this.styleRule.style, "", false, false, false, false);
-        this.propertiesTreeOutline.appendChild(item);
-        item.listItemElement.textContent = "";
-        item._newProperty = true;
-        return item;
-    },
-
-    _clickSelector: function(event)
-    {
-        event.stopPropagation();
-
-        // Don't search "Computed Styles", "Style Attribute", or Mapped Attributes.
-        if (this.computedStyle || !this.rule || this.rule.isUser)
-            return;
-
-        var searchElement = document.getElementById("search");
-        searchElement.value = this.styleRule.selectorText;
-        WebInspector.performSearch({ target: searchElement });
-    },
-
-    _dblclickEmptySpace: function(event)
-    {
-        this.expand();
-        this.addNewBlankProperty().startEditing();
-    },
-
-    _dblclickSelector: function(event)
-    {
-        if (!this.editable)
-            return;
-
-        if (!this.rule && this.propertiesTreeOutline.children.length === 0) {
-            this.expand();
-            this.addNewBlankProperty().startEditing();
-            return;
-        }
-
-        if (!this.rule)
-            return;
-
-        this.startEditingSelector();
-        event.stopPropagation();
-    },
-
-    startEditingSelector: function()
-    {
-        var element = this.titleElement;
-        if (WebInspector.isBeingEdited(element))
-            return;
-
-        WebInspector.startEditing(this.titleElement, this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this), null);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    editingSelectorCommitted: function(element, newContent, oldContent, context, moveDirection)
-    {
-        function moveToNextIfNeeded() {
-            if (!moveDirection || moveDirection !== "forward")
-                return;
-
-            this.expand();
-            if (this.propertiesTreeOutline.children.length === 0)
-                this.addNewBlankProperty().startEditing();
-            else {
-                var item = this.propertiesTreeOutline.children[0]
-                item.startEditing(item.valueElement);
-            }
-        }
-
-        if (newContent === oldContent)
-            return moveToNextIfNeeded.call(this);
-
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // Invalid Syntax for a Selector
-                moveToNextIfNeeded.call(self);
-                return;
-            }
-
-            var newRulePayload = result[0];
-            var doesAffectSelectedNode = result[1];
-            if (!doesAffectSelectedNode) {
-                self.noAffect = true;
-                self.element.addStyleClass("no-affect");
-            } else {
-                delete self.noAffect;
-                self.element.removeStyleClass("no-affect");
-            }
-
-            var newRule = WebInspector.CSSStyleDeclaration.parseRule(newRulePayload);
-            self.rule = newRule;
-            self.styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, parentStyleSheet: newRule.parentStyleSheet, rule: newRule };
-
-            var oldIdentifier = this.identifier;
-            self.identifier = newRule.selectorText + ":" + self.subtitleElement.textContent;
-
-            self.pane.update();
-
-            WebInspector.panels.elements.renameSelector(oldIdentifier, this.identifier, oldContent, newContent);
-
-            moveToNextIfNeeded.call(self);
-        }
-
-        InjectedScriptAccess.applyStyleRuleText(this.rule.id, newContent, this.pane.node.id, callback);
-    },
-
-    editingSelectorCancelled: function()
-    {
-        // Do nothing, this is overridden by BlankStylePropertiesSection.
-    }
-}
-
-WebInspector.StylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.BlankStylePropertiesSection = function(defaultSelectorText)
-{
-    WebInspector.StylePropertiesSection.call(this, {selectorText: defaultSelectorText, rule: {isViaInspector: true}}, "", false, {}, false);
-
-    this.element.addStyleClass("blank-section");
-}
-
-WebInspector.BlankStylePropertiesSection.prototype = {
-    expand: function()
-    {
-        // Do nothing, blank sections are not expandable.
-    },
-
-    editingSelectorCommitted: function(element, newContent, oldContent, context)
-    {
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // Invalid Syntax for a Selector
-                self.editingSelectorCancelled();
-                return;
-            }
-
-            var rule = result[0];
-            var doesSelectorAffectSelectedNode = result[1];
-
-            var styleRule = WebInspector.CSSStyleDeclaration.parseRule(rule);
-            styleRule.rule = rule;
-
-            self.makeNormal(styleRule);
-
-            if (!doesSelectorAffectSelectedNode) {
-                self.noAffect = true;
-                self.element.addStyleClass("no-affect");
-            }
-
-            self.subtitleElement.textContent = WebInspector.UIString("via inspector");
-            self.expand();
-
-            self.addNewBlankProperty().startEditing();
-        }
-
-        InjectedScriptAccess.addStyleSelector(newContent, this.pane.node.id, callback);
-    },
-
-    editingSelectorCancelled: function()
-    {
-        this.pane.removeSection(this);
-    },
-
-    makeNormal: function(styleRule)
-    {
-        this.element.removeStyleClass("blank-section");
-
-        this.styleRule = styleRule;
-        this.rule = styleRule.rule;
-        this.computedStyle = false;
-        this.editable = true;
-        this.identifier = styleRule.selectorText + ":via inspector";
-
-        this.__proto__ = WebInspector.StylePropertiesSection.prototype;
-    }
-}
-
-WebInspector.BlankStylePropertiesSection.prototype.__proto__ = WebInspector.StylePropertiesSection.prototype;
-
-WebInspector.StylePropertyTreeElement = function(styleRule, style, name, shorthand, inherited, overloaded, disabled)
-{
-    this._styleRule = styleRule;
-    this.style = style;
-    this.name = name;
-    this.shorthand = shorthand;
-    this._inherited = inherited;
-    this._overloaded = overloaded;
-    this._disabled = disabled;
-
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, shorthand);
-}
-
-WebInspector.StylePropertyTreeElement.prototype = {
-    get inherited()
-    {
-        return this._inherited;
-    },
-
-    set inherited(x)
-    {
-        if (x === this._inherited)
-            return;
-        this._inherited = x;
-        this.updateState();
-    },
-
-    get overloaded()
-    {
-        return this._overloaded;
-    },
-
-    set overloaded(x)
-    {
-        if (x === this._overloaded)
-            return;
-        this._overloaded = x;
-        this.updateState();
-    },
-
-    get disabled()
-    {
-        return this._disabled;
-    },
-
-    set disabled(x)
-    {
-        if (x === this._disabled)
-            return;
-        this._disabled = x;
-        this.updateState();
-    },
-
-    get priority()
-    {
-        if (this.disabled && this.style.__disabledPropertyPriorities && this.name in this.style.__disabledPropertyPriorities)
-            return this.style.__disabledPropertyPriorities[this.name];
-        return (this.shorthand ? this.style.getShorthandPriority(this.name) : this.style.getPropertyPriority(this.name));
-    },
-
-    get value()
-    {
-        if (this.disabled && this.style.__disabledPropertyValues && this.name in this.style.__disabledPropertyValues)
-            return this.style.__disabledPropertyValues[this.name];
-        return (this.shorthand ? this.style.getShorthandValue(this.name) : this.style.getPropertyValue(this.name));
-    },
-
-    onattach: function()
-    {
-        this.updateTitle();
-    },
-
-    updateTitle: function()
-    {
-        var priority = this.priority;
-        var value = this.value;
-
-        if (priority && !priority.length)
-            delete priority;
-        if (priority)
-            priority = "!" + priority;
-
-        this.updateState();
-
-        var enabledCheckboxElement = document.createElement("input");
-        enabledCheckboxElement.className = "enabled-button";
-        enabledCheckboxElement.type = "checkbox";
-        enabledCheckboxElement.checked = !this.disabled;
-        enabledCheckboxElement.addEventListener("change", this.toggleEnabled.bind(this), false);
-
-        var nameElement = document.createElement("span");
-        nameElement.className = "name";
-        nameElement.textContent = this.name;
-        this.nameElement = nameElement;
-
-        var valueElement = document.createElement("span");
-        valueElement.className = "value";
-        this.valueElement = valueElement;
-
-        if (value) {
-            function processValue(regex, processor, nextProcessor, valueText)
-            {
-                var container = document.createDocumentFragment();
-
-                var items = valueText.replace(regex, "\0$1\0").split("\0");
-                for (var i = 0; i < items.length; ++i) {
-                    if ((i % 2) === 0) {
-                        if (nextProcessor)
-                            container.appendChild(nextProcessor(items[i]));
-                        else
-                            container.appendChild(document.createTextNode(items[i]));
-                    } else {
-                        var processedNode = processor(items[i]);
-                        if (processedNode)
-                            container.appendChild(processedNode);
-                    }
-                }
-
-                return container;
-            }
-
-            function linkifyURL(url)
-            {
-                var container = document.createDocumentFragment();
-                container.appendChild(document.createTextNode("url("));
-                container.appendChild(WebInspector.linkifyURLAsNode(url, url, null, (url in WebInspector.resourceURLMap)));
-                container.appendChild(document.createTextNode(")"));
-                return container;
-            }
-
-            function processColor(text)
-            {
-                try {
-                    var color = new WebInspector.Color(text);
-                } catch (e) {
-                    return document.createTextNode(text);
-                }
-
-                var swatchElement = document.createElement("span");
-                swatchElement.title = WebInspector.UIString("Click to change color format");
-                swatchElement.className = "swatch";
-                swatchElement.style.setProperty("background-color", text);
-
-                swatchElement.addEventListener("click", changeColorDisplay, false);
-                swatchElement.addEventListener("dblclick", function(event) { event.stopPropagation() }, false);
-
-                var format;
-                if (Preferences.showColorNicknames && color.nickname)
-                    format = "nickname";
-                else if (WebInspector.settings.colorFormat === "rgb")
-                    format = (color.simple ? "rgb" : "rgba");
-                else if (WebInspector.settings.colorFormat === "hsl")
-                    format = (color.simple ? "hsl" : "hsla");
-                else if (color.simple)
-                    format = (color.hasShortHex() ? "shorthex" : "hex");
-                else
-                    format = "rgba";
-
-                var colorValueElement = document.createElement("span");
-                colorValueElement.textContent = color.toString(format);
-
-                function changeColorDisplay(event)
-                {
-                    switch (format) {
-                        case "rgb":
-                            format = "hsl";
-                            break;
-
-                        case "shorthex":
-                            format = "hex";
-                            break;
-
-                        case "hex":
-                            format = "rgb";
-                            break;
-
-                        case "nickname":
-                            if (color.simple) {
-                                if (color.hasShortHex())
-                                    format = "shorthex";
-                                else
-                                    format = "hex";
-                                break;
-                            }
-
-                            format = "rgba";
-                            break;
-
-                        case "hsl":
-                            if (color.nickname)
-                                format = "nickname";
-                            else if (color.hasShortHex())
-                                format = "shorthex";
-                            else
-                                format = "hex";
-                            break;
-
-                        case "rgba":
-                            format = "hsla";
-                            break;
-
-                        case "hsla":
-                            if (color.nickname)
-                                format = "nickname";
-                            else
-                                format = "rgba";
-                            break;
-                    }
-
-                    colorValueElement.textContent = color.toString(format);
-                }
-
-                var container = document.createDocumentFragment();
-                container.appendChild(swatchElement);
-                container.appendChild(colorValueElement);
-                return container;
-            }
-
-            var colorRegex = /((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b)/g;
-            var colorProcessor = processValue.bind(window, colorRegex, processColor, null);
-
-            valueElement.appendChild(processValue(/url\(([^)]+)\)/g, linkifyURL, colorProcessor, value));
-        }
-
-        if (priority) {
-            var priorityElement = document.createElement("span");
-            priorityElement.className = "priority";
-            priorityElement.textContent = priority;
-        }
-
-        this.listItemElement.removeChildren();
-
-        // Append the checkbox for root elements of an editable section.
-        if (this.treeOutline.section && this.treeOutline.section.editable && this.parent.root)
-            this.listItemElement.appendChild(enabledCheckboxElement);
-        this.listItemElement.appendChild(nameElement);
-        this.listItemElement.appendChild(document.createTextNode(": "));
-        this.listItemElement.appendChild(valueElement);
-
-        if (priorityElement) {
-            this.listItemElement.appendChild(document.createTextNode(" "));
-            this.listItemElement.appendChild(priorityElement);
-        }
-
-        this.listItemElement.appendChild(document.createTextNode(";"));
-
-        this.tooltip = this.name + ": " + valueElement.textContent + (priority ? " " + priority : "");
-    },
-
-    updateAll: function(updateAllRules)
-    {
-        if (updateAllRules && this.treeOutline.section && this.treeOutline.section.pane)
-            this.treeOutline.section.pane.update(null, this.treeOutline.section);
-        else if (this.treeOutline.section)
-            this.treeOutline.section.update(true);
-        else
-            this.updateTitle(); // FIXME: this will not show new properties. But we don't hit his case yet.
-    },
-
-    toggleEnabled: function(event)
-    {
-        var disabled = !event.target.checked;
-
-        var self = this;
-        function callback(newPayload)
-        {
-            if (!newPayload)
-                return;
-
-            self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
-            self._styleRule.style = self.style;
-
-            // Set the disabled property here, since the code above replies on it not changing
-            // until after the value and priority are retrieved.
-            self.disabled = disabled;
-
-            if (self.treeOutline.section && self.treeOutline.section.pane)
-                self.treeOutline.section.pane.dispatchEventToListeners("style property toggled");
-
-            self.updateAll(true);
-        }
-
-        InjectedScriptAccess.toggleStyleEnabled(this.style.id, this.name, disabled, callback);
-    },
-
-    updateState: function()
-    {
-        if (!this.listItemElement)
-            return;
-
-        if (this.style.isPropertyImplicit(this.name) || this.value === "initial")
-            this.listItemElement.addStyleClass("implicit");
-        else
-            this.listItemElement.removeStyleClass("implicit");
-
-        if (this.inherited)
-            this.listItemElement.addStyleClass("inherited");
-        else
-            this.listItemElement.removeStyleClass("inherited");
-
-        if (this.overloaded)
-            this.listItemElement.addStyleClass("overloaded");
-        else
-            this.listItemElement.removeStyleClass("overloaded");
-
-        if (this.disabled)
-            this.listItemElement.addStyleClass("disabled");
-        else
-            this.listItemElement.removeStyleClass("disabled");
-    },
-
-    onpopulate: function()
-    {
-        // Only populate once and if this property is a shorthand.
-        if (this.children.length || !this.shorthand)
-            return;
-
-        var longhandProperties = this.style.getLonghandProperties(this.name);
-        for (var i = 0; i < longhandProperties.length; ++i) {
-            var name = longhandProperties[i];
-
-            if (this.treeOutline.section) {
-                var inherited = this.treeOutline.section.isPropertyInherited(name);
-                var overloaded = this.treeOutline.section.isPropertyOverloaded(name);
-            }
-
-            var item = new WebInspector.StylePropertyTreeElement(this._styleRule, this.style, name, false, inherited, overloaded);
-            this.appendChild(item);
-        }
-    },
-
-    ondblclick: function(event)
-    {
-        this.startEditing(event.target);
-        event.stopPropagation();
-    },
-
-    startEditing: function(selectElement)
-    {
-        // FIXME: we don't allow editing of longhand properties under a shorthand right now.
-        if (this.parent.shorthand)
-            return;
-
-        if (WebInspector.isBeingEdited(this.listItemElement) || (this.treeOutline.section && !this.treeOutline.section.editable))
-            return;
-
-        var context = { expanded: this.expanded, hasChildren: this.hasChildren };
-
-        // Lie about our children to prevent expanding on double click and to collapse shorthands.
-        this.hasChildren = false;
-
-        if (!selectElement)
-            selectElement = this.listItemElement;
-
-        this.listItemElement.handleKeyEvent = this.editingKeyDown.bind(this);
-
-        WebInspector.startEditing(this.listItemElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-        window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1);
-    },
-
-    editingKeyDown: function(event)
-    {
-        var arrowKeyPressed = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down");
-        var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");
-        if (!arrowKeyPressed && !pageKeyPressed)
-            return;
-
-        var selection = window.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-        if (selectionRange.commonAncestorContainer !== this.listItemElement && !selectionRange.commonAncestorContainer.isDescendant(this.listItemElement))
-            return;
-
-        const styleValueDelimeters = " \t\n\"':;,/()";
-        var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.listItemElement);
-        var wordString = wordRange.toString();
-        var replacementString = wordString;
-
-        var matches = /(.*?)(-?\d+(?:\.\d+)?)(.*)/.exec(wordString);
-        if (matches && matches.length) {
-            var prefix = matches[1];
-            var number = parseFloat(matches[2]);
-            var suffix = matches[3];
-
-            // If the number is near zero or the number is one and the direction will take it near zero.
-            var numberNearZero = (number < 1 && number > -1);
-            if (number === 1 && event.keyIdentifier === "Down")
-                numberNearZero = true;
-            else if (number === -1 && event.keyIdentifier === "Up")
-                numberNearZero = true;
-
-            if (numberNearZero && event.altKey && arrowKeyPressed) {
-                if (event.keyIdentifier === "Down")
-                    number = Math.ceil(number - 1);
-                else
-                    number = Math.floor(number + 1);
-            } else {
-                // Jump by 10 when shift is down or jump by 0.1 when near zero or Alt/Option is down.
-                // Also jump by 10 for page up and down, or by 100 if shift is held with a page key.
-                var changeAmount = 1;
-                if (event.shiftKey && pageKeyPressed)
-                    changeAmount = 100;
-                else if (event.shiftKey || pageKeyPressed)
-                    changeAmount = 10;
-                else if (event.altKey || numberNearZero)
-                    changeAmount = 0.1;
-
-                if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")
-                    changeAmount *= -1;
-
-                // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
-                // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
-                number = Number((number + changeAmount).toFixed(6));
-            }
-
-            replacementString = prefix + number + suffix;
-        } else {
-            // FIXME: this should cycle through known keywords for the current property name.
-            return;
-        }
-
-        var replacementTextNode = document.createTextNode(replacementString);
-
-        wordRange.deleteContents();
-        wordRange.insertNode(replacementTextNode);
-
-        var finalSelectionRange = document.createRange();
-        finalSelectionRange.setStart(replacementTextNode, 0);
-        finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
-
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-
-        event.preventDefault();
-        event.handled = true;
-
-        if (!this.originalCSSText) {
-            // Remember the rule's original CSS text, so it can be restored
-            // if the editing is canceled and before each apply.
-            this.originalCSSText = this.style.styleTextWithShorthands();
-        } else {
-            // Restore the original CSS text before applying user changes. This is needed to prevent
-            // new properties from sticking around if the user adds one, then removes it.
-            InjectedScriptAccess.setStyleText(this.style.id, this.originalCSSText);
-        }
-
-        this.applyStyleText(this.listItemElement.textContent);
-    },
-
-    editingEnded: function(context)
-    {
-        this.hasChildren = context.hasChildren;
-        if (context.expanded)
-            this.expand();
-        delete this.listItemElement.handleKeyEvent;
-        delete this.originalCSSText;
-    },
-
-    editingCancelled: function(element, context)
-    {
-        if (this._newProperty)
-            this.treeOutline.removeChild(this);
-        else if (this.originalCSSText) {
-            InjectedScriptAccess.setStyleText(this.style.id, this.originalCSSText);
-
-            if (this.treeOutline.section && this.treeOutline.section.pane)
-                this.treeOutline.section.pane.dispatchEventToListeners("style edited");
-
-            this.updateAll();
-        } else
-            this.updateTitle();
-
-        this.editingEnded(context);
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context, moveDirection)
-    {
-        this.editingEnded(context);
-
-        // Determine where to move to before making changes
-        var newProperty, moveToPropertyName, moveToSelector;
-        var moveTo = (moveDirection === "forward" ? this.nextSibling : this.previousSibling);
-        if (moveTo)
-            moveToPropertyName = moveTo.name;
-        else if (moveDirection === "forward")
-            newProperty = true;
-        else if (moveDirection === "backward" && this.treeOutline.section.rule)
-            moveToSelector = true;
-
-        // Make the Changes and trigger the moveToNextCallback after updating
-        var blankInput = /^\s*$/.test(userInput);
-        if (userInput !== previousContent || (this._newProperty && blankInput)) { // only if something changed, or adding a new style and it was blank
-            this.treeOutline.section._afterUpdate = moveToNextCallback.bind(this, this._newProperty, !blankInput);
-            this.applyStyleText(userInput, true);
-        } else
-            moveToNextCallback(this._newProperty, false, this.treeOutline.section, false);
-
-        // The Callback to start editing the next property
-        function moveToNextCallback(alreadyNew, valueChanged, section)
-        {
-            if (!moveDirection)
-                return;
-
-            // User just tabbed through without changes
-            if (moveTo && moveTo.parent) {
-                moveTo.startEditing(moveTo.valueElement);
-                return;
-            }
-
-            // User has made a change then tabbed, wiping all the original treeElements,
-            // recalculate the new treeElement for the same property we were going to edit next
-            if (moveTo && !moveTo.parent) {
-                var treeElement = section.findTreeElementWithName(moveToPropertyName);
-                if (treeElement)
-                    treeElement.startEditing(treeElement.valueElement);
-                return;
-            }
-
-            // Create a new attribute in this section
-            if (newProperty) {
-                if (alreadyNew && !valueChanged)
-                    return;
-
-                var item = section.addNewBlankProperty();
-                item.startEditing();
-                return;
-            }
-
-            if (moveToSelector)
-                section.startEditingSelector();
-        }
-    },
-
-    applyStyleText: function(styleText, updateInterface)
-    {
-        var section = this.treeOutline.section;
-        var elementsPanel = WebInspector.panels.elements;
-        var styleTextLength = styleText.trimWhitespace().length;
-        if (!styleTextLength && updateInterface) {
-            if (this._newProperty) {
-                // The user deleted everything, so remove the tree element and update.
-                this.parent.removeChild(this);
-                return;
-            } else {
-                delete section._afterUpdate;
-            }
-        }
-
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // The user typed something, but it didn't parse. Just abort and restore
-                // the original title for this property.  If this was a new attribute and
-                // we couldn't parse, then just remove it.
-                if (self._newProperty) {
-                    self.parent.removeChild(self);
-                    return;
-                }
-                if (updateInterface)
-                    self.updateTitle();
-                return;
-            }
-
-            var newPayload = result[0];
-            var changedProperties = result[1];
-            elementsPanel.removeStyleChange(section.identifier, self.style, self.name);
-
-            if (!styleTextLength) {
-                // Do remove ourselves from UI when the property removal is confirmed.
-                self.parent.removeChild(self);
-            } else {
-                self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
-                for (var i = 0; i < changedProperties.length; ++i)
-                    elementsPanel.addStyleChange(section.identifier, self.style, changedProperties[i]);
-                self._styleRule.style = self.style;
-            }
-
-            if (section && section.pane)
-                section.pane.dispatchEventToListeners("style edited");
-
-            if (updateInterface)
-                self.updateAll(true);
-
-            if (!section.rule)
-                WebInspector.panels.elements.treeOutline.update();
-        }
-
-        InjectedScriptAccess.applyStyleText(this.style.id, styleText.trimWhitespace(), this.name, callback);
-    }
-}
-
-WebInspector.StylePropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* PanelEnablerView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PanelEnablerView = function(identifier, headingText, disclaimerText, buttonTitle)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("panel-enabler-view");
-    this.element.addStyleClass(identifier);
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.className = "panel-enabler-view-content";
-    this.element.appendChild(this.contentElement);
-
-    this.imageElement = document.createElement("img");
-    this.contentElement.appendChild(this.imageElement);
-
-    this.choicesForm = document.createElement("form");
-    this.contentElement.appendChild(this.choicesForm);
-
-    this.headerElement = document.createElement("h1");
-    this.headerElement.textContent = headingText;
-    this.choicesForm.appendChild(this.headerElement);
-
-    var self = this;
-    function enableOption(text, checked) {
-        var label = document.createElement("label");
-        var option = document.createElement("input");
-        option.type = "radio";
-        option.name = "enable-option";
-        if (checked)
-            option.checked = true;
-        label.appendChild(option);
-        label.appendChild(document.createTextNode(text));
-        self.choicesForm.appendChild(label);
-        return option;
-    };
-
-    this.enabledForSession = enableOption(WebInspector.UIString("Only enable for this session"), true);
-    this.enabledAlways = enableOption(WebInspector.UIString("Always enable"));
-
-    this.disclaimerElement = document.createElement("div");
-    this.disclaimerElement.className = "panel-enabler-disclaimer";
-    this.disclaimerElement.textContent = disclaimerText;
-    this.choicesForm.appendChild(this.disclaimerElement);
-
-    this.enableButton = document.createElement("button");
-    this.enableButton.setAttribute("type", "button");
-    this.enableButton.textContent = buttonTitle;
-    this.enableButton.addEventListener("click", this._enableButtonCicked.bind(this), false);
-    this.choicesForm.appendChild(this.enableButton);
-
-    window.addEventListener("resize", this._windowResized.bind(this), true);
-}
-
-WebInspector.PanelEnablerView.prototype = {
-    _enableButtonCicked: function()
-    {
-        this.dispatchEventToListeners("enable clicked");
-    },
-
-    _windowResized: function()
-    {
-        this.imageElement.removeStyleClass("hidden");
-
-        if (this.element.offsetWidth < (this.choicesForm.offsetWidth + this.imageElement.offsetWidth))
-            this.imageElement.addStyleClass("hidden");
-    },
-
-    get alwaysEnabled() {
-        return this.enabledAlways.checked;
-    }
-}
-
-WebInspector.PanelEnablerView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* StatusBarButton.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StatusBarButton = function(title, className)
-{
-    this.element = document.createElement("button");
-    this.element.className = className + " status-bar-item";
-    this.element.addEventListener("click", this._clicked.bind(this), false);
-
-    this.glyph = document.createElement("div");
-    this.glyph.className = "glyph";
-    this.element.appendChild(this.glyph);
-
-    this.glyphShadow = document.createElement("div");
-    this.glyphShadow.className = "glyph shadow";
-    this.element.appendChild(this.glyphShadow);
-
-    this.title = title;
-    this.disabled = false;
-    this._toggled = false;
-    this._visible = true;
-}
-
-WebInspector.StatusBarButton.prototype = {
-    _clicked: function()
-    {
-        this.dispatchEventToListeners("click");
-    },
-
-    get disabled()
-    {
-        return this._disabled;
-    },
-
-    set disabled(x)
-    {
-        if (this._disabled === x)
-            return;
-        this._disabled = x;
-        this.element.disabled = x;
-    },
-
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.element.title = x;
-    },
-
-    get toggled()
-    {
-        return this._toggled;
-    },
-
-    set toggled(x)
-    {
-        if (this._toggled === x)
-            return;
-
-        if (x)
-            this.element.addStyleClass("toggled-on");
-        else
-            this.element.removeStyleClass("toggled-on");
-        this._toggled = x;
-    },
-
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set visible(x)
-    {
-        if (this._visible === x)
-            return;
-
-        if (x)
-            this.element.removeStyleClass("hidden");
-        else
-            this.element.addStyleClass("hidden");
-        this._visible = x;
-    }
-}
-
-WebInspector.StatusBarButton.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SummaryBar.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SummaryBar = function(categories)
-{
-    this.categories = categories;
-
-    this.element = document.createElement("div");
-    this.element.className = "summary-bar";
-
-    this.graphElement = document.createElement("canvas");
-    this.graphElement.setAttribute("width", "450");
-    this.graphElement.setAttribute("height", "38");
-    this.graphElement.className = "summary-graph";
-    this.element.appendChild(this.graphElement);
-
-    this.legendElement = document.createElement("div");
-    this.legendElement.className = "summary-graph-legend";
-    this.element.appendChild(this.legendElement);
-}
-
-WebInspector.SummaryBar.prototype = {
-
-    get calculator() {
-        return this._calculator;
-    },
-
-    set calculator(x) {
-        this._calculator = x;
-    },
-
-    reset: function()
-    {
-        this.legendElement.removeChildren();
-        this._drawSummaryGraph();
-    },
-
-    update: function(data)
-    {
-        var graphInfo = this.calculator.computeSummaryValues(data);
-
-        var fillSegments = [];
-
-        this.legendElement.removeChildren();
-
-        for (var category in this.categories) {
-            var size = graphInfo.categoryValues[category];
-            if (!size)
-                continue;
-
-            var colorString = this.categories[category].color;
-
-            var fillSegment = {color: colorString, value: size};
-            fillSegments.push(fillSegment);
-
-            var legendLabel = this._makeLegendElement(this.categories[category].title, this.calculator.formatValue(size), colorString);
-            this.legendElement.appendChild(legendLabel);
-        }
-
-        if (graphInfo.total) {
-            var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));
-            totalLegendLabel.addStyleClass("total");
-            this.legendElement.appendChild(totalLegendLabel);
-        }
-
-        this._drawSummaryGraph(fillSegments);
-    },
-
-    _drawSwatch: function(canvas, color)
-    {
-        var ctx = canvas.getContext("2d");
-
-        function drawSwatchSquare() {
-            ctx.fillStyle = color;
-            ctx.fillRect(0, 0, 13, 13);
-
-            var gradient = ctx.createLinearGradient(0, 0, 13, 13);
-            gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");
-            gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
-
-            ctx.fillStyle = gradient;
-            ctx.fillRect(0, 0, 13, 13);
-
-            gradient = ctx.createLinearGradient(13, 13, 0, 0);
-            gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");
-            gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
-
-            ctx.fillStyle = gradient;
-            ctx.fillRect(0, 0, 13, 13);
-
-            ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";
-            ctx.strokeRect(0.5, 0.5, 12, 12);
-        }
-
-        ctx.clearRect(0, 0, 13, 24);
-
-        drawSwatchSquare();
-
-        ctx.save();
-
-        ctx.translate(0, 25);
-        ctx.scale(1, -1);
-
-        drawSwatchSquare();
-
-        ctx.restore();
-
-        this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);
-    },
-
-    _drawSummaryGraph: function(segments)
-    {
-        if (!segments || !segments.length) {
-            segments = [{color: "white", value: 1}];
-            this._showingEmptySummaryGraph = true;
-        } else
-            delete this._showingEmptySummaryGraph;
-
-        // Calculate the total of all segments.
-        var total = 0;
-        for (var i = 0; i < segments.length; ++i)
-            total += segments[i].value;
-
-        // Calculate the percentage of each segment, rounded to the nearest percent.
-        var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });
-
-        // Calculate the total percentage.
-        var percentTotal = 0;
-        for (var i = 0; i < percents.length; ++i)
-            percentTotal += percents[i];
-
-        // Make sure our percentage total is not greater-than 100, it can be greater
-        // if we rounded up for a few segments.
-        while (percentTotal > 100) {
-            for (var i = 0; i < percents.length && percentTotal > 100; ++i) {
-                if (percents[i] > 1) {
-                    --percents[i];
-                    --percentTotal;
-                }
-            }
-        }
-
-        // Make sure our percentage total is not less-than 100, it can be less
-        // if we rounded down for a few segments.
-        while (percentTotal < 100) {
-            for (var i = 0; i < percents.length && percentTotal < 100; ++i) {
-                ++percents[i];
-                ++percentTotal;
-            }
-        }
-
-        var ctx = this.graphElement.getContext("2d");
-
-        var x = 0;
-        var y = 0;
-        var w = 450;
-        var h = 19;
-        var r = (h / 2);
-
-        function drawPillShadow()
-        {
-            // This draws a line with a shadow that is offset away from the line. The line is stroked
-            // twice with different X shadow offsets to give more feathered edges. Later we erase the
-            // line with destination-out 100% transparent black, leaving only the shadow. This only
-            // works if nothing has been drawn into the canvas yet.
-
-            ctx.beginPath();
-            ctx.moveTo(x + 4, y + h - 3 - 0.5);
-            ctx.lineTo(x + w - 4, y + h - 3 - 0.5);
-            ctx.closePath();
-
-            ctx.save();
-
-            ctx.shadowBlur = 2;
-            ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
-            ctx.shadowOffsetX = 3;
-            ctx.shadowOffsetY = 5;
-
-            ctx.strokeStyle = "white";
-            ctx.lineWidth = 1;
-
-            ctx.stroke();
-
-            ctx.shadowOffsetX = -3;
-
-            ctx.stroke();
-
-            ctx.restore();
-
-            ctx.save();
-
-            ctx.globalCompositeOperation = "destination-out";
-            ctx.strokeStyle = "rgba(0, 0, 0, 1)";
-            ctx.lineWidth = 1;
-
-            ctx.stroke();
-
-            ctx.restore();
-        }
-
-        function drawPill()
-        {
-            // Make a rounded rect path.
-            ctx.beginPath();
-            ctx.moveTo(x, y + r);
-            ctx.lineTo(x, y + h - r);
-            ctx.quadraticCurveTo(x, y + h, x + r, y + h);
-            ctx.lineTo(x + w - r, y + h);
-            ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
-            ctx.lineTo(x + w, y + r);
-            ctx.quadraticCurveTo(x + w, y, x + w - r, y);
-            ctx.lineTo(x + r, y);
-            ctx.quadraticCurveTo(x, y, x, y + r);
-            ctx.closePath();
-
-            // Clip to the rounded rect path.
-            ctx.save();
-            ctx.clip();
-
-            // Fill the segments with the associated color.
-            var previousSegmentsWidth = 0;
-            for (var i = 0; i < segments.length; ++i) {
-                var segmentWidth = Math.round(w * percents[i] / 100);
-                ctx.fillStyle = segments[i].color;
-                ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);
-                previousSegmentsWidth += segmentWidth;
-            }
-
-            // Draw the segment divider lines.
-            ctx.lineWidth = 1;
-            for (var i = 1; i < 20; ++i) {
-                ctx.beginPath();
-                ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);
-                ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);
-                ctx.closePath();
-
-                ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";
-                ctx.stroke();
-
-                ctx.beginPath();
-                ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);
-                ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);
-                ctx.closePath();
-
-                ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";
-                ctx.stroke();
-            }
-
-            // Draw the pill shading.
-            var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));
-            lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");
-            lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");
-            lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
-
-            var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);
-            darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
-            darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");
-            darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");
-
-            ctx.fillStyle = darkGradient;
-            ctx.fillRect(x, y, w, h);
-
-            ctx.fillStyle = lightGradient;
-            ctx.fillRect(x, y, w, h);
-
-            ctx.restore();
-        }
-
-        ctx.clearRect(x, y, w, (h * 2));
-
-        drawPillShadow();
-        drawPill();
-
-        ctx.save();
-
-        ctx.translate(0, (h * 2) + 1);
-        ctx.scale(1, -1);
-
-        drawPill();
-
-        ctx.restore();
-
-        this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);
-    },
-
-    _fadeOutRect: function(ctx, x, y, w, h, a1, a2)
-    {
-        ctx.save();
-
-        var gradient = ctx.createLinearGradient(x, y, x, y + h);
-        gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");
-        gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");
-        gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");
-
-        ctx.globalCompositeOperation = "destination-out";
-
-        ctx.fillStyle = gradient;
-        ctx.fillRect(x, y, w, h);
-
-        ctx.restore();
-    },
-
-    _makeLegendElement: function(label, value, color)
-    {
-        var legendElement = document.createElement("label");
-        legendElement.className = "summary-graph-legend-item";
-
-        if (color) {
-            var swatch = document.createElement("canvas");
-            swatch.className = "summary-graph-legend-swatch";
-            swatch.setAttribute("width", "13");
-            swatch.setAttribute("height", "24");
-
-            legendElement.appendChild(swatch);
-
-            this._drawSwatch(swatch, color);
-        }
-
-        var labelElement = document.createElement("div");
-        labelElement.className = "summary-graph-legend-label";
-        legendElement.appendChild(labelElement);
-
-        var headerElement = document.createElement("div");
-        headerElement.className = "summary-graph-legend-header";
-        headerElement.textContent = label;
-        labelElement.appendChild(headerElement);
-
-        var valueElement = document.createElement("div");
-        valueElement.className = "summary-graph-legend-value";
-        valueElement.textContent = value;
-        labelElement.appendChild(valueElement);
-
-        return legendElement;
-    }
-}
-
-WebInspector.SummaryBar.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ElementsPanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008 Matt Lilek <[email protected]>
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ElementsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.element.addStyleClass("elements");
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.id = "elements-content";
-    this.contentElement.className = "outline-disclosure source-code";
-
-    this.treeOutline = new WebInspector.ElementsTreeOutline();
-    this.treeOutline.panel = this;
-    this.treeOutline.includeRootDOMNode = false;
-    this.treeOutline.selectEnabled = true;
-
-    this.treeOutline.focusedNodeChanged = function(forceUpdate)
-    {
-        if (this.panel.visible && WebInspector.currentFocusElement !== document.getElementById("search"))
-            WebInspector.currentFocusElement = this.element;
-
-        this.panel.updateBreadcrumb(forceUpdate);
-
-        for (var pane in this.panel.sidebarPanes)
-           this.panel.sidebarPanes[pane].needsUpdate = true;
-
-        this.panel.updateStyles(true);
-        this.panel.updateMetrics();
-        this.panel.updateProperties();
-        this.panel.updateEventListeners();
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.panel.nodeSearchButton.toggled = false;
-        }
-        if (this._focusedDOMNode)
-            InjectedScriptAccess.addInspectedNode(this._focusedDOMNode.id, function() {});
-    };
-
-    this.contentElement.appendChild(this.treeOutline.element);
-
-    this.crumbsElement = document.createElement("div");
-    this.crumbsElement.className = "crumbs";
-    this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false);
-    this.crumbsElement.addEventListener("mouseout", this._mouseMovedOutOfCrumbs.bind(this), false);
-
-    this.sidebarPanes = {};
-    this.sidebarPanes.styles = new WebInspector.StylesSidebarPane();
-    this.sidebarPanes.metrics = new WebInspector.MetricsSidebarPane();
-    this.sidebarPanes.properties = new WebInspector.PropertiesSidebarPane();
-    this.sidebarPanes.eventListeners = new WebInspector.EventListenersSidebarPane();
-
-    this.sidebarPanes.styles.onexpand = this.updateStyles.bind(this);
-    this.sidebarPanes.metrics.onexpand = this.updateMetrics.bind(this);
-    this.sidebarPanes.properties.onexpand = this.updateProperties.bind(this);
-    this.sidebarPanes.eventListeners.onexpand = this.updateEventListeners.bind(this);
-
-    this.sidebarPanes.styles.expanded = true;
-
-    this.sidebarPanes.styles.addEventListener("style edited", this._stylesPaneEdited, this);
-    this.sidebarPanes.styles.addEventListener("style property toggled", this._stylesPaneEdited, this);
-    this.sidebarPanes.metrics.addEventListener("metrics edited", this._metricsPaneEdited, this);
-
-    this.sidebarElement = document.createElement("div");
-    this.sidebarElement.id = "elements-sidebar";
-
-    this.sidebarElement.appendChild(this.sidebarPanes.styles.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.metrics.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.properties.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.eventListeners.element);
-
-    this.sidebarResizeElement = document.createElement("div");
-    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-    this.sidebarResizeElement.addEventListener("mousedown", this.rightSidebarResizerDragStart.bind(this), false);
-
-    this.nodeSearchButton = new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."), "node-search-status-bar-item");
-    this.nodeSearchButton.addEventListener("click", this._nodeSearchButtonClicked.bind(this), false);
-
-    this.searchingForNode = false;
-
-    this.element.appendChild(this.contentElement);
-    this.element.appendChild(this.sidebarElement);
-    this.element.appendChild(this.sidebarResizeElement);
-
-    this._changedStyles = {};
-
-    this.reset();
-}
-
-WebInspector.ElementsPanel.prototype = {
-    toolbarItemClass: "elements",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Elements");
-    },
-
-    get statusBarItems()
-    {
-        return [this.nodeSearchButton.element, this.crumbsElement];
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.treeOutline.element;
-    },
-
-    updateStatusBarItems: function()
-    {
-        this.updateBreadcrumbSizes();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
-        this.updateBreadcrumb();
-        this.treeOutline.updateSelection();
-        if (this.recentlyModifiedNodes.length)
-            this.updateModifiedNodes();
-    },
-
-    hide: function()
-    {
-        WebInspector.Panel.prototype.hide.call(this);
-
-        WebInspector.hoveredDOMNode = null;
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.nodeSearchButton.toggled = false;
-        }
-    },
-
-    resize: function()
-    {
-        this.treeOutline.updateSelection();
-        this.updateBreadcrumbSizes();
-    },
-
-    reset: function()
-    {
-        if (this.focusedDOMNode) {
-            this._selectedPathOnReset = [];
-            var node = this.focusedDOMNode;
-            while ("index" in node) {
-                this._selectedPathOnReset.push(node.nodeName);
-                this._selectedPathOnReset.push(node.index);
-                node = node.parentNode;
-            }
-            this._selectedPathOnReset.reverse();
-        }
-
-        this.rootDOMNode = null;
-        this.focusedDOMNode = null;
-
-        WebInspector.hoveredDOMNode = null;
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.nodeSearchButton.toggled = false;
-        }
-
-        this.recentlyModifiedNodes = [];
-
-        delete this.currentQuery;
-        this.searchCanceled();
-    },
-
-    setDocument: function(inspectedRootDocument)
-    {
-        this.reset();
-
-        if (!inspectedRootDocument)
-            return;
-
-        inspectedRootDocument.addEventListener("DOMNodeInserted", this._nodeInserted.bind(this));
-        inspectedRootDocument.addEventListener("DOMNodeRemoved", this._nodeRemoved.bind(this));
-
-        this.treeOutline.suppressSelectHighlight = true;
-        this.rootDOMNode = inspectedRootDocument;
-        this.treeOutline.suppressSelectHighlight = false;
-
-        function selectNode(candidateFocusNode)
-        {
-            if (!candidateFocusNode)
-                candidateFocusNode = inspectedRootDocument.body || inspectedRootDocument.documentElement;
-
-            if (!candidateFocusNode)
-                return;
-
-            this.treeOutline.suppressSelectHighlight = true;
-            this.focusedDOMNode = candidateFocusNode;
-            if (this.treeOutline.selectedTreeElement)
-                this.treeOutline.selectedTreeElement.expand();
-            this.treeOutline.suppressSelectHighlight = false;
-        }
-
-        function selectLastSelectedNode(nodeId)
-        {
-            var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : 0;
-            selectNode.call(this, node);
-        }
-
-        if (this._selectedPathOnReset)
-            InjectedScriptAccess.nodeByPath(this._selectedPathOnReset, selectLastSelectedNode.bind(this));
-        else
-            selectNode.call(this);
-        delete this._selectedPathOnReset;
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var treeElement = this.treeOutline.findTreeElement(this._searchResults[i]);
-                if (treeElement)
-                    treeElement.highlighted = false;
-            }
-        }
-
-        WebInspector.updateSearchMatchesCount(0, this);
-
-        this._currentSearchResultIndex = 0;
-        this._searchResults = [];
-        InjectedScriptAccess.searchCanceled(function() {});
-    },
-
-    performSearch: function(query)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        const whitespaceTrimmedQuery = query.trimWhitespace();
-        if (!whitespaceTrimmedQuery.length)
-            return;
-
-        this._updatedMatchCountOnce = false;
-        this._matchesCountUpdateTimeout = null;
-
-        InjectedScriptAccess.performSearch(whitespaceTrimmedQuery, function() {});
-    },
-
-    _updateMatchesCount: function()
-    {
-        WebInspector.updateSearchMatchesCount(this._searchResults.length, this);
-        this._matchesCountUpdateTimeout = null;
-        this._updatedMatchCountOnce = true;
-    },
-
-    _updateMatchesCountSoon: function()
-    {
-        if (!this._updatedMatchCountOnce)
-            return this._updateMatchesCount();
-        if (this._matchesCountUpdateTimeout)
-            return;
-        // Update the matches count every half-second so it doesn't feel twitchy.
-        this._matchesCountUpdateTimeout = setTimeout(this._updateMatchesCount.bind(this), 500);
-    },
-
-    addNodesToSearchResult: function(nodeIds)
-    {
-        if (!nodeIds)
-            return;
-
-        var nodeIdsArray = nodeIds.split(",");
-        for (var i = 0; i < nodeIdsArray.length; ++i) {
-            var nodeId = nodeIdsArray[i];
-            var node = WebInspector.domAgent.nodeForId(nodeId);
-            if (!node)
-                continue;
-
-            if (!this._searchResults.length) {
-                this._currentSearchResultIndex = 0;
-
-                // Only change the focusedDOMNode if the search was manually performed, because
-                // the search may have been performed programmatically and we wouldn't want to
-                // change the current focusedDOMNode.
-                if (WebInspector.currentFocusElement === document.getElementById("search"))
-                    this.focusedDOMNode = node;
-            }
-
-            this._searchResults.push(node);
-
-            // Highlight the tree element to show it matched the search.
-            // FIXME: highlight the substrings in text nodes and attributes.
-            var treeElement = this.treeOutline.findTreeElement(node);
-            if (treeElement)
-                treeElement.highlighted = true;
-        }
-
-        this._updateMatchesCountSoon();
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
-    },
-
-    renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)
-    {
-        // TODO: Implement Shifting the oldSelector, and its contents to a newSelector
-    },
-
-    addStyleChange: function(identifier, style, property)
-    {
-        if (!style.parentRule)
-            return;
-
-        var selector = style.parentRule.selectorText;
-        if (!this._changedStyles[identifier])
-            this._changedStyles[identifier] = {};
-
-        if (!this._changedStyles[identifier][selector])
-            this._changedStyles[identifier][selector] = {};
-
-        if (!this._changedStyles[identifier][selector][property])
-            WebInspector.styleChanges += 1;
-
-        this._changedStyles[identifier][selector][property] = style.getPropertyValue(property);
-    },
-
-    removeStyleChange: function(identifier, style, property)
-    {
-        if (!style.parentRule)
-            return;
-
-        var selector = style.parentRule.selectorText;
-        if (!this._changedStyles[identifier] || !this._changedStyles[identifier][selector])
-            return;
-
-        if (this._changedStyles[identifier][selector][property]) {
-            delete this._changedStyles[identifier][selector][property];
-            WebInspector.styleChanges -= 1;
-        }
-    },
-
-    generateStylesheet: function()
-    {
-        if (!WebInspector.styleChanges)
-            return;
-
-        // Merge Down to Just Selectors
-        var mergedSelectors = {};
-        for (var identifier in this._changedStyles) {
-            for (var selector in this._changedStyles[identifier]) {
-                if (!mergedSelectors[selector])
-                    mergedSelectors[selector] = this._changedStyles[identifier][selector];
-                else { // merge on selector
-                    var merge = {};
-                    for (var property in mergedSelectors[selector])
-                        merge[property] = mergedSelectors[selector][property];
-                    for (var property in this._changedStyles[identifier][selector]) {
-                        if (!merge[property])
-                            merge[property] = this._changedStyles[identifier][selector][property];
-                        else { // merge on property within a selector, include comment to notify user
-                            var value1 = merge[property];
-                            var value2 = this._changedStyles[identifier][selector][property];
-
-                            if (value1 === value2)
-                                merge[property] = [value1];
-                            else if (value1 instanceof Array)
-                                merge[property].push(value2);
-                            else
-                                merge[property] = [value1, value2];
-                        }
-                    }
-                    mergedSelectors[selector] = merge;
-                }
-            }
-        }
-
-        var builder = [];
-        builder.push("/**");
-        builder.push(" * Inspector Generated Stylesheet"); // UIString?
-        builder.push(" */\n");
-
-        var indent = "  ";
-        function displayProperty(property, value, comment) {
-            if (comment)
-                return indent + "/* " + property + ": " + value + "; */";
-            else
-                return indent + property + ": " + value + ";";
-        }
-
-        for (var selector in mergedSelectors) {
-            var psuedoStyle = mergedSelectors[selector];
-            var properties = Object.properties(psuedoStyle);
-            if (properties.length) {
-                builder.push(selector + " {");
-                for (var i = 0; i < properties.length; ++i) {
-                    var property = properties[i];
-                    var value = psuedoStyle[property];
-                    if (!(value instanceof Array))
-                        builder.push(displayProperty(property, value));
-                    else {
-                        if (value.length === 1)
-                            builder.push(displayProperty(property, value) + " /* merged from equivalent edits */"); // UIString?
-                        else {                        
-                            builder.push(indent + "/* There was a Conflict... There were Multiple Edits for '" + property + "' */"); // UIString?
-                            for (var j = 0; j < value.length; ++j)
-                                builder.push(displayProperty(property, value, true));
-                        }
-                    }
-                }
-                builder.push("}\n");
-            }
-        }
-
-        WebInspector.showConsole();
-        WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(builder.join("\n")));
-    },
-
-    get rootDOMNode()
-    {
-        return this.treeOutline.rootDOMNode;
-    },
-
-    set rootDOMNode(x)
-    {
-        this.treeOutline.rootDOMNode = x;
-    },
-
-    get focusedDOMNode()
-    {
-        return this.treeOutline.focusedDOMNode;
-    },
-
-    set focusedDOMNode(x)
-    {
-        this.treeOutline.focusedDOMNode = x;
-    },
-
-    _nodeInserted: function(event)
-    {
-        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, inserted: true});
-        if (this.visible)
-            this._updateModifiedNodesSoon();
-    },
-
-    _nodeRemoved: function(event)
-    {
-        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, removed: true});
-        if (this.visible)
-            this._updateModifiedNodesSoon();
-    },
-
-    _updateModifiedNodesSoon: function()
-    {
-        if ("_updateModifiedNodesTimeout" in this)
-            return;
-        this._updateModifiedNodesTimeout = setTimeout(this.updateModifiedNodes.bind(this), 0);
-    },
-
-    updateModifiedNodes: function()
-    {
-        if ("_updateModifiedNodesTimeout" in this) {
-            clearTimeout(this._updateModifiedNodesTimeout);
-            delete this._updateModifiedNodesTimeout;
-        }
-
-        var updatedParentTreeElements = [];
-        var updateBreadcrumbs = false;
-
-        for (var i = 0; i < this.recentlyModifiedNodes.length; ++i) {
-            var replaced = this.recentlyModifiedNodes[i].replaced;
-            var parent = this.recentlyModifiedNodes[i].parent;
-            if (!parent)
-                continue;
-
-            var parentNodeItem = this.treeOutline.findTreeElement(parent);
-            if (parentNodeItem && !parentNodeItem.alreadyUpdatedChildren) {
-                parentNodeItem.updateChildren(replaced);
-                parentNodeItem.alreadyUpdatedChildren = true;
-                updatedParentTreeElements.push(parentNodeItem);
-            }
-
-            if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))
-                updateBreadcrumbs = true;
-        }
-
-        for (var i = 0; i < updatedParentTreeElements.length; ++i)
-            delete updatedParentTreeElements[i].alreadyUpdatedChildren;
-
-        this.recentlyModifiedNodes = [];
-
-        if (updateBreadcrumbs)
-            this.updateBreadcrumb(true);
-    },
-
-    _stylesPaneEdited: function()
-    {
-        this.sidebarPanes.metrics.needsUpdate = true;
-        this.updateMetrics();
-    },
-
-    _metricsPaneEdited: function()
-    {
-        this.sidebarPanes.styles.needsUpdate = true;
-        this.updateStyles(true);
-    },
-
-    _mouseMovedInCrumbs: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");
-
-        WebInspector.hoveredDOMNode = (crumbElement ? crumbElement.representedObject : null);
-
-        if ("_mouseOutOfCrumbsTimeout" in this) {
-            clearTimeout(this._mouseOutOfCrumbsTimeout);
-            delete this._mouseOutOfCrumbsTimeout;
-        }
-    },
-
-    _mouseMovedOutOfCrumbs: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.crumbsElement))
-            return;
-
-        WebInspector.hoveredDOMNode = null;
-
-        this._mouseOutOfCrumbsTimeout = setTimeout(this.updateBreadcrumbSizes.bind(this), 1000);
-    },
-
-    updateBreadcrumb: function(forceUpdate)
-    {
-        if (!this.visible)
-            return;
-
-        var crumbs = this.crumbsElement;
-
-        var handled = false;
-        var foundRoot = false;
-        var crumb = crumbs.firstChild;
-        while (crumb) {
-            if (crumb.representedObject === this.rootDOMNode)
-                foundRoot = true;
-
-            if (foundRoot)
-                crumb.addStyleClass("dimmed");
-            else
-                crumb.removeStyleClass("dimmed");
-
-            if (crumb.representedObject === this.focusedDOMNode) {
-                crumb.addStyleClass("selected");
-                handled = true;
-            } else {
-                crumb.removeStyleClass("selected");
-            }
-
-            crumb = crumb.nextSibling;
-        }
-
-        if (handled && !forceUpdate) {
-            // We don't need to rebuild the crumbs, but we need to adjust sizes
-            // to reflect the new focused or root node.
-            this.updateBreadcrumbSizes();
-            return;
-        }
-
-        crumbs.removeChildren();
-
-        var panel = this;
-
-        function selectCrumbFunction(event)
-        {
-            var crumb = event.currentTarget;
-            if (crumb.hasStyleClass("collapsed")) {
-                // Clicking a collapsed crumb will expose the hidden crumbs.
-                if (crumb === panel.crumbsElement.firstChild) {
-                    // If the focused crumb is the first child, pick the farthest crumb
-                    // that is still hidden. This allows the user to expose every crumb.
-                    var currentCrumb = crumb;
-                    while (currentCrumb) {
-                        var hidden = currentCrumb.hasStyleClass("hidden");
-                        var collapsed = currentCrumb.hasStyleClass("collapsed");
-                        if (!hidden && !collapsed)
-                            break;
-                        crumb = currentCrumb;
-                        currentCrumb = currentCrumb.nextSibling;
-                    }
-                }
-
-                panel.updateBreadcrumbSizes(crumb);
-            } else {
-                // Clicking a dimmed crumb or double clicking (event.detail >= 2)
-                // will change the root node in addition to the focused node.
-                if (event.detail >= 2 || crumb.hasStyleClass("dimmed"))
-                    panel.rootDOMNode = crumb.representedObject.parentNode;
-                panel.focusedDOMNode = crumb.representedObject;
-            }
-
-            event.preventDefault();
-        }
-
-        foundRoot = false;
-        for (var current = this.focusedDOMNode; current; current = current.parentNode) {
-            if (current.nodeType === Node.DOCUMENT_NODE)
-                continue;
-
-            if (current === this.rootDOMNode)
-                foundRoot = true;
-
-            var crumb = document.createElement("span");
-            crumb.className = "crumb";
-            crumb.representedObject = current;
-            crumb.addEventListener("mousedown", selectCrumbFunction, false);
-
-            var crumbTitle;
-            switch (current.nodeType) {
-                case Node.ELEMENT_NODE:
-                    crumbTitle = current.nodeName.toLowerCase();
-
-                    var nameElement = document.createElement("span");
-                    nameElement.textContent = crumbTitle;
-                    crumb.appendChild(nameElement);
-
-                    var idAttribute = current.getAttribute("id");
-                    if (idAttribute) {
-                        var idElement = document.createElement("span");
-                        crumb.appendChild(idElement);
-
-                        var part = "#" + idAttribute;
-                        crumbTitle += part;
-                        idElement.appendChild(document.createTextNode(part));
-
-                        // Mark the name as extra, since the ID is more important.
-                        nameElement.className = "extra";
-                    }
-
-                    var classAttribute = current.getAttribute("class");
-                    if (classAttribute) {
-                        var classes = classAttribute.split(/\s+/);
-                        var foundClasses = {};
-
-                        if (classes.length) {
-                            var classesElement = document.createElement("span");
-                            classesElement.className = "extra";
-                            crumb.appendChild(classesElement);
-
-                            for (var i = 0; i < classes.length; ++i) {
-                                var className = classes[i];
-                                if (className && !(className in foundClasses)) {
-                                    var part = "." + className;
-                                    crumbTitle += part;
-                                    classesElement.appendChild(document.createTextNode(part));
-                                    foundClasses[className] = true;
-                                }
-                            }
-                        }
-                    }
-
-                    break;
-
-                case Node.TEXT_NODE:
-                    if (isNodeWhitespace.call(current))
-                        crumbTitle = WebInspector.UIString("(whitespace)");
-                    else
-                        crumbTitle = WebInspector.UIString("(text)");
-                    break
-
-                case Node.COMMENT_NODE:
-                    crumbTitle = "<!-->";
-                    break;
-
-                case Node.DOCUMENT_TYPE_NODE:
-                    crumbTitle = "<!DOCTYPE>";
-                    break;
-
-                default:
-                    crumbTitle = current.nodeName.toLowerCase();
-            }
-
-            if (!crumb.childNodes.length) {
-                var nameElement = document.createElement("span");
-                nameElement.textContent = crumbTitle;
-                crumb.appendChild(nameElement);
-            }
-
-            crumb.title = crumbTitle;
-
-            if (foundRoot)
-                crumb.addStyleClass("dimmed");
-            if (current === this.focusedDOMNode)
-                crumb.addStyleClass("selected");
-            if (!crumbs.childNodes.length)
-                crumb.addStyleClass("end");
-
-            crumbs.appendChild(crumb);
-        }
-
-        if (crumbs.hasChildNodes())
-            crumbs.lastChild.addStyleClass("start");
-
-        this.updateBreadcrumbSizes();
-    },
-
-    updateBreadcrumbSizes: function(focusedCrumb)
-    {
-        if (!this.visible)
-            return;
-
-        if (document.body.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        var crumbs = this.crumbsElement;
-        if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)
-            return; // No crumbs, do nothing.
-
-        // A Zero index is the right most child crumb in the breadcrumb.
-        var selectedIndex = 0;
-        var focusedIndex = 0;
-        var selectedCrumb;
-
-        var i = 0;
-        var crumb = crumbs.firstChild;
-        while (crumb) {
-            // Find the selected crumb and index. 
-            if (!selectedCrumb && crumb.hasStyleClass("selected")) {
-                selectedCrumb = crumb;
-                selectedIndex = i;
-            }
-
-            // Find the focused crumb index. 
-            if (crumb === focusedCrumb)
-                focusedIndex = i;
-
-            // Remove any styles that affect size before
-            // deciding to shorten any crumbs.
-            if (crumb !== crumbs.lastChild)
-                crumb.removeStyleClass("start");
-            if (crumb !== crumbs.firstChild)
-                crumb.removeStyleClass("end");
-
-            crumb.removeStyleClass("compact");
-            crumb.removeStyleClass("collapsed");
-            crumb.removeStyleClass("hidden");
-
-            crumb = crumb.nextSibling;
-            ++i;
-        }
-
-        // Restore the start and end crumb classes in case they got removed in coalesceCollapsedCrumbs().
-        // The order of the crumbs in the document is opposite of the visual order.
-        crumbs.firstChild.addStyleClass("end");
-        crumbs.lastChild.addStyleClass("start");
-
-        function crumbsAreSmallerThanContainer()
-        {
-            var rightPadding = 20;
-            var errorWarningElement = document.getElementById("error-warning-count");
-            if (!WebInspector.drawer.visible && errorWarningElement)
-                rightPadding += errorWarningElement.offsetWidth;
-            return ((crumbs.totalOffsetLeft + crumbs.offsetWidth + rightPadding) < window.innerWidth);
-        }
-
-        if (crumbsAreSmallerThanContainer())
-            return; // No need to compact the crumbs, they all fit at full size.
-
-        var BothSides = 0;
-        var AncestorSide = -1;
-        var ChildSide = 1;
-
-        function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb)
-        {
-            if (!significantCrumb)
-                significantCrumb = (focusedCrumb || selectedCrumb);
-
-            if (significantCrumb === selectedCrumb)
-                var significantIndex = selectedIndex;
-            else if (significantCrumb === focusedCrumb)
-                var significantIndex = focusedIndex;
-            else {
-                var significantIndex = 0;
-                for (var i = 0; i < crumbs.childNodes.length; ++i) {
-                    if (crumbs.childNodes[i] === significantCrumb) {
-                        significantIndex = i;
-                        break;
-                    }
-                }
-            }
-
-            function shrinkCrumbAtIndex(index)
-            {
-                var shrinkCrumb = crumbs.childNodes[index];
-                if (shrinkCrumb && shrinkCrumb !== significantCrumb)
-                    shrinkingFunction(shrinkCrumb);
-                if (crumbsAreSmallerThanContainer())
-                    return true; // No need to compact the crumbs more.
-                return false;
-            }
-
-            // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs
-            // fit in the container or we run out of crumbs to shrink.
-            if (direction) {
-                // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb.
-                var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1);
-                while (index !== significantIndex) {
-                    if (shrinkCrumbAtIndex(index))
-                        return true;
-                    index += (direction > 0 ? 1 : -1);
-                }
-            } else {
-                // Crumbs are shrunk in order of descending distance from the signifcant crumb,
-                // with a tie going to child crumbs.
-                var startIndex = 0;
-                var endIndex = crumbs.childNodes.length - 1;
-                while (startIndex != significantIndex || endIndex != significantIndex) {
-                    var startDistance = significantIndex - startIndex;
-                    var endDistance = endIndex - significantIndex;
-                    if (startDistance >= endDistance)
-                        var index = startIndex++;
-                    else
-                        var index = endIndex--;
-                    if (shrinkCrumbAtIndex(index))
-                        return true;
-                }
-            }
-
-            // We are not small enough yet, return false so the caller knows.
-            return false;
-        }
-
-        function coalesceCollapsedCrumbs()
-        {
-            var crumb = crumbs.firstChild;
-            var collapsedRun = false;
-            var newStartNeeded = false;
-            var newEndNeeded = false;
-            while (crumb) {
-                var hidden = crumb.hasStyleClass("hidden");
-                if (!hidden) {
-                    var collapsed = crumb.hasStyleClass("collapsed"); 
-                    if (collapsedRun && collapsed) {
-                        crumb.addStyleClass("hidden");
-                        crumb.removeStyleClass("compact");
-                        crumb.removeStyleClass("collapsed");
-
-                        if (crumb.hasStyleClass("start")) {
-                            crumb.removeStyleClass("start");
-                            newStartNeeded = true;
-                        }
-
-                        if (crumb.hasStyleClass("end")) {
-                            crumb.removeStyleClass("end");
-                            newEndNeeded = true;
-                        }
-
-                        continue;
-                    }
-
-                    collapsedRun = collapsed;
-
-                    if (newEndNeeded) {
-                        newEndNeeded = false;
-                        crumb.addStyleClass("end");
-                    }
-                } else
-                    collapsedRun = true;
-                crumb = crumb.nextSibling;
-            }
-
-            if (newStartNeeded) {
-                crumb = crumbs.lastChild;
-                while (crumb) {
-                    if (!crumb.hasStyleClass("hidden")) {
-                        crumb.addStyleClass("start");
-                        break;
-                    }
-                    crumb = crumb.previousSibling;
-                }
-            }
-        }
-
-        function compact(crumb)
-        {
-            if (crumb.hasStyleClass("hidden"))
-                return;
-            crumb.addStyleClass("compact");
-        }
-
-        function collapse(crumb, dontCoalesce)
-        {
-            if (crumb.hasStyleClass("hidden"))
-                return;
-            crumb.addStyleClass("collapsed");
-            crumb.removeStyleClass("compact");
-            if (!dontCoalesce)
-                coalesceCollapsedCrumbs();
-        }
-
-        function compactDimmed(crumb)
-        {
-            if (crumb.hasStyleClass("dimmed"))
-                compact(crumb);
-        }
-
-        function collapseDimmed(crumb)
-        {
-            if (crumb.hasStyleClass("dimmed"))
-                collapse(crumb);
-        }
-
-        if (!focusedCrumb) {
-            // When not focused on a crumb we can be biased and collapse less important
-            // crumbs that the user might not care much about.
-
-            // Compact child crumbs.
-            if (makeCrumbsSmaller(compact, ChildSide))
-                return;
-
-            // Collapse child crumbs.
-            if (makeCrumbsSmaller(collapse, ChildSide))
-                return;
-
-            // Compact dimmed ancestor crumbs.
-            if (makeCrumbsSmaller(compactDimmed, AncestorSide))
-                return;
-
-            // Collapse dimmed ancestor crumbs.
-            if (makeCrumbsSmaller(collapseDimmed, AncestorSide))
-                return;
-        }
-
-        // Compact ancestor crumbs, or from both sides if focused.
-        if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide)))
-            return;
-
-        // Collapse ancestor crumbs, or from both sides if focused.
-        if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide)))
-            return;
-
-        if (!selectedCrumb)
-            return;
-
-        // Compact the selected crumb.
-        compact(selectedCrumb);
-        if (crumbsAreSmallerThanContainer())
-            return;
-
-        // Collapse the selected crumb as a last resort. Pass true to prevent coalescing.
-        collapse(selectedCrumb, true);
-    },
-
-    updateStyles: function(forceUpdate)
-    {
-        var stylesSidebarPane = this.sidebarPanes.styles;
-        if (!stylesSidebarPane.expanded || !stylesSidebarPane.needsUpdate)
-            return;
-
-        stylesSidebarPane.update(this.focusedDOMNode, null, forceUpdate);
-        stylesSidebarPane.needsUpdate = false;
-    },
-
-    updateMetrics: function()
-    {
-        var metricsSidebarPane = this.sidebarPanes.metrics;
-        if (!metricsSidebarPane.expanded || !metricsSidebarPane.needsUpdate)
-            return;
-
-        metricsSidebarPane.update(this.focusedDOMNode);
-        metricsSidebarPane.needsUpdate = false;
-    },
-
-    updateProperties: function()
-    {
-        var propertiesSidebarPane = this.sidebarPanes.properties;
-        if (!propertiesSidebarPane.expanded || !propertiesSidebarPane.needsUpdate)
-            return;
-
-        propertiesSidebarPane.update(this.focusedDOMNode);
-        propertiesSidebarPane.needsUpdate = false;
-    },
-
-    updateEventListeners: function()
-    {
-        var eventListenersSidebarPane = this.sidebarPanes.eventListeners;
-        if (!eventListenersSidebarPane.expanded || !eventListenersSidebarPane.needsUpdate)
-            return;
-
-        eventListenersSidebarPane.update(this.focusedDOMNode);
-        eventListenersSidebarPane.needsUpdate = false;
-    },
-
-    handleShortcut: function(event)
-    {
-        // Cmd/Control + Shift + C should be a shortcut to clicking the Node Search Button.
-        // This shortcut matches Firebug.
-        if (event.keyIdentifier === "U+0043") {     // C key
-            if (WebInspector.isMac())
-                var isNodeSearchKey = event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey;
-            else
-                var isNodeSearchKey = event.ctrlKey && !event.metaKey && !event.altKey && event.shiftKey;
-
-            if (isNodeSearchKey) {
-                this._nodeSearchButtonClicked(event);
-                event.handled = true;
-                return;
-            }
-        }
-    },
-
-    handleCopyEvent: function(event)
-    {
-        // Don't prevent the normal copy if the user has a selection.
-        if (!window.getSelection().isCollapsed)
-            return;
-        event.clipboardData.clearData();
-        event.preventDefault();
-        InspectorBackend.copyNode(this.focusedDOMNode.id);
-    },
-
-    rightSidebarResizerDragStart: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarElement, this.rightSidebarResizerDrag.bind(this), this.rightSidebarResizerDragEnd.bind(this), event, "col-resize");
-    },
-
-    rightSidebarResizerDragEnd: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    },
-
-    rightSidebarResizerDrag: function(event)
-    {
-        var x = event.pageX;
-        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minElementsSidebarWidth, window.innerWidth * 0.66);
-
-        this.sidebarElement.style.width = newWidth + "px";
-        this.contentElement.style.right = newWidth + "px";
-        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
-
-        this.treeOutline.updateSelection();
-
-        event.preventDefault();
-    },
-
-    _nodeSearchButtonClicked: function(event)
-    {
-        InspectorBackend.toggleNodeSearch();
-
-        this.nodeSearchButton.toggled = InspectorBackend.searchingForNode();
-    }
-}
-
-WebInspector.ElementsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* ResourcesPanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourcesPanel = function()
-{
-    WebInspector.AbstractTimelinePanel.call(this);
-
-    this.element.addStyleClass("resources");
-
-    this._createPanelEnabler();
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "resource-views";
-    this.element.appendChild(this.viewsContainerElement);
-
-    this.createFilterPanel();
-    this.createInterface();
-
-    this._createStatusbarButtons();
-
-    this.reset();
-    this.filter(this.filterAllElement, false);
-    this.graphsTreeElement.children[0].select();
-}
-
-WebInspector.ResourcesPanel.prototype = {
-    toolbarItemClass: "resources",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Resources");
-    },
-
-    get statusBarItems()
-    {
-        return [this.enableToggleButton.element, this.largerResourcesButton.element, this.sortingSelectElement];
-    },
-
-    get categories()
-    {
-        return WebInspector.resourceCategories;
-    },
-
-    createItemTreeElement: function(item)
-    {
-        return new WebInspector.ResourceSidebarTreeElement(item);
-    },
-
-    createItemGraph: function(item)
-    {
-        return new WebInspector.ResourceGraph(item);
-    },
-
-    isCategoryVisible: function(categoryName)
-    {
-        return (this.itemsGraphsElement.hasStyleClass("filter-all") || this.itemsGraphsElement.hasStyleClass("filter-" + categoryName.toLowerCase()));
-    },
-
-    populateSidebar: function()
-    {
-        var timeGraphItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Time"));
-        timeGraphItem.onselect = this._graphSelected.bind(this);
-
-        var transferTimeCalculator = new WebInspector.ResourceTransferTimeCalculator();
-        var transferDurationCalculator = new WebInspector.ResourceTransferDurationCalculator();
-
-        timeGraphItem.sortingOptions = [
-            { name: WebInspector.UIString("Sort by Start Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by Response Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by End Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by Duration"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration, calculator: transferDurationCalculator },
-            { name: WebInspector.UIString("Sort by Latency"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency, calculator: transferDurationCalculator },
-        ];
-
-        timeGraphItem.selectedSortingOptionIndex = 1;
-
-        var sizeGraphItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Size"));
-        sizeGraphItem.onselect = this._graphSelected.bind(this);
-
-        var transferSizeCalculator = new WebInspector.ResourceTransferSizeCalculator();
-        sizeGraphItem.sortingOptions = [
-            { name: WebInspector.UIString("Sort by Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize, calculator: transferSizeCalculator },
-        ];
-
-        sizeGraphItem.selectedSortingOptionIndex = 0;
-
-        this.graphsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("GRAPHS"), {}, true);
-        this.sidebarTree.appendChild(this.graphsTreeElement);
-
-        this.graphsTreeElement.appendChild(timeGraphItem);
-        this.graphsTreeElement.appendChild(sizeGraphItem);
-        this.graphsTreeElement.expand();
-
-        this.itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESOURCES"), {}, true);
-        this.sidebarTree.appendChild(this.itemsTreeElement);
-
-        this.itemsTreeElement.expand();
-    },
-
-    _createPanelEnabler: function()
-    {
-        var panelEnablerHeading = WebInspector.UIString("You need to enable resource tracking to use this panel.");
-        var panelEnablerDisclaimer = WebInspector.UIString("Enabling resource tracking will reload the page and make page loading slower.");
-        var panelEnablerButton = WebInspector.UIString("Enable resource tracking");
-
-        this.panelEnablerView = new WebInspector.PanelEnablerView("resources", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-        this.panelEnablerView.addEventListener("enable clicked", this._enableResourceTracking, this);
-
-        this.element.appendChild(this.panelEnablerView.element);
-
-        this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-        this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
-    },
-
-    _createStatusbarButtons: function()
-    {
-        this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
-
-        WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-        this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
-        this.sortingSelectElement = document.createElement("select");
-        this.sortingSelectElement.className = "status-bar-item";
-        this.sortingSelectElement.addEventListener("change", this._changeSortingFunction.bind(this), false);
-    },
-
-    _settingsLoaded: function()
-    {
-        this.largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
-        if (!WebInspector.settings.resourcesLargeRows)
-            this._setLargerResources(WebInspector.settings.resourcesLargeRows);
-    },
-
-    get mainResourceLoadTime()
-    {
-        return this._mainResourceLoadTime || -1;
-    },
-    
-    set mainResourceLoadTime(x)
-    {
-        if (this._mainResourceLoadTime === x)
-            return;
-        
-        this._mainResourceLoadTime = x;
-        
-        // Update the dividers to draw the new line
-        this.updateGraphDividersIfNeeded(true);
-    },
-    
-    get mainResourceDOMContentTime()
-    {
-        return this._mainResourceDOMContentTime || -1;
-    },
-    
-    set mainResourceDOMContentTime(x)
-    {
-        if (this._mainResourceDOMContentTime === x)
-            return;
-        
-        this._mainResourceDOMContentTime = x;
-        
-        this.updateGraphDividersIfNeeded(true);
-    },
-
-    show: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.show.call(this);
-
-        var visibleView = this.visibleView;
-        if (visibleView) {
-            visibleView.headersVisible = true;
-            visibleView.show(this.viewsContainerElement);
-        }
-
-        // Hide any views that are visible that are not this panel's current visible view.
-        // This can happen when a ResourceView is visible in the Scripts panel then switched
-        // to the this panel.
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            var view = resource._resourcesView;
-            if (!view || view === visibleView)
-                continue;
-            view.visible = false;
-        }
-    },
-
-    resize: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.resize.call(this);
-
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch)
-            views.push(visibleView);
-
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            if (!resource._itemsTreeElement)
-                continue;
-            var resourceView = this.resourceViewForResource(resource);
-            if (!resourceView.performSearch || resourceView === visibleView)
-                continue;
-            views.push(resourceView);
-        }
-
-        return views;
-    },
-
-    get searchResultsSortFunction()
-    {
-        const resourceTreeElementSortFunction = this.sortingFunction;
-
-        function sortFuction(a, b)
-        {
-            return resourceTreeElementSortFunction(a.resource._itemsTreeElement, b.resource._itemsTreeElement);
-        }
-
-        return sortFuction;
-    },
-
-    searchMatchFound: function(view, matches)
-    {
-        view.resource._itemsTreeElement.searchMatches = matches;
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
-
-        if (startingNewSearch || !this._resources)
-            return;
-
-        for (var i = 0; i < this._resources.length; ++i) {
-            var resource = this._resources[i];
-            if (resource._itemsTreeElement)
-                resource._itemsTreeElement.updateErrorsAndWarnings();
-        }
-    },
-
-    performSearch: function(query)
-    {
-        for (var i = 0; i < this._resources.length; ++i) {
-            var resource = this._resources[i];
-            if (resource._itemsTreeElement)
-                resource._itemsTreeElement.resetBubble();
-        }
-
-        WebInspector.Panel.prototype.performSearch.call(this, query);
-    },
-
-    get visibleView()
-    {
-        if (this.visibleResource)
-            return this.visibleResource._resourcesView;
-        return null;
-    },
-
-    get sortingFunction()
-    {
-        return this._sortingFunction;
-    },
-
-    set sortingFunction(x)
-    {
-        this._sortingFunction = x;
-        this._sortResourcesIfNeeded();
-    },
-
-    refresh: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.refresh.call(this);
-
-        this._sortResourcesIfNeeded();
-        this._updateSummaryGraph();
-    },
-
-    _updateSummaryGraph: function()
-    {
-        this.summaryBar.update(this._resources);
-    },
-
-    resourceTrackingWasEnabled: function()
-    {
-        this.reset();
-    },
-
-    resourceTrackingWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        this.closeVisibleResource();
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        if (this._resources) {
-            var resourcesLength = this._resources.length;
-            for (var i = 0; i < resourcesLength; ++i) {
-                var resource = this._resources[i];
-
-                resource.warnings = 0;
-                resource.errors = 0;
-
-                delete resource._resourcesView;
-            }
-        }
-
-        WebInspector.AbstractTimelinePanel.prototype.reset.call(this);
-        
-        this.mainResourceLoadTime = -1;
-        this.mainResourceDOMContentTime = -1;
- 
-        this.viewsContainerElement.removeChildren();
-
-        this.summaryBar.reset();
-
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Resource tracking enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            this.largerResourcesButton.visible = true;
-            this.sortingSelectElement.removeStyleClass("hidden");
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Resource tracking disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            this.largerResourcesButton.visible = false;
-            this.sortingSelectElement.addStyleClass("hidden");
-            this.panelEnablerView.visible = true;
-        }
-    },
-
-    addResource: function(resource)
-    {
-        this._resources.push(resource);
-        this.refreshResource(resource);
-    },
-
-    removeResource: function(resource)
-    {
-        if (this.visibleView === resource._resourcesView)
-            this.closeVisibleResource();
-
-        this.removeItem(resource);
-
-        resource.warnings = 0;
-        resource.errors = 0;
-
-        delete resource._resourcesView;
-    },
-
-    addMessageToResource: function(resource, msg)
-    {
-        if (!resource)
-            return;
-
-        switch (msg.level) {
-        case WebInspector.ConsoleMessage.MessageLevel.Warning:
-            resource.warnings += msg.repeatDelta;
-            break;
-        case WebInspector.ConsoleMessage.MessageLevel.Error:
-            resource.errors += msg.repeatDelta;
-            break;
-        }
-
-        if (!this.currentQuery && resource._itemsTreeElement)
-            resource._itemsTreeElement.updateErrorsAndWarnings();
-
-        var view = this.resourceViewForResource(resource);
-        if (view.addMessage)
-            view.addMessage(msg);
-    },
-
-    clearMessages: function()
-    {
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            resource.warnings = 0;
-            resource.errors = 0;
-
-            if (!this.currentQuery && resource._itemsTreeElement)
-                resource._itemsTreeElement.updateErrorsAndWarnings();
-
-            var view = resource._resourcesView;
-            if (!view || !view.clearMessages)
-                continue;
-            view.clearMessages();
-        }
-    },
-
-    refreshResource: function(resource)
-    {
-        this.refreshItem(resource);
-    },
-
-    recreateViewForResourceIfNeeded: function(resource)
-    {
-        if (!resource || !resource._resourcesView)
-            return;
-
-        var newView = this._createResourceView(resource);
-        if (newView.prototype === resource._resourcesView.prototype)
-            return;
-
-        resource.warnings = 0;
-        resource.errors = 0;
-
-        if (!this.currentQuery && resource._itemsTreeElement)
-            resource._itemsTreeElement.updateErrorsAndWarnings();
-
-        var oldView = resource._resourcesView;
-
-        resource._resourcesView.detach();
-        delete resource._resourcesView;
-
-        resource._resourcesView = newView;
-
-        newView.headersVisible = oldView.headersVisible;
-
-        if (oldView.visible && oldView.element.parentNode)
-            newView.show(oldView.element.parentNode);
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return !!WebInspector.resourceForURL(url);
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        this.showResource(WebInspector.resourceForURL(url), line);
-    },
-
-    showResource: function(resource, line)
-    {
-        if (!resource)
-            return;
-
-        this.containerElement.addStyleClass("viewing-resource");
-
-        if (this.visibleResource && this.visibleResource._resourcesView)
-            this.visibleResource._resourcesView.hide();
-
-        var view = this.resourceViewForResource(resource);
-        view.headersVisible = true;
-        view.show(this.viewsContainerElement);
-
-        if (line) {
-            if (view.revealLine)
-                view.revealLine(line);
-            if (view.highlightLine)
-                view.highlightLine(line);
-        }
-
-        this.revealAndSelectItem(resource);
-
-        this.visibleResource = resource;
-
-        this.updateSidebarWidth();
-    },
-
-    showView: function(view)
-    {
-        if (!view)
-            return;
-        this.showResource(view.resource);
-    },
-
-    closeVisibleResource: function()
-    {
-        this.containerElement.removeStyleClass("viewing-resource");
-        this._updateDividersLabelBarPosition();
-
-        if (this.visibleResource && this.visibleResource._resourcesView)
-            this.visibleResource._resourcesView.hide();
-        delete this.visibleResource;
-
-        if (this._lastSelectedGraphTreeElement)
-            this._lastSelectedGraphTreeElement.select(true);
-
-        this.updateSidebarWidth();
-    },
-
-    resourceViewForResource: function(resource)
-    {
-        if (!resource)
-            return null;
-        if (!resource._resourcesView)
-            resource._resourcesView = this._createResourceView(resource);
-        return resource._resourcesView;
-    },
-
-    sourceFrameForResource: function(resource)
-    {
-        var view = this.resourceViewForResource(resource);
-        if (!view)
-            return null;
-
-        if (!view.setupSourceFrameIfNeeded)
-            return null;
-
-        // Setting up the source frame requires that we be attached.
-        if (!this.element.parentNode)
-            this.attach();
-
-        view.setupSourceFrameIfNeeded();
-        return view.sourceFrame;
-    },
-
-    _sortResourcesIfNeeded: function()
-    {
-        this.sortItems(this.sortingFunction);
-    },
-
-    updateGraphDividersIfNeeded: function(force)
-    {
-        var proceed = WebInspector.AbstractTimelinePanel.prototype.updateGraphDividersIfNeeded.call(this, force);
-        
-        if (!proceed)
-            return;
-
-        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
-            // If our current sorting method starts at zero, that means it shows all
-            // resources starting at the same point, and so onLoad event and DOMContent
-            // event lines really wouldn't make much sense here, so don't render them.
-            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
-            // function defined, we are probably sorting by size, and event times aren't relevant
-            // in this case.
-            return;
-        }
-
-        if (this.mainResourceLoadTime !== -1) {
-            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceLoadTime);
-
-            var loadDivider = document.createElement("div");
-            loadDivider.className = "resources-onload-divider";
-
-            var loadDividerPadding = document.createElement("div");
-            loadDividerPadding.className = "resources-event-divider-padding";
-            loadDividerPadding.style.left = percent + "%";
-            loadDividerPadding.title = WebInspector.UIString("Load event fired");
-            loadDividerPadding.appendChild(loadDivider);
-
-            this.addEventDivider(loadDividerPadding);
-        }
-        
-        if (this.mainResourceDOMContentTime !== -1) {
-            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceDOMContentTime);
-
-            var domContentDivider = document.createElement("div");
-            domContentDivider.className = "resources-ondomcontent-divider";
-            
-            var domContentDividerPadding = document.createElement("div");
-            domContentDividerPadding.className = "resources-event-divider-padding";
-            domContentDividerPadding.style.left = percent + "%";
-            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
-            domContentDividerPadding.appendChild(domContentDivider);
-
-            this.addEventDivider(domContentDividerPadding);
-        }
-    },
-
-    _graphSelected: function(treeElement)
-    {
-        if (this._lastSelectedGraphTreeElement)
-            this._lastSelectedGraphTreeElement.selectedSortingOptionIndex = this.sortingSelectElement.selectedIndex;
-
-        this._lastSelectedGraphTreeElement = treeElement;
-
-        this.sortingSelectElement.removeChildren();
-        for (var i = 0; i < treeElement.sortingOptions.length; ++i) {
-            var sortingOption = treeElement.sortingOptions[i];
-            var option = document.createElement("option");
-            option.label = sortingOption.name;
-            option.sortingFunction = sortingOption.sortingFunction;
-            option.calculator = sortingOption.calculator;
-            this.sortingSelectElement.appendChild(option);
-        }
-
-        this.sortingSelectElement.selectedIndex = treeElement.selectedSortingOptionIndex;
-        this._changeSortingFunction();
-
-        this.closeVisibleResource();
-        this.containerElement.scrollTop = 0;
-    },
-
-    _toggleLargerResources: function()
-    {
-        if (!this.itemsTreeElement._childrenListNode)
-            return;
-
-        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
-        this._setLargerResources(this.itemsTreeElement.smallChildren);
-    },
-
-    _setLargerResources: function(enabled)
-    {
-        this.largerResourcesButton.toggled = enabled;
-        this.itemsTreeElement.smallChildren = !enabled;
-        if (!enabled) {
-            this.itemsGraphsElement.addStyleClass("small");
-            this.largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
-            this.adjustScrollPosition();
-        } else {
-            this.itemsGraphsElement.removeStyleClass("small");
-            this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
-        }
-    },
-
-    _changeSortingFunction: function()
-    {
-        var selectedOption = this.sortingSelectElement[this.sortingSelectElement.selectedIndex];
-        this.sortingFunction = selectedOption.sortingFunction;
-        this.calculator = this.summaryBar.calculator = selectedOption.calculator;
-    },
-
-    _createResourceView: function(resource)
-    {
-        switch (resource.category) {
-            case WebInspector.resourceCategories.documents:
-            case WebInspector.resourceCategories.stylesheets:
-            case WebInspector.resourceCategories.scripts:
-            case WebInspector.resourceCategories.xhr:
-                return new WebInspector.SourceView(resource);
-            case WebInspector.resourceCategories.images:
-                return new WebInspector.ImageView(resource);
-            case WebInspector.resourceCategories.fonts:
-                return new WebInspector.FontView(resource);
-            default:
-                return new WebInspector.ResourceView(resource);
-        }
-    },
-
-    setSidebarWidth: function(width)
-    {
-        if (this.visibleResource) {
-            this.containerElement.style.width = width + "px";
-            this.sidebarElement.style.removeProperty("width");
-        } else {
-            this.sidebarElement.style.width = width + "px";
-            this.containerElement.style.removeProperty("width");
-        }
-
-        this.sidebarResizeElement.style.left = (width - 3) + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        WebInspector.AbstractTimelinePanel.prototype.updateMainViewWidth.call(this, width);
-        this.viewsContainerElement.style.left = width + "px";
-    },
-
-    _enableResourceTracking: function()
-    {
-        if (InspectorBackend.resourceTrackingEnabled())
-            return;
-        this._toggleResourceTracking(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleResourceTracking: function(optionalAlways)
-    {
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this.largerResourcesButton.visible = false;
-            this.sortingSelectElement.visible = false;
-            InspectorBackend.disableResourceTracking(true);
-        } else {
-            this.largerResourcesButton.visible = true;
-            this.sortingSelectElement.visible = true;
-            InspectorBackend.enableResourceTracking(!!optionalAlways);
-        }
-    },
-
-    get _resources()
-    {
-        return this.items;
-    }
-}
-
-WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.AbstractTimelinePanel.prototype;
-
-WebInspector.ResourceTimeCalculator = function(startAtZero)
-{
-    WebInspector.AbstractTimelineCalculator.call(this);
-    this.startAtZero = startAtZero;
-}
-
-WebInspector.ResourceTimeCalculator.prototype = {
-    computeSummaryValues: function(resources)
-    {
-        var resourcesByCategory = {};
-        var resourcesLength = resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = resources[i];
-            if (!(resource.category.name in resourcesByCategory))
-                resourcesByCategory[resource.category.name] = [];
-            resourcesByCategory[resource.category.name].push(resource);
-        }
-
-        var earliestStart;
-        var latestEnd;
-        var categoryValues = {};
-        for (var category in resourcesByCategory) {
-            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
-            categoryValues[category] = 0;
-
-            var segment = {start: -1, end: -1};
-
-            var categoryResources = resourcesByCategory[category];
-            var resourcesLength = categoryResources.length;
-            for (var i = 0; i < resourcesLength; ++i) {
-                var resource = categoryResources[i];
-                if (resource.startTime === -1 || resource.endTime === -1)
-                    continue;
-
-                if (typeof earliestStart === "undefined")
-                    earliestStart = resource.startTime;
-                else
-                    earliestStart = Math.min(earliestStart, resource.startTime);
-
-                if (typeof latestEnd === "undefined")
-                    latestEnd = resource.endTime;
-                else
-                    latestEnd = Math.max(latestEnd, resource.endTime);
-
-                if (resource.startTime <= segment.end) {
-                    segment.end = Math.max(segment.end, resource.endTime);
-                    continue;
-                }
-
-                categoryValues[category] += segment.end - segment.start;
-
-                segment.start = resource.startTime;
-                segment.end = resource.endTime;
-            }
-
-            // Add the last segment
-            categoryValues[category] += segment.end - segment.start;
-        }
-
-        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
-    },
-
-    computeBarGraphPercentages: function(resource)
-    {
-        if (resource.startTime !== -1)
-            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var start = 0;
-
-        if (resource.responseReceivedTime !== -1)
-            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var middle = (this.startAtZero ? start : 100);
-
-        if (resource.endTime !== -1)
-            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var end = (this.startAtZero ? middle : 100);
-
-        if (this.startAtZero) {
-            end -= start;
-            middle -= start;
-            start = 0;
-        }
-
-        return {start: start, middle: middle, end: end};
-    },
-    
-    computePercentageFromEventTime: function(eventTime)
-    {
-        // This function computes a percentage in terms of the total loading time
-        // of a specific event. If startAtZero is set, then this is useless, and we
-        // want to return 0.
-        if (eventTime !== -1 && !this.startAtZero)
-            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
-
-        return 0;
-    },
-
-    computeBarGraphLabels: function(resource)
-    {
-        var leftLabel = "";
-        if (resource.latency > 0)
-            leftLabel = this.formatValue(resource.latency);
-
-        var rightLabel = "";
-        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
-            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
-
-        if (leftLabel && rightLabel) {
-            var total = this.formatValue(resource.duration);
-            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
-        } else if (leftLabel)
-            var tooltip = WebInspector.UIString("%s latency", leftLabel);
-        else if (rightLabel)
-            var tooltip = WebInspector.UIString("%s download", rightLabel);
-
-        if (resource.cached)
-            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
-
-        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
-    },
-
-    updateBoundaries: function(resource)
-    {
-        var didChange = false;
-
-        var lowerBound;
-        if (this.startAtZero)
-            lowerBound = 0;
-        else
-            lowerBound = this._lowerBound(resource);
-
-        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
-            this.minimumBoundary = lowerBound;
-            didChange = true;
-        }
-
-        var upperBound = this._upperBound(resource);
-        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
-            this.maximumBoundary = upperBound;
-            didChange = true;
-        }
-
-        return didChange;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _lowerBound: function(resource)
-    {
-        return 0;
-    },
-
-    _upperBound: function(resource)
-    {
-        return 0;
-    }
-}
-
-WebInspector.ResourceTimeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
-
-WebInspector.ResourceTransferTimeCalculator = function()
-{
-    WebInspector.ResourceTimeCalculator.call(this, false);
-}
-
-WebInspector.ResourceTransferTimeCalculator.prototype = {
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _lowerBound: function(resource)
-    {
-        return resource.startTime;
-    },
-
-    _upperBound: function(resource)
-    {
-        return resource.endTime;
-    }
-}
-
-WebInspector.ResourceTransferTimeCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
-
-WebInspector.ResourceTransferDurationCalculator = function()
-{
-    WebInspector.ResourceTimeCalculator.call(this, true);
-}
-
-WebInspector.ResourceTransferDurationCalculator.prototype = {
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _upperBound: function(resource)
-    {
-        return resource.duration;
-    }
-}
-
-WebInspector.ResourceTransferDurationCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
-
-WebInspector.ResourceTransferSizeCalculator = function()
-{
-    WebInspector.AbstractTimelineCalculator.call(this);
-}
-
-WebInspector.ResourceTransferSizeCalculator.prototype = {
-    computeBarGraphLabels: function(resource)
-    {
-        const label = this.formatValue(this._value(resource));
-        var tooltip = label;
-        if (resource.cached)
-            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
-        return {left: label, right: label, tooltip: tooltip};
-    },
-
-    _value: function(resource)
-    {
-        return resource.contentLength;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.bytesToString(value, WebInspector.UIString.bind(WebInspector));
-    }
-}
-
-WebInspector.ResourceTransferSizeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
-
-WebInspector.ResourceSidebarTreeElement = function(resource)
-{
-    this.resource = resource;
-
-    this.createIconElement();
-
-    WebInspector.SidebarTreeElement.call(this, "resource-sidebar-tree-item", "", "", resource);
-
-    this.refreshTitles();
-}
-
-WebInspector.ResourceSidebarTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
-
-        this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
-        this._listItemNode.draggable = true;
-        
-        // FIXME: should actually add handler to parent, to be resolved via
-        // https://bugs.webkit.org/show_bug.cgi?id=30227
-        this._listItemNode.addEventListener("dragstart", this.ondragstart.bind(this), false);
-        this.updateErrorsAndWarnings();
-    },
-
-    onselect: function()
-    {
-        WebInspector.panels.resources.showResource(this.resource);
-    },
-    
-    ondblclick: function(event)
-    {
-        InjectedScriptAccess.openInInspectedWindow(this.resource.url, function() {});
-    },
-
-    ondragstart: function(event) {
-        event.dataTransfer.setData("text/plain", this.resource.url);
-        event.dataTransfer.setData("text/uri-list", this.resource.url + "\r\n");
-        event.dataTransfer.effectAllowed = "copy";
-        return true;
-    },
-
-    get mainTitle()
-    {
-        return this.resource.displayName;
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        var subtitle = this.resource.displayDomain;
-
-        if (this.resource.path && this.resource.lastPathComponent) {
-            var lastPathComponentIndex = this.resource.path.lastIndexOf("/" + this.resource.lastPathComponent);
-            if (lastPathComponentIndex != -1)
-                subtitle += this.resource.path.substring(0, lastPathComponentIndex);
-        }
-
-        return subtitle;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    },
-
-    get selectable()
-    {
-        return WebInspector.panels.resources.isCategoryVisible(this.resource.category.name);
-    },
-
-    createIconElement: function()
-    {
-        var previousIconElement = this.iconElement;
-
-        if (this.resource.category === WebInspector.resourceCategories.images) {
-            var previewImage = document.createElement("img");
-            previewImage.className = "image-resource-icon-preview";
-            previewImage.src = this.resource.url;
-
-            this.iconElement = document.createElement("div");
-            this.iconElement.className = "icon";
-            this.iconElement.appendChild(previewImage);
-        } else {
-            this.iconElement = document.createElement("img");
-            this.iconElement.className = "icon";
-        }
-
-        if (previousIconElement)
-            previousIconElement.parentNode.replaceChild(this.iconElement, previousIconElement);
-    },
-
-    refresh: function()
-    {
-        this.refreshTitles();
-
-        if (!this._listItemNode.hasStyleClass("resources-category-" + this.resource.category.name)) {
-            this._listItemNode.removeMatchingStyleClasses("resources-category-\\w+");
-            this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
-
-            this.createIconElement();
-        }
-
-        this.tooltip = this.resource.url;
-    },
-
-    resetBubble: function()
-    {
-        this.bubbleText = "";
-        this.bubbleElement.removeStyleClass("search-matches");
-        this.bubbleElement.removeStyleClass("warning");
-        this.bubbleElement.removeStyleClass("error");
-    },
-
-    set searchMatches(matches)
-    {
-        this.resetBubble();
-
-        if (!matches)
-            return;
-
-        this.bubbleText = matches;
-        this.bubbleElement.addStyleClass("search-matches");
-    },
-
-    updateErrorsAndWarnings: function()
-    {
-        this.resetBubble();
-
-        if (this.resource.warnings || this.resource.errors)
-            this.bubbleText = (this.resource.warnings + this.resource.errors);
-
-        if (this.resource.warnings)
-            this.bubbleElement.addStyleClass("warning");
-
-        if (this.resource.errors)
-            this.bubbleElement.addStyleClass("error");
-    }
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareByDuration(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareByLatency(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareBySize(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.ResourceGraph = function(resource)
-{
-    this.resource = resource;
-
-    this._graphElement = document.createElement("div");
-    this._graphElement.className = "resources-graph-side";
-    this._graphElement.addEventListener("mouseover", this.refreshLabelPositions.bind(this), false);
-
-    if (resource.cached)
-        this._graphElement.addStyleClass("resource-cached");
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "resources-graph-bar-area hidden";
-    this._graphElement.appendChild(this._barAreaElement);
-
-    this._barLeftElement = document.createElement("div");
-    this._barLeftElement.className = "resources-graph-bar waiting";
-    this._barAreaElement.appendChild(this._barLeftElement);
-
-    this._barRightElement = document.createElement("div");
-    this._barRightElement.className = "resources-graph-bar";
-    this._barAreaElement.appendChild(this._barRightElement);
-
-    this._labelLeftElement = document.createElement("div");
-    this._labelLeftElement.className = "resources-graph-label waiting";
-    this._barAreaElement.appendChild(this._labelLeftElement);
-
-    this._labelRightElement = document.createElement("div");
-    this._labelRightElement.className = "resources-graph-label";
-    this._barAreaElement.appendChild(this._labelRightElement);
-
-    this._graphElement.addStyleClass("resources-category-" + resource.category.name);
-}
-
-WebInspector.ResourceGraph.prototype = {
-    get graphElement()
-    {
-        return this._graphElement;
-    },
-
-    refreshLabelPositions: function()
-    {
-        this._labelLeftElement.style.removeProperty("left");
-        this._labelLeftElement.style.removeProperty("right");
-        this._labelLeftElement.removeStyleClass("before");
-        this._labelLeftElement.removeStyleClass("hidden");
-
-        this._labelRightElement.style.removeProperty("left");
-        this._labelRightElement.style.removeProperty("right");
-        this._labelRightElement.removeStyleClass("after");
-        this._labelRightElement.removeStyleClass("hidden");
-
-        const labelPadding = 10;
-        const rightBarWidth = (this._barRightElement.offsetWidth - labelPadding);
-        const leftBarWidth = ((this._barLeftElement.offsetWidth - this._barRightElement.offsetWidth) - labelPadding);
-
-        var labelBefore = (this._labelLeftElement.offsetWidth > leftBarWidth);
-        var labelAfter = (this._labelRightElement.offsetWidth > rightBarWidth);
-
-        if (labelBefore) {
-            if ((this._graphElement.offsetWidth * (this._percentages.start / 100)) < (this._labelLeftElement.offsetWidth + 10))
-                this._labelLeftElement.addStyleClass("hidden");
-            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
-            this._labelLeftElement.addStyleClass("before");
-        } else {
-            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
-            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
-        }
-
-        if (labelAfter) {
-            if ((this._graphElement.offsetWidth * ((100 - this._percentages.end) / 100)) < (this._labelRightElement.offsetWidth + 10))
-                this._labelRightElement.addStyleClass("hidden");
-            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
-            this._labelRightElement.addStyleClass("after");
-        } else {
-            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
-            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
-        }
-    },
-
-    refresh: function(calculator)
-    {
-        var percentages = calculator.computeBarGraphPercentages(this.resource);
-        var labels = calculator.computeBarGraphLabels(this.resource);
-
-        this._percentages = percentages;
-
-        this._barAreaElement.removeStyleClass("hidden");
-
-        if (!this._graphElement.hasStyleClass("resources-category-" + this.resource.category.name)) {
-            this._graphElement.removeMatchingStyleClasses("resources-category-\\w+");
-            this._graphElement.addStyleClass("resources-category-" + this.resource.category.name);
-        }
-
-        this._barLeftElement.style.setProperty("left", percentages.start + "%");
-        this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
-
-        this._barRightElement.style.setProperty("left", percentages.middle + "%");
-        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
-
-        this._labelLeftElement.textContent = labels.left;
-        this._labelRightElement.textContent = labels.right;
-
-        var tooltip = (labels.tooltip || "");
-        this._barLeftElement.title = tooltip;
-        this._labelLeftElement.title = tooltip;
-        this._labelRightElement.title = tooltip;
-        this._barRightElement.title = tooltip;
-    }
-}
-
-/* ScriptsPanel.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScriptsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.element.addStyleClass("scripts");
-
-    this.topStatusBar = document.createElement("div");
-    this.topStatusBar.className = "status-bar";
-    this.topStatusBar.id = "scripts-status-bar";
-    this.element.appendChild(this.topStatusBar);
-
-    this.backButton = document.createElement("button");
-    this.backButton.className = "status-bar-item";
-    this.backButton.id = "scripts-back";
-    this.backButton.title = WebInspector.UIString("Show the previous script resource.");
-    this.backButton.disabled = true;
-    this.backButton.appendChild(document.createElement("img"));
-    this.backButton.addEventListener("click", this._goBack.bind(this), false);
-    this.topStatusBar.appendChild(this.backButton);
-
-    this.forwardButton = document.createElement("button");
-    this.forwardButton.className = "status-bar-item";
-    this.forwardButton.id = "scripts-forward";
-    this.forwardButton.title = WebInspector.UIString("Show the next script resource.");
-    this.forwardButton.disabled = true;
-    this.forwardButton.appendChild(document.createElement("img"));
-    this.forwardButton.addEventListener("click", this._goForward.bind(this), false);
-    this.topStatusBar.appendChild(this.forwardButton);
-
-    this.filesSelectElement = document.createElement("select");
-    this.filesSelectElement.className = "status-bar-item";
-    this.filesSelectElement.id = "scripts-files";
-    this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false);
-    this.topStatusBar.appendChild(this.filesSelectElement);
-
-    this.functionsSelectElement = document.createElement("select");
-    this.functionsSelectElement.className = "status-bar-item";
-    this.functionsSelectElement.id = "scripts-functions";
-
-    // FIXME: append the functions select element to the top status bar when it is implemented.
-    // this.topStatusBar.appendChild(this.functionsSelectElement);
-
-    this.sidebarButtonsElement = document.createElement("div");
-    this.sidebarButtonsElement.id = "scripts-sidebar-buttons";
-    this.topStatusBar.appendChild(this.sidebarButtonsElement);
-
-    this.pauseButton = document.createElement("button");
-    this.pauseButton.className = "status-bar-item";
-    this.pauseButton.id = "scripts-pause";
-    this.pauseButton.title = WebInspector.UIString("Pause script execution.");
-    this.pauseButton.disabled = true;
-    this.pauseButton.appendChild(document.createElement("img"));
-    this.pauseButton.addEventListener("click", this._togglePause.bind(this), false);
-    this.sidebarButtonsElement.appendChild(this.pauseButton);
-
-    this.stepOverButton = document.createElement("button");
-    this.stepOverButton.className = "status-bar-item";
-    this.stepOverButton.id = "scripts-step-over";
-    this.stepOverButton.title = WebInspector.UIString("Step over next function call.");
-    this.stepOverButton.disabled = true;
-    this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false);
-    this.stepOverButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepOverButton);
-
-    this.stepIntoButton = document.createElement("button");
-    this.stepIntoButton.className = "status-bar-item";
-    this.stepIntoButton.id = "scripts-step-into";
-    this.stepIntoButton.title = WebInspector.UIString("Step into next function call.");
-    this.stepIntoButton.disabled = true;
-    this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false);
-    this.stepIntoButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepIntoButton);
-
-    this.stepOutButton = document.createElement("button");
-    this.stepOutButton.className = "status-bar-item";
-    this.stepOutButton.id = "scripts-step-out";
-    this.stepOutButton.title = WebInspector.UIString("Step out of current function.");
-    this.stepOutButton.disabled = true;
-    this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false);
-    this.stepOutButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepOutButton);
-
-    this.debuggerStatusElement = document.createElement("div");
-    this.debuggerStatusElement.id = "scripts-debugger-status";
-    this.sidebarButtonsElement.appendChild(this.debuggerStatusElement);
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "script-resource-views";
-
-    this.sidebarElement = document.createElement("div");
-    this.sidebarElement.id = "scripts-sidebar";
-
-    this.sidebarResizeElement = document.createElement("div");
-    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-    this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
-
-    this.sidebarResizeWidgetElement = document.createElement("div");
-    this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget";
-    this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
-    this.topStatusBar.appendChild(this.sidebarResizeWidgetElement);
-
-    this.sidebarPanes = {};
-    this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
-    this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
-    this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
-    this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane();
-
-    for (var pane in this.sidebarPanes)
-        this.sidebarElement.appendChild(this.sidebarPanes[pane].element);
-
-    this.sidebarPanes.callstack.expanded = true;
-    this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this);
-
-    this.sidebarPanes.scopechain.expanded = true;
-    this.sidebarPanes.breakpoints.expanded = true;
-
-    var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel.");
-    var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower.");
-    var panelEnablerButton = WebInspector.UIString("Enable Debugging");
-
-    this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-    this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this);
-
-    this.element.appendChild(this.panelEnablerView.element);
-    this.element.appendChild(this.viewsContainerElement);
-    this.element.appendChild(this.sidebarElement);
-    this.element.appendChild(this.sidebarResizeElement);
-
-    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-    this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false);
-
-    this.pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item");
-    this.pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false);
-
-    this._breakpointsURLMap = {};
-
-    this._shortcuts = {};
-    var handler, shortcut;
-    var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-
-    // Continue.
-    handler = this.pauseButton.click.bind(this.pauseButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F8);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Slash, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step over.
-    handler = this.stepOverButton.click.bind(this.stepOverButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F10);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.SingleQuote, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step into.
-    handler = this.stepIntoButton.click.bind(this.stepIntoButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step out.
-    handler = this.stepOutButton.click.bind(this.stepOutButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11, WebInspector.KeyboardShortcut.Modifiers.Shift);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    this.reset();
-}
-
-WebInspector.ScriptsPanel.prototype = {
-    toolbarItemClass: "scripts",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Scripts");
-    },
-
-    get statusBarItems()
-    {
-        return [this.enableToggleButton.element, this.pauseOnExceptionButton.element];
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.filesSelectElement;
-    },
-
-    get paused()
-    {
-        return this._paused;
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
-
-        if (this.visibleView) {
-            if (this.visibleView instanceof WebInspector.ResourceView)
-                this.visibleView.headersVisible = false;
-            this.visibleView.show(this.viewsContainerElement);
-        }
-
-        // Hide any views that are visible that are not this panel's current visible view.
-        // This can happen when a ResourceView is visible in the Resources panel then switched
-        // to the this panel.
-        for (var sourceID in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceID];
-            var view = this._sourceViewForScriptOrResource(scriptOrResource);
-            if (!view || view === this.visibleView)
-                continue;
-            view.visible = false;
-        }
-        if (this._attachDebuggerWhenShown) {
-            InspectorBackend.enableDebugger(false);
-            delete this._attachDebuggerWhenShown;
-        }
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch) {
-            visibleView.alreadySearching = true;
-            views.push(visibleView);
-        }
-
-        for (var sourceID in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceID];
-            var view = this._sourceViewForScriptOrResource(scriptOrResource);
-            if (!view || !view.performSearch || view.alreadySearching)
-                continue;
-
-            view.alreadySearching = true;
-            views.push(view);
-        }
-
-        for (var i = 0; i < views.length; ++i)
-            delete views[i].alreadySearching;
-
-        return views;
-    },
-
-    addScript: function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
-    {
-        var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, errorLine, errorMessage);
-
-        if (sourceURL in WebInspector.resourceURLMap) {
-            var resource = WebInspector.resourceURLMap[sourceURL];
-            resource.addScript(script);
-        }
-
-        sourceURL = script.sourceURL;
-
-        if (sourceID)
-            this._sourceIDMap[sourceID] = (resource || script);
-
-        if (sourceURL in this._breakpointsURLMap && sourceID) {
-            var breakpoints = this._breakpointsURLMap[sourceURL];
-            var breakpointsLength = breakpoints.length;
-            for (var i = 0; i < breakpointsLength; ++i) {
-                var breakpoint = breakpoints[i];
-
-                if (startingLine <= breakpoint.line) {
-                    // remove and add the breakpoint, to clean up things like the sidebar
-                    this.removeBreakpoint(breakpoint);
-                    breakpoint.sourceID = sourceID;
-                    this.addBreakpoint(breakpoint);
-                    
-                    if (breakpoint.enabled)
-                        InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-                }
-            }
-        }
-
-        this._addScriptToFilesMenu(script);
-    },
-
-    scriptOrResourceForID: function(id)
-    {
-        return this._sourceIDMap[id];
-    },
-
-    scriptForURL: function(url)
-    {
-        return this._scriptsForURLsInFilesSelect[url];
-    },
-
-    addBreakpoint: function(breakpoint)
-    {
-        this.sidebarPanes.breakpoints.addBreakpoint(breakpoint);
-
-        var sourceFrame;
-        if (breakpoint.url) {
-            if (!(breakpoint.url in this._breakpointsURLMap))
-                this._breakpointsURLMap[breakpoint.url] = [];
-            this._breakpointsURLMap[breakpoint.url].unshift(breakpoint);
-
-            if (breakpoint.url in WebInspector.resourceURLMap) {
-                var resource = WebInspector.resourceURLMap[breakpoint.url];
-                sourceFrame = this._sourceFrameForScriptOrResource(resource);
-            }
-        }
-
-        if (breakpoint.sourceID && !sourceFrame) {
-            var object = this._sourceIDMap[breakpoint.sourceID]
-            sourceFrame = this._sourceFrameForScriptOrResource(object);
-        }
-
-        if (sourceFrame)
-            sourceFrame.addBreakpoint(breakpoint);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        this.sidebarPanes.breakpoints.removeBreakpoint(breakpoint);
-
-        var sourceFrame;
-        if (breakpoint.url && breakpoint.url in this._breakpointsURLMap) {
-            var breakpoints = this._breakpointsURLMap[breakpoint.url];
-            breakpoints.remove(breakpoint);
-            if (!breakpoints.length)
-                delete this._breakpointsURLMap[breakpoint.url];
-
-            if (breakpoint.url in WebInspector.resourceURLMap) {
-                var resource = WebInspector.resourceURLMap[breakpoint.url];
-                sourceFrame = this._sourceFrameForScriptOrResource(resource);
-            }
-        }
-
-        if (breakpoint.sourceID && !sourceFrame) {
-            var object = this._sourceIDMap[breakpoint.sourceID]
-            sourceFrame = this._sourceFrameForScriptOrResource(object);
-        }
-
-        if (sourceFrame)
-            sourceFrame.removeBreakpoint(breakpoint);
-    },
-
-    selectedCallFrameId: function()
-    {
-        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
-        if (!selectedCallFrame)
-            return null;
-        return selectedCallFrame.id;
-    },
-
-    evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)
-    {
-        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
-        if (!this._paused || !selectedCallFrame)
-            return;
-
-        if (typeof updateInterface === "undefined")
-            updateInterface = true;
-
-        var self = this;
-        function updatingCallbackWrapper(result, exception)
-        {
-            callback(result, exception);
-            if (updateInterface)
-                self.sidebarPanes.scopechain.update(selectedCallFrame);
-        }
-        this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);
-    },
-
-    doEvalInCallFrame: function(callFrame, code, objectGroup, callback)
-    {
-        function evalCallback(result)
-        {
-            if (result)
-                callback(result.value, result.isException);
-        }
-        InjectedScriptAccess.evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
-    },
-
-    debuggerPaused: function(callFrames)
-    {
-        this._paused = true;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        this._updateDebuggerButtons();
-
-        this.sidebarPanes.callstack.update(callFrames, this._sourceIDMap);
-        this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];
-
-        WebInspector.currentPanel = this;
-        window.focus();
-    },
-
-    debuggerResumed: function()
-    {
-        this._paused = false;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        this._clearInterface();
-    },
-
-    attachDebuggerWhenShown: function()
-    {
-        if (this.element.parentElement) {
-            InspectorBackend.enableDebugger(false);
-        } else {
-            this._attachDebuggerWhenShown = true;
-        }
-    },
-
-    debuggerWasEnabled: function()
-    {
-        this.reset();
-    },
-
-    debuggerWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        this.visibleView = null;
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        if (!InspectorBackend.debuggerEnabled()) {
-            this._paused = false;
-            this._waitingToPause = false;
-            this._stepping = false;
-        }
-
-        this._clearInterface();
-
-        this._backForwardList = [];
-        this._currentBackForwardIndex = -1;
-        this._updateBackAndForwardButtons();
-
-        this._scriptsForURLsInFilesSelect = {};
-        this.filesSelectElement.removeChildren();
-        this.functionsSelectElement.removeChildren();
-        this.viewsContainerElement.removeChildren();
-
-        if (this._sourceIDMap) {
-            for (var sourceID in this._sourceIDMap) {
-                var object = this._sourceIDMap[sourceID];
-                if (object instanceof WebInspector.Resource)
-                    object.removeAllScripts();
-            }
-        }
-
-        this._sourceIDMap = {};
-        
-        this.sidebarPanes.watchExpressions.refreshExpressions();
-    },
-
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    set visibleView(x)
-    {
-        if (this._visibleView === x)
-            return;
-
-        if (this._visibleView)
-            this._visibleView.hide();
-
-        this._visibleView = x;
-
-        if (x)
-            x.show(this.viewsContainerElement);
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return InspectorBackend.debuggerEnabled() &&
-            !!(WebInspector.resourceForURL(url) || this.scriptForURL(url));
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        var resource = WebInspector.resourceForURL(url);
-        if (resource)
-            this.showResource(resource, line);
-        else
-            this.showScript(this.scriptForURL(url), line);
-    },
-
-    showScript: function(script, line)
-    {
-        this._showScriptOrResource(script, {line: line, shouldHighlightLine: true});
-    },
-
-    showResource: function(resource, line)
-    {
-        this._showScriptOrResource(resource, {line: line, shouldHighlightLine: true});
-    },
-
-    showView: function(view)
-    {
-        if (!view)
-            return;
-        this._showScriptOrResource((view.resource || view.script));
-    },
-
-    handleShortcut: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.handled = true;
-        } else
-            this.sidebarPanes.callstack.handleShortcut(event);
-    },
-
-    scriptViewForScript: function(script)
-    {
-        if (!script)
-            return null;
-        if (!script._scriptView)
-            script._scriptView = new WebInspector.ScriptView(script);
-        return script._scriptView;
-    },
-
-    sourceFrameForScript: function(script)
-    {
-        var view = this.scriptViewForScript(script);
-        if (!view)
-            return null;
-
-        // Setting up the source frame requires that we be attached.
-        if (!this.element.parentNode)
-            this.attach();
-
-        view.setupSourceFrameIfNeeded();
-        return view.sourceFrame;
-    },
-
-    _sourceViewForScriptOrResource: function(scriptOrResource)
-    {
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            return WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
-        }
-        if (scriptOrResource instanceof WebInspector.Script)
-            return this.scriptViewForScript(scriptOrResource);
-    },
-
-    _sourceFrameForScriptOrResource: function(scriptOrResource)
-    {
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            return WebInspector.panels.resources.sourceFrameForResource(scriptOrResource);
-        }
-        if (scriptOrResource instanceof WebInspector.Script)
-            return this.sourceFrameForScript(scriptOrResource);
-    },
-
-    _showScriptOrResource: function(scriptOrResource, options)
-    {
-        // options = {line:, shouldHighlightLine:, fromBackForwardAction:, initialLoad:}
-        if (!options) 
-            options = {};
-
-        if (!scriptOrResource)
-            return;
-
-        var view;
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            view = WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
-            view.headersVisible = false;
-
-            if (scriptOrResource.url in this._breakpointsURLMap) {
-                var sourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
-                if (sourceFrame && !sourceFrame.breakpoints.length) {
-                    var breakpoints = this._breakpointsURLMap[scriptOrResource.url];
-                    var breakpointsLength = breakpoints.length;
-                    for (var i = 0; i < breakpointsLength; ++i)
-                        sourceFrame.addBreakpoint(breakpoints[i]);
-                }
-            }
-        } else if (scriptOrResource instanceof WebInspector.Script)
-            view = this.scriptViewForScript(scriptOrResource);
-
-        if (!view)
-            return;
-
-        var url = scriptOrResource.url || scriptOrResource.sourceURL;
-        if (url && !options.initialLoad)
-            WebInspector.settings.lastViewedScriptFile = url;
-
-        if (!options.fromBackForwardAction) {
-            var oldIndex = this._currentBackForwardIndex;
-            if (oldIndex >= 0)
-                this._backForwardList.splice(oldIndex + 1, this._backForwardList.length - oldIndex);
-
-            // Check for a previous entry of the same object in _backForwardList.
-            // If one is found, remove it and update _currentBackForwardIndex to match.
-            var previousEntryIndex = this._backForwardList.indexOf(scriptOrResource);
-            if (previousEntryIndex !== -1) {
-                this._backForwardList.splice(previousEntryIndex, 1);
-                --this._currentBackForwardIndex;
-            }
-
-            this._backForwardList.push(scriptOrResource);
-            ++this._currentBackForwardIndex;
-
-            this._updateBackAndForwardButtons();
-        }
-
-        this.visibleView = view;
-
-        if (options.line) {
-            if (view.revealLine)
-                view.revealLine(options.line);
-            if (view.highlightLine && options.shouldHighlightLine)
-                view.highlightLine(options.line);
-        }
-
-        var option;
-        if (scriptOrResource instanceof WebInspector.Script) {
-            option = scriptOrResource.filesSelectOption;
-
-            // hasn't been added yet - happens for stepping in evals,
-            // so use the force option to force the script into the menu.
-            if (!option) {
-                this._addScriptToFilesMenu(scriptOrResource, {force: true});
-                option = scriptOrResource.filesSelectOption;
-            }
-
-            console.assert(option);
-        } else {
-            var script = this.scriptForURL(url);
-            if (script)
-               option = script.filesSelectOption;
-        }
-
-        if (option)
-            this.filesSelectElement.selectedIndex = option.index;
-    },
-
-    _addScriptToFilesMenu: function(script, options)
-    {
-        var force = options && options.force;
-
-        if (!script.sourceURL && !force)
-            return;
-
-        if (script.resource && this._scriptsForURLsInFilesSelect[script.sourceURL])
-            return;
-
-        this._scriptsForURLsInFilesSelect[script.sourceURL] = script;
-
-        var select = this.filesSelectElement;
-
-        var option = document.createElement("option");
-        option.representedObject = (script.resource || script);
-        option.text = (script.sourceURL ? WebInspector.displayNameForURL(script.sourceURL) : WebInspector.UIString("(program)"));
-
-        function optionCompare(a, b)
-        {
-            var aTitle = a.text.toLowerCase();
-            var bTitle = b.text.toLowerCase();
-            if (aTitle < bTitle)
-                return -1;
-            else if (aTitle > bTitle)
-                return 1;
-
-            var aSourceID = a.representedObject.sourceID;
-            var bSourceID = b.representedObject.sourceID;
-            if (aSourceID < bSourceID)
-                return -1;
-            else if (aSourceID > bSourceID)
-                return 1;
-            return 0;
-        }
-
-        var insertionIndex = insertionIndexForObjectInListSortedByFunction(option, select.childNodes, optionCompare);
-        if (insertionIndex < 0)
-            select.appendChild(option);
-        else
-            select.insertBefore(option, select.childNodes.item(insertionIndex));
-
-        script.filesSelectOption = option;
-
-        // Call _showScriptOrResource if the option we just appended ended up being selected.
-        // This will happen for the first item added to the menu.
-        if (select.options[select.selectedIndex] === option)
-            this._showScriptOrResource(option.representedObject, {initialLoad: true});
-        else {
-            // if not first item, check to see if this was the last viewed
-            var url = option.representedObject.url || option.representedObject.sourceURL;
-            var lastURL = WebInspector.settings.lastViewedScriptFile;
-            if (url && url === lastURL)
-                this._showScriptOrResource(option.representedObject, {initialLoad: true});
-        }
-    },
-
-    _clearCurrentExecutionLine: function()
-    {
-        if (this._executionSourceFrame)
-            this._executionSourceFrame.executionLine = 0;
-        delete this._executionSourceFrame;
-    },
-
-    _callFrameSelected: function()
-    {
-        this._clearCurrentExecutionLine();
-
-        var callStackPane = this.sidebarPanes.callstack;
-        var currentFrame = callStackPane.selectedCallFrame;
-        if (!currentFrame)
-            return;
-
-        this.sidebarPanes.scopechain.update(currentFrame);
-        this.sidebarPanes.watchExpressions.refreshExpressions();
-
-        var scriptOrResource = this._sourceIDMap[currentFrame.sourceID];
-        this._showScriptOrResource(scriptOrResource, {line: currentFrame.line});
-
-        this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
-        if (this._executionSourceFrame)
-            this._executionSourceFrame.executionLine = currentFrame.line;
-    },
-
-    _changeVisibleFile: function(event)
-    {
-        var select = this.filesSelectElement;
-        this._showScriptOrResource(select.options[select.selectedIndex].representedObject);
-    },
-
-    _startSidebarResizeDrag: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarElement, this._sidebarResizeDrag.bind(this), this._endSidebarResizeDrag.bind(this), event, "col-resize");
-
-        if (event.target === this.sidebarResizeWidgetElement)
-            this._dragOffset = (event.target.offsetWidth - (event.pageX - event.target.totalOffsetLeft));
-        else
-            this._dragOffset = 0;
-    },
-
-    _endSidebarResizeDrag: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-
-        delete this._dragOffset;
-    },
-
-    _sidebarResizeDrag: function(event)
-    {
-        var x = event.pageX + this._dragOffset;
-        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minScriptsSidebarWidth, window.innerWidth * 0.66);
-
-        this.sidebarElement.style.width = newWidth + "px";
-        this.sidebarButtonsElement.style.width = newWidth + "px";
-        this.viewsContainerElement.style.right = newWidth + "px";
-        this.sidebarResizeWidgetElement.style.right = newWidth + "px";
-        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
-
-        event.preventDefault();
-    },
-
-    _updatePauseOnExceptionsButton: function()
-    {
-        if (InspectorBackend.pauseOnExceptions()) {
-            this.pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.");
-            this.pauseOnExceptionButton.toggled = true;
-        } else {
-            this.pauseOnExceptionButton.title = WebInspector.UIString("Pause on exceptions.");
-            this.pauseOnExceptionButton.toggled = false;
-        }
-    },
-
-    _updateDebuggerButtons: function()
-    {
-        if (InspectorBackend.debuggerEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Debugging enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            this.pauseOnExceptionButton.visible = true;
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Debugging disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            this.pauseOnExceptionButton.visible = false;
-            this.panelEnablerView.visible = true;
-        }
-
-        this._updatePauseOnExceptionsButton();
-
-        if (this._paused) {
-            this.pauseButton.addStyleClass("paused");
-
-            this.pauseButton.disabled = false;
-            this.stepOverButton.disabled = false;
-            this.stepIntoButton.disabled = false;
-            this.stepOutButton.disabled = false;
-
-            this.debuggerStatusElement.textContent = WebInspector.UIString("Paused");
-        } else {
-            this.pauseButton.removeStyleClass("paused");
-
-            this.pauseButton.disabled = this._waitingToPause;
-            this.stepOverButton.disabled = true;
-            this.stepIntoButton.disabled = true;
-            this.stepOutButton.disabled = true;
-
-            if (this._waitingToPause)
-                this.debuggerStatusElement.textContent = WebInspector.UIString("Pausing");
-            else if (this._stepping)
-                this.debuggerStatusElement.textContent = WebInspector.UIString("Stepping");
-            else
-                this.debuggerStatusElement.textContent = "";
-        }
-    },
-
-    _updateBackAndForwardButtons: function()
-    {
-        this.backButton.disabled = this._currentBackForwardIndex <= 0;
-        this.forwardButton.disabled = this._currentBackForwardIndex >= (this._backForwardList.length - 1);
-    },
-
-    _clearInterface: function()
-    {
-        this.sidebarPanes.callstack.update(null);
-        this.sidebarPanes.scopechain.update(null);
-
-        this._clearCurrentExecutionLine();
-        this._updateDebuggerButtons();
-    },
-
-    _goBack: function()
-    {
-        if (this._currentBackForwardIndex <= 0) {
-            console.error("Can't go back from index " + this._currentBackForwardIndex);
-            return;
-        }
-
-        this._showScriptOrResource(this._backForwardList[--this._currentBackForwardIndex], {fromBackForwardAction: true});
-        this._updateBackAndForwardButtons();
-    },
-
-    _goForward: function()
-    {
-        if (this._currentBackForwardIndex >= this._backForwardList.length - 1) {
-            console.error("Can't go forward from index " + this._currentBackForwardIndex);
-            return;
-        }
-
-        this._showScriptOrResource(this._backForwardList[++this._currentBackForwardIndex], {fromBackForwardAction: true});
-        this._updateBackAndForwardButtons();
-    },
-
-    _enableDebugging: function()
-    {
-        if (InspectorBackend.debuggerEnabled())
-            return;
-        this._toggleDebugging(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleDebugging: function(optionalAlways)
-    {
-        this._paused = false;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        if (InspectorBackend.debuggerEnabled())
-            InspectorBackend.disableDebugger(true);
-        else
-            InspectorBackend.enableDebugger(!!optionalAlways);
-    },
-
-    _togglePauseOnExceptions: function()
-    {
-        InspectorBackend.setPauseOnExceptions(!InspectorBackend.pauseOnExceptions());
-        this._updatePauseOnExceptionsButton();
-    },
-
-    _togglePause: function()
-    {
-        if (this._paused) {
-            this._paused = false;
-            this._waitingToPause = false;
-            InspectorBackend.resumeDebugger();
-        } else {
-            this._stepping = false;
-            this._waitingToPause = true;
-            InspectorBackend.pauseInDebugger();
-        }
-
-        this._clearInterface();
-    },
-
-    _stepOverClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepOverStatementInDebugger();
-    },
-
-    _stepIntoClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepIntoStatementInDebugger();
-    },
-
-    _stepOutClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepOutOfFunctionInDebugger();
-    }
-}
-
-WebInspector.ScriptsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* StoragePanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StoragePanel = function(database)
-{
-    WebInspector.Panel.call(this);
-
-    this.createSidebar();
-
-    this.databasesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("DATABASES"), {}, true);
-    this.sidebarTree.appendChild(this.databasesListTreeElement);
-    this.databasesListTreeElement.expand();
-
-    this.localStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("LOCAL STORAGE"), {}, true);
-    this.sidebarTree.appendChild(this.localStorageListTreeElement);
-    this.localStorageListTreeElement.expand();
-
-    this.sessionStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("SESSION STORAGE"), {}, true);
-    this.sidebarTree.appendChild(this.sessionStorageListTreeElement);
-    this.sessionStorageListTreeElement.expand();
-
-    this.cookieListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("COOKIES"), {}, true);
-    this.sidebarTree.appendChild(this.cookieListTreeElement);
-    this.cookieListTreeElement.expand();
-
-    this.storageViews = document.createElement("div");
-    this.storageViews.id = "storage-views";
-    this.element.appendChild(this.storageViews);
-
-    this.storageViewStatusBarItemsContainer = document.createElement("div");
-    this.storageViewStatusBarItemsContainer.id = "storage-view-status-bar-items";
-
-    this.reset();
-}
-
-WebInspector.StoragePanel.prototype = {
-    toolbarItemClass: "storage",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Storage");
-    },
-
-    get statusBarItems()
-    {
-        return [this.storageViewStatusBarItemsContainer];
-    },
-
-    reset: function()
-    {
-        if (this._databases) {
-            var databasesLength = this._databases.length;
-            for (var i = 0; i < databasesLength; ++i) {
-                var database = this._databases[i];
-
-                delete database._tableViews;
-                delete database._queryView;
-            }
-        }
-
-        this._databases = [];
-
-        if (this._domStorage) {
-            var domStorageLength = this._domStorage.length;
-            for (var i = 0; i < domStorageLength; ++i) {
-                var domStorage = this._domStorage[i];
-
-                delete domStorage._domStorageView;
-            }
-        }
-
-        this._domStorage = [];
-
-        this._cookieViews = {};
-
-        this.databasesListTreeElement.removeChildren();
-        this.localStorageListTreeElement.removeChildren();
-        this.sessionStorageListTreeElement.removeChildren();
-        this.cookieListTreeElement.removeChildren();
-
-        this.storageViews.removeChildren();        
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        
-        if (this.sidebarTree.selectedTreeElement)
-            this.sidebarTree.selectedTreeElement.deselect();
-    },
-
-    addDatabase: function(database)
-    {
-        this._databases.push(database);
-
-        var databaseTreeElement = new WebInspector.DatabaseSidebarTreeElement(database);
-        database._databasesTreeElement = databaseTreeElement;
-        this.databasesListTreeElement.appendChild(databaseTreeElement);
-    },
-    
-    addCookieDomain: function(domain)
-    {
-        var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
-        this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
-    },
-
-    addDOMStorage: function(domStorage)
-    {
-        this._domStorage.push(domStorage);
-        var domStorageTreeElement = new WebInspector.DOMStorageSidebarTreeElement(domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage"));
-        domStorage._domStorageTreeElement = domStorageTreeElement;
-        if (domStorage.isLocalStorage)
-            this.localStorageListTreeElement.appendChild(domStorageTreeElement);
-        else
-            this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
-    },
-
-    selectDatabase: function(databaseId)
-    {
-        var database;
-        for (var i = 0, len = this._databases.length; i < len; ++i) {
-            database = this._databases[i];
-            if (database.id === databaseId) {
-                this.showDatabase(database);
-                database._databasesTreeElement.select();
-                return;
-            }
-        }
-    },
-
-    selectDOMStorage: function(storageId)
-    {
-        var domStorage = this._domStorageForId(storageId);
-        if (domStorage) {
-            this.showDOMStorage(domStorage);
-            domStorage._domStorageTreeElement.select();
-        }
-    },
-
-    showDatabase: function(database, tableName)
-    {
-        if (!database)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view;
-        if (tableName) {
-            if (!("_tableViews" in database))
-                database._tableViews = {};
-            view = database._tableViews[tableName];
-            if (!view) {
-                view = new WebInspector.DatabaseTableView(database, tableName);
-                database._tableViews[tableName] = view;
-            }
-        } else {
-            view = database._queryView;
-            if (!view) {
-                view = new WebInspector.DatabaseQueryView(database);
-                database._queryView = view;
-            }
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems || [];
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i].element);
-    },
-
-    showDOMStorage: function(domStorage)
-    {
-        if (!domStorage)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view;
-        view = domStorage._domStorageView;
-        if (!view) {
-            view = new WebInspector.DOMStorageItemsView(domStorage);
-            domStorage._domStorageView = view;
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    showCookies: function(cookieDomain)
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view = this._cookieViews[cookieDomain];
-        if (!view) {
-            view = new WebInspector.CookieItemsView(cookieDomain);
-            this._cookieViews[cookieDomain] = view;
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-        delete this.visibleView;
-    },
-
-    updateDatabaseTables: function(database)
-    {
-        if (!database || !database._databasesTreeElement)
-            return;
-
-        database._databasesTreeElement.shouldRefreshChildren = true;
-
-        if (!("_tableViews" in database))
-            return;
-
-        var tableNamesHash = {};
-        var self = this;
-        function tableNamesCallback(tableNames)
-        {
-            var tableNamesLength = tableNames.length;
-            for (var i = 0; i < tableNamesLength; ++i)
-                tableNamesHash[tableNames[i]] = true;
-
-            for (var tableName in database._tableViews) {
-                if (!(tableName in tableNamesHash)) {
-                    if (self.visibleView === database._tableViews[tableName])
-                        self.closeVisibleView();
-                    delete database._tableViews[tableName];
-                }
-            }
-        }
-        database.getTableNames(tableNamesCallback);
-    },
-
-    dataGridForResult: function(rows)
-    {
-        if (!rows.length)
-            return null;
-
-        var columns = {};
-        var numColumns = 0;
-
-        for (var columnIdentifier in rows[0]) {
-            var column = {};
-            column.width = columnIdentifier.length;
-            column.title = columnIdentifier;
-
-            columns[columnIdentifier] = column;
-            ++numColumns;
-        }
-
-        var nodes = [];
-        var length = rows.length;
-        for (var i = 0; i < length; ++i) {
-            var data = {};
-
-            var row = rows[i];
-            for (var columnIdentifier in row) {
-                var text = row[columnIdentifier];
-                data[columnIdentifier] = text;
-                if (text.length > columns[columnIdentifier].width)
-                    columns[columnIdentifier].width = text.length;
-            }
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = false;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = 0;
-        for (var columnIdentifier in columns)
-            totalColumnWidths += columns[columnIdentifier].width;
-
-        // Calculate the percentage width for the columns.
-        const minimumPrecent = Math.min(5, Math.floor(100/numColumns));
-        var recoupPercent = 0;
-        for (var columnIdentifier in columns) {
-            var width = columns[columnIdentifier].width;
-            width = Math.round((width / totalColumnWidths) * 100);
-            if (width < minimumPrecent) {
-                recoupPercent += (minimumPrecent - width);
-                width = minimumPrecent;
-            }
-
-            columns[columnIdentifier].width = width;
-        }
-
-        // Enforce the minimum percentage width.
-        while (recoupPercent > 0) {
-            for (var columnIdentifier in columns) {
-                if (columns[columnIdentifier].width > minimumPrecent) {
-                    --columns[columnIdentifier].width;
-                    --recoupPercent;
-                    if (!recoupPercent)
-                        break;
-                }
-            }
-        }
-
-        // Change the width property to a string suitable for a style width.
-        for (var columnIdentifier in columns)
-            columns[columnIdentifier].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns);
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-
-        return dataGrid;
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    updateDOMStorage: function(storageId)
-    {
-        var domStorage = this._domStorageForId(storageId);
-        if (!domStorage)
-            return;
-
-        var view = domStorage._domStorageView;
-        if (this.visibleView && view === this.visibleView)
-            domStorage._domStorageView.update();
-    },
-
-    _domStorageForId: function(storageId)
-    {
-        if (!this._domStorage)
-            return null;
-        var domStorageLength = this._domStorage.length;
-        for (var i = 0; i < domStorageLength; ++i) {
-            var domStorage = this._domStorage[i];
-            if (domStorage.id == storageId)
-                return domStorage;
-        }
-        return null;
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.storageViews.style.left = width + "px";
-        this.storageViewStatusBarItemsContainer.style.left = width + "px";
-    }
-}
-
-WebInspector.StoragePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.DatabaseSidebarTreeElement = function(database)
-{
-    this.database = database;
-
-    WebInspector.SidebarTreeElement.call(this, "database-sidebar-tree-item", "", "", database, true);
-
-    this.refreshTitles();
-}
-
-WebInspector.DatabaseSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDatabase(this.database);
-    },
-
-    oncollapse: function()
-    {
-        // Request a refresh after every collapse so the next
-        // expand will have an updated table list.
-        this.shouldRefreshChildren = true;
-    },
-
-    onpopulate: function()
-    {
-        this.removeChildren();
-
-        var self = this;
-        function tableNamesCallback(tableNames)
-        {
-            var tableNamesLength = tableNames.length;
-            for (var i = 0; i < tableNamesLength; ++i)
-                self.appendChild(new WebInspector.SidebarDatabaseTableTreeElement(self.database, tableNames[i]));
-        }
-        this.database.getTableNames(tableNamesCallback);
-    },
-
-    get mainTitle()
-    {
-        return this.database.name;
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return this.database.displayDomain;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.DatabaseSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.SidebarDatabaseTableTreeElement = function(database, tableName)
-{
-    this.database = database;
-    this.tableName = tableName;
-
-    WebInspector.SidebarTreeElement.call(this, "database-table-sidebar-tree-item small", tableName, "", null, false);
-}
-
-WebInspector.SidebarDatabaseTableTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDatabase(this.database, this.tableName);
-    }
-}
-
-WebInspector.SidebarDatabaseTableTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.DOMStorageSidebarTreeElement = function(domStorage, className)
-{
-
-    this.domStorage = domStorage;
-
-    WebInspector.SidebarTreeElement.call(this, "domstorage-sidebar-tree-item " + className, domStorage, "", null, false);
-
-    this.refreshTitles();
-}
-
-WebInspector.DOMStorageSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDOMStorage(this.domStorage);
-    },
-
-    get mainTitle()
-    {
-        return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files");
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return ""; //this.database.displayDomain;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.CookieSidebarTreeElement = function(cookieDomain)
-{
-    WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
-    this._cookieDomain = cookieDomain;
-
-    this.refreshTitles();
-}
-
-WebInspector.CookieSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showCookies(this._cookieDomain);
-    },
-    
-    get mainTitle()
-    {
-        return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files");
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return "";
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.CookieSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-/* ProfilesPanel.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
-
-WebInspector.ProfileType = function(id, name)
-{
-    this._id = id;
-    this._name = name;
-}
-
-WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;
-
-WebInspector.ProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return "";
-    },
-
-    get buttonStyle()
-    {
-        return undefined;
-    },
-
-    get buttonCaption()
-    {
-        return this.name;
-    },
-
-    get id()
-    {
-        return this._id;
-    },
-
-    get name()
-    {
-        return this._name;
-    },
-
-    buttonClicked: function()
-    {
-    },
-
-    viewForProfile: function(profile)
-    {
-        if (!profile._profileView)
-            profile._profileView = this.createView(profile);
-        return profile._profileView;
-    },
-
-    // Must be implemented by subclasses.
-    createView: function(profile)
-    {
-        throw new Error("Needs implemented.");
-    },
-
-    // Must be implemented by subclasses.
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        throw new Error("Needs implemented.");
-    }
-}
-
-WebInspector.ProfilesPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.createSidebar();
-
-    this.element.addStyleClass("profiles");
-    this._profileTypesByIdMap = {};
-    this._profileTypeButtonsByIdMap = {};
-
-    var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
-    var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
-    var panelEnablerButton = WebInspector.UIString("Enable Profiling");
-    this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-    this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);
-
-    this.element.appendChild(this.panelEnablerView.element);
-
-    this.profileViews = document.createElement("div");
-    this.profileViews.id = "profile-views";
-    this.element.appendChild(this.profileViews);
-
-    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-    this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
-
-    this.profileViewStatusBarItemsContainer = document.createElement("div");
-    this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
-
-    this._profiles = [];
-    this.reset();
-}
-
-WebInspector.ProfilesPanel.prototype = {
-    toolbarItemClass: "profiles",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Profiles");
-    },
-
-    get statusBarItems()
-    {
-        function clickHandler(profileType, buttonElement)
-        {
-            profileType.buttonClicked.call(profileType);
-            this.updateProfileTypeButtons();
-        }
-
-        var items = [this.enableToggleButton.element];
-        // FIXME: Generate a single "combo-button".
-        for (var typeId in this._profileTypesByIdMap) {
-            var profileType = this.getProfileType(typeId);
-            if (profileType.buttonStyle) {
-                var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
-                this._profileTypeButtonsByIdMap[typeId] = button.element;
-                button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);
-                items.push(button.element);
-            }
-        }
-        items.push(this.profileViewStatusBarItemsContainer);
-        return items;
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        if (this._shouldPopulateProfiles)
-            this._populateProfiles();
-    },
-
-    populateInterface: function()
-    {
-        if (this.visible)
-            this._populateProfiles();
-        else
-            this._shouldPopulateProfiles = true;
-    },
-
-    profilerWasEnabled: function()
-    {
-        this.reset();
-        this.populateInterface();
-    },
-
-    profilerWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        for (var i = 0; i < this._profiles.length; ++i)
-            delete this._profiles[i]._profileView;
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        this._profiles = [];
-        this._profilesIdMap = {};
-        this._profileGroups = {};
-        this._profileGroupsForLinks = {}
-
-        this.sidebarTreeElement.removeStyleClass("some-expandable");
-
-        for (var typeId in this._profileTypesByIdMap)
-            this.getProfileType(typeId).treeElement.removeChildren();
-
-        this.profileViews.removeChildren();
-
-        this.profileViewStatusBarItemsContainer.removeChildren();
-
-        this._updateInterface();
-    },
-
-    registerProfileType: function(profileType)
-    {
-        this._profileTypesByIdMap[profileType.id] = profileType;
-        profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);
-        this.sidebarTree.appendChild(profileType.treeElement);
-        profileType.treeElement.expand();
-    },
-
-    _makeKey: function(text, profileTypeId)
-    {
-        return escape(text) + '/' + escape(profileTypeId);
-    },
-
-    addProfileHeader: function(profile)
-    {
-        var typeId = profile.typeId;
-        var profileType = this.getProfileType(typeId);
-        var sidebarParent = profileType.treeElement;
-        var small = false;
-        var alternateTitle;
-
-        profile.__profilesPanelProfileType = profileType;
-        this._profiles.push(profile);
-        this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;
-
-        if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
-            var profileTitleKey = this._makeKey(profile.title, typeId);
-            if (!(profileTitleKey in this._profileGroups))
-                this._profileGroups[profileTitleKey] = [];
-
-            var group = this._profileGroups[profileTitleKey];
-            group.push(profile);
-
-            if (group.length === 2) {
-                // Make a group TreeElement now that there are 2 profiles.
-                group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
-
-                // Insert at the same index for the first profile of the group.
-                var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);
-                sidebarParent.insertChild(group._profilesTreeElement, index);
-
-                // Move the first profile to the group.
-                var selected = group[0]._profilesTreeElement.selected;
-                sidebarParent.removeChild(group[0]._profilesTreeElement);
-                group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
-                if (selected) {
-                    group[0]._profilesTreeElement.select();
-                    group[0]._profilesTreeElement.reveal();
-                }
-
-                group[0]._profilesTreeElement.small = true;
-                group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);
-
-                this.sidebarTreeElement.addStyleClass("some-expandable");
-            }
-
-            if (group.length >= 2) {
-                sidebarParent = group._profilesTreeElement;
-                alternateTitle = WebInspector.UIString("Run %d", group.length);
-                small = true;
-            }
-        }
-
-        var profileTreeElement = profileType.createSidebarTreeElementForProfile(profile);
-        profileTreeElement.small = small;
-        if (alternateTitle)
-            profileTreeElement.mainTitle = alternateTitle;
-        profile._profilesTreeElement = profileTreeElement;
-
-        sidebarParent.appendChild(profileTreeElement);
-        if (!this.visibleView)
-            this.showProfile(profile);
-    },
-
-    showProfile: function(profile)
-    {
-        if (!profile)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view = profile.__profilesPanelProfileType.viewForProfile(profile);
-
-        view.show(this.profileViews);
-
-        profile._profilesTreeElement.select(true);
-        profile._profilesTreeElement.reveal();
-
-        this.visibleView = view;
-
-        this.profileViewStatusBarItemsContainer.removeChildren();
-
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    showView: function(view)
-    {
-        this.showProfile(view.profile);
-    },
-
-    getProfileType: function(typeId)
-    {
-        return this._profileTypesByIdMap[typeId];
-    },
-
-    showProfileForURL: function(url)
-    {
-        var match = url.match(WebInspector.ProfileType.URLRegExp);
-        if (!match)
-            return;
-        this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);
-    },
-
-    updateProfileTypeButtons: function()
-    {
-        for (var typeId in this._profileTypeButtonsByIdMap) {
-            var buttonElement = this._profileTypeButtonsByIdMap[typeId];
-            var profileType = this.getProfileType(typeId);
-            buttonElement.className = profileType.buttonStyle;
-            buttonElement.title = profileType.buttonTooltip;
-            // FIXME: Apply profileType.buttonCaption once captions are added to button controls.
-        }
-    },
-
-    closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-        delete this.visibleView;
-    },
-
-    displayTitleForProfileLink: function(title, typeId)
-    {
-        title = unescape(title);
-        if (title.indexOf(UserInitiatedProfileName) === 0) {
-            title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
-        } else {
-            var titleKey = this._makeKey(title, typeId);
-            if (!(titleKey in this._profileGroupsForLinks))
-                this._profileGroupsForLinks[titleKey] = 0;
-
-            groupNumber = ++this._profileGroupsForLinks[titleKey];
-
-            if (groupNumber > 2)
-                // The title is used in the console message announcing that a profile has started so it gets
-                // incremented twice as often as it's displayed
-                title += " " + WebInspector.UIString("Run %d", groupNumber / 2);
-        }
-        
-        return title;
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch)
-            views.push(visibleView);
-
-        var profilesLength = this._profiles.length;
-        for (var i = 0; i < profilesLength; ++i) {
-            var profile = this._profiles[i];
-            var view = profile.__profilesPanelProfileType.viewForProfile(profile);
-            if (!view.performSearch || view === visibleView)
-                continue;
-            views.push(view);
-        }
-
-        return views;
-    },
-
-    searchMatchFound: function(view, matches)
-    {
-        view.profile._profilesTreeElement.searchMatches = matches;
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
-
-        if (!this._profiles)
-            return;
-
-        for (var i = 0; i < this._profiles.length; ++i) {
-            var profile = this._profiles[i];
-            profile._profilesTreeElement.searchMatches = 0;
-        }
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    _updateInterface: function()
-    {
-        // FIXME: Replace ProfileType-specific button visibility changes by a single ProfileType-agnostic "combo-button" visibility change.
-        if (InspectorBackend.profilerEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            for (var typeId in this._profileTypeButtonsByIdMap)
-                this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");
-            this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            for (var typeId in this._profileTypeButtonsByIdMap)
-                this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");
-            this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
-            this.panelEnablerView.visible = true;
-        }
-    },
-
-    _enableProfiling: function()
-    {
-        if (InspectorBackend.profilerEnabled())
-            return;
-        this._toggleProfiling(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleProfiling: function(optionalAlways)
-    {
-        if (InspectorBackend.profilerEnabled())
-            InspectorBackend.disableProfiler(true);
-        else
-            InspectorBackend.enableProfiler(!!optionalAlways);
-    },
-
-    _populateProfiles: function()
-    {
-        var sidebarTreeChildrenCount = this.sidebarTree.children.length;
-        for (var i = 0; i < sidebarTreeChildrenCount; ++i) {
-            var treeElement = this.sidebarTree.children[i];
-            if (treeElement.children.length)
-                return;
-        }
-
-        function populateCallback(profileHeaders) {
-            profileHeaders.sort(function(a, b) { return a.uid - b.uid; });
-            var profileHeadersLength = profileHeaders.length;
-            for (var i = 0; i < profileHeadersLength; ++i)
-                WebInspector.addProfileHeader(profileHeaders[i]);
-        }
-
-        var callId = WebInspector.Callback.wrap(populateCallback);
-        InspectorBackend.getProfileHeaders(callId);
-
-        delete this._shouldPopulateProfiles;
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.profileViews.style.left = width + "px";
-        this.profileViewStatusBarItemsContainer.style.left = width + "px";
-    }
-}
-
-WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.ProfileSidebarTreeElement = function(profile)
-{
-    this.profile = profile;
-
-    if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
-        this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);
-
-    WebInspector.SidebarTreeElement.call(this, "profile-sidebar-tree-item", "", "", profile, false);
-
-    this.refreshTitles();
-}
-
-WebInspector.ProfileSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.profiles.showProfile(this.profile);
-    },
-
-    get mainTitle()
-    {
-        if (this._mainTitle)
-            return this._mainTitle;
-        if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
-            return WebInspector.UIString("Profile %d", this._profileNumber);
-        return this.profile.title;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        // There is no subtitle.
-    },
-
-    set subtitle(x)
-    {
-        // Can't change subtitle.
-    },
-
-    set searchMatches(matches)
-    {
-        if (!matches) {
-            if (!this.bubbleElement)
-                return;
-            this.bubbleElement.removeStyleClass("search-matches");
-            this.bubbleText = "";
-            return;
-        }
-
-        this.bubbleText = matches;
-        this.bubbleElement.addStyleClass("search-matches");
-    }
-}
-
-WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)
-{
-    WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);
-}
-
-WebInspector.ProfileGroupSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);
-    }
-}
-
-WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.didGetProfileHeaders = WebInspector.Callback.processCallback;
-WebInspector.didGetProfile = WebInspector.Callback.processCallback;
-
-/* ConsolePanel.js */
-
-/*
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ConsolePanel = function()
-{
-    WebInspector.Panel.call(this);
-}
-
-WebInspector.ConsolePanel.prototype = {
-    toolbarItemClass: "console",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Console");
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this._previousConsoleState = WebInspector.drawer.state;
-        WebInspector.drawer.enterPanelMode();
-        WebInspector.showConsole();
-        
-        // Move the scope bar to the top of the messages, like the resources filter.
-        var scopeBar = document.getElementById("console-filter");
-        var consoleMessages = document.getElementById("console-messages");
-
-        scopeBar.parentNode.removeChild(scopeBar);
-        document.getElementById("console-view").insertBefore(scopeBar, consoleMessages);
-        
-        // Update styles, and give console-messages a top margin so it doesn't overwrite the scope bar.
-        scopeBar.addStyleClass("console-filter-top");
-        scopeBar.removeStyleClass("status-bar-item");
-
-        consoleMessages.addStyleClass("console-filter-top");
-    },
-
-    hide: function()
-    {
-        WebInspector.Panel.prototype.hide.call(this);
-
-        if (this._previousConsoleState === WebInspector.Drawer.State.Hidden)
-            WebInspector.drawer.immediatelyExitPanelMode();
-        else
-            WebInspector.drawer.exitPanelMode();
-        delete this._previousConsoleState;
-        
-        // Move the scope bar back to the bottom bar, next to Clear Console.
-        var scopeBar = document.getElementById("console-filter");
-
-        scopeBar.parentNode.removeChild(scopeBar);
-        document.getElementById("other-drawer-status-bar-items").appendChild(scopeBar);
-        
-        // Update styles, and remove the top margin on console-messages.
-        scopeBar.removeStyleClass("console-filter-top");
-        scopeBar.addStyleClass("status-bar-item");
-
-        document.getElementById("console-messages").removeStyleClass("console-filter-top");
-    }
-}
-
-WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* AuditsPanel.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this._constructCategories();
-
-    this.createSidebar();
-    this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);
-    this.sidebarTree.appendChild(this.auditsTreeElement);
-    this.auditsTreeElement.expand();
-
-    this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();
-    this.auditsTreeElement.appendChild(this.auditsItemTreeElement);
-
-    this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);
-    this.sidebarTree.appendChild(this.auditResultsTreeElement);
-    this.auditResultsTreeElement.expand();
-
-    this.element.addStyleClass("audits");
-
-    this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-audit-results-status-bar-item");
-    this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "audit-views";
-    this.element.appendChild(this.viewsContainerElement);
-}
-
-WebInspector.AuditsPanel.prototype = {
-    toolbarItemClass: "audits",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Audits");
-    },
-
-    get statusBarItems()
-    {
-        return [this.clearResultsButton.element];
-    },
-
-    get mainResourceLoadTime()
-    {
-        return this._mainResourceLoadTime;
-    },
-
-    set mainResourceLoadTime(x)
-    {
-        this._mainResourceLoadTime = x;
-        this._didMainResourceLoad();
-    },
-
-    get mainResourceDOMContentTime()
-    {
-        return this._mainResourceDOMContentTime;
-    },
-
-    set mainResourceDOMContentTime(x)
-    {
-        this._mainResourceDOMContentTime = x;
-    },
-
-    get categoriesById()
-    {
-        return this._auditCategoriesById;
-    },
-
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    _constructCategories: function()
-    {
-        this._auditCategoriesById = {};
-        for (var categoryCtorID in WebInspector.AuditCategories) {
-            var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();
-            this.categoriesById[auditCategory.id] = auditCategory;
-        }
-    },
-
-    _executeAudit: function(categories, resultCallback)
-    {
-        var resources = [];
-        for (var id in WebInspector.resources)
-            resources.push(WebInspector.resources[id]);
-
-        var rulesRemaining = 0;
-        for (var i = 0; i < categories.length; ++i)
-            rulesRemaining += categories[i].ruleCount;
-
-        var results = [];
-        var mainResourceURL = WebInspector.mainResource.url;
-
-        function ruleResultReadyCallback(categoryResult, ruleResult)
-        {
-            if (ruleResult.children)
-                categoryResult.entries.push(ruleResult);
-
-            --rulesRemaining;
-
-            if (!rulesRemaining && resultCallback)
-                resultCallback(mainResourceURL, results);
-        }
-
-        if (!rulesRemaining) {
-            resultCallback(mainResourceURL, results);
-            return;
-        }
-
-        for (var i = 0; i < categories.length; ++i) {
-            var category = categories[i];
-            var result = new WebInspector.AuditCategoryResult(category);
-            results.push(result);
-            category.runRules(resources, ruleResultReadyCallback.bind(null, result));
-        }
-    },
-
-    _auditFinishedCallback: function(launcherCallback, mainResourceURL, results)
-    {
-        var children = this.auditResultsTreeElement.children;
-        var ordinal = 1;
-        for (var i = 0; i < children.length; ++i) {
-            if (children[i].mainResourceURL === mainResourceURL)
-                ordinal++;
-        }
-
-        var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);
-        this.auditResultsTreeElement.appendChild(resultTreeElement);
-        resultTreeElement.reveal();
-        resultTreeElement.select();
-        if (launcherCallback)
-            launcherCallback();
-    },
-
-    initiateAudit: function(categoryIds, runImmediately, launcherCallback)
-    {
-        if (!categoryIds || !categoryIds.length)
-            return;
-
-        var categories = [];
-        for (var i = 0; i < categoryIds.length; ++i)
-            categories.push(this.categoriesById[categoryIds[i]]);
-
-        function initiateAuditCallback(categories, launcherCallback)
-        {
-            this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));
-        }
-
-        if (runImmediately)
-            initiateAuditCallback.call(this, categories, launcherCallback);
-        else
-            this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));
-    },
-
-    _reloadResources: function(callback)
-    {
-        function nullCallback()
-        {
-        }
-        this._resourceTrackingCallback = callback;
-        if (!InspectorBackend.resourceTrackingEnabled()) {
-            InspectorBackend.enableResourceTracking(false);
-            this._updateLauncherViewControls();
-        } else
-            InjectedScriptAccess.evaluate("window.location.reload()", nullCallback);
-    },
-
-    _didMainResourceLoad: function()
-    {
-        if (this._resourceTrackingCallback) {
-            var callback = this._resourceTrackingCallback;
-            this._resourceTrackingCallback = null;
-            callback();
-        }
-    },
-
-    showResults: function(categoryResults)
-    {
-        if (!categoryResults._resultView)
-            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
-
-        this.showView(categoryResults._resultView);
-    },
-
-    showLauncherView: function()
-    {
-        if (!this._launcherView)
-            this._launcherView = new WebInspector.AuditLauncherView(this.categoriesById, this.initiateAudit.bind(this));
-
-        this.showView(this._launcherView);
-    },
-
-    showView: function(view)
-    {
-        if (view) {
-            if (this._visibleView === view)
-                return;
-            this._closeVisibleView();
-            this._visibleView = view;
-        }
-        var visibleView = this.visibleView;
-        if (visibleView)
-            visibleView.show(this.viewsContainerElement);
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this.showView();
-        this._updateLauncherViewControls();
-    },
-
-    attach: function()
-    {
-        WebInspector.Panel.prototype.attach.call(this);
-
-        this.auditsItemTreeElement.select();
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.viewsContainerElement.style.left = width + "px";
-    },
-
-    _updateLauncherViewControls: function()
-    {
-        if (this._launcherView)
-            this._launcherView.updateResourceTrackingState();
-    },
-
-    _clearButtonClicked: function()
-    {
-        this.auditsItemTreeElement.reveal();
-        this.auditsItemTreeElement.select();
-        this.auditResultsTreeElement.removeChildren();
-    },
-
-    _closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-    }
-}
-
-WebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-
-
-WebInspector.AuditCategory = function(id, displayName)
-{
-    this._id = id;
-    this._displayName = displayName;
-    this._rules = [];
-}
-
-WebInspector.AuditCategory.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get displayName()
-    {
-        return this._displayName;
-    },
-
-    get ruleCount()
-    {
-        return this._rules.length;
-    },
-
-    addRule: function(rule)
-    {
-        this._rules.push(rule);
-    },
-
-    runRules: function(resources, callback)
-    {
-        for (var i = 0; i < this._rules.length; ++i)
-            this._rules[i].run(resources, callback);
-    }
-}
-
-
-WebInspector.AuditRule = function(id, displayName, parametersObject)
-{
-    this._id = id;
-    this._displayName = displayName;
-    this._parametersObject = parametersObject;
-}
-
-WebInspector.AuditRule.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get displayName()
-    {
-        return this._displayName;
-    },
-
-    run: function(resources, callback)
-    {
-        this.doRun(resources, new WebInspector.AuditRuleResult(this.displayName), callback);
-    },
-
-    doRun: function(resources, result, callback)
-    {
-        throw new Error("doRun() not implemented");
-    },
-
-    getValue: function(key)
-    {
-        if (key in this._parametersObject)
-            return this._parametersObject[key];
-        else
-            throw new Error(key + " not found in rule parameters");
-    }
-}
-
-
-WebInspector.AuditCategoryResult = function(category)
-{
-    this.categoryId = category.id;
-    this.title = category.displayName;
-    this.entries = [];
-}
-
-WebInspector.AuditCategoryResult.prototype = {
-    addEntry: function(value)
-    {
-        var entry = new WebInspector.AuditRuleResult(value);
-        this.entries.push(entry);
-        return entry;
-    }
-}
-
-/**
- * @param {string} value The result message HTML contents.
- */
-WebInspector.AuditRuleResult = function(value)
-{
-    this.value = value;
-    this.type = WebInspector.AuditRuleResult.Type.NA;
-}
-
-WebInspector.AuditRuleResult.Type = {
-    NA: 0,
-    Hint: 1,
-    Violation: 2
-}
-
-WebInspector.AuditRuleResult.prototype = {
-    appendChild: function(value)
-    {
-        if (!this.children)
-            this.children = [];
-        var entry = new WebInspector.AuditRuleResult(value);
-        this.children.push(entry);
-        return entry;
-    },
-
-    set type(x)
-    {
-        this._type = x;
-    },
-
-    get type()
-    {
-        return this._type;
-    }
-}
-
-
-WebInspector.AuditsSidebarTreeElement = function()
-{
-    this.small = false;
-
-    WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);
-}
-
-WebInspector.AuditsSidebarTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
-    },
-
-    onselect: function()
-    {
-        WebInspector.panels.audits.showLauncherView();
-    },
-
-    get selectable()
-    {
-        return true;
-    },
-
-    refresh: function()
-    {
-        this.refreshTitles();
-    }
-}
-
-WebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-
-WebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)
-{
-    this.results = results;
-    this.mainResourceURL = mainResourceURL;
-
-    WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);
-}
-
-WebInspector.AuditResultSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.audits.showResults(this.results);
-    },
-
-    get selectable()
-    {
-        return true;
-    }
-}
-
-WebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-// Contributed audit rules should go into this namespace.
-WebInspector.AuditRules = {};
-
-// Contributed audit categories should go into this namespace.
-WebInspector.AuditCategories = {};
-
-/* AuditResultView.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditResultView = function(categoryResults)
-{
-    WebInspector.View.call(this);
-
-    this.element.id = "audit-result-view";
-
-    function entrySortFunction(a, b)
-    {
-        var result = b.type - a.type;
-        if (!result)
-            result = (a.value || "").localeCompare(b.value || "");
-        return result;
-    }
-
-    for (var i = 0; i < categoryResults.length; ++i) {
-        var entries = categoryResults[i].entries;
-        if (entries) {
-            entries.sort(entrySortFunction);
-            this.element.appendChild(new WebInspector.AuditCategoryResultPane(categoryResults[i]).element);
-        }
-    }
-}
-
-WebInspector.AuditResultView.prototype.__proto__ = WebInspector.View.prototype;
-
-
-WebInspector.AuditCategoryResultPane = function(categoryResult)
-{
-    WebInspector.SidebarPane.call(this, categoryResult.title);
-    this.expand();
-    for (var i = 0; i < categoryResult.entries.length; ++i)
-        this.bodyElement.appendChild(new WebInspector.AuditRuleResultPane(categoryResult.entries[i]).element);
-}
-
-WebInspector.AuditCategoryResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-
-WebInspector.AuditRuleResultPane = function(ruleResult)
-{
-    WebInspector.SidebarPane.call(this, ruleResult.value);
-    if (!ruleResult.children)
-        return;
-
-    this._decorateRuleResult(ruleResult);
-
-    for (var i = 0; i < ruleResult.children.length; ++i) {
-        var section = new WebInspector.AuditRuleResultChildSection(ruleResult.children[i]);
-        this.bodyElement.appendChild(section.element);
-    }
-}
-
-WebInspector.AuditRuleResultPane.prototype = {
-    _decorateRuleResult: function(ruleResult)
-    {
-        if (ruleResult.type == WebInspector.AuditRuleResult.Type.NA)
-            return;
-
-        var scoreElement = document.createElement("img");
-        scoreElement.className = "score";
-        var className = (ruleResult.type == WebInspector.AuditRuleResult.Type.Violation) ? "red" : "green";
-        scoreElement.addStyleClass(className);
-        this.element.insertBefore(scoreElement, this.element.firstChild);
-    }
-}
-
-WebInspector.AuditRuleResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-
-WebInspector.AuditRuleResultChildSection = function(entry)
-{
-    WebInspector.Section.call(this, entry.value);
-    var children = entry.children;
-    this._hasChildren = !!children && children.length;
-    if (!this._hasChildren)
-        this.element.addStyleClass("blank-section");
-    else {
-        this.contentElement = document.createElement("div");
-        this.contentElement.addStyleClass("section-content");
-        for (var i = 0; i < children.length; ++i) {
-            var paraElement = document.createElement("p");
-            paraElement.innerHTML = children[i].value;
-            this.contentElement.appendChild(paraElement);
-        }
-        this.contentElement.appendChild(paraElement);
-        this.element.appendChild(this.contentElement);
-    }
-}
-
-WebInspector.AuditRuleResultChildSection.prototype = {
-
-    // title is considered pure HTML
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-
-        this.titleElement.innerHTML = x;
-    },
-
-    expand: function()
-    {
-        if (this._hasChildren)
-            WebInspector.Section.prototype.expand.call(this);
-    }
-}
-
-WebInspector.AuditRuleResultChildSection.prototype.__proto__ = WebInspector.Section.prototype;
-
-/* AuditLauncherView.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditLauncherView = function(categoriesById, runnerCallback)
-{
-    WebInspector.View.call(this);
-    this._categoriesById = categoriesById;
-    this._runnerCallback = runnerCallback;
-    this._categoryIdPrefix = "audit-category-item-";
-    this._auditRunning = false;
-
-    this.element.addStyleClass("audit-launcher-view");
-
-    this._contentElement = document.createElement("div");
-    this._contentElement.className = "audit-launcher-view-content";
-    this.element.appendChild(this._contentElement);
-
-    function categorySortFunction(a, b)
-    {
-        var aTitle = a.displayName || "";
-        var bTitle = b.displayName || "";
-        return aTitle.localeCompare(bTitle);
-    }
-    var sortedCategories = [];
-    for (var id in this._categoriesById)
-        sortedCategories.push(this._categoriesById[id]);
-    sortedCategories.sort(categorySortFunction);
-
-    if (!sortedCategories.length) {
-        this._headerElement = document.createElement("h1");
-        this._headerElement.className = "no-audits";
-        this._headerElement.textContent = WebInspector.UIString("No audits to run");
-        this._contentElement.appendChild(this._headerElement);
-    } else
-        this._createLauncherUI(sortedCategories);
-}
-
-WebInspector.AuditLauncherView.prototype = {
-    updateResourceTrackingState: function()
-    {
-        if (!this._auditPresentStateLabelElement)
-            return;
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State");
-            this._auditPresentStateElement.disabled = false;
-            this._auditPresentStateElement.parentElement.removeStyleClass("disabled");
-        } else {
-            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)");
-            this._auditPresentStateElement.disabled = true;
-            this._auditPresentStateElement.parentElement.addStyleClass("disabled");
-            this.auditReloadedStateElement.checked = true;
-        }
-    },
-
-    _setAuditRunning: function(auditRunning)
-    {
-        if (this._auditRunning === auditRunning)
-            return;
-        this._auditRunning = auditRunning;
-        this._updateButton();
-    },
-
-    _launchButtonClicked: function(event)
-    {
-        var catIds = [];
-        var childNodes = this._categoriesElement.childNodes;
-        for (var id in this._categoriesById) {
-            if (this._categoriesById[id]._checkboxElement.checked)
-                catIds.push(id);
-        }
-        function profilingFinishedCallback()
-        {
-            this._setAuditRunning(false);
-        }
-        this._setAuditRunning(true);
-        this._runnerCallback(catIds, this._auditPresentStateElement.checked, profilingFinishedCallback.bind(this));
-    },
-
-    _selectAllClicked: function(checkCategories)
-    {
-        var childNodes = this._categoriesElement.childNodes;
-        for (var i = 0, length = childNodes.length; i < length; ++i)
-            childNodes[i].firstChild.checked = checkCategories;
-        this._currentCategoriesCount = checkCategories ? this._totalCategoriesCount : 0;
-        this._updateButton();
-    },
-
-    _categoryClicked: function(event)
-    {
-        this._currentCategoriesCount += event.target.checked ? 1 : -1;
-        this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._totalCategoriesCount;
-        this._updateButton();
-    },
-
-    _createCategoryElement: function(title, id)
-    {
-        var element;
-        var labelElement = document.createElement("label");
-        labelElement.id = this._categoryIdPrefix + id;
-
-        element = document.createElement("input");
-        element.type = "checkbox";
-        labelElement.appendChild(element);
-        labelElement.appendChild(document.createTextNode(title));
-
-        return labelElement;
-    },
-
-    _createLauncherUI: function(sortedCategories)
-    {
-        this._headerElement = document.createElement("h1");
-        this._headerElement.textContent = WebInspector.UIString("Select audits to run");
-        this._contentElement.appendChild(this._headerElement);
-
-        function handleSelectAllClick(event)
-        {
-            this._selectAllClicked(event.target.checked);
-        }
-        var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");
-        categoryElement.id = "audit-launcher-selectall";
-        this._selectAllCheckboxElement = categoryElement.firstChild;
-        this._selectAllCheckboxElement.checked = true;
-        this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);
-        this._contentElement.appendChild(categoryElement);
-
-        this._categoriesElement = document.createElement("div");
-        this._categoriesElement.className = "audit-categories-container";
-        this._contentElement.appendChild(this._categoriesElement);
-
-        var boundCategoryClickListener = this._categoryClicked.bind(this);
-
-        for (var i = 0; i < sortedCategories.length; ++i) {
-            categoryElement = this._createCategoryElement(sortedCategories[i].displayName, sortedCategories[i].id);
-            categoryElement.firstChild.addEventListener("click", boundCategoryClickListener, false);
-            sortedCategories[i]._checkboxElement = categoryElement.firstChild;
-            this._categoriesElement.appendChild(categoryElement);
-        }
-
-        this._totalCategoriesCount = this._categoriesElement.childNodes.length;
-        this._currentCategoriesCount = 0;
-
-        this._buttonContainerElement = document.createElement("div");
-        this._buttonContainerElement.className = "button-container";
-
-        var labelElement = document.createElement("label");
-        this._auditPresentStateElement = document.createElement("input");
-        this._auditPresentStateElement.name = "audit-mode";
-        this._auditPresentStateElement.type = "radio";
-        this._auditPresentStateElement.checked = true;
-        this._auditPresentStateLabelElement = document.createTextNode("");
-        labelElement.appendChild(this._auditPresentStateElement);
-        labelElement.appendChild(this._auditPresentStateLabelElement);
-        this._buttonContainerElement.appendChild(labelElement);
-
-        labelElement = document.createElement("label");
-        this.auditReloadedStateElement = document.createElement("input");
-        this.auditReloadedStateElement.name = "audit-mode";
-        this.auditReloadedStateElement.type = "radio";
-        labelElement.appendChild(this.auditReloadedStateElement);
-        labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));
-        this._buttonContainerElement.appendChild(labelElement);
-
-        this._launchButton = document.createElement("button");
-        this._launchButton.setAttribute("type", "button");
-        this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);
-        this._buttonContainerElement.appendChild(this._launchButton);
-
-        this._contentElement.appendChild(this._buttonContainerElement);
-
-        this._selectAllClicked(this._selectAllCheckboxElement.checked);
-        this.updateResourceTrackingState();
-        this._updateButton();
-        this.resize();
-    },
-
-    _updateButton: function()
-    {
-        this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;
-        if (this._auditRunning)
-            this._launchButton.textContent = WebInspector.UIString("Running...");
-        else
-            this._launchButton.textContent = WebInspector.UIString("Run");
-    },
-
-    resize: function()
-    {
-        if (this._categoriesElement)
-            this._categoriesElement.style.height = (this._buttonContainerElement.totalOffsetTop - this._categoriesElement.totalOffsetTop) + "px";
-    }
-}
-
-WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ResourceView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) IBM Corp. 2009  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourceView = function(resource)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("resource-view");
-
-    this.resource = resource;
-
-    this.headersElement = document.createElement("div");
-    this.headersElement.className = "resource-view-headers";
-    this.element.appendChild(this.headersElement);
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.className = "resource-view-content";
-    this.element.appendChild(this.contentElement);
-
-    this.headersListElement = document.createElement("ol");
-    this.headersListElement.className = "outline-disclosure";
-    this.headersElement.appendChild(this.headersListElement);
-
-    this.headersTreeOutline = new TreeOutline(this.headersListElement);
-    this.headersTreeOutline.expandTreeElementsWhenArrowing = true;
-
-    this.urlTreeElement = new TreeElement("", null, false);
-    this.urlTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.urlTreeElement);
-
-    this.requestMethodTreeElement = new TreeElement("", null, false);
-    this.requestMethodTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.requestMethodTreeElement);
-
-    this.statusCodeTreeElement = new TreeElement("", null, false);
-    this.statusCodeTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.statusCodeTreeElement);
-     
-    this.requestHeadersTreeElement = new TreeElement("", null, true);
-    this.requestHeadersTreeElement.expanded = false;
-    this.requestHeadersTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.requestHeadersTreeElement);
-
-    this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
-    this._decodeRequestParameters = true;
-
-    this.queryStringTreeElement = new TreeElement("", null, true);
-    this.queryStringTreeElement.expanded = false;
-    this.queryStringTreeElement.selectable = false;
-    this.queryStringTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.queryStringTreeElement);
-
-    this.formDataTreeElement = new TreeElement("", null, true);
-    this.formDataTreeElement.expanded = false;
-    this.formDataTreeElement.selectable = false;
-    this.formDataTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.formDataTreeElement);
-
-    this.requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);
-    this.requestPayloadTreeElement.expanded = false;
-    this.requestPayloadTreeElement.selectable = false;
-    this.requestPayloadTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.requestPayloadTreeElement);
-
-    this.responseHeadersTreeElement = new TreeElement("", null, true);
-    this.responseHeadersTreeElement.expanded = false;
-    this.responseHeadersTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.responseHeadersTreeElement);
-
-    this.headersVisible = true;
-
-    resource.addEventListener("url changed", this._refreshURL, this);
-    resource.addEventListener("requestHeaders changed", this._refreshRequestHeaders, this);
-    resource.addEventListener("responseHeaders changed", this._refreshResponseHeaders, this);
-    resource.addEventListener("finished", this._refreshHTTPInformation, this);
-
-    this._refreshURL();
-    this._refreshRequestHeaders();
-    this._refreshResponseHeaders();
-    this._refreshHTTPInformation();
-}
-
-WebInspector.ResourceView.prototype = {
-    get headersVisible()
-    {
-        return this._headersVisible;
-    },
-
-    set headersVisible(x)
-    {
-        if (x === this._headersVisible)
-            return;
-
-        this._headersVisible = x;
-
-        if (x)
-            this.element.addStyleClass("headers-visible");
-        else
-            this.element.removeStyleClass("headers-visible");
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode) {
-            var parentElement = (document.getElementById("resource-views") || document.getElementById("script-resource-views"));
-            if (parentElement)
-                parentElement.appendChild(this.element);
-        }
-    },
-
-    _refreshURL: function()
-    {
-        this.urlTreeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request URL") + ":</div>" +
-            "<div class=\"header-value source-code\">" + this.resource.url.escapeHTML() + "</div>";
-    },
-
-    _refreshQueryString: function()
-    {
-        var url = this.resource.url;
-        var hasQueryString = url.indexOf("?") >= 0;
-
-        if (!hasQueryString) {
-            this.queryStringTreeElement.hidden = true;
-            return;
-        }
-
-        this.queryStringTreeElement.hidden = false;
-        var parmString = url.split("?", 2)[1];
-        this._refreshParms(WebInspector.UIString("Query String Parameters"), parmString, this.queryStringTreeElement);
-    },
-
-    _refreshFormData: function()
-    {
-        this.formDataTreeElement.hidden = true;
-        this.requestPayloadTreeElement.hidden = true;
-
-        var isFormData = this.resource.requestFormData;
-        if (!isFormData)
-            return;
-
-        var isFormEncoded = false;
-        var requestContentType = this._getHeaderValue(this.resource.requestHeaders, "Content-Type");
-        if (requestContentType && requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
-            isFormEncoded = true;
-
-        if (isFormEncoded) {
-            this.formDataTreeElement.hidden = false;
-            this._refreshParms(WebInspector.UIString("Form Data"), this.resource.requestFormData, this.formDataTreeElement);
-        } else {
-            this.requestPayloadTreeElement.hidden = false;
-            this._refreshRequestPayload(this.resource.requestFormData);
-        }
-    },
-
-    _refreshRequestPayload: function(formData)
-    {
-        this.requestPayloadTreeElement.removeChildren();
-
-        var title = "<div class=\"header-name\">&nbsp;</div>";
-        title += "<div class=\"raw-form-data header-value source-code\">" + formData.escapeHTML() + "</div>";
-        var parmTreeElement = new TreeElement(title, null, false);
-        parmTreeElement.selectable = false;
-        this.requestPayloadTreeElement.appendChild(parmTreeElement);
-    },
-
-    _refreshParms: function(title, parmString, parmsTreeElement)
-    {
-        var parms = parmString.split("&");
-        for (var i = 0; i < parms.length; ++i) {
-            var parm = parms[i];
-            parm = parm.split("=", 2);
-            if (parm.length == 1)
-                parm.push("");
-            parms[i] = parm;
-        }
-
-        parmsTreeElement.removeChildren();
-
-        parmsTreeElement.title = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
-
-        for (var i = 0; i < parms.length; ++i) {
-            var key = parms[i][0];
-            var value = parms[i][1];
-
-            var errorDecoding = false;
-            if (this._decodeRequestParameters) {
-                if (value.indexOf("%") >= 0) {
-                    try {
-                        value = decodeURIComponent(value);
-                    } catch(e) {
-                        errorDecoding = true;
-                    }
-                }
-                    
-                value = value.replace(/\+/g, " ");
-            }
-
-            valueEscaped = value.escapeHTML();
-            if (errorDecoding)
-                valueEscaped += " <span class=\"error-message\">" + WebInspector.UIString("(unable to decode value)").escapeHTML() + "</span>";
-
-            var title = "<div class=\"header-name\">" + key.escapeHTML() + ":</div>";
-            title += "<div class=\"header-value source-code\">" + valueEscaped + "</div>";
-
-            var parmTreeElement = new TreeElement(title, null, false);
-            parmTreeElement.selectable = false;
-            parmTreeElement.tooltip = this._decodeHover;
-            parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
-            parmsTreeElement.appendChild(parmTreeElement);
-        }
-    },
-
-    _toggleURLdecoding: function(event)
-    {
-        this._decodeRequestParameters = !this._decodeRequestParameters;
-        this._refreshQueryString();
-        this._refreshFormData();
-    },
-
-    _getHeaderValue: function(headers, key)
-    {
-        var lowerKey = key.toLowerCase();
-        for (var testKey in headers) {
-            if (testKey.toLowerCase() === lowerKey)
-                return headers[testKey];
-        }
-    },
-
-    _refreshRequestHeaders: function()
-    {
-        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
-        this._refreshFormData();
-    },
-
-    _refreshResponseHeaders: function()
-    {
-        this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement);
-    },
-
-    _refreshHTTPInformation: function()
-    {
-        var requestMethodElement = this.requestMethodTreeElement;
-        requestMethodElement.hidden = !this.resource.statusCode;
-        var statusCodeElement = this.statusCodeTreeElement;
-        statusCodeElement.hidden = !this.resource.statusCode;
-        var statusCodeImage = "";
-
-        if (this.resource.statusCode) {
-            var statusImageSource = "";
-            if (this.resource.statusCode < 300)
-                statusImageSource = "Images/successGreenDot.png";
-            else if (this.resource.statusCode < 400)
-                statusImageSource = "Images/warningOrangeDot.png";
-            else
-                statusImageSource = "Images/errorRedDot.png";
-            statusCodeImage = "<img class=\"resource-status-image\" src=\"" + statusImageSource + "\" title=\"" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "\">";
-    
-            requestMethodElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request Method") + ":</div>" +
-                "<div class=\"header-value source-code\">" + this.resource.requestMethod + "</div>";
-
-            statusCodeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Status Code") + ":</div>" +
-                statusCodeImage + "<div class=\"header-value source-code\">" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "</div>";
-        }
-    },
-    
-    _refreshHeaders: function(title, headers, headersTreeElement)
-    {
-        headersTreeElement.removeChildren();
-
-        var length = headers.length;
-        headersTreeElement.title = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";
-        headersTreeElement.hidden = !length;
-
-        var length = headers.length;
-        for (var i = 0; i < length; ++i) {
-            var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";
-            title += "<div class=\"header-value source-code\">" + headers[i].value.escapeHTML() + "</div>"
-
-            var headerTreeElement = new TreeElement(title, null, false);
-            headerTreeElement.selectable = false;
-            headersTreeElement.appendChild(headerTreeElement);
-        }
-    }
-}
-
-WebInspector.ResourceView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* SourceFrame.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceFrame = function(element, addBreakpointDelegate)
-{
-    this.messages = [];
-    this.breakpoints = [];
-    this._shortcuts = {};
-
-    this.addBreakpointDelegate = addBreakpointDelegate;
-
-    this.element = element || document.createElement("iframe");
-    this.element.addStyleClass("source-view-frame");
-    this.element.setAttribute("viewsource", "true");
-
-    this.element.addEventListener("load", this._loaded.bind(this), false);
-}
-
-WebInspector.SourceFrame.prototype = {
-    get executionLine()
-    {
-        return this._executionLine;
-    },
-
-    set executionLine(x)
-    {
-        if (this._executionLine === x)
-            return;
-
-        var previousLine = this._executionLine;
-        this._executionLine = x;
-
-        this._updateExecutionLine(previousLine);
-    },
-
-    get autoSizesToFitContentHeight()
-    {
-        return this._autoSizesToFitContentHeight;
-    },
-
-    set autoSizesToFitContentHeight(x)
-    {
-        if (this._autoSizesToFitContentHeight === x)
-            return;
-
-        this._autoSizesToFitContentHeight = x;
-
-        if (this._autoSizesToFitContentHeight) {
-            this._windowResizeListener = this._windowResized.bind(this);
-            window.addEventListener("resize", this._windowResizeListener, false);
-            this.sizeToFitContentHeight();
-        } else {
-            this.element.style.removeProperty("height");
-            if (this.element.contentDocument)
-                this.element.contentDocument.body.removeStyleClass("webkit-height-sized-to-fit");
-            window.removeEventListener("resize", this._windowResizeListener, false);
-            delete this._windowResizeListener;
-        }
-    },
-
-    sourceRow: function(lineNumber)
-    {
-        if (!lineNumber || !this.element.contentDocument)
-            return;
-
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var rows = table.rows;
-
-        // Line numbers are a 1-based index, but the rows collection is 0-based.
-        --lineNumber;
-
-        return rows[lineNumber];
-    },
-
-    lineNumberForSourceRow: function(sourceRow)
-    {
-        // Line numbers are a 1-based index, but the rows collection is 0-based.
-        var lineNumber = 0;
-        while (sourceRow) {
-            ++lineNumber;
-            sourceRow = sourceRow.previousSibling;
-        }
-
-        return lineNumber;
-    },
-
-    revealLine: function(lineNumber)
-    {
-        if (!this._isContentLoaded()) {
-            this._lineNumberToReveal = lineNumber;
-            return;
-        }
-
-        var row = this.sourceRow(lineNumber);
-        if (row)
-            row.scrollIntoViewIfNeeded(true);
-    },
-
-    addBreakpoint: function(breakpoint)
-    {
-        this.breakpoints.push(breakpoint);
-        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
-        this._addBreakpointToSource(breakpoint);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        this.breakpoints.remove(breakpoint);
-        breakpoint.removeEventListener("enabled", null, this);
-        breakpoint.removeEventListener("disabled", null, this);
-        this._removeBreakpointFromSource(breakpoint);
-    },
-
-    addMessage: function(msg)
-    {
-        // Don't add the message if there is no message or valid line or if the msg isn't an error or warning.
-        if (!msg.message || msg.line <= 0 || !msg.isErrorOrWarning())
-            return;
-        this.messages.push(msg);
-        this._addMessageToSource(msg);
-    },
-
-    clearMessages: function()
-    {
-        this.messages = [];
-
-        if (!this.element.contentDocument)
-            return;
-
-        var bubbles = this.element.contentDocument.querySelectorAll(".webkit-html-message-bubble");
-        if (!bubbles)
-            return;
-
-        for (var i = 0; i < bubbles.length; ++i) {
-            var bubble = bubbles[i];
-            bubble.parentNode.removeChild(bubble);
-        }
-    },
-
-    sizeToFitContentHeight: function()
-    {
-        if (this.element.contentDocument) {
-            this.element.style.setProperty("height", this.element.contentDocument.body.offsetHeight + "px");
-            this.element.contentDocument.body.addStyleClass("webkit-height-sized-to-fit");
-        }
-    },
-
-    _highlightLineEnds: function(event)
-    {
-        event.target.parentNode.removeStyleClass("webkit-highlighted-line");
-    },
-
-    highlightLine: function(lineNumber)
-    {
-        if (!this._isContentLoaded()) {
-            this._lineNumberToHighlight = lineNumber;
-            return;
-        }
-
-        var sourceRow = this.sourceRow(lineNumber);
-        if (!sourceRow)
-            return;
-        var line = sourceRow.getElementsByClassName('webkit-line-content')[0];
-        // Trick to reset the animation if the user clicks on the same link
-        // Using a timeout to avoid coalesced style updates
-        line.style.setProperty("-webkit-animation-name", "none");
-        setTimeout(function () {
-            line.style.removeProperty("-webkit-animation-name");
-            sourceRow.addStyleClass("webkit-highlighted-line");
-        }, 0);
-    },
-
-    _loaded: function()
-    {
-        WebInspector.addMainEventListeners(this.element.contentDocument);
-        this.element.contentDocument.addEventListener("contextmenu", this._documentContextMenu.bind(this), true);
-        this.element.contentDocument.addEventListener("mousedown", this._documentMouseDown.bind(this), true);
-        this.element.contentDocument.addEventListener("keydown", this._documentKeyDown.bind(this), true);
-        this.element.contentDocument.addEventListener("webkitAnimationEnd", this._highlightLineEnds.bind(this), false);
-
-        // Register 'eval' shortcut.
-        var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-        var shortcut = WebInspector.KeyboardShortcut.makeKey(69 /* 'E' */, platformSpecificModifier | WebInspector.KeyboardShortcut.Modifiers.Shift);
-        this._shortcuts[shortcut] = this._evalSelectionInCallFrame.bind(this);
-
-        var headElement = this.element.contentDocument.head;
-        if (!headElement) {
-            headElement = this.element.contentDocument.createElement("head");
-            this.element.contentDocument.documentElement.insertBefore(headElement, this.element.contentDocument.documentElement.firstChild);
-        }
-        
-        var linkElement = this.element.contentDocument.createElement("link");
-        linkElement.type = "text/css";
-        linkElement.rel = "stylesheet";
-        linkElement.href = "inspectorSyntaxHighlight.css";
-        headElement.appendChild(linkElement);
-
-        var styleElement = this.element.contentDocument.createElement("style");
-        headElement.appendChild(styleElement);
-
-        // Add these style rules here since they are specific to the Inspector. They also behave oddly and not
-        // all properties apply if added to view-source.css (because it is a user agent sheet.)
-        var styleText = ".webkit-line-number { background-repeat: no-repeat; background-position: right 1px; }\n";
-        styleText += ".webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(program-counter); }\n";
-
-        styleText += ".webkit-breakpoint .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint); }\n";
-        styleText += ".webkit-breakpoint-disabled .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-disabled); }\n";
-        styleText += ".webkit-breakpoint.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-program-counter); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-disabled-program-counter); }\n";
-
-        styleText += ".webkit-breakpoint.webkit-breakpoint-conditional .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-conditional); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-breakpoint-conditional .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-disabled-conditional); }\n";
-        styleText += ".webkit-breakpoint.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-conditional-program-counter); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-disabled-conditional-program-counter); }\n";
-
-        styleText += ".webkit-execution-line .webkit-line-content { background-color: rgb(171, 191, 254); outline: 1px solid rgb(64, 115, 244); }\n";
-        styleText += ".webkit-height-sized-to-fit { overflow-y: hidden }\n";
-        styleText += ".webkit-line-content { background-color: white; }\n";
-        styleText += "@-webkit-keyframes fadeout {from {background-color: rgb(255, 255, 120);} to { background-color: white;}}\n";
-        styleText += ".webkit-highlighted-line .webkit-line-content { background-color: rgb(255, 255, 120); -webkit-animation: 'fadeout' 2s 500ms}\n";
-
-        // TODO: Move these styles into inspector.css once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed and popup moved into the top frame.
-        styleText += ".popup-content { position: absolute; z-index: 10000; padding: 4px; background-color: rgb(203, 226, 255); -webkit-border-radius: 7px; border: 2px solid rgb(169, 172, 203); }";
-        styleText += ".popup-glasspane { position: absolute; top: 0; left: 0; height: 100%; width: 100%; opacity: 0; z-index: 9900; }";
-        styleText += ".popup-message { background-color: transparent; font-family: Lucida Grande, sans-serif; font-weight: normal; font-size: 11px; text-align: left; text-shadow: none; color: rgb(85, 85, 85); cursor: default; margin: 0 0 2px 0; }";
-        styleText += ".popup-content.breakpoint-condition { width: 90%; }";
-        styleText += ".popup-content input#bp-condition { font-family: monospace; margin: 0; border: 1px inset rgb(190, 190, 190) !important; width: 100%; box-shadow: none !important; outline: none !important; -webkit-user-modify: read-write; }";
-        // This class is already in inspector.css
-        styleText += ".hidden { display: none !important; }";
-
-        styleElement.textContent = styleText;
-
-        this._needsProgramCounterImage = true;
-        this._needsBreakpointImages = true;
-
-        this.element.contentWindow.Element.prototype.addStyleClass = Element.prototype.addStyleClass;
-        this.element.contentWindow.Element.prototype.removeStyleClass = Element.prototype.removeStyleClass;
-        this.element.contentWindow.Element.prototype.removeChildren = Element.prototype.removeChildren;
-        this.element.contentWindow.Element.prototype.positionAt = Element.prototype.positionAt;
-        this.element.contentWindow.Element.prototype.removeMatchingStyleClasses = Element.prototype.removeMatchingStyleClasses;
-        this.element.contentWindow.Element.prototype.hasStyleClass = Element.prototype.hasStyleClass;
-        this.element.contentWindow.Element.prototype.pageOffsetRelativeToWindow = Element.prototype.pageOffsetRelativeToWindow;
-        this.element.contentWindow.Element.prototype.__defineGetter__("totalOffsetLeft", Element.prototype.__lookupGetter__("totalOffsetLeft"));
-        this.element.contentWindow.Element.prototype.__defineGetter__("totalOffsetTop", Element.prototype.__lookupGetter__("totalOffsetTop"));
-        this.element.contentWindow.Node.prototype.enclosingNodeOrSelfWithNodeName = Node.prototype.enclosingNodeOrSelfWithNodeName;
-        this.element.contentWindow.Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = Node.prototype.enclosingNodeOrSelfWithNodeNameInArray;
-
-        this._addExistingMessagesToSource();
-        this._addExistingBreakpointsToSource();
-        this._updateExecutionLine();
-        if (this._executionLine)
-            this.revealLine(this._executionLine);
-
-        if (this.autoSizesToFitContentHeight)
-            this.sizeToFitContentHeight();
-
-        if (this._lineNumberToReveal) {
-            this.revealLine(this._lineNumberToReveal);
-            delete this._lineNumberToReveal;
-        }
-
-        if (this._lineNumberToHighlight) {
-            this.highlightLine(this._lineNumberToHighlight);
-            delete this._lineNumberToHighlight;
-        }
-
-        this.dispatchEventToListeners("content loaded");
-    },
-
-    _isContentLoaded: function() {
-        var doc = this.element.contentDocument;
-        return doc && doc.getElementsByTagName("table")[0];
-    },
-
-    _windowResized: function(event)
-    {
-        if (!this._autoSizesToFitContentHeight)
-            return;
-        this.sizeToFitContentHeight();
-    },
-
-    _documentContextMenu: function(event)
-    {
-        if (!event.target.hasStyleClass("webkit-line-number"))
-            return;
-        var sourceRow = event.target.enclosingNodeOrSelfWithNodeName("tr");
-        if (!sourceRow._breakpointObject && this.addBreakpointDelegate)
-            this.addBreakpointDelegate(this.lineNumberForSourceRow(sourceRow));
-
-        var breakpoint = sourceRow._breakpointObject;
-        if (!breakpoint)
-            return;
-
-        this._editBreakpointCondition(event.target, sourceRow, breakpoint);
-        event.preventDefault();
-    },
-
-    _documentMouseDown: function(event)
-    {
-        if (!event.target.hasStyleClass("webkit-line-number"))
-            return;
-        if (event.button != 0 || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
-            return;
-        var sourceRow = event.target.enclosingNodeOrSelfWithNodeName("tr");
-        if (sourceRow._breakpointObject && sourceRow._breakpointObject.enabled)
-            sourceRow._breakpointObject.enabled = false;
-        else if (sourceRow._breakpointObject)
-            WebInspector.panels.scripts.removeBreakpoint(sourceRow._breakpointObject);
-        else if (this.addBreakpointDelegate)
-            this.addBreakpointDelegate(this.lineNumberForSourceRow(sourceRow));
-
-        event.preventDefault();
-    },
-
-    _editBreakpointCondition: function(eventTarget, sourceRow, breakpoint)
-    {
-        // TODO: Migrate the popup to the top-level document and remove the blur listener from conditionElement once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed.
-        var popupDocument = this.element.contentDocument;
-        this._showBreakpointConditionPopup(eventTarget, breakpoint.line, popupDocument);
-
-        function committed(element, newText)
-        {
-            breakpoint.condition = newText;
-            if (breakpoint.condition)
-                sourceRow.addStyleClass("webkit-breakpoint-conditional");
-            else
-                sourceRow.removeStyleClass("webkit-breakpoint-conditional");
-            dismissed.call(this);
-        }
-
-        function dismissed()
-        {
-            this._popup.hide();
-            delete this._conditionEditorElement;
-        }
-
-        var dismissedHandler = dismissed.bind(this);
-        this._conditionEditorElement.addEventListener("blur", dismissedHandler, false);
-
-        WebInspector.startEditing(this._conditionEditorElement, committed.bind(this), dismissedHandler);
-        this._conditionEditorElement.value = breakpoint.condition;
-        this._conditionEditorElement.select();
-    },
-
-    _showBreakpointConditionPopup: function(clickedElement, lineNumber, popupDocument)
-    {
-        var popupContentElement = this._createPopupElement(lineNumber, popupDocument);
-        var lineElement = clickedElement.enclosingNodeOrSelfWithNodeName("td").nextSibling;
-        if (this._popup) {
-            this._popup.hide();
-            this._popup.element = popupContentElement;
-        } else {
-            this._popup = new WebInspector.Popup(popupContentElement);
-            this._popup.autoHide = true;
-        }
-        this._popup.anchor = lineElement;
-        this._popup.show();
-    },
-
-    _createPopupElement: function(lineNumber, popupDocument)
-    {
-        var popupContentElement = popupDocument.createElement("div");
-        popupContentElement.className = "popup-content breakpoint-condition";
-
-        var labelElement = document.createElement("label");
-        labelElement.className = "popup-message";
-        labelElement.htmlFor = "bp-condition";
-        labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:", lineNumber)));
-        popupContentElement.appendChild(labelElement);
-
-        var editorElement = document.createElement("input");
-        editorElement.id = "bp-condition";
-        editorElement.type = "text"
-        popupContentElement.appendChild(editorElement);
-        this._conditionEditorElement = editorElement;
-
-        return popupContentElement;
-    },
-
-    _documentKeyDown: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.preventDefault();
-        } else {
-            WebInspector.documentKeyDown(event);
-        }
-    },
-
-    _evalSelectionInCallFrame: function(event)
-    {
-        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
-            return;
-
-        var selection = this.element.contentWindow.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var expression = selection.getRangeAt(0).toString().trimWhitespace();
-        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result, exception) {
-            WebInspector.showConsole();
-            var commandMessage = new WebInspector.ConsoleCommand(expression);
-            WebInspector.console.addMessage(commandMessage);
-            WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
-        });
-    },
-
-    _breakpointEnableChanged: function(event)
-    {
-        var breakpoint = event.target;
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        sourceRow.addStyleClass("webkit-breakpoint");
-
-        if (breakpoint.enabled)
-            sourceRow.removeStyleClass("webkit-breakpoint-disabled");
-        else
-            sourceRow.addStyleClass("webkit-breakpoint-disabled");
-    },
-
-    _updateExecutionLine: function(previousLine)
-    {
-        if (previousLine) {
-            var sourceRow = this.sourceRow(previousLine);
-            if (sourceRow)
-                sourceRow.removeStyleClass("webkit-execution-line");
-        }
-
-        if (!this._executionLine)
-            return;
-
-        this._drawProgramCounterImageIfNeeded();
-
-        var sourceRow = this.sourceRow(this._executionLine);
-        if (sourceRow)
-            sourceRow.addStyleClass("webkit-execution-line");
-    },
-
-    _addExistingBreakpointsToSource: function()
-    {
-        var length = this.breakpoints.length;
-        for (var i = 0; i < length; ++i)
-            this._addBreakpointToSource(this.breakpoints[i]);
-    },
-
-    _addBreakpointToSource: function(breakpoint)
-    {
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        breakpoint.sourceText = sourceRow.getElementsByClassName('webkit-line-content')[0].textContent;
-
-        this._drawBreakpointImagesIfNeeded();
-
-        sourceRow._breakpointObject = breakpoint;
-
-        sourceRow.addStyleClass("webkit-breakpoint");
-        if (!breakpoint.enabled)
-            sourceRow.addStyleClass("webkit-breakpoint-disabled");
-        if (breakpoint.condition)
-            sourceRow.addStyleClass("webkit-breakpoint-conditional");
-    },
-
-    _removeBreakpointFromSource: function(breakpoint)
-    {
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        delete sourceRow._breakpointObject;
-
-        sourceRow.removeStyleClass("webkit-breakpoint");
-        sourceRow.removeStyleClass("webkit-breakpoint-disabled");
-        sourceRow.removeStyleClass("webkit-breakpoint-conditional");
-    },
-
-    _incrementMessageRepeatCount: function(msg, repeatDelta)
-    {
-        if (!msg._resourceMessageLineElement)
-            return;
-
-        if (!msg._resourceMessageRepeatCountElement) {
-            var repeatedElement = document.createElement("span");
-            msg._resourceMessageLineElement.appendChild(repeatedElement);
-            msg._resourceMessageRepeatCountElement = repeatedElement;
-        }
-
-        msg.repeatCount += repeatDelta;
-        msg._resourceMessageRepeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", msg.repeatCount);
-    },
-
-    _addExistingMessagesToSource: function()
-    {
-        var length = this.messages.length;
-        for (var i = 0; i < length; ++i)
-            this._addMessageToSource(this.messages[i]);
-    },
-
-    _addMessageToSource: function(msg)
-    {
-        var row = this.sourceRow(msg.line);
-        if (!row)
-            return;
-
-        var cell = row.cells[1];
-        if (!cell)
-            return;
-
-        var messageBubbleElement = cell.lastChild;
-        if (!messageBubbleElement || messageBubbleElement.nodeType !== Node.ELEMENT_NODE || !messageBubbleElement.hasStyleClass("webkit-html-message-bubble")) {
-            messageBubbleElement = this.element.contentDocument.createElement("div");
-            messageBubbleElement.className = "webkit-html-message-bubble";
-            cell.appendChild(messageBubbleElement);
-        }
-
-        if (!row.messages)
-            row.messages = [];
-
-        for (var i = 0; i < row.messages.length; ++i) {
-            if (row.messages[i].isEqual(msg, true)) {
-                this._incrementMessageRepeatCount(row.messages[i], msg.repeatDelta);
-                return;
-            }
-        }
-
-        row.messages.push(msg);
-
-        var imageURL;
-        switch (msg.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                messageBubbleElement.addStyleClass("webkit-html-error-message");
-                imageURL = "Images/errorIcon.png";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                messageBubbleElement.addStyleClass("webkit-html-warning-message");
-                imageURL = "Images/warningIcon.png";
-                break;
-        }
-
-        var messageLineElement = this.element.contentDocument.createElement("div");
-        messageLineElement.className = "webkit-html-message-line";
-        messageBubbleElement.appendChild(messageLineElement);
-
-        // Create the image element in the Inspector's document so we can use relative image URLs.
-        var image = document.createElement("img");
-        image.src = imageURL;
-        image.className = "webkit-html-message-icon";
-
-        // Adopt the image element since it wasn't created in element's contentDocument.
-        image = this.element.contentDocument.adoptNode(image);
-        messageLineElement.appendChild(image);
-        messageLineElement.appendChild(this.element.contentDocument.createTextNode(msg.message));
-
-        msg._resourceMessageLineElement = messageLineElement;
-    },
-
-    _drawProgramCounterInContext: function(ctx, glow)
-    {
-        if (glow)
-            ctx.save();
-
-        ctx.beginPath();
-        ctx.moveTo(17, 2);
-        ctx.lineTo(19, 2);
-        ctx.lineTo(19, 0);
-        ctx.lineTo(21, 0);
-        ctx.lineTo(26, 5.5);
-        ctx.lineTo(21, 11);
-        ctx.lineTo(19, 11);
-        ctx.lineTo(19, 9);
-        ctx.lineTo(17, 9);
-        ctx.closePath();
-        ctx.fillStyle = "rgb(142, 5, 4)";
-
-        if (glow) {
-            ctx.shadowBlur = 4;
-            ctx.shadowColor = "rgb(255, 255, 255)";
-            ctx.shadowOffsetX = -1;
-            ctx.shadowOffsetY = 0;
-        }
-
-        ctx.fill();
-        ctx.fill(); // Fill twice to get a good shadow and darker anti-aliased pixels.
-
-        if (glow)
-            ctx.restore();
-    },
-
-    _drawProgramCounterImageIfNeeded: function()
-    {
-        if (!this._needsProgramCounterImage || !this.element.contentDocument)
-            return;
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        delete this._needsProgramCounterImage;
-    },
-
-    _drawBreakpointImagesIfNeeded: function(conditional)
-    {
-        if (!this._needsBreakpointImages || !this.element.contentDocument)
-            return;
-
-        function drawBreakpoint(ctx, disabled, conditional)
-        {
-            ctx.beginPath();
-            ctx.moveTo(0, 2);
-            ctx.lineTo(2, 0);
-            ctx.lineTo(21, 0);
-            ctx.lineTo(26, 5.5);
-            ctx.lineTo(21, 11);
-            ctx.lineTo(2, 11);
-            ctx.lineTo(0, 9);
-            ctx.closePath();
-            ctx.fillStyle = conditional ? "rgb(217, 142, 1)" : "rgb(1, 142, 217)";
-            ctx.strokeStyle = conditional ? "rgb(205, 103, 0)" : "rgb(0, 103, 205)";
-            ctx.lineWidth = 3;
-            ctx.fill();
-            ctx.save();
-            ctx.clip();
-            ctx.stroke();
-            ctx.restore();
-
-            if (!disabled)
-                return;
-
-            ctx.save();
-            ctx.globalCompositeOperation = "destination-out";
-            ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
-            ctx.fillRect(0, 0, 26, 11);
-            ctx.restore();
-        }
-
-
-        // Unconditional breakpoints.
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-
-        // Conditional breakpoints.
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-conditional", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, false, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-conditional-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, false, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-conditional", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-conditional-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        delete this._needsBreakpointImages;
-    },
-
-    syntaxHighlightJavascript: function()
-    {
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var jsSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(table, this);
-        jsSyntaxHighlighter.process();
-    },
-
-    syntaxHighlightCSS: function()
-    {
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighlighter(table, this);
-        cssSyntaxHighlighter.process();
-    }
-}
-
-WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceSyntaxHighlighter = function(table, sourceFrame)
-{
-    this.table = table;
-    this.sourceFrame = sourceFrame;
-}
-
-WebInspector.SourceSyntaxHighlighter.prototype = {
-    createSpan: function(content, className)
-    {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(content));
-        return span;
-    },
-
-    process: function()
-    {
-        // Split up the work into chunks so we don't block the
-        // UI thread while processing.
-
-        var rows = this.table.rows;
-        var rowsLength = rows.length;
-        const tokensPerChunk = 100;
-        const lineLengthLimit = 20000;
-        
-        var boundProcessChunk = processChunk.bind(this);
-        var processChunkInterval = setInterval(boundProcessChunk, 25);
-        boundProcessChunk();
-        
-        function processChunk()
-        {
-            for (var i = 0; i < tokensPerChunk; i++) {
-                if (this.cursor >= this.lineCode.length)
-                    moveToNextLine.call(this);
-                if (this.lineIndex >= rowsLength) {
-                    this.sourceFrame.dispatchEventToListeners("syntax highlighting complete");
-                    return;
-                }
-                if (this.cursor > lineLengthLimit) {
-                    var codeFragment = this.lineCode.substring(this.cursor);
-                    this.nonToken += codeFragment;
-                    this.cursor += codeFragment.length;
-                }
-
-                this.lex();
-            }
-        }
-        
-        function moveToNextLine()
-        {
-            this.appendNonToken();
-            
-            var row = rows[this.lineIndex];
-            var line = row ? row.cells[1] : null;
-            if (line && this.newLine) {
-                line.removeChildren();
-                
-                if (this.messageBubble)
-                    this.newLine.appendChild(this.messageBubble);
-                
-                line.parentNode.insertBefore(this.newLine, line);
-                line.parentNode.removeChild(line);
-                
-                this.newLine = null;
-            }
-            this.lineIndex++;
-            if (this.lineIndex >= rowsLength && processChunkInterval) {
-                clearInterval(processChunkInterval);
-                this.sourceFrame.dispatchEventToListeners("syntax highlighting complete");
-                return;
-            }
-            row = rows[this.lineIndex];
-            line = row ? row.cells[1] : null;
-            
-            this.messageBubble = null;
-            if (line.lastChild && line.lastChild.nodeType === Node.ELEMENT_NODE && line.lastChild.hasStyleClass("webkit-html-message-bubble")) {
-                this.messageBubble = line.lastChild;
-                line.removeChild(this.messageBubble);
-            }
-
-            this.lineCode = line.textContent;
-            this.newLine = line.cloneNode(false);
-            this.cursor = 0;
-            if (!line)
-                moveToNextLine();
-        }
-    },
-    
-    lex: function()
-    {
-        var token = null;
-        var codeFragment = this.lineCode.substring(this.cursor);
-        
-        for (var i = 0; i < this.rules.length; i++) {
-            var rule = this.rules[i];
-            var ruleContinueStateCondition = ("preContinueState" in rule) ? rule.preContinueState : this.ContinueState.None;
-            if (this.continueState !== ruleContinueStateCondition)
-                continue;
-            if (("preLexState" in rule) && this.lexState !== rule.preLexState)
-                continue;
-
-            var match = rule.pattern.exec(codeFragment);
-            if (match) {
-                token = match[0];
-                if (token && (!rule.keywords || (token in rule.keywords))) {
-                    this.cursor += token.length;
-                    if (rule.style) {
-                        this.appendNonToken();
-                        var elem = this.createSpan(token, rule.style);
-                        this.newLine.appendChild(elem);
-                        if (rule.callback)
-                            rule.callback.call(this, elem);
-                    } else
-                        this.nonToken += token;
-
-                    if ("postLexState" in rule)
-                        this.lexState = rule.postLexState;
-                    if ("postContinueState" in rule)
-                        this.continueState = rule.postContinueState;
-                    return;
-                }
-            }
-        }
-        this.nonToken += codeFragment[0];
-        this.cursor++;
-    },
-    
-    appendNonToken: function ()
-    {
-        if (this.nonToken.length > 0) {
-            this.newLine.appendChild(document.createTextNode(this.nonToken));
-            this.nonToken = "";
-        }
-    },
-    
-    syntaxHighlightNode: function(node)
-    {
-        this.lineCode = node.textContent;
-        node.removeChildren();
-        this.newLine = node;
-        this.cursor = 0;
-        while (true) {
-            if (this.cursor >= this.lineCode.length) {
-                var codeFragment = this.lineCode.substring(this.cursor);
-                this.nonToken += codeFragment;
-                this.cursor += codeFragment.length;
-                this.appendNonToken();
-                this.newLine = null;
-                return;
-            }
-
-            this.lex();
-        }
-    }
-}
-
-/* CSSSourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CSSSourceSyntaxHighlighter = function(table, sourceFrame) {
-    WebInspector.SourceSyntaxHighlighter.call(this, table, sourceFrame);
-
-    this.LexState = {
-        Initial: 1,
-        DeclarationProperty: 2,
-        DeclarationValue: 3,
-        AtMedia: 4,
-        AtRule: 5,
-        AtKeyframes: 6
-    };
-    this.ContinueState = {
-        None: 0,
-        Comment: 1
-    };
-    
-    this.nonToken = "";
-    this.cursor = 0;
-    this.lineIndex = -1;
-    this.lineCode = "";
-    this.newLine = null;
-    this.lexState = this.LexState.Initial;
-    this.continueState = this.ContinueState.None;
-    
-    const urlPattern = /^url\(\s*(?:(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*')|(?:[!#$%&*-~\w]|(?:\\[\da-f]{1,6}\s?|\.))*)\s*\)/i;
-    const stringPattern = /^(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*')/i;
-    const identPattern = /^-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*/i;
-    const startBlockPattern = /^{/i;
-    const endBlockPattern = /^}/i;
-
-    const propertyKeywords = [
-        "background", "background-attachment", "background-clip", "background-color", "background-image",
-        "background-origin", "background-position", "background-position-x", "background-position-y",
-        "background-repeat", "background-repeat-x", "background-repeat-y", "background-size", "border",
-        "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius",
-        "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-left",
-        "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right",
-        "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style",
-        "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style",
-        "border-top-width", "border-width", "bottom", "caption-side", "clear", "clip", "color", "content",
-        "counter-increment", "counter-reset", "cursor", "direction", "display", "empty-cells", "float",
-        "font", "font-family", "font-size", "font-stretch", "font-style", "font-variant", "font-weight",
-        "height", "left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position",
-        "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "max-height",
-        "max-width", "min-height", "min-width", "opacity", "orphans", "outline", "outline-color", "outline-offset",
-        "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y", "padding", "padding-bottom",
-        "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before",
-        "page-break-inside", "pointer-events", "position", "quotes", "resize", "right", "size", "src",
-        "table-layout", "text-align", "text-decoration", "text-indent", "text-line-through", "text-line-through-color",
-        "text-line-through-mode", "text-line-through-style", "text-line-through-width", "text-overflow", "text-overline",
-        "text-overline-color", "text-overline-mode", "text-overline-style", "text-overline-width", "text-rendering",
-        "text-shadow", "text-transform", "text-underline", "text-underline-color", "text-underline-mode",
-        "text-underline-style", "text-underline-width", "top", "unicode-bidi", "unicode-range", "vertical-align",
-        "visibility", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "zoom",
-        "-webkit-animation", "-webkit-animation-delay", "-webkit-animation-direction", "-webkit-animation-duration",
-        "-webkit-animation-iteration-count", "-webkit-animation-name", "-webkit-animation-play-state",
-        "-webkit-animation-timing-function", "-webkit-appearance", "-webkit-backface-visibility",
-        "-webkit-background-clip", "-webkit-background-composite", "-webkit-background-origin", "-webkit-background-size",
-        "-webkit-binding", "-webkit-border-fit", "-webkit-border-horizontal-spacing", "-webkit-border-image",
-        "-webkit-border-radius", "-webkit-border-vertical-spacing", "-webkit-box-align", "-webkit-box-direction",
-        "-webkit-box-flex", "-webkit-box-flex-group", "-webkit-box-lines", "-webkit-box-ordinal-group",
-        "-webkit-box-orient", "-webkit-box-pack", "-webkit-box-reflect", "-webkit-box-shadow", "-webkit-box-sizing",
-        "-webkit-column-break-after", "-webkit-column-break-before", "-webkit-column-break-inside", "-webkit-column-count",
-        "-webkit-column-gap", "-webkit-column-rule", "-webkit-column-rule-color", "-webkit-column-rule-style",
-        "-webkit-column-rule-width", "-webkit-column-width", "-webkit-columns", "-webkit-font-size-delta",
-        "-webkit-font-smoothing", "-webkit-highlight", "-webkit-line-break", "-webkit-line-clamp",
-        "-webkit-margin-bottom-collapse", "-webkit-margin-collapse", "-webkit-margin-start", "-webkit-margin-top-collapse",
-        "-webkit-marquee", "-webkit-marquee-direction", "-webkit-marquee-increment", "-webkit-marquee-repetition",
-        "-webkit-marquee-speed", "-webkit-marquee-style", "-webkit-mask", "-webkit-mask-attachment",
-        "-webkit-mask-box-image", "-webkit-mask-clip", "-webkit-mask-composite", "-webkit-mask-image",
-        "-webkit-mask-origin", "-webkit-mask-position", "-webkit-mask-position-x", "-webkit-mask-position-y",
-        "-webkit-mask-repeat", "-webkit-mask-repeat-x", "-webkit-mask-repeat-y", "-webkit-mask-size",
-        "-webkit-match-nearest-mail-blockquote-color", "-webkit-nbsp-mode", "-webkit-padding-start",
-        "-webkit-perspective", "-webkit-perspective-origin", "-webkit-perspective-origin-x", "-webkit-perspective-origin-y",
-        "-webkit-rtl-ordering", "-webkit-text-decorations-in-effect", "-webkit-text-fill-color", "-webkit-text-security",
-        "-webkit-text-size-adjust", "-webkit-text-stroke", "-webkit-text-stroke-color", "-webkit-text-stroke-width",
-        "-webkit-transform", "-webkit-transform-origin", "-webkit-transform-origin-x", "-webkit-transform-origin-y",
-        "-webkit-transform-origin-z", "-webkit-transform-style", "-webkit-transition", "-webkit-transition-delay",
-        "-webkit-transition-duration", "-webkit-transition-property", "-webkit-transition-timing-function",
-        "-webkit-user-drag", "-webkit-user-modify", "-webkit-user-select", "-webkit-variable-declaration-block"
-    ].keySet();
-    
-    const valueKeywords = [
-        "inherit", "initial", "none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed",
-        "solid", "double", "caption", "icon", "menu", "message-box", "small-caption", "-webkit-mini-control",
-        "-webkit-small-control", "-webkit-control", "status-bar", "italic", "oblique", "all", "small-caps",
-        "normal", "bold", "bolder", "lighter", "xx-small", "x-small", "small", "medium", "large", "x-large",
-        "xx-large", "-webkit-xxx-large", "smaller", "larger", "wider", "narrower", "ultra-condensed",
-        "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded",
-        "ultra-expanded", "serif", "sans-serif", "cursive", "fantasy", "monospace", "-webkit-body", "aqua",
-        "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "orange", "purple",
-        "red", "silver", "teal", "white", "yellow", "transparent", "-webkit-link", "-webkit-activelink",
-        "activeborder", "activecaption", "appworkspace", "background", "buttonface", "buttonhighlight",
-        "buttonshadow", "buttontext", "captiontext", "graytext", "highlight", "highlighttext", "inactiveborder",
-        "inactivecaption", "inactivecaptiontext", "infobackground", "infotext", "match", "menutext", "scrollbar",
-        "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "window",
-        "windowframe", "windowtext", "-webkit-focus-ring-color", "currentcolor", "grey", "-webkit-text", "repeat",
-        "repeat-x", "repeat-y", "no-repeat", "clear", "copy", "source-over", "source-in", "source-out",
-        "source-atop", "destination-over", "destination-in", "destination-out", "destination-atop", "xor",
-        "plus-darker", "plus-lighter", "baseline", "middle", "sub", "super", "text-top", "text-bottom", "top",
-        "bottom", "-webkit-baseline-middle", "-webkit-auto", "left", "right", "center", "justify", "-webkit-left",
-        "-webkit-right", "-webkit-center", "outside", "inside", "disc", "circle", "square", "decimal",
-        "decimal-leading-zero", "lower-roman", "upper-roman", "lower-greek", "lower-alpha", "lower-latin",
-        "upper-alpha", "upper-latin", "hebrew", "armenian", "georgian", "cjk-ideographic", "hiragana", "katakana",
-        "hiragana-iroha", "katakana-iroha", "inline", "block", "list-item", "run-in", "compact", "inline-block",
-        "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row",
-        "table-column-group", "table-column", "table-cell", "table-caption", "-webkit-box", "-webkit-inline-box",
-        "-wap-marquee", "auto", "crosshair", "default", "pointer", "move", "vertical-text", "cell", "context-menu",
-        "alias", "progress", "no-drop", "not-allowed", "-webkit-zoom-in", "-webkit-zoom-out", "e-resize", "ne-resize",
-        "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "ew-resize", "ns-resize", "nesw-resize",
-        "nwse-resize", "col-resize", "row-resize", "text", "wait", "help", "all-scroll", "-webkit-grab", "-webkit-grabbing",
-        "ltr", "rtl", "capitalize", "uppercase", "lowercase", "visible", "collapse", "above", "absolute", "always",
-        "avoid", "below", "bidi-override", "blink", "both", "close-quote", "crop", "cross", "embed", "fixed", "hand",
-        "hide", "higher", "invert", "landscape", "level", "line-through", "local", "loud", "lower", "-webkit-marquee",
-        "mix", "no-close-quote", "no-open-quote", "nowrap", "open-quote", "overlay", "overline", "portrait", "pre",
-        "pre-line", "pre-wrap", "relative", "scroll", "separate", "show", "static", "thick", "thin", "underline",
-        "-webkit-nowrap", "stretch", "start", "end", "reverse", "horizontal", "vertical", "inline-axis", "block-axis",
-        "single", "multiple", "forwards", "backwards", "ahead", "up", "down", "slow", "fast", "infinite", "slide",
-        "alternate", "read-only", "read-write", "read-write-plaintext-only", "element", "ignore", "intrinsic",
-        "min-intrinsic", "clip", "ellipsis", "discard", "dot-dash", "dot-dot-dash", "wave", "continuous",
-        "skip-white-space", "break-all", "break-word", "space", "after-white-space", "checkbox", "radio", "push-button",
-        "square-button", "button", "button-bevel", "default-button", "list-button", "listbox", "listitem", 
-        "media-fullscreen-button", "media-mute-button", "media-play-button", "media-seek-back-button",
-        "media-seek-forward-button", "media-rewind-button", "media-return-to-realtime-button", "media-slider",
-        "media-sliderthumb", "media-volume-slider-container", "media-volume-slider", "media-volume-sliderthumb",
-        "media-controls-background", "media-current-time-display", "media-time-remaining-display", "menulist",
-        "menulist-button", "menulist-text", "menulist-textfield", "slider-horizontal", "slider-vertical",
-        "sliderthumb-horizontal", "sliderthumb-vertical", "caret", "searchfield", "searchfield-decoration", 
-        "searchfield-results-decoration", "searchfield-results-button", "searchfield-cancel-button", "textfield",
-        "textarea", "caps-lock-indicator", "round", "border", "border-box", "content", "content-box", "padding",
-        "padding-box", "contain", "cover", "logical", "visual", "lines", "running", "paused", "flat", "preserve-3d",
-        "ease", "linear", "ease-in", "ease-out", "ease-in-out", "document", "reset", "visiblePainted", "visibleFill",
-        "visibleStroke", "painted", "fill", "stroke", "antialiased", "subpixel-antialiased", "optimizeSpeed",
-        "optimizeLegibility", "geometricPrecision"
-    ].keySet();
-
-    const mediaTypes = ["all", "aural", "braille", "embossed", "handheld", "print", "projection", "screen", "tty", "tv"].keySet();
-
-    this.rules = [{
-        name: "commentAction",
-        pattern: /^\/\*[^\*]*\*+([^\/*][^*]*\*+)*\//i,
-        style: "webkit-css-comment"
-    }, {
-        name: "commentStartAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*)/i,
-        style: "webkit-css-comment",
-        postContinueState: this.ContinueState.Comment
-    }, {
-        name: "commentEndAction",
-        pattern: /^(?:(?:[^\*]|\*[^\/])*\*+\/)/i,
-        style: "webkit-css-comment",
-        preContinueState: this.ContinueState.Comment,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "commentMiddleAction",
-        pattern: /^.*/i,
-        style: "webkit-css-comment",
-        preContinueState: this.ContinueState.Comment
-    }, {
-        name: "selectorAction",
-        pattern: /^(?:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\*)(?:#-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\.-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\[\s*-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*(?:(?:=|~=|\|=)\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*'))\s*)?\]|:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\(\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*)?\)))*|(?:#-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\.-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\[\s*-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*(?:(?:=|~=|\|=)\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*'))\s*)?\]|:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\(\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*)?\)))+)/i,
-        style: "webkit-css-selector",
-        preLexState: this.LexState.Initial
-    }, {
-        name: "startRulesetBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.DeclarationProperty
-    }, {
-        name: "propertyAction",
-        pattern: identPattern,
-        style: "webkit-css-property",
-        keywords: propertyKeywords,
-        preLexState: this.LexState.DeclarationProperty,
-    }, {
-        name: "declarationColonAction",
-        pattern: /^:/i,
-        preLexState: this.LexState.DeclarationProperty,
-        postLexState: this.LexState.DeclarationValue
-    }, {
-        name: "colorAction",
-        pattern: /^(?:#(?:[\da-f]{6}|[\da-f]{3})|rgba\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|hsla\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|rgb\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|hsl\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\))/i,
-        style: "webkit-css-color",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "numvalueAction",
-        pattern: /^(?:-?(?:\d+|\d*\.\d+)(?:em|rem|__qem|ex|px|cm|mm|in|pt|pc|deg|rad|grad|turn|ms|s|Hz|kHz|%)?)/i,
-        style: "webkit-css-number",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "urlAction",
-        pattern: urlPattern,
-        style: "webkit-css-url",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "importantAction",
-        pattern: /^!\s*important/i,
-        style: "webkit-css-important",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "valueIdentAction",
-        pattern: identPattern,
-        keywords: valueKeywords,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "declarationSemicolonAction",
-        pattern: /^;/i,
-        preLexState: this.LexState.DeclarationValue,
-        postLexState: this.LexState.DeclarationProperty
-    }, {
-        name: "endRulesetBlockAction",
-        pattern: endBlockPattern,
-        preLexState: this.LexState.DeclarationProperty,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atMediaAction",
-        pattern: /^@media/i,
-        style: "webkit-css-at-rule",
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtMedia
-    }, {
-        name: "startAtMediaBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtMedia,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atKeyframesAction",
-        pattern: /^@-webkit-keyframes/i,
-        style: "webkit-css-at-rule",
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtKeyframes
-    }, {
-        name: "startAtKeyframesBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtKeyframes,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atRuleAction",
-        style: "webkit-css-at-rule",
-        pattern: /^@-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*/i,
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtRule
-    }, {
-        name: "endAtRuleAction",
-        pattern: /^;/i,
-        preLexState: this.LexState.AtRule,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "urlAction",
-        pattern: urlPattern,
-        style: "webkit-css-url",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.AtKeyframes
-    }, {
-        name: "atRuleIdentAction",
-        pattern: identPattern,
-        keywords: mediaTypes,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "atRuleIdentAction",
-        pattern: identPattern,
-        keywords: mediaTypes,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.AtMedia,
-    }, {
-        name: "startAtRuleBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtRule,
-        postLexState: this.LexState.DeclarationProperty
-    }];
-}
-
-WebInspector.CSSSourceSyntaxHighlighter.prototype.__proto__ = WebInspector.SourceSyntaxHighlighter.prototype;
-
-/* JavaScriptSourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.JavaScriptSourceSyntaxHighlighter = function(table, sourceFrame) {
-    WebInspector.SourceSyntaxHighlighter.call(this, table, sourceFrame);
-
-    this.LexState = {
-        Initial: 1,
-        DivisionAllowed: 2,
-    };
-    this.ContinueState = {
-        None: 0,
-        Comment: 1,
-        SingleQuoteString: 2,
-        DoubleQuoteString: 3,
-        RegExp: 4
-    };
-    
-    this.nonToken = "";
-    this.cursor = 0;
-    this.lineIndex = -1;
-    this.lineCode = "";
-    this.newLine = null;
-    this.lexState = this.LexState.Initial;
-    this.continueState = this.ContinueState.None;
-
-    const keywords = [
-        "null", "true", "false", "break", "case", "catch", "const", "default", "finally", "for",
-        "instanceof", "new", "var", "continue", "function", "return", "void", "delete", "if",
-        "this", "do", "while", "else", "in", "switch", "throw", "try", "typeof", "debugger",
-        "class", "enum", "export", "extends", "import", "super", "get", "set"
-    ].keySet();
-
-    this.rules = [{
-        name: "singleLineCommentAction",
-        pattern: /^(?:\/\/.*)/,
-        style: "webkit-javascript-comment"
-    }, {
-        name: "multiLineSingleLineCommentAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*\*+\/)/,
-        style: "webkit-javascript-comment"
-    }, {
-        name: "multiLineCommentStartAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*)/,
-        style: "webkit-javascript-comment",
-        postContinueState: this.ContinueState.Comment
-    }, {
-        name: "multiLineCommentEndAction",
-        pattern: /^(?:(?:[^\*]|\*[^\/])*\*+\/)/,
-        style: "webkit-javascript-comment",
-        preContinueState: this.ContinueState.Comment,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "multiLineCommentMiddleAction",
-        pattern: /^.*/,
-        style: "webkit-javascript-comment",
-        preContinueState: this.ContinueState.Comment
-    }, {
-        name: "numericLiteralAction",
-        pattern: /^(?:(?:0|[1-9]\d*)\.\d+?(?:[eE](?:\d+|\+\d+|-\d+))?|\.\d+(?:[eE](?:\d+|\+\d+|-\d+))?|(?:0|[1-9]\d*)(?:[eE](?:\d+|\+\d+|-\d+))?|0x[0-9a-fA-F]+|0X[0-9a-fA-F]+)/,
-        style: "webkit-javascript-number",
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "stringLiteralAction",
-        pattern: /^(?:"(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*"|'(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*')/,
-        style: "webkit-javascript-string",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "singleQuoteStringStartAction",
-        pattern: /^(?:'(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        postContinueState:  this.ContinueState.SingleQuoteString
-    }, {
-        name: "singleQuoteStringEndAction",
-        pattern: /^(?:(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*')/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.SingleQuoteString,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "singleQuoteStringMiddleAction",
-        pattern: /^(?:(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.SingleQuoteString
-    }, {
-        name: "doubleQuoteStringStartAction",
-        pattern: /^(?:"(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        postContinueState: this.ContinueState.DoubleQuoteString
-    }, {
-        name: "doubleQuoteStringEndAction",
-        pattern: /^(?:(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*")/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.DoubleQuoteString,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "doubleQuoteStringMiddleAction",
-        pattern: /^(?:(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.DoubleQuoteString
-    }, {
-        name: "keywordAction",
-        pattern: /^(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        keywords: keywords,
-        style: "webkit-javascript-keyword",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "identAction",
-        pattern: /^(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-ident",
-        callback: function(identElement) { identElement.addEventListener("mouseover", showDatatip, false); },
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "rightParenAction",
-        pattern: /^\)/,
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "punctuatorAction",
-        pattern: /^(?:<=|>=|===|==|!=|!==|\+\+|\-\-|<<|>>|>>>|&&|\|\||\+=|\-=|\*=|%=|<<=|>>=|>>>=|&=|\|=|^=|[{}\(\[\]\.;,<>\+\-\*%&\|\^!~\?:=])/,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "divPunctuatorAction",
-        pattern: /^(?:\/=?)/,
-        preLexState: this.LexState.DivisionAllowed,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "regExpLiteralAction",
-        pattern: /^(?:\/(?:(?:\\.)|[^\\*\/])(?:(?:\\.)|[^\\/])*\/(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-regexp",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "regExpStartAction",
-        pattern: /^(?:\/(?:(?:\\.)|[^\\*\/])(?:(?:\\.)|[^\\/])*)\\$/,
-        style: "webkit-javascript-regexp",
-        postContinueState: this.ContinueState.RegExp
-    }, {
-        name: "regExpEndAction",
-        pattern: /^(?:(?:(?:\\.)|[^\\/])*\/(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-regexp",
-        preContinueState: this.ContinueState.RegExp,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "regExpMiddleAction",
-        pattern: /^(?:(?:(?:\\.)|[^\\/])*)\\$/,
-        style: "webkit-javascript-regexp",
-        preContinueState: this.ContinueState.RegExp
-    }];
-
-    function showDatatip(event) {
-        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
-            return;
-
-        var node = event.target;
-        var parts = [node.textContent];
-        while (node.previousSibling && node.previousSibling.textContent === ".") {
-            node = node.previousSibling.previousSibling;
-            if (!node || !node.hasStyleClass("webkit-javascript-ident"))
-                break;
-            parts.unshift(node.textContent);
-        }
-
-        var expression = parts.join(".");
-
-        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", callback);
-        function callback(result, exception)
-        {
-            if (exception)
-                return;
-            event.target.setAttribute("title", result.description);
-            event.target.addEventListener("mouseout", onmouseout, false);
-            
-            function onmouseout(event)
-            {
-                event.target.removeAttribute("title");
-                event.target.removeEventListener("mouseout", onmouseout, false);
-            }
-        }
-    }
-}
-
-WebInspector.JavaScriptSourceSyntaxHighlighter.prototype.__proto__ = WebInspector.SourceSyntaxHighlighter.prototype;
-
-/* SourceView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceView = function(resource)
-{
-    // Set the sourceFrame first since WebInspector.ResourceView will set headersVisible
-    // and our override of headersVisible needs the sourceFrame.
-    this.sourceFrame = new WebInspector.SourceFrame(null, this._addBreakpoint.bind(this));
-
-    WebInspector.ResourceView.call(this, resource);
-
-    resource.addEventListener("finished", this._resourceLoadingFinished, this);
-
-    this.element.addStyleClass("source");
-
-    this._frameNeedsSetup = true;
-
-    this.contentElement.appendChild(this.sourceFrame.element);
-
-    var gutterElement = document.createElement("div");
-    gutterElement.className = "webkit-line-gutter-backdrop";
-    this.element.appendChild(gutterElement);
-}
-
-WebInspector.SourceView.prototype = {
-    set headersVisible(x)
-    {
-        if (x === this._headersVisible)
-            return;
-
-        var superSetter = WebInspector.ResourceView.prototype.__lookupSetter__("headersVisible");
-        if (superSetter)
-            superSetter.call(this, x);
-
-        this.sourceFrame.autoSizesToFitContentHeight = x;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.ResourceView.prototype.show.call(this, parentElement);
-        this.setupSourceFrameIfNeeded();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.sourceFrame.autoSizesToFitContentHeight)
-            this.sourceFrame.sizeToFitContentHeight();
-    },
-
-    detach: function()
-    {
-        WebInspector.ResourceView.prototype.detach.call(this);
-
-        // FIXME: We need to mark the frame for setup on detach because the frame DOM is cleared
-        // when it is removed from the document. Is this a bug?
-        this._frameNeedsSetup = true;
-        this._sourceFrameSetup = false;
-    },
-
-    setupSourceFrameIfNeeded: function()
-    {
-        if (!this._frameNeedsSetup)
-            return;
-
-        this.attach();
-
-        delete this._frameNeedsSetup;
-        this.sourceFrame.addEventListener("content loaded", this._contentLoaded, this);
-        InspectorFrontendHost.addResourceSourceToFrame(this.resource.identifier, this.sourceFrame.element);
-    },
-    
-    _contentLoaded: function()
-    {
-        delete this._frameNeedsSetup;
-        this.sourceFrame.removeEventListener("content loaded", this._contentLoaded, this);
-        
-        if (this.resource.type === WebInspector.Resource.Type.Script
-            || this.resource.mimeType === "application/json"
-            || this.resource.mimeType === "application/javascript"
-            || /\.js(on)?$/.test(this.resource.lastPathComponent) ) {
-            this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-            this.sourceFrame.syntaxHighlightJavascript();
-        } else if (this.resource.type === WebInspector.Resource.Type.Stylesheet
-            || this.resource.mimeType === "text/css"
-            || /\.css$/.test(this.resource.lastPathComponent) ) {
-            this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-            this.sourceFrame.syntaxHighlightCSS();
-        } else
-            this._sourceFrameSetupFinished();
-    },
-
-    _resourceLoadingFinished: function(event)
-    {
-        this._frameNeedsSetup = true;
-        this._sourceFrameSetup = false;
-        if (this.visible)
-            this.setupSourceFrameIfNeeded();
-        this.resource.removeEventListener("finished", this._resourceLoadingFinished, this);
-    },
-
-    _addBreakpoint: function(line)
-    {
-        var sourceID = null;
-        var closestStartingLine = 0;
-        var scripts = this.resource.scripts;
-        for (var i = 0; i < scripts.length; ++i) {
-            var script = scripts[i];
-            if (script.startingLine <= line && script.startingLine >= closestStartingLine) {
-                closestStartingLine = script.startingLine;
-                sourceID = script.sourceID;
-            }
-        }
-
-        if (WebInspector.panels.scripts) {
-            var breakpoint = new WebInspector.Breakpoint(this.resource.url, line, sourceID);
-            WebInspector.panels.scripts.addBreakpoint(breakpoint);
-        }
-    },
-
-    // The rest of the methods in this prototype need to be generic enough to work with a ScriptView.
-    // The ScriptView prototype pulls these methods into it's prototype to avoid duplicate code.
-
-    searchCanceled: function()
-    {
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-        delete this._delayedFindSearchMatches;
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        var lineQueryRegex = /(^|\s)(?:#|line:\s*)(\d+)(\s|$)/i;
-        var lineQueryMatch = query.match(lineQueryRegex);
-        if (lineQueryMatch) {
-            var lineToSearch = parseInt(lineQueryMatch[2]);
-
-            // If there was a space before and after the line query part, replace with a space.
-            // Otherwise replace with an empty string to eat the prefix or postfix space.
-            var lineQueryReplacement = (lineQueryMatch[1] && lineQueryMatch[3] ? " " : "");
-            var filterlessQuery = query.replace(lineQueryRegex, lineQueryReplacement);
-        }
-
-        this._searchFinishedCallback = finishedCallback;
-
-        function findSearchMatches(query, finishedCallback)
-        {
-            if (isNaN(lineToSearch)) {
-                // Search the whole document since there was no line to search.
-                this._searchResults = (InspectorFrontendHost.search(this.sourceFrame.element.contentDocument, query) || []);
-            } else {
-                var sourceRow = this.sourceFrame.sourceRow(lineToSearch);
-                if (sourceRow) {
-                    if (filterlessQuery) {
-                        // There is still a query string, so search for that string in the line.
-                        this._searchResults = (InspectorFrontendHost.search(sourceRow, filterlessQuery) || []);
-                    } else {
-                        // Match the whole line, since there was no remaining query string to match.
-                        var rowRange = this.sourceFrame.element.contentDocument.createRange();
-                        rowRange.selectNodeContents(sourceRow);
-                        this._searchResults = [rowRange];
-                    }
-                }
-
-                // Attempt to search for the whole query, just incase it matches a color like "#333".
-                var wholeQueryMatches = InspectorFrontendHost.search(this.sourceFrame.element.contentDocument, query);
-                if (wholeQueryMatches)
-                    this._searchResults = this._searchResults.concat(wholeQueryMatches);
-            }
-
-            if (this._searchResults)
-                finishedCallback(this, this._searchResults.length);
-        }
-
-        if (!this._sourceFrameSetup) {
-            // The search is performed in _sourceFrameSetupFinished by calling _delayedFindSearchMatches.
-            this._delayedFindSearchMatches = findSearchMatches.bind(this, query, finishedCallback);
-            this.setupSourceFrameIfNeeded();
-            return;
-        }
-
-        findSearchMatches.call(this, query, finishedCallback);
-    },
-
-    jumpToFirstSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToLastSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    showingFirstSearchResult: function()
-    {
-        return (this._currentSearchResultIndex === 0);
-    },
-
-    showingLastSearchResult: function()
-    {
-        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
-    },
-
-    revealLine: function(lineNumber)
-    {
-        this.setupSourceFrameIfNeeded();
-        this.sourceFrame.revealLine(lineNumber);
-    },
-
-    highlightLine: function(lineNumber)
-    {
-        this.setupSourceFrameIfNeeded();
-        this.sourceFrame.highlightLine(lineNumber);
-    },
-
-    addMessage: function(msg)
-    {
-        this.sourceFrame.addMessage(msg);
-    },
-
-    clearMessages: function()
-    {
-        this.sourceFrame.clearMessages();
-    },
-
-    _jumpToSearchResult: function(index)
-    {
-        var foundRange = this._searchResults[index];
-        if (!foundRange)
-            return;
-
-        var selection = this.sourceFrame.element.contentWindow.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(foundRange);
-
-        if (foundRange.startContainer.scrollIntoViewIfNeeded)
-            foundRange.startContainer.scrollIntoViewIfNeeded(true);
-        else if (foundRange.startContainer.parentNode)
-            foundRange.startContainer.parentNode.scrollIntoViewIfNeeded(true);
-    },
-
-    _sourceFrameSetupFinished: function()
-    {
-        this._sourceFrameSetup = true;
-        if (this._delayedFindSearchMatches) {
-            this._delayedFindSearchMatches();
-            delete this._delayedFindSearchMatches;
-        }
-    },
-
-    _syntaxHighlightingComplete: function(event)
-    {
-        this._sourceFrameSetupFinished();
-        this.sourceFrame.removeEventListener("syntax highlighting complete", null, this);
-    }
-}
-
-WebInspector.SourceView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* FontView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.FontView = function(resource)
-{
-    WebInspector.ResourceView.call(this, resource);
-
-    this.element.addStyleClass("font");
-
-    var uniqueFontName = "WebInspectorFontPreview" + this.resource.identifier;
-
-    this.fontStyleElement = document.createElement("style");
-    this.fontStyleElement.textContent = "@font-face { font-family: \"" + uniqueFontName + "\"; src: url(" + this.resource.url + "); }";
-    document.head.appendChild(this.fontStyleElement);
-
-    this.fontPreviewElement = document.createElement("div");
-    this.fontPreviewElement.className = "preview";
-    this.contentElement.appendChild(this.fontPreviewElement);
-
-    this.fontPreviewElement.style.setProperty("font-family", uniqueFontName, null);
-    this.fontPreviewElement.innerHTML = "ABCDEFGHIJKLM<br>NOPQRSTUVWXYZ<br>abcdefghijklm<br>nopqrstuvwxyz<br>1234567890";
-
-    this.updateFontPreviewSize();
-}
-
-WebInspector.FontView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.ResourceView.prototype.show.call(this, parentElement);
-        this.updateFontPreviewSize();
-    },
-
-    resize: function()
-    {
-        this.updateFontPreviewSize();
-    },
-
-    updateFontPreviewSize: function ()
-    {
-        if (!this.fontPreviewElement || !this.visible)
-            return;
-
-        this.fontPreviewElement.removeStyleClass("preview");
-
-        var measureFontSize = 50;
-        this.fontPreviewElement.style.setProperty("position", "absolute", null);
-        this.fontPreviewElement.style.setProperty("font-size", measureFontSize + "px", null);
-        this.fontPreviewElement.style.removeProperty("height");
-
-        var height = this.fontPreviewElement.offsetHeight;
-        var width = this.fontPreviewElement.offsetWidth;
-
-        var containerWidth = this.contentElement.offsetWidth;
-
-        // Subtract some padding. This should match the padding in the CSS plus room for the scrollbar.
-        containerWidth -= 40;
-
-        if (!height || !width || !containerWidth) {
-            this.fontPreviewElement.style.removeProperty("font-size");
-            this.fontPreviewElement.style.removeProperty("position");
-            this.fontPreviewElement.addStyleClass("preview");
-            return;
-        }
-
-        var lineCount = this.fontPreviewElement.getElementsByTagName("br").length + 1;
-        var realLineHeight = Math.floor(height / lineCount);
-        var fontSizeLineRatio = measureFontSize / realLineHeight;
-        var widthRatio = containerWidth / width;
-        var finalFontSize = Math.floor(realLineHeight * widthRatio * fontSizeLineRatio) - 1;
-
-        this.fontPreviewElement.style.setProperty("font-size", finalFontSize + "px", null);
-        this.fontPreviewElement.style.setProperty("height", this.fontPreviewElement.offsetHeight + "px", null);
-        this.fontPreviewElement.style.removeProperty("position");
-
-        this.fontPreviewElement.addStyleClass("preview");
-    }
-}
-
-WebInspector.FontView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* ImageView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ImageView = function(resource)
-{
-    WebInspector.ResourceView.call(this, resource);
-
-    this.element.addStyleClass("image");
-
-    var container = document.createElement("div");
-    container.className = "image";
-    this.contentElement.appendChild(container);
-
-    this.imagePreviewElement = document.createElement("img");
-    this.imagePreviewElement.addStyleClass("resource-image-view");
-    this.imagePreviewElement.setAttribute("src", this.resource.url);
-
-    container.appendChild(this.imagePreviewElement);
-
-    container = document.createElement("div");
-    container.className = "info";
-    this.contentElement.appendChild(container);
-
-    var imageNameElement = document.createElement("h1");
-    imageNameElement.className = "title";
-    imageNameElement.textContent = this.resource.displayName;
-    container.appendChild(imageNameElement);
-
-    var infoListElement = document.createElement("dl");
-    infoListElement.className = "infoList";
-
-    var imageProperties = [
-        { name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", this.imagePreviewElement.naturalWidth, this.imagePreviewElement.height) },
-        { name: WebInspector.UIString("File size"), value: Number.bytesToString(this.resource.contentLength, WebInspector.UIString.bind(WebInspector)) },
-        { name: WebInspector.UIString("MIME type"), value: this.resource.mimeType }
-    ];
-
-    var listHTML = '';
-    for (var i = 0; i < imageProperties.length; ++i)
-        listHTML += "<dt>" + imageProperties[i].name + "</dt><dd>" + imageProperties[i].value + "</dd>";
-
-    infoListElement.innerHTML = listHTML;
-    container.appendChild(infoListElement);
-}
-
-WebInspector.ImageView.prototype = {
-    
-}
-
-WebInspector.ImageView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* DatabaseTableView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DatabaseTableView = function(database, tableName)
-{
-    WebInspector.View.call(this);
-
-    this.database = database;
-    this.tableName = tableName;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-}
-
-WebInspector.DatabaseTableView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    get statusBarItems()
-    {
-        return [this.refreshButton];
-    },
-
-    update: function()
-    {
-        this.database.executeSql("SELECT * FROM " + this.tableName, this._queryFinished.bind(this), this._queryError.bind(this));
-    },
-
-    _queryFinished: function(result)
-    {
-        this.element.removeChildren();
-
-        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
-        if (!dataGrid) {
-            var emptyMsgElement = document.createElement("div");
-            emptyMsgElement.className = "storage-table-empty";
-            emptyMsgElement.textContent = WebInspector.UIString("The “%s”\ntable is empty.", this.tableName);
-            this.element.appendChild(emptyMsgElement);
-            return;
-        }
-
-        this.element.appendChild(dataGrid.element);
-    },
-
-    _queryError: function(error)
-    {
-        this.element.removeChildren();
-
-        var errorMsgElement = document.createElement("div");
-        errorMsgElement.className = "storage-table-error";
-        errorMsgElement.textContent = WebInspector.UIString("An error occurred trying to\nread the “%s” table.", this.tableName);
-        this.element.appendChild(errorMsgElement);
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    }
-}
-
-WebInspector.DatabaseTableView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* DatabaseQueryView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DatabaseQueryView = function(database)
-{
-    WebInspector.View.call(this);
-
-    this.database = database;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("query");
-    this.element.tabIndex = 0;
-
-    this.element.addEventListener("selectstart", this._selectStart.bind(this), false);
-
-    this.promptElement = document.createElement("div");
-    this.promptElement.className = "database-query-prompt";
-    this.promptElement.appendChild(document.createElement("br"));
-    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
-    this.element.appendChild(this.promptElement);
-
-    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " ");
-}
-
-WebInspector.DatabaseQueryView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-
-        function moveBackIfOutside()
-        {
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-        }
-
-        setTimeout(moveBackIfOutside.bind(this), 0);
-    },
-
-    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
-    {
-        var prefix = wordRange.toString().toLowerCase();
-        if (!prefix.length)
-            return;
-
-        var results = [];
-
-        function accumulateMatches(textArray)
-        {
-            if (bestMatchOnly && results.length)
-                return;
-            for (var i = 0; i < textArray.length; ++i) {
-                var text = textArray[i].toLowerCase();
-                if (text.length < prefix.length)
-                    continue;
-                if (text.indexOf(prefix) !== 0)
-                    continue;
-                results.push(textArray[i]);
-                if (bestMatchOnly)
-                    return;
-            }
-        }
-        
-        function tableNamesCallback(tableNames)
-        {
-            accumulateMatches(tableNames.map(function(name) { return name + " " }));
-            accumulateMatches(["SELECT ", "FROM ", "WHERE ", "LIMIT ", "DELETE FROM ", "CREATE ", "DROP ", "TABLE ", "INDEX ", "UPDATE ", "INSERT INTO ", "VALUES ("]);
-
-            completionsReadyCallback(results);
-        }
-        this.database.getTableNames(tableNamesCallback);
-    },
-
-    _promptKeyDown: function(event)
-    {
-        if (isEnterKey(event)) {
-            this._enterKeyPressed(event);
-            return;
-        }
-    },
-
-    _selectStart: function(event)
-    {
-        if (this._selectionTimeout)
-            clearTimeout(this._selectionTimeout);
-
-        this.prompt.clearAutoComplete();
-
-        function moveBackIfOutside()
-        {
-            delete this._selectionTimeout;
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-            this.prompt.autoCompleteSoon();
-        }
-
-        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
-    },
-
-    _enterKeyPressed: function(event)
-    {
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.prompt.clearAutoComplete(true);
-
-        var query = this.prompt.text;
-        if (!query.length)
-            return;
-
-        this.prompt.history.push(query);
-        this.prompt.historyOffset = 0;
-        this.prompt.text = "";
-
-        this.database.executeSql(query, this._queryFinished.bind(this, query), this._queryError.bind(this, query));
-    },
-
-    _queryFinished: function(query, result)
-    {
-        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
-        if (!dataGrid)
-            return;
-        dataGrid.element.addStyleClass("inline");
-        this._appendQueryResult(query, dataGrid.element);
-
-        if (query.match(/^create /i) || query.match(/^drop table /i))
-            WebInspector.panels.storage.updateDatabaseTables(this.database);
-    },
-
-    _queryError: function(query, error)
-    {
-        if (error.code == 1)
-            var message = error.message;
-        else if (error.code == 2)
-            var message = WebInspector.UIString("Database no longer has expected version.");
-        else
-            var message = WebInspector.UIString("An unexpected error %s occurred.", error.code);
-
-        this._appendQueryResult(query, message, "error");
-    },
-
-    _appendQueryResult: function(query, result, resultClassName)
-    {
-        var element = document.createElement("div");
-        element.className = "database-user-query";
-
-        var commandTextElement = document.createElement("span");
-        commandTextElement.className = "database-query-text";
-        commandTextElement.textContent = query;
-        element.appendChild(commandTextElement);
-
-        var resultElement = document.createElement("div");
-        resultElement.className = "database-query-result";
-
-        if (resultClassName)
-            resultElement.addStyleClass(resultClassName);
-
-        if (typeof result === "string" || result instanceof String)
-            resultElement.textContent = result;
-        else if (result && result.nodeName)
-            resultElement.appendChild(result);
-
-        if (resultElement.childNodes.length)
-            element.appendChild(resultElement);
-
-        this.element.insertBefore(element, this.promptElement);
-        this.promptElement.scrollIntoView(false);
-    }
-}
-
-WebInspector.DatabaseQueryView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ScriptView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScriptView = function(script)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("script-view");
-
-    this.script = script;
-
-    this._frameNeedsSetup = true;
-    this._sourceFrameSetup = false;
-
-    this.sourceFrame = new WebInspector.SourceFrame(null, this._addBreakpoint.bind(this));
-
-    this.element.appendChild(this.sourceFrame.element);
-}
-
-WebInspector.ScriptView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.setupSourceFrameIfNeeded();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    setupSourceFrameIfNeeded: function()
-    {
-        if (!this._frameNeedsSetup)
-            return;
-
-        this.attach();
-
-        if (!InspectorFrontendHost.addSourceToFrame("text/javascript", this.script.source, this.sourceFrame.element))
-            return;
-
-        delete this._frameNeedsSetup;
-
-        this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-        this.sourceFrame.syntaxHighlightJavascript();
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode)
-            document.getElementById("script-resource-views").appendChild(this.element);
-    },
-
-    _addBreakpoint: function(line)
-    {
-        var breakpoint = new WebInspector.Breakpoint(this.script.sourceURL, line, this.script.sourceID);
-        WebInspector.panels.scripts.addBreakpoint(breakpoint);
-    },
-
-    // The follow methods are pulled from SourceView, since they are
-    // generic and work with ScriptView just fine.
-
-    revealLine: WebInspector.SourceView.prototype.revealLine,
-    highlightLine: WebInspector.SourceView.prototype.highlightLine,
-    addMessage: WebInspector.SourceView.prototype.addMessage,
-    clearMessages: WebInspector.SourceView.prototype.clearMessages,
-    searchCanceled: WebInspector.SourceView.prototype.searchCanceled,
-    performSearch: WebInspector.SourceView.prototype.performSearch,
-    jumpToFirstSearchResult: WebInspector.SourceView.prototype.jumpToFirstSearchResult,
-    jumpToLastSearchResult: WebInspector.SourceView.prototype.jumpToLastSearchResult,
-    jumpToNextSearchResult: WebInspector.SourceView.prototype.jumpToNextSearchResult,
-    jumpToPreviousSearchResult: WebInspector.SourceView.prototype.jumpToPreviousSearchResult,
-    showingFirstSearchResult: WebInspector.SourceView.prototype.showingFirstSearchResult,
-    showingLastSearchResult: WebInspector.SourceView.prototype.showingLastSearchResult,
-    _jumpToSearchResult: WebInspector.SourceView.prototype._jumpToSearchResult,
-    _sourceFrameSetupFinished: WebInspector.SourceView.prototype._sourceFrameSetupFinished,
-    _syntaxHighlightingComplete: WebInspector.SourceView.prototype._syntaxHighlightingComplete
-}
-
-WebInspector.ScriptView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ProfileDataGridNode = function(profileView, profileNode, owningTree, hasChildren)
-{
-    this.profileView = profileView;
-    this.profileNode = profileNode;
-
-    WebInspector.DataGridNode.call(this, null, hasChildren);
-
-    this.addEventListener("populate", this._populate, this);
-
-    this.tree = owningTree;
-
-    this.childrenByCallUID = {};
-    this.lastComparator = null;
-
-    this.callUID = profileNode.callUID;
-    this.selfTime = profileNode.selfTime;
-    this.totalTime = profileNode.totalTime;
-    this.functionName = profileNode.functionName;
-    this.numberOfCalls = profileNode.numberOfCalls;
-    this.url = profileNode.url;
-}
-
-WebInspector.ProfileDataGridNode.prototype = {
-    get data()
-    {
-        function formatMilliseconds(time)
-        {
-            return Number.secondsToString(time / 1000, WebInspector.UIString.bind(WebInspector), !Preferences.samplingCPUProfiler);
-        }
-
-        var data = {};
-
-        data["function"] = this.functionName;
-        data["calls"] = this.numberOfCalls;
-
-        if (this.profileView.showSelfTimeAsPercent)
-            data["self"] = WebInspector.UIString("%.2f%%", this.selfPercent);
-        else
-            data["self"] = formatMilliseconds(this.selfTime);
-
-        if (this.profileView.showTotalTimeAsPercent)
-            data["total"] = WebInspector.UIString("%.2f%%", this.totalPercent);
-        else
-            data["total"] = formatMilliseconds(this.totalTime);
-
-        if (this.profileView.showAverageTimeAsPercent)
-            data["average"] = WebInspector.UIString("%.2f%%", this.averagePercent);
-        else
-            data["average"] = formatMilliseconds(this.averageTime);
-
-        return data;
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
-
-        if (columnIdentifier === "self" && this._searchMatchedSelfColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "total" && this._searchMatchedTotalColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "average" && this._searchMatchedAverageColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "calls" && this._searchMatchedCallsColumn)
-            cell.addStyleClass("highlight");
-
-        if (columnIdentifier !== "function")
-            return cell;
-
-        if (this.profileNode._searchMatchedFunctionColumn)
-            cell.addStyleClass("highlight");
-
-        if (this.profileNode.url) {
-            var fileName = WebInspector.displayNameForURL(this.profileNode.url);
-
-            var urlElement = document.createElement("a");
-            urlElement.className = "profile-node-file webkit-html-resource-link";
-            urlElement.href = this.profileNode.url;
-            urlElement.lineNumber = this.profileNode.lineNumber;
-            urlElement.preferredPanel = "scripts";
-
-            if (this.profileNode.lineNumber > 0)
-                urlElement.textContent = fileName + ":" + this.profileNode.lineNumber;
-            else
-                urlElement.textContent = fileName;
-
-            cell.insertBefore(urlElement, cell.firstChild);
-        }
-
-        return cell;
-    },
-
-    select: function(supressSelectedEvent)
-    {
-        WebInspector.DataGridNode.prototype.select.call(this, supressSelectedEvent);
-        this.profileView._dataGridNodeSelected(this);
-    },
-
-    deselect: function(supressDeselectedEvent)
-    {
-        WebInspector.DataGridNode.prototype.deselect.call(this, supressDeselectedEvent);
-        this.profileView._dataGridNodeDeselected(this);
-    },
-
-    sort: function(/*Function*/ comparator, /*Boolean*/ force)
-    {
-        var gridNodeGroups = [[this]];
-
-        for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) {
-            var gridNodes = gridNodeGroups[gridNodeGroupIndex];
-            var count = gridNodes.length;
-
-            for (var index = 0; index < count; ++index) {
-                var gridNode = gridNodes[index];
-
-                // If the grid node is collapsed, then don't sort children (save operation for later).
-                // If the grid node has the same sorting as previously, then there is no point in sorting it again.
-                if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) {
-                    if (gridNode.children.length)
-                        gridNode.shouldRefreshChildren = true;
-                    continue;
-                }
-
-                gridNode.lastComparator = comparator;
-
-                var children = gridNode.children;
-                var childCount = children.length;
-
-                if (childCount) {
-                    children.sort(comparator);
-
-                    for (var childIndex = 0; childIndex < childCount; ++childIndex)
-                        children[childIndex]._recalculateSiblings(childIndex);
-
-                    gridNodeGroups.push(children);
-                }
-            }
-        }
-    },
-
-    insertChild: function(/*ProfileDataGridNode*/ profileDataGridNode, index)
-    {
-        WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index);
-
-        this.childrenByCallUID[profileDataGridNode.callUID] = profileDataGridNode;
-    },
-
-    removeChild: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode);
-
-        delete this.childrenByCallUID[profileDataGridNode.callUID];
-    },
-
-    removeChildren: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        WebInspector.DataGridNode.prototype.removeChildren.call(this);
-
-        this.childrenByCallUID = {};
-    },
-
-    findChild: function(/*Node*/ node)
-    {
-        if (!node)
-            return null;
-        return this.childrenByCallUID[node.callUID];
-    },
-
-    get averageTime()
-    {
-        return this.selfTime / Math.max(1, this.numberOfCalls);
-    },
-
-    get averagePercent()
-    {
-        return this.averageTime / this.tree.totalTime * 100.0;
-    },
-
-    get selfPercent()
-    {
-        return this.selfTime / this.tree.totalTime * 100.0;
-    },
-
-    get totalPercent()
-    {
-        return this.totalTime / this.tree.totalTime * 100.0;
-    },
-
-    get _parent()
-    {
-        return this.parent !== this.dataGrid ? this.parent : this.tree;
-    },
-
-    _populate: function(event)
-    {
-        this._sharedPopulate();
-
-        if (this._parent) {
-            var currentComparator = this._parent.lastComparator;
-
-            if (currentComparator)
-                this.sort(currentComparator, true);
-        }
-
-        if (this.removeEventListener)
-            this.removeEventListener("populate", this._populate, this);
-    },
-
-    // When focusing and collapsing we modify lots of nodes in the tree.
-    // This allows us to restore them all to their original state when we revert.
-    _save: function()
-    {
-        if (this._savedChildren)
-            return;
-
-        this._savedSelfTime = this.selfTime;
-        this._savedTotalTime = this.totalTime;
-        this._savedNumberOfCalls = this.numberOfCalls;
-
-        this._savedChildren = this.children.slice();
-    },
-
-    // When focusing and collapsing we modify lots of nodes in the tree.
-    // This allows us to restore them all to their original state when we revert.
-    _restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.selfTime = this._savedSelfTime;
-        this.totalTime = this._savedTotalTime;
-        this.numberOfCalls = this._savedNumberOfCalls;
-
-        this.removeChildren();
-
-        var children = this._savedChildren;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            children[index]._restore();
-            this.appendChild(children[index]);
-        }
-    },
-
-    _merge: function(child, shouldAbsorb)
-    {
-        this.selfTime += child.selfTime;
-
-        if (!shouldAbsorb) {
-            this.totalTime += child.totalTime;
-            this.numberOfCalls += child.numberOfCalls;
-        }
-
-        var children = this.children.slice();
-
-        this.removeChildren();
-
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            if (!shouldAbsorb || children[index] !== child)
-                this.appendChild(children[index]);
-        }
-
-        children = child.children.slice();
-        count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            var orphanedChild = children[index],
-                existingChild = this.childrenByCallUID[orphanedChild.callUID];
-
-            if (existingChild)
-                existingChild._merge(orphanedChild, false);
-            else
-                this.appendChild(orphanedChild);
-        }
-    }
-}
-
-WebInspector.ProfileDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-WebInspector.ProfileDataGridTree = function(profileView, profileNode)
-{
-    this.tree = this;
-    this.children = [];
-
-    this.profileView = profileView;
-
-    this.totalTime = profileNode.totalTime;
-    this.lastComparator = null;
-
-    this.childrenByCallUID = {};
-}
-
-WebInspector.ProfileDataGridTree.prototype = {
-    get expanded()
-    {
-        return true;
-    },
-
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        this.children.splice(index, 0, child);
-        this.childrenByCallUID[child.callUID] = child;
-    },
-
-    removeChildren: function()
-    {
-        this.children = [];
-        this.childrenByCallUID = {};
-    },
-
-    findChild: WebInspector.ProfileDataGridNode.prototype.findChild,
-    sort: WebInspector.ProfileDataGridNode.prototype.sort,
-
-    _save: function()
-    {
-        if (this._savedChildren)
-            return;
-
-        this._savedTotalTime = this.totalTime;
-        this._savedChildren = this.children.slice();
-    },
-
-    restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.children = this._savedChildren;
-        this.totalTime = this._savedTotalTime;
-
-        var children = this.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            children[index]._restore();
-
-        this._savedChildren = null;
-    }
-}
-
-WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}];
-
-WebInspector.ProfileDataGridTree.propertyComparator = function(/*String*/ property, /*Boolean*/ isAscending)
-{
-    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];
-
-    if (!comparator) {
-        if (isAscending) {
-            comparator = function(lhs, rhs)
-            {
-                if (lhs[property] < rhs[property])
-                    return -1;
-
-                if (lhs[property] > rhs[property])
-                    return 1;
-
-                return 0;
-            }
-        } else {
-            comparator = function(lhs, rhs)
-            {
-                if (lhs[property] > rhs[property])
-                    return -1;
-
-                if (lhs[property] < rhs[property])
-                    return 1;
-
-                return 0;
-            }
-        }
-
-        this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;
-    }
-
-    return comparator;
-}
-
-/* BottomUpProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// Bottom Up Profiling shows the entire callstack backwards:
-// The root node is a representation of each individual function called, and each child of that node represents
-// a reverse-callstack showing how many of those calls came from it. So, unlike top-down, the statistics in
-// each child still represent the root node. We have to be particularly careful of recursion with this mode
-// because a root node can represent itself AND an ancestor.
-
-WebInspector.BottomUpProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*BottomUpProfileDataGridTree*/ owningTree)
-{
-    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, this._willHaveChildren(profileNode));
-
-    this._remainingNodeInfos = [];
-}
-
-WebInspector.BottomUpProfileDataGridNode.prototype = {
-    _takePropertiesFromProfileDataGridNode: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        this._save();
-
-        this.selfTime = profileDataGridNode.selfTime;
-        this.totalTime = profileDataGridNode.totalTime;
-        this.numberOfCalls = profileDataGridNode.numberOfCalls;
-    },
-
-    // When focusing, we keep just the members of the callstack.
-    _keepOnlyChild: function(/*ProfileDataGridNode*/ child)
-    {
-        this._save();
-
-        this.removeChildren();
-        this.appendChild(child);
-    },
-
-    _exclude: function(aCallUID)
-    {
-        if (this._remainingNodeInfos)
-            this._populate();
-
-        this._save();
-
-        var children = this.children;
-        var index = this.children.length;
-
-        while (index--)
-            children[index]._exclude(aCallUID);
-
-        var child = this.childrenByCallUID[aCallUID];
-
-        if (child)
-            this._merge(child, true);
-    },
-
-    _restore: function()
-    {
-        WebInspector.ProfileDataGridNode.prototype._restore();
-
-        if (!this.children.length)
-            this.hasChildren = this._willHaveChildren();
-    },
-
-    _merge: function(/*ProfileDataGridNode*/ child, /*Boolean*/ shouldAbsorb)
-    {
-        this.selfTime -= child.selfTime;
-
-        WebInspector.ProfileDataGridNode.prototype._merge.call(this, child, shouldAbsorb);
-    },
-
-    _sharedPopulate: function()
-    {
-        var remainingNodeInfos = this._remainingNodeInfos;
-        var count = remainingNodeInfos.length;
-
-        for (var index = 0; index < count; ++index) {
-            var nodeInfo = remainingNodeInfos[index];
-            var ancestor = nodeInfo.ancestor;
-            var focusNode = nodeInfo.focusNode;
-            var child = this.findChild(ancestor);
-
-            // If we already have this child, then merge the data together.
-            if (child) {
-                var totalTimeAccountedFor = nodeInfo.totalTimeAccountedFor;
-
-                child.selfTime += focusNode.selfTime;
-                child.numberOfCalls += focusNode.numberOfCalls;
-
-                if (!totalTimeAccountedFor)
-                    child.totalTime += focusNode.totalTime;
-            } else {
-                // If not, add it as a true ancestor.
-                // In heavy mode, we take our visual identity from ancestor node...
-                var child = new WebInspector.BottomUpProfileDataGridNode(this.profileView, ancestor, this.tree);
-
-                if (ancestor !== focusNode) {
-                    // but the actual statistics from the "root" node (bottom of the callstack).
-                    child.selfTime = focusNode.selfTime;
-                    child.totalTime = focusNode.totalTime;
-                    child.numberOfCalls = focusNode.numberOfCalls;
-                }
-
-                this.appendChild(child);
-            }
-
-            var parent = ancestor.parent;
-            if (parent && parent.parent) {
-                nodeInfo.ancestor = parent;
-                child._remainingNodeInfos.push(nodeInfo);
-            }
-        }
-
-        delete this._remainingNodeInfos;
-    },
-
-    _willHaveChildren: function(profileNode)
-    {
-        profileNode = profileNode || this.profileNode;
-        // In bottom up mode, our parents are our children since we display an inverted tree.
-        // However, we don't want to show the very top parent since it is redundant.
-        return !!(profileNode.parent && profileNode.parent.parent);
-    }
-}
-
-WebInspector.BottomUpProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
-
-WebInspector.BottomUpProfileDataGridTree = function(/*ProfileView*/ aProfileView, /*ProfileNode*/ aProfileNode)
-{
-    WebInspector.ProfileDataGridTree.call(this, aProfileView, aProfileNode);
-
-    // Iterate each node in pre-order.
-    var profileNodeUIDs = 0;
-    var profileNodeGroups = [[], [aProfileNode]];
-    var visitedProfileNodesForCallUID = {};
-
-    this._remainingNodeInfos = [];
-
-    for (var profileNodeGroupIndex = 0; profileNodeGroupIndex < profileNodeGroups.length; ++profileNodeGroupIndex) {
-        var parentProfileNodes = profileNodeGroups[profileNodeGroupIndex];
-        var profileNodes = profileNodeGroups[++profileNodeGroupIndex];
-        var count = profileNodes.length;
-
-        for (var index = 0; index < count; ++index) {
-            var profileNode = profileNodes[index];
-
-            if (!profileNode.UID)
-                profileNode.UID = ++profileNodeUIDs;
-
-            if (profileNode.head && profileNode !== profileNode.head) {
-                // The total time of this ancestor is accounted for if we're in any form of recursive cycle.
-                var visitedNodes = visitedProfileNodesForCallUID[profileNode.callUID];
-                var totalTimeAccountedFor = false;
-
-                if (!visitedNodes) {
-                    visitedNodes = {}
-                    visitedProfileNodesForCallUID[profileNode.callUID] = visitedNodes;
-                } else {
-                    // The total time for this node has already been accounted for iff one of it's parents has already been visited.
-                    // We can do this check in this style because we are traversing the tree in pre-order.
-                    var parentCount = parentProfileNodes.length;
-                    for (var parentIndex = 0; parentIndex < parentCount; ++parentIndex) {
-                        if (visitedNodes[parentProfileNodes[parentIndex].UID]) {
-                            totalTimeAccountedFor = true;
-                            break;
-                        }
-                    }
-                }
-
-                visitedNodes[profileNode.UID] = true;
-
-                this._remainingNodeInfos.push({ ancestor:profileNode, focusNode:profileNode, totalTimeAccountedFor:totalTimeAccountedFor });
-            }
-
-            var children = profileNode.children;
-            if (children.length) {
-                profileNodeGroups.push(parentProfileNodes.concat([profileNode]))
-                profileNodeGroups.push(children);
-            }
-        }
-    }
-
-    // Populate the top level nodes.
-    WebInspector.BottomUpProfileDataGridNode.prototype._populate.call(this);
-
-    return this;
-}
-
-WebInspector.BottomUpProfileDataGridTree.prototype = {
-    // When focusing, we keep the entire callstack up to this ancestor.
-    focus: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        if (!profileDataGridNode)
-            return;
-
-        this._save();
-
-        var currentNode = profileDataGridNode;
-        var focusNode = profileDataGridNode;
-
-        while (currentNode.parent && (currentNode instanceof WebInspector.ProfileDataGridNode)) {
-            currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);
-
-            focusNode = currentNode;
-            currentNode = currentNode.parent;
-
-            if (currentNode instanceof WebInspector.ProfileDataGridNode)
-                currentNode._keepOnlyChild(focusNode);
-        }
-
-        this.children = [focusNode];
-        this.totalTime = profileDataGridNode.totalTime;
-    },
-
-    exclude: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        if (!profileDataGridNode)
-            return;
-
-        this._save();
-
-        var excludedCallUID = profileDataGridNode.callUID;
-        var excludedTopLevelChild = this.childrenByCallUID[excludedCallUID];
-
-        // If we have a top level node that is excluded, get rid of it completely (not keeping children),
-        // since bottom up data relies entirely on the root node.
-        if (excludedTopLevelChild)
-            this.children.remove(excludedTopLevelChild);
-
-        var children = this.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            children[index]._exclude(excludedCallUID);
-
-        if (this.lastComparator)
-            this.sort(this.lastComparator, true);
-    },
-
-    _sharedPopulate: WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate
-}
-
-WebInspector.BottomUpProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
-
-
-/* TopDownProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TopDownProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*TopDownProfileDataGridTree*/ owningTree)
-{
-    var hasChildren = (profileNode.children && profileNode.children.length);
-
-    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, hasChildren);
-
-    this._remainingChildren = profileNode.children;
-}
-
-WebInspector.TopDownProfileDataGridNode.prototype = {
-    _sharedPopulate: function()
-    {
-        var children = this._remainingChildren;
-        var childrenLength = children.length;
-
-        for (var i = 0; i < childrenLength; ++i)
-            this.appendChild(new WebInspector.TopDownProfileDataGridNode(this.profileView, children[i], this.tree));
-
-        this._remainingChildren = null;
-    },
-
-    _exclude: function(aCallUID)
-    {
-        if (this._remainingChildren)
-            this._populate();
-
-        this._save();
-
-        var children = this.children;
-        var index = this.children.length;
-
-        while (index--)
-            children[index]._exclude(aCallUID);
-
-        var child = this.childrenByCallUID[aCallUID];
-
-        if (child)
-            this._merge(child, true);
-    }
-}
-
-WebInspector.TopDownProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
-
-WebInspector.TopDownProfileDataGridTree = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode)
-{
-    WebInspector.ProfileDataGridTree.call(this, profileView, profileNode);
-
-    this._remainingChildren = profileNode.children;
-
-    WebInspector.TopDownProfileDataGridNode.prototype._populate.call(this);
-}
-
-WebInspector.TopDownProfileDataGridTree.prototype = {
-    focus: function(/*ProfileDataGridNode*/ profileDataGrideNode)
-    {
-        if (!profileDataGrideNode)
-            return;
-
-        this._save();
-        profileDataGrideNode.savePosition();
-
-        this.children = [profileDataGrideNode];
-        this.totalTime = profileDataGrideNode.totalTime;
-    },
-
-    exclude: function(/*ProfileDataGridNode*/ profileDataGrideNode)
-    {
-        if (!profileDataGrideNode)
-            return;
-
-        this._save();
-
-        var excludedCallUID = profileDataGrideNode.callUID;
-
-        WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(this, excludedCallUID);
-
-        if (this.lastComparator)
-            this.sort(this.lastComparator, true);
-    },
-
-    restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.children[0].restorePosition();
-
-        WebInspector.ProfileDataGridTree.prototype.restore.call(this);
-    },
-
-    _merge: WebInspector.TopDownProfileDataGridNode.prototype._merge,
-
-    _sharedPopulate: WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate
-}
-
-WebInspector.TopDownProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
-
-/* ProfileView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// FIXME: Rename the file.
-
-WebInspector.CPUProfileView = function(profile)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("profile-view");
-
-    this.showSelfTimeAsPercent = true;
-    this.showTotalTimeAsPercent = true;
-    this.showAverageTimeAsPercent = true;
-
-    var columns = { "self": { title: WebInspector.UIString("Self"), width: "72px", sort: "descending", sortable: true },
-                    "total": { title: WebInspector.UIString("Total"), width: "72px", sortable: true },
-                    "average": { title: WebInspector.UIString("Average"), width: "72px", sortable: true },
-                    "calls": { title: WebInspector.UIString("Calls"), width: "54px", sortable: true },
-                    "function": { title: WebInspector.UIString("Function"), disclosure: true, sortable: true } };
-
-    if (Preferences.samplingCPUProfiler) {
-        delete columns.average;
-        delete columns.calls;
-    }
-
-    this.dataGrid = new WebInspector.DataGrid(columns);
-    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
-    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
-    this.element.appendChild(this.dataGrid.element);
-
-    this.viewSelectElement = document.createElement("select");
-    this.viewSelectElement.className = "status-bar-item";
-    this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false);
-    this.view = "Heavy";
-
-    var heavyViewOption = document.createElement("option");
-    heavyViewOption.label = WebInspector.UIString("Heavy (Bottom Up)");
-    var treeViewOption = document.createElement("option");
-    treeViewOption.label = WebInspector.UIString("Tree (Top Down)");
-    this.viewSelectElement.appendChild(heavyViewOption);
-    this.viewSelectElement.appendChild(treeViewOption);
-
-    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item");
-    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
-
-    this.focusButton = new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."), "focus-profile-node-status-bar-item");
-    this.focusButton.disabled = true;
-    this.focusButton.addEventListener("click", this._focusClicked.bind(this), false);
-
-    this.excludeButton = new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."), "exclude-profile-node-status-bar-item");
-    this.excludeButton.disabled = true;
-    this.excludeButton.addEventListener("click", this._excludeClicked.bind(this), false);
-
-    this.resetButton = new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."), "reset-profile-status-bar-item");
-    this.resetButton.visible = false;
-    this.resetButton.addEventListener("click", this._resetClicked.bind(this), false);
-
-    this.profile = profile;
-
-    var self = this;
-    function profileCallback(profile)
-    {
-        self.profile = profile;
-        self._assignParentsInProfile();
-      
-        self.profileDataGridTree = self.bottomUpProfileDataGridTree;
-        self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
-     
-        self.refresh();
-     
-        self._updatePercentButton();
-    }
-
-    var callId = WebInspector.Callback.wrap(profileCallback);
-    InspectorBackend.getProfile(callId, this.profile.uid);
-}
-
-WebInspector.CPUProfileView.prototype = {
-    get statusBarItems()
-    {
-        return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];
-    },
-
-    get profile()
-    {
-        return this._profile;
-    },
-
-    set profile(profile)
-    {
-        this._profile = profile;
-    },
-
-    get bottomUpProfileDataGridTree()
-    {
-        if (!this._bottomUpProfileDataGridTree)
-            this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this, this.profile.head);
-        return this._bottomUpProfileDataGridTree;
-    },
-
-    get topDownProfileDataGridTree()
-    {
-        if (!this._topDownProfileDataGridTree)
-            this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this, this.profile.head);
-        return this._topDownProfileDataGridTree;
-    },
-
-    get currentTree()
-    {
-        return this._currentTree;
-    },
-
-    set currentTree(tree)
-    {
-        this._currentTree = tree;
-        this.refresh();
-    },
-
-    get topDownTree()
-    {
-        if (!this._topDownTree) {
-            this._topDownTree = WebInspector.TopDownTreeFactory.create(this.profile.head);
-            this._sortProfile(this._topDownTree);
-        }
-
-        return this._topDownTree;
-    },
-
-    get bottomUpTree()
-    {
-        if (!this._bottomUpTree) {
-            this._bottomUpTree = WebInspector.BottomUpTreeFactory.create(this.profile.head);
-            this._sortProfile(this._bottomUpTree);
-        }
-
-        return this._bottomUpTree;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.dataGrid.updateWidths();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.dataGrid)
-            this.dataGrid.updateWidths();
-    },
-
-    refresh: function()
-    {
-        var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
-
-        this.dataGrid.removeChildren();
-
-        var children = this.profileDataGridTree.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            this.dataGrid.appendChild(children[index]);
-
-        if (selectedProfileNode)
-            selectedProfileNode.selected = true;
-    },
-
-    refreshVisibleData: function()
-    {
-        var child = this.dataGrid.children[0];
-        while (child) {
-            child.refresh();
-            child = child.traverseNextNode(false, null, true);
-        }
-    },
-
-    refreshShowAsPercents: function()
-    {
-        this._updatePercentButton();
-        this.refreshVisibleData();
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var profileNode = this._searchResults[i].profileNode;
-
-                delete profileNode._searchMatchedSelfColumn;
-                delete profileNode._searchMatchedTotalColumn;
-                delete profileNode._searchMatchedCallsColumn;
-                delete profileNode._searchMatchedFunctionColumn;
-
-                profileNode.refresh();
-            }
-        }
-
-        delete this._searchFinishedCallback;
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        query = query.trimWhitespace();
-
-        if (!query.length)
-            return;
-
-        this._searchFinishedCallback = finishedCallback;
-
-        var greaterThan = (query.indexOf(">") === 0);
-        var lessThan = (query.indexOf("<") === 0);
-        var equalTo = (query.indexOf("=") === 0 || ((greaterThan || lessThan) && query.indexOf("=") === 1));
-        var percentUnits = (query.lastIndexOf("%") === (query.length - 1));
-        var millisecondsUnits = (query.length > 2 && query.lastIndexOf("ms") === (query.length - 2));
-        var secondsUnits = (!millisecondsUnits && query.lastIndexOf("s") === (query.length - 1));
-
-        var queryNumber = parseFloat(query);
-        if (greaterThan || lessThan || equalTo) {
-            if (equalTo && (greaterThan || lessThan))
-                queryNumber = parseFloat(query.substring(2));
-            else
-                queryNumber = parseFloat(query.substring(1));
-        }
-
-        var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber);
-
-        // Make equalTo implicitly true if it wasn't specified there is no other operator.
-        if (!isNaN(queryNumber) && !(greaterThan || lessThan))
-            equalTo = true;
-
-        function matchesQuery(/*ProfileDataGridNode*/ profileDataGridNode)
-        {
-            delete profileDataGridNode._searchMatchedSelfColumn;
-            delete profileDataGridNode._searchMatchedTotalColumn;
-            delete profileDataGridNode._searchMatchedAverageColumn;
-            delete profileDataGridNode._searchMatchedCallsColumn;
-            delete profileDataGridNode._searchMatchedFunctionColumn;
-
-            if (percentUnits) {
-                if (lessThan) {
-                    if (profileDataGridNode.selfPercent < queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent < queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                } else if (greaterThan) {
-                    if (profileDataGridNode.selfPercent > queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent > queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-
-                if (equalTo) {
-                    if (profileDataGridNode.selfPercent == queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent == queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-            } else if (millisecondsUnits || secondsUnits) {
-                if (lessThan) {
-                    if (profileDataGridNode.selfTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                } else if (greaterThan) {
-                    if (profileDataGridNode.selfTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-
-                if (equalTo) {
-                    if (profileDataGridNode.selfTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-            } else {
-                if (equalTo && profileDataGridNode.numberOfCalls == queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-                if (greaterThan && profileDataGridNode.numberOfCalls > queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-                if (lessThan && profileDataGridNode.numberOfCalls < queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-            }
-
-            if (profileDataGridNode.functionName.hasSubstring(query, true) || profileDataGridNode.url.hasSubstring(query, true))
-                profileDataGridNode._searchMatchedFunctionColumn = true;
-
-            if (profileDataGridNode._searchMatchedSelfColumn ||
-                profileDataGridNode._searchMatchedTotalColumn ||
-                profileDataGridNode._searchMatchedAverageColumn ||
-                profileDataGridNode._searchMatchedCallsColumn ||
-                profileDataGridNode._searchMatchedFunctionColumn)
-            {
-                profileDataGridNode.refresh();
-                return true;
-            }
-
-            return false;
-        }
-
-        var current = this.profileDataGridTree.children[0];
-
-        while (current) {
-            if (matchesQuery(current)) {
-                this._searchResults.push({ profileNode: current });
-            }
-
-            current = current.traverseNextNode(false, null, false);
-        }
-
-        finishedCallback(this, this._searchResults.length);
-    },
-
-    jumpToFirstSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToLastSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    showingFirstSearchResult: function()
-    {
-        return (this._currentSearchResultIndex === 0);
-    },
-
-    showingLastSearchResult: function()
-    {
-        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
-    },
-
-    _jumpToSearchResult: function(index)
-    {
-        var searchResult = this._searchResults[index];
-        if (!searchResult)
-            return;
-
-        var profileNode = searchResult.profileNode;
-        profileNode.reveal();
-        profileNode.select();
-    },
-
-    _changeView: function(event)
-    {
-        if (!event || !this.profile)
-            return;
-
-        if (event.target.selectedIndex == 1 && this.view == "Heavy") {
-            this.profileDataGridTree = this.topDownProfileDataGridTree;
-            this._sortProfile();
-            this.view = "Tree";
-        } else if (event.target.selectedIndex == 0 && this.view == "Tree") {
-            this.profileDataGridTree = this.bottomUpProfileDataGridTree;
-            this._sortProfile();
-            this.view = "Heavy";
-        }
-
-        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
-            return;
-
-        // The current search needs to be performed again. First negate out previous match
-        // count by calling the search finished callback with a negative number of matches.
-        // Then perform the search again the with same query and callback.
-        this._searchFinishedCallback(this, -this._searchResults.length);
-        this.performSearch(this.currentQuery, this._searchFinishedCallback);
-    },
-
-    _percentClicked: function(event)
-    {
-        var currentState = this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent;
-        this.showSelfTimeAsPercent = !currentState;
-        this.showTotalTimeAsPercent = !currentState;
-        this.showAverageTimeAsPercent = !currentState;
-        this.refreshShowAsPercents();
-    },
-
-    _updatePercentButton: function()
-    {
-        if (this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent) {
-            this.percentButton.title = WebInspector.UIString("Show absolute total and self times.");
-            this.percentButton.toggled = true;
-        } else {
-            this.percentButton.title = WebInspector.UIString("Show total and self times as percentages.");
-            this.percentButton.toggled = false;
-        }
-    },
-
-    _focusClicked: function(event)
-    {
-        if (!this.dataGrid.selectedNode)
-            return;
-
-        this.resetButton.visible = true;
-        this.profileDataGridTree.focus(this.dataGrid.selectedNode);
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _excludeClicked: function(event)
-    {
-        var selectedNode = this.dataGrid.selectedNode
-
-        if (!selectedNode)
-            return;
-
-        selectedNode.deselect();
-
-        this.resetButton.visible = true;
-        this.profileDataGridTree.exclude(selectedNode);
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _resetClicked: function(event)
-    {
-        this.resetButton.visible = false;
-        this.profileDataGridTree.restore();
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _dataGridNodeSelected: function(node)
-    {
-        this.focusButton.disabled = false;
-        this.excludeButton.disabled = false;
-    },
-
-    _dataGridNodeDeselected: function(node)
-    {
-        this.focusButton.disabled = true;
-        this.excludeButton.disabled = true;
-    },
-
-    _sortData: function(event)
-    {
-        this._sortProfile(this.profile);
-    },
-
-    _sortProfile: function()
-    {
-        var sortAscending = this.dataGrid.sortOrder === "ascending";
-        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
-        var sortProperty = {
-                "average": "averageTime",
-                "self": "selfTime",
-                "total": "totalTime",
-                "calls": "numberOfCalls",
-                "function": "functionName"
-            }[sortColumnIdentifier];
-
-        this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
-
-        this.refresh();
-    },
-
-    _mouseDownInDataGrid: function(event)
-    {
-        if (event.detail < 2)
-            return;
-
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell || (!cell.hasStyleClass("total-column") && !cell.hasStyleClass("self-column") && !cell.hasStyleClass("average-column")))
-            return;
-
-        if (cell.hasStyleClass("total-column"))
-            this.showTotalTimeAsPercent = !this.showTotalTimeAsPercent;
-        else if (cell.hasStyleClass("self-column"))
-            this.showSelfTimeAsPercent = !this.showSelfTimeAsPercent;
-        else if (cell.hasStyleClass("average-column"))
-            this.showAverageTimeAsPercent = !this.showAverageTimeAsPercent;
-
-        this.refreshShowAsPercents();
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    _assignParentsInProfile: function()
-    {
-        var head = this.profile.head;
-        head.parent = null;
-        head.head = null;
-        var nodesToTraverse = [ { parent: head, children: head.children } ];
-        while (nodesToTraverse.length > 0) {
-            var pair = nodesToTraverse.shift();
-            var parent = pair.parent;
-            var children = pair.children;
-            var length = children.length;
-            for (var i = 0; i < length; ++i) {
-                children[i].head = head;
-                children[i].parent = parent;
-                if (children[i].children.length > 0)
-                    nodesToTraverse.push({ parent: children[i], children: children[i].children });
-            }
-        }
-    }
-}
-
-WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.CPUProfileType = function()
-{
-    WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));
-    this._recording = false;
-}
-
-WebInspector.CPUProfileType.TypeId = "CPU";
-
-WebInspector.CPUProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");
-    },
-
-    get buttonStyle()
-    {
-        return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";
-    },
-
-    buttonClicked: function()
-    {
-        this._recording = !this._recording;
-
-        if (this._recording)
-            InspectorBackend.startProfiling();
-        else
-            InspectorBackend.stopProfiling();
-    },
-
-    setRecordingProfile: function(isProfiling)
-    {
-        this._recording = isProfiling;
-    },
-
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        return new WebInspector.ProfileSidebarTreeElement(profile);
-    },
-
-    createView: function(profile)
-    {
-        return new WebInspector.CPUProfileView(profile);
-    }
-}
-
-WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
-
-/* DOMAgent.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMNode = function(doc, payload) {
-    this.ownerDocument = doc;
-
-    this.id = payload.id;
-    this.nodeType = payload.nodeType;
-    this.nodeName = payload.nodeName;
-    this.localName = payload.localName;
-    this._nodeValue = payload.nodeValue;
-    this.textContent = this.nodeValue;
-
-    this.attributes = [];
-    this._attributesMap = {};
-    if (payload.attributes)
-        this._setAttributesPayload(payload.attributes);
-
-    this._childNodeCount = payload.childNodeCount;
-    this.children = null;
-
-    this.nextSibling = null;
-    this.prevSibling = null;
-    this.firstChild = null;
-    this.lastChild = null;
-    this.parentNode = null;
-
-    if (payload.children)
-        this._setChildrenPayload(payload.children);
-
-    this._computedStyle = null;
-    this.style = null;
-    this._matchedCSSRules = [];
-
-    if (this.nodeType === Node.ELEMENT_NODE) {
-        // HTML and BODY from internal iframes should not overwrite top-level ones.
-        if (!this.ownerDocument.documentElement && this.nodeName === "HTML")
-            this.ownerDocument.documentElement = this;
-        if (!this.ownerDocument.body && this.nodeName === "BODY")
-            this.ownerDocument.body = this;
-    } else if (this.nodeType === Node.DOCUMENT_TYPE_NODE) {
-        this.publicId = payload.publicId;
-        this.systemId = payload.systemId;
-        this.internalSubset = payload.internalSubset;
-    }
-}
-
-WebInspector.DOMNode.prototype = {
-    hasAttributes: function()
-    {
-        return this.attributes.length > 0;
-    },
-
-    hasChildNodes: function()  {
-        return this._childNodeCount > 0;
-    },
-
-    get nodeValue() {
-        return this._nodeValue;
-    },
-
-    set nodeValue(value) {
-        if (this.nodeType != Node.TEXT_NODE)
-            return;
-        var self = this;
-        var callback = function()
-        {
-            self._nodeValue = value;
-            self.textContent = value;
-        };
-        this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, callback);
-    },
-
-    getAttribute: function(name)
-    {
-        var attr = this._attributesMap[name];
-        return attr ? attr.value : undefined;
-    },
-
-    setAttribute: function(name, value)
-    {
-        var self = this;
-        var callback = function()
-        {
-            var attr = self._attributesMap[name];
-            if (attr)
-                attr.value = value;
-            else
-                attr = self._addAttribute(name, value);
-        };
-        this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback);
-    },
-
-    removeAttribute: function(name)
-    {
-        var self = this;
-        var callback = function()
-        {
-            delete self._attributesMap[name];
-            for (var i = 0;  i < self.attributes.length; ++i) {
-                if (self.attributes[i].name == name) {
-                    self.attributes.splice(i, 1);
-                    break;
-                }
-            }
-        };
-        this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback);
-    },
-
-    _setAttributesPayload: function(attrs)
-    {
-        for (var i = 0; i < attrs.length; i += 2)
-            this._addAttribute(attrs[i], attrs[i + 1]);
-    },
-
-    _insertChild: function(prev, payload)
-    {
-        var node = new WebInspector.DOMNode(this.ownerDocument, payload);
-        if (!prev)
-            // First node
-            this.children = [ node ];
-        else
-            this.children.splice(this.children.indexOf(prev) + 1, 0, node);
-        this._renumber();
-        return node;
-    },
-
-    removeChild_: function(node)
-    {
-        this.children.splice(this.children.indexOf(node), 1);
-        node.parentNode = null;
-        this._renumber();
-    },
-
-    _setChildrenPayload: function(payloads)
-    {
-        this.children = [];
-        for (var i = 0; i < payloads.length; ++i) {
-            var payload = payloads[i];
-            var node = new WebInspector.DOMNode(this.ownerDocument, payload);
-            this.children.push(node);
-        }
-        this._renumber();
-    },
-
-    _renumber: function()
-    {
-        this._childNodeCount = this.children.length;
-        if (this._childNodeCount == 0) {
-            this.firstChild = null;
-            this.lastChild = null;
-            return;
-        }
-        this.firstChild = this.children[0];
-        this.lastChild = this.children[this._childNodeCount - 1];
-        for (var i = 0; i < this._childNodeCount; ++i) {
-            var child = this.children[i];
-            child.index = i;
-            child.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null;
-            child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null;
-            child.parentNode = this;
-        }
-    },
-
-    _addAttribute: function(name, value)
-    {
-        var attr = {
-            "name": name,
-            "value": value,
-            "_node": this
-        };
-        this._attributesMap[name] = attr;
-        this.attributes.push(attr);
-    },
-
-    _setStyles: function(computedStyle, inlineStyle, styleAttributes, matchedCSSRules)
-    {
-        this._computedStyle = new WebInspector.CSSStyleDeclaration(computedStyle);
-        this.style = new WebInspector.CSSStyleDeclaration(inlineStyle);
-
-        for (var name in styleAttributes) {
-            if (this._attributesMap[name])
-                this._attributesMap[name].style = new WebInspector.CSSStyleDeclaration(styleAttributes[name]);
-        }
-
-        this._matchedCSSRules = [];
-        for (var i = 0; i < matchedCSSRules.length; i++)
-            this._matchedCSSRules.push(WebInspector.CSSStyleDeclaration.parseRule(matchedCSSRules[i]));
-    },
-
-    _clearStyles: function()
-    {
-        this.computedStyle = null;
-        this.style = null;
-        for (var name in this._attributesMap)
-            this._attributesMap[name].style = null;
-        this._matchedCSSRules = null;
-    }
-}
-
-WebInspector.DOMDocument = function(domAgent, defaultView, payload)
-{
-    WebInspector.DOMNode.call(this, this, payload);
-    this._listeners = {};
-    this._domAgent = domAgent;
-    this.defaultView = defaultView;
-}
-
-WebInspector.DOMDocument.prototype = {
-
-    addEventListener: function(name, callback)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners) {
-            listeners = [];
-            this._listeners[name] = listeners;
-        }
-        listeners.push(callback);
-    },
-
-    removeEventListener: function(name, callback)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners)
-            return;
-
-        var index = listeners.indexOf(callback);
-        if (index != -1)
-            listeners.splice(index, 1);
-    },
-
-    _fireDomEvent: function(name, event)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners)
-            return;
-
-        for (var i = 0; i < listeners.length; ++i) {
-            var listener = listeners[i];
-            listener.call(this, event);
-        }
-    }
-}
-
-WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype;
-
-
-WebInspector.DOMWindow = function(domAgent)
-{
-    this._domAgent = domAgent;
-}
-
-WebInspector.DOMWindow.prototype = {
-    get document()
-    {
-        return this._domAgent.document;
-    },
-
-    get Node()
-    {
-        return WebInspector.DOMNode;
-    },
-
-    get Element()
-    {
-        return WebInspector.DOMNode;
-    },
-
-    Object: function()
-    {
-    },
-
-    getComputedStyle: function(node)
-    {
-        return node._computedStyle;
-    },
-
-    getMatchedCSSRules: function(node, pseudoElement, authorOnly)
-    {
-        return node._matchedCSSRules;
-    }
-}
-
-WebInspector.DOMAgent = function() {
-    this._window = new WebInspector.DOMWindow(this);
-    this._idToDOMNode = null;
-    this.document = null;
-}
-
-WebInspector.DOMAgent.prototype = {
-    get domWindow()
-    {
-        return this._window;
-    },
-
-    getChildNodesAsync: function(parent, callback)
-    {
-        var children = parent.children;
-        if (children) {
-            callback(children);
-            return;
-        }
-        function mycallback() {
-            callback(parent.children);
-        }
-        var callId = WebInspector.Callback.wrap(mycallback);
-        InspectorBackend.getChildNodes(callId, parent.id);
-    },
-
-    setAttributeAsync: function(node, name, value, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.setAttribute(WebInspector.Callback.wrap(mycallback), node.id, name, value);
-    },
-
-    removeAttributeAsync: function(node, name, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.removeAttribute(WebInspector.Callback.wrap(mycallback), node.id, name);
-    },
-
-    setTextNodeValueAsync: function(node, text, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.setTextNodeValue(WebInspector.Callback.wrap(mycallback), node.id, text);
-    },
-
-    _didApplyDomChange: function(node, callback, success)
-    {
-        if (!success)
-            return;
-        callback();
-        // TODO(pfeldman): Fix this hack.
-        var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node);
-        if (elem) {
-            elem._updateTitle();
-        }
-    },
-
-    _attributesUpdated: function(nodeId, attrsArray)
-    {
-        var node = this._idToDOMNode[nodeId];
-        node._setAttributesPayload(attrsArray);
-    },
-
-    nodeForId: function(nodeId) {
-        return this._idToDOMNode[nodeId];
-    },
-
-    _setDocument: function(payload)
-    {
-        this._idToDOMNode = {};
-        if (payload && "id" in payload) {
-            this.document = new WebInspector.DOMDocument(this, this._window, payload);
-            this._idToDOMNode[payload.id] = this.document;
-            this._bindNodes(this.document.children);
-        } else
-            this.document = null;
-        WebInspector.panels.elements.setDocument(this.document);
-    },
-
-    _setDetachedRoot: function(payload)
-    {
-        var root = new WebInspector.DOMNode(this.document, payload);
-        this._idToDOMNode[payload.id] = root;
-    },
-
-    _setChildNodes: function(parentId, payloads)
-    {
-        var parent = this._idToDOMNode[parentId];
-        parent._setChildrenPayload(payloads);
-        this._bindNodes(parent.children);
-    },
-
-    _bindNodes: function(children)
-    {
-        for (var i = 0; i < children.length; ++i) {
-            var child = children[i];
-            this._idToDOMNode[child.id] = child;
-            if (child.children)
-                this._bindNodes(child.children);
-        }
-    },
-
-    _childNodeCountUpdated: function(nodeId, newValue)
-    {
-        var node = this._idToDOMNode[nodeId];
-        node._childNodeCount = newValue;
-        var outline = WebInspector.panels.elements.treeOutline;
-        var treeElement = outline.findTreeElement(node);
-        if (treeElement)
-            treeElement.hasChildren = newValue;
-    },
-
-    _childNodeInserted: function(parentId, prevId, payload)
-    {
-        var parent = this._idToDOMNode[parentId];
-        var prev = this._idToDOMNode[prevId];
-        var node = parent._insertChild(prev, payload);
-        this._idToDOMNode[node.id] = node;
-        var event = { target : node, relatedNode : parent };
-        this.document._fireDomEvent("DOMNodeInserted", event);
-    },
-
-    _childNodeRemoved: function(parentId, nodeId)
-    {
-        var parent = this._idToDOMNode[parentId];
-        var node = this._idToDOMNode[nodeId];
-        parent.removeChild_(node);
-        var event = { target : node, relatedNode : parent };
-        this.document._fireDomEvent("DOMNodeRemoved", event);
-        delete this._idToDOMNode[nodeId];
-    }
-}
-
-WebInspector.Cookies = {}
-
-WebInspector.Cookies.getCookiesAsync = function(callback)
-{
-    function mycallback(cookies, cookiesString) {
-        if (cookiesString)
-            callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false);
-        else
-            callback(cookies, true);
-    }
-    var callId = WebInspector.Callback.wrap(mycallback);
-    InspectorBackend.getCookies(callId);
-}
-
-WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
-{
-    var rawCookies = rawCookieString.split(/;\s*/);
-    var cookies = [];
-
-    if (!(/^\s*$/.test(rawCookieString))) {
-        for (var i = 0; i < rawCookies.length; ++i) {
-            var cookie = rawCookies[i];
-            var delimIndex = cookie.indexOf("=");
-            var name = cookie.substring(0, delimIndex);
-            var value = cookie.substring(delimIndex + 1);
-            var size = name.length + value.length;
-            cookies.push({ name: name, value: value, size: size });
-        }
-    }
-
-    return cookies;
-}
-
-WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL)
-{
-    var match = resourceURL.match(WebInspector.URLRegExp);
-    if (!match)
-        return false;
-    // See WebInspector.URLRegExp for definitions of the group index constants.
-    if (!this.cookieDomainMatchesResourceDomain(cookie.domain, match[2]))
-        return false;
-    var resourcePort = match[3] ? match[3] : undefined;
-    var resourcePath = match[4] ? match[4] : '/';
-    return (resourcePath.indexOf(cookie.path) === 0
-        && (!cookie.port || resourcePort == cookie.port)
-        && (!cookie.secure || match[1].toLowerCase() === 'https'));
-}
-
-WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain)
-{
-    if (cookieDomain.charAt(0) !== '.')
-        return resourceDomain === cookieDomain;
-    return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)?" + cookieDomain.substring(1).escapeForRegExp() + "$"), "i");
-}
-
-WebInspector.EventListeners = {}
-
-WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback)
-{
-    if (!node)
-        return;
-
-    var callId = WebInspector.Callback.wrap(callback);
-    InspectorBackend.getEventListenersForNode(callId, node.id);
-}
-
-WebInspector.CSSStyleDeclaration = function(payload)
-{
-    this.id = payload.id;
-    this.width = payload.width;
-    this.height = payload.height;
-    this.__disabledProperties = payload.__disabledProperties;
-    this.__disabledPropertyValues = payload.__disabledPropertyValues;
-    this.__disabledPropertyPriorities = payload.__disabledPropertyPriorities;
-    this.uniqueStyleProperties = payload.uniqueStyleProperties;
-    this._shorthandValues = payload.shorthandValues;
-    this._propertyMap = {};
-    this._longhandProperties = {};
-    this.length = payload.properties.length;
-
-    for (var i = 0; i < this.length; ++i) {
-        var property = payload.properties[i];
-        var name = property.name;
-        this[i] = name;
-        this._propertyMap[name] = property;
-    }
-
-    // Index longhand properties.
-    for (var i = 0; i < this.uniqueStyleProperties.length; ++i) {
-        var name = this.uniqueStyleProperties[i];
-        var property = this._propertyMap[name];
-        if (property.shorthand) {
-            var longhands = this._longhandProperties[property.shorthand];
-            if (!longhands) {
-                longhands = [];
-                this._longhandProperties[property.shorthand] = longhands;
-            }
-            longhands.push(name);
-        }
-    }
-}
-
-WebInspector.CSSStyleDeclaration.parseStyle = function(payload)
-{
-    return new WebInspector.CSSStyleDeclaration(payload);
-}
-
-WebInspector.CSSStyleDeclaration.parseRule = function(payload)
-{
-    var rule = {};
-    rule.id = payload.id;
-    rule.selectorText = payload.selectorText;
-    rule.style = new WebInspector.CSSStyleDeclaration(payload.style);
-    rule.style.parentRule = rule;
-    rule.isUserAgent = payload.isUserAgent;
-    rule.isUser = payload.isUser;
-    rule.isViaInspector = payload.isViaInspector;
-    if (payload.parentStyleSheet)
-        rule.parentStyleSheet = { href: payload.parentStyleSheet.href };
-
-    return rule;
-}
-
-WebInspector.CSSStyleDeclaration.prototype = {
-    getPropertyValue: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.value : "";
-    },
-
-    getPropertyPriority: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.priority : "";
-    },
-
-    getPropertyShorthand: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.shorthand : "";
-    },
-
-    isPropertyImplicit: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.implicit : "";
-    },
-
-    styleTextWithShorthands: function()
-    {
-        var cssText = "";
-        var foundProperties = {};
-        for (var i = 0; i < this.length; ++i) {
-            var individualProperty = this[i];
-            var shorthandProperty = this.getPropertyShorthand(individualProperty);
-            var propertyName = (shorthandProperty || individualProperty);
-
-            if (propertyName in foundProperties)
-                continue;
-
-            if (shorthandProperty) {
-                var value = this.getPropertyValue(shorthandProperty);
-                var priority = this.getShorthandPriority(shorthandProperty);
-            } else {
-                var value = this.getPropertyValue(individualProperty);
-                var priority = this.getPropertyPriority(individualProperty);
-            }
-
-            foundProperties[propertyName] = true;
-
-            cssText += propertyName + ": " + value;
-            if (priority)
-                cssText += " !" + priority;
-            cssText += "; ";
-        }
-
-        return cssText;
-    },
-
-    getLonghandProperties: function(name)
-    {
-        return this._longhandProperties[name] || [];
-    },
-
-    getShorthandValue: function(shorthandProperty)
-    {
-        return this._shorthandValues[shorthandProperty];
-    },
-
-    getShorthandPriority: function(shorthandProperty)
-    {
-        var priority = this.getPropertyPriority(shorthandProperty);
-        if (priority)
-            return priority;
-
-        var longhands = this._longhandProperties[shorthandProperty];
-        return longhands ? this.getPropertyPriority(longhands[0]) : null;
-    }
-}
-
-WebInspector.attributesUpdated = function()
-{
-    this.domAgent._attributesUpdated.apply(this.domAgent, arguments);
-}
-
-WebInspector.setDocument = function()
-{
-    this.domAgent._setDocument.apply(this.domAgent, arguments);
-}
-
-WebInspector.setDetachedRoot = function()
-{
-    this.domAgent._setDetachedRoot.apply(this.domAgent, arguments);
-}
-
-WebInspector.setChildNodes = function()
-{
-    this.domAgent._setChildNodes.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeCountUpdated = function()
-{
-    this.domAgent._childNodeCountUpdated.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeInserted = function()
-{
-    this.domAgent._childNodeInserted.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeRemoved = function()
-{
-    this.domAgent._childNodeRemoved.apply(this.domAgent, arguments);
-}
-
-WebInspector.didGetCookies = WebInspector.Callback.processCallback;
-WebInspector.didGetChildNodes = WebInspector.Callback.processCallback;
-WebInspector.didPerformSearch = WebInspector.Callback.processCallback;
-WebInspector.didApplyDomChange = WebInspector.Callback.processCallback;
-WebInspector.didRemoveAttribute = WebInspector.Callback.processCallback;
-WebInspector.didSetTextNodeValue = WebInspector.Callback.processCallback;
-WebInspector.didGetEventListenersForNode = WebInspector.Callback.processCallback;
-
-/* InjectedScript.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var InjectedScript = {};
-
-// Called from within InspectorController on the 'inspected page' side.
-InjectedScript.reset = function()
-{
-    InjectedScript._styles = {};
-    InjectedScript._styleRules = {};
-    InjectedScript._lastStyleId = 0;
-    InjectedScript._lastStyleRuleId = 0;
-    InjectedScript._searchResults = [];
-    InjectedScript._includedInSearchResultsPropertyName = "__includedInInspectorSearchResults";
-}
-
-InjectedScript.reset();
-
-InjectedScript.dispatch = function(methodName, args, callId)
-{
-    var argsArray = JSON.parse(args);
-    if (callId)
-        argsArray.splice(0, 0, callId);  // Methods that run asynchronously have a call back id parameter.
-    var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
-    if (typeof result === "undefined") {
-        InjectedScript._window().console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
-        result = null;
-    }
-    return JSON.stringify(result);
-}
-
-InjectedScript.getStyles = function(nodeId, authorOnly)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    var defaultView = node.ownerDocument.defaultView;
-    var matchedRules = defaultView.getMatchedCSSRules(node, "", authorOnly);
-    var matchedCSSRules = [];
-    for (var i = 0; matchedRules && i < matchedRules.length; ++i)
-        matchedCSSRules.push(InjectedScript._serializeRule(matchedRules[i]));
-
-    var styleAttributes = {};
-    var attributes = node.attributes;
-    for (var i = 0; attributes && i < attributes.length; ++i) {
-        if (attributes[i].style)
-            styleAttributes[attributes[i].name] = InjectedScript._serializeStyle(attributes[i].style, true);
-    }
-    var result = {};
-    result.inlineStyle = InjectedScript._serializeStyle(node.style, true);
-    result.computedStyle = InjectedScript._serializeStyle(defaultView.getComputedStyle(node));
-    result.matchedCSSRules = matchedCSSRules;
-    result.styleAttributes = styleAttributes;
-    return result;
-}
-
-InjectedScript.getComputedStyle = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    return InjectedScript._serializeStyle(node.ownerDocument.defaultView.getComputedStyle(node));
-}
-
-InjectedScript.getInlineStyle = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    return InjectedScript._serializeStyle(node.style, true);
-}
-
-InjectedScript.applyStyleText = function(styleId, styleText, propertyName)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    var styleTextLength = styleText.length;
-
-    // Create a new element to parse the user input CSS.
-    var parseElement = document.createElement("span");
-    parseElement.setAttribute("style", styleText);
-
-    var tempStyle = parseElement.style;
-    if (tempStyle.length || !styleTextLength) {
-        // The input was parsable or the user deleted everything, so remove the
-        // original property from the real style declaration. If this represents
-        // a shorthand remove all the longhand properties.
-        if (style.getPropertyShorthand(propertyName)) {
-            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
-            for (var i = 0; i < longhandProperties.length; ++i)
-                style.removeProperty(longhandProperties[i]);
-        } else
-            style.removeProperty(propertyName);
-    }
-
-    // Notify caller that the property was successfully deleted.
-    if (!styleTextLength)
-        return [null, [propertyName]];
-
-    if (!tempStyle.length)
-        return false;
-
-    // Iterate of the properties on the test element's style declaration and
-    // add them to the real style declaration. We take care to move shorthands.
-    var foundShorthands = {};
-    var changedProperties = [];
-    var uniqueProperties = InjectedScript._getUniqueStyleProperties(tempStyle);
-    for (var i = 0; i < uniqueProperties.length; ++i) {
-        var name = uniqueProperties[i];
-        var shorthand = tempStyle.getPropertyShorthand(name);
-
-        if (shorthand && shorthand in foundShorthands)
-            continue;
-
-        if (shorthand) {
-            var value = InjectedScript._getShorthandValue(tempStyle, shorthand);
-            var priority = InjectedScript._getShorthandPriority(tempStyle, shorthand);
-            foundShorthands[shorthand] = true;
-        } else {
-            var value = tempStyle.getPropertyValue(name);
-            var priority = tempStyle.getPropertyPriority(name);
-        }
-
-        // Set the property on the real style declaration.
-        style.setProperty((shorthand || name), value, priority);
-        changedProperties.push(shorthand || name);
-    }
-    return [InjectedScript._serializeStyle(style, true), changedProperties];
-}
-
-InjectedScript.setStyleText = function(style, cssText)
-{
-    style.cssText = cssText;
-    return true;
-}
-
-InjectedScript.toggleStyleEnabled = function(styleId, propertyName, disabled)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    if (disabled) {
-        if (!style.__disabledPropertyValues || !style.__disabledPropertyPriorities) {
-            var inspectedWindow = InjectedScript._window();
-            style.__disabledProperties = new inspectedWindow.Object;
-            style.__disabledPropertyValues = new inspectedWindow.Object;
-            style.__disabledPropertyPriorities = new inspectedWindow.Object;
-        }
-
-        style.__disabledPropertyValues[propertyName] = style.getPropertyValue(propertyName);
-        style.__disabledPropertyPriorities[propertyName] = style.getPropertyPriority(propertyName);
-
-        if (style.getPropertyShorthand(propertyName)) {
-            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
-            for (var i = 0; i < longhandProperties.length; ++i) {
-                style.__disabledProperties[longhandProperties[i]] = true;
-                style.removeProperty(longhandProperties[i]);
-            }
-        } else {
-            style.__disabledProperties[propertyName] = true;
-            style.removeProperty(propertyName);
-        }
-    } else if (style.__disabledProperties && style.__disabledProperties[propertyName]) {
-        var value = style.__disabledPropertyValues[propertyName];
-        var priority = style.__disabledPropertyPriorities[propertyName];
-
-        style.setProperty(propertyName, value, priority);
-        delete style.__disabledProperties[propertyName];
-        delete style.__disabledPropertyValues[propertyName];
-        delete style.__disabledPropertyPriorities[propertyName];
-    }
-    return InjectedScript._serializeStyle(style, true);
-}
-
-InjectedScript.applyStyleRuleText = function(ruleId, newContent, selectedNodeId)
-{
-    var rule = InjectedScript._styleRules[ruleId];
-    if (!rule)
-        return false;
-
-    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
-
-    try {
-        var stylesheet = rule.parentStyleSheet;
-        stylesheet.addRule(newContent);
-        var newRule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
-        newRule.style.cssText = rule.style.cssText;
-
-        var parentRules = stylesheet.cssRules;
-        for (var i = 0; i < parentRules.length; ++i) {
-            if (parentRules[i] === rule) {
-                rule.parentStyleSheet.removeRule(i);
-                break;
-            }
-        }
-
-        return [InjectedScript._serializeRule(newRule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode)];
-    } catch(e) {
-        // Report invalid syntax.
-        return false;
-    }
-}
-
-InjectedScript.addStyleSelector = function(newContent, selectedNodeId)
-{
-    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
-    if (!selectedNode)
-        return false;
-    var ownerDocument = selectedNode.ownerDocument;
-
-    var stylesheet = ownerDocument.__stylesheet;
-    if (!stylesheet) {
-        var head = ownerDocument.head;
-        var styleElement = ownerDocument.createElement("style");
-        styleElement.type = "text/css";
-        head.appendChild(styleElement);
-        stylesheet = ownerDocument.styleSheets[ownerDocument.styleSheets.length - 1];
-        ownerDocument.__stylesheet = stylesheet;
-    }
-
-    try {
-        stylesheet.addRule(newContent);
-    } catch (e) {
-        // Invalid Syntax for a Selector
-        return false;
-    }
-
-    var rule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
-    rule.__isViaInspector = true;
-
-    return [ InjectedScript._serializeRule(rule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode) ];
-}
-
-InjectedScript._doesSelectorAffectNode = function(selectorText, node)
-{
-    if (!node)
-        return false;
-    var nodes = node.ownerDocument.querySelectorAll(selectorText);
-    for (var i = 0; i < nodes.length; ++i) {
-        if (nodes[i] === node) {
-            return true;
-        }
-    }
-    return false;
-}
-
-InjectedScript.setStyleProperty = function(styleId, name, value)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    style.setProperty(name, value, "");
-    return true;
-}
-
-InjectedScript._serializeRule = function(rule)
-{
-    var parentStyleSheet = rule.parentStyleSheet;
-
-    var ruleValue = {};
-    ruleValue.selectorText = rule.selectorText;
-    if (parentStyleSheet) {
-        ruleValue.parentStyleSheet = {};
-        ruleValue.parentStyleSheet.href = parentStyleSheet.href;
-    }
-    ruleValue.isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode && !parentStyleSheet.href;
-    ruleValue.isUser = parentStyleSheet && parentStyleSheet.ownerNode && parentStyleSheet.ownerNode.nodeName == "#document";
-    ruleValue.isViaInspector = !!rule.__isViaInspector;
-
-    // Bind editable scripts only.
-    var doBind = !ruleValue.isUserAgent && !ruleValue.isUser;
-    ruleValue.style = InjectedScript._serializeStyle(rule.style, doBind);
-
-    if (doBind) {
-        if (!rule.id) {
-            rule.id = InjectedScript._lastStyleRuleId++;
-            InjectedScript._styleRules[rule.id] = rule;
-        }
-        ruleValue.id = rule.id;
-    }
-    return ruleValue;
-}
-
-InjectedScript._serializeStyle = function(style, doBind)
-{
-    var result = {};
-    result.width = style.width;
-    result.height = style.height;
-    result.__disabledProperties = style.__disabledProperties;
-    result.__disabledPropertyValues = style.__disabledPropertyValues;
-    result.__disabledPropertyPriorities = style.__disabledPropertyPriorities;
-    result.properties = [];
-    result.shorthandValues = {};
-    var foundShorthands = {};
-    for (var i = 0; i < style.length; ++i) {
-        var property = {};
-        var name = style[i];
-        property.name = name;
-        property.priority = style.getPropertyPriority(name);
-        property.implicit = style.isPropertyImplicit(name);
-        var shorthand =  style.getPropertyShorthand(name);
-        property.shorthand = shorthand;
-        if (shorthand && !(shorthand in foundShorthands)) {
-            foundShorthands[shorthand] = true;
-            result.shorthandValues[shorthand] = InjectedScript._getShorthandValue(style, shorthand);
-        }
-        property.value = style.getPropertyValue(name);
-        result.properties.push(property);
-    }
-    result.uniqueStyleProperties = InjectedScript._getUniqueStyleProperties(style);
-
-    if (doBind) {
-        if (!style.id) {
-            style.id = InjectedScript._lastStyleId++;
-            InjectedScript._styles[style.id] = style;
-        }
-        result.id = style.id;
-    }
-    return result;
-}
-
-InjectedScript._getUniqueStyleProperties = function(style)
-{
-    var properties = [];
-    var foundProperties = {};
-
-    for (var i = 0; i < style.length; ++i) {
-        var property = style[i];
-        if (property in foundProperties)
-            continue;
-        foundProperties[property] = true;
-        properties.push(property);
-    }
-
-    return properties;
-}
-
-
-InjectedScript._getLonghandProperties = function(style, shorthandProperty)
-{
-    var properties = [];
-    var foundProperties = {};
-
-    for (var i = 0; i < style.length; ++i) {
-        var individualProperty = style[i];
-        if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-            continue;
-        foundProperties[individualProperty] = true;
-        properties.push(individualProperty);
-    }
-
-    return properties;
-}
-
-InjectedScript._getShorthandValue = function(style, shorthandProperty)
-{
-    var value = style.getPropertyValue(shorthandProperty);
-    if (!value) {
-        // Some shorthands (like border) return a null value, so compute a shorthand value.
-        // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823 is fixed.
-
-        var foundProperties = {};
-        for (var i = 0; i < style.length; ++i) {
-            var individualProperty = style[i];
-            if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-                continue;
-
-            var individualValue = style.getPropertyValue(individualProperty);
-            if (style.isPropertyImplicit(individualProperty) || individualValue === "initial")
-                continue;
-
-            foundProperties[individualProperty] = true;
-
-            if (!value)
-                value = "";
-            else if (value.length)
-                value += " ";
-            value += individualValue;
-        }
-    }
-    return value;
-}
-
-InjectedScript._getShorthandPriority = function(style, shorthandProperty)
-{
-    var priority = style.getPropertyPriority(shorthandProperty);
-    if (!priority) {
-        for (var i = 0; i < style.length; ++i) {
-            var individualProperty = style[i];
-            if (style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-                continue;
-            priority = style.getPropertyPriority(individualProperty);
-            break;
-        }
-    }
-    return priority;
-}
-
-InjectedScript.getPrototypes = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    var result = [];
-    for (var prototype = node; prototype; prototype = prototype.__proto__) {
-        var title = Object.describe(prototype, true);
-        if (title.match(/Prototype$/)) {
-            title = title.replace(/Prototype$/, "");
-        }
-        result.push(title);
-    }
-    return result;
-}
-
-InjectedScript.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object)
-        return false;
-
-    var properties = [];
-
-    // Go over properties, prepare results.
-    for (var propertyName in object) {
-        if (!ignoreHasOwnProperty && "hasOwnProperty" in object && !object.hasOwnProperty(propertyName))
-            continue;
-
-        var property = {};
-        property.name = propertyName;
-        property.parentObjectProxy = objectProxy;
-        var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
-        if (!property.isGetter) {
-            var childObject = object[propertyName];
-            var childObjectProxy = new InjectedScript.createProxyObject(childObject, objectProxy.objectId, abbreviate);
-            childObjectProxy.path = objectProxy.path ? objectProxy.path.slice() : [];
-            childObjectProxy.path.push(propertyName);
-            childObjectProxy.protoDepth = objectProxy.protoDepth || 0;
-            property.value = childObjectProxy;
-        } else {
-            // FIXME: this should show something like "getter" (bug 16734).
-            property.value = { description: "\u2014" }; // em dash
-            property.isGetter = true;
-        }
-        properties.push(property);
-    }
-    return properties;
-}
-
-InjectedScript.setPropertyValue = function(objectProxy, propertyName, expression)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object)
-        return false;
-
-    var expressionLength = expression.length;
-    if (!expressionLength) {
-        delete object[propertyName];
-        return !(propertyName in object);
-    }
-
-    try {
-        // Surround the expression in parenthesis so the result of the eval is the result
-        // of the whole expression not the last potential sub-expression.
-
-        // There is a regression introduced here: eval is now happening against global object,
-        // not call frame while on a breakpoint.
-        // TODO: bring evaluation against call frame back.
-        var result = InjectedScript._window().eval("(" + expression + ")");
-        // Store the result in the property.
-        object[propertyName] = result;
-        return true;
-    } catch(e) {
-        try {
-            var result = InjectedScript._window().eval("\"" + expression.escapeCharacters("\"") + "\"");
-            object[propertyName] = result;
-            return true;
-        } catch(e) {
-            return false;
-        }
-    }
-}
-
-InjectedScript.getNodePropertyValue = function(nodeId, propertyName)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    var result = node[propertyName];
-    return result !== undefined ? result : false;
-}
-
-InjectedScript.setOuterHTML = function(nodeId, value, expanded)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    var parent = node.parentNode;
-    var prevSibling = node.previousSibling;
-    node.outerHTML = value;
-    var newNode = prevSibling ? prevSibling.nextSibling : parent.firstChild;
-
-    return InjectedScriptHost.pushNodePathToFrontend(newNode, expanded, false);
-}
-
-InjectedScript.getCompletions = function(expression, includeInspectorCommandLineAPI, callFrameId)
-{
-    var props = {};
-    try {
-        var expressionResult;
-        // Evaluate on call frame if call frame id is available.
-        if (typeof callFrameId === "number") {
-            var callFrame = InjectedScript._callFrameForId(callFrameId);
-            if (!callFrame)
-                return props;
-            if (expression)
-                expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
-            else {
-                // Evaluate into properties in scope of the selected call frame.
-                var scopeChain = callFrame.scopeChain;
-                for (var i = 0; i < scopeChain.length; ++i) {
-                    var scopeObject = scopeChain[i];
-                    try {
-                        for (var propertyName in scopeObject)
-                            props[propertyName] = true;
-                    } catch (e) {
-                    }
-                }
-            }
-        } else {
-            if (!expression)
-                expression = "this";
-            expressionResult = InjectedScript._evaluateOn(InjectedScript._window().eval, InjectedScript._window(), expression);
-        }
-        if (expressionResult)
-            for (var prop in expressionResult)
-                props[prop] = true;
-        if (includeInspectorCommandLineAPI)
-            for (var prop in InjectedScript._window().console._inspectorCommandLineAPI)
-                if (prop.charAt(0) !== '_')
-                    props[prop] = true;
-    } catch(e) {
-    }
-    return props;
-}
-
-InjectedScript.evaluate = function(expression, objectGroup)
-{
-    return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression, objectGroup);
-}
-
-InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup)
-{
-    var result = {};
-    try {
-        result.value = InjectedScriptHost.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression), objectGroup);
-        // Handle error that might have happened while describing result.
-        if (result.value.errorText) {
-            result.value = result.value.errorText;
-            result.isException = true;
-        }
-    } catch (e) {
-        result.value = e.toString();
-        result.isException = true;
-    }
-    return result;
-}
-
-InjectedScript._evaluateOn = function(evalFunction, object, expression)
-{
-    InjectedScript._ensureCommandLineAPIInstalled(evalFunction, object);
-    // Surround the expression in with statements to inject our command line API so that
-    // the window object properties still take more precedent than our API functions.
-    expression = "with (window.console._inspectorCommandLineAPI) { with (window) {\n" + expression + "\n} }";
-    var value = evalFunction.call(object, expression);
-
-    // When evaluating on call frame error is not thrown, but returned as a value.
-    if (Object.type(value) === "error")
-        throw value.toString();
-
-    return value;
-}
-
-InjectedScript.addInspectedNode = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    InjectedScript._ensureCommandLineAPIInstalled(InjectedScript._window().eval, InjectedScript._window());
-    var inspectedNodes = InjectedScript._window().console._inspectorCommandLineAPI._inspectedNodes;
-    inspectedNodes.unshift(node);
-    if (inspectedNodes.length >= 5)
-        inspectedNodes.pop();
-    return true;
-}
-
-InjectedScript.performSearch = function(whitespaceTrimmedQuery)
-{
-    var tagNameQuery = whitespaceTrimmedQuery;
-    var attributeNameQuery = whitespaceTrimmedQuery;
-    var startTagFound = (tagNameQuery.indexOf("<") === 0);
-    var endTagFound = (tagNameQuery.lastIndexOf(">") === (tagNameQuery.length - 1));
-
-    if (startTagFound || endTagFound) {
-        var tagNameQueryLength = tagNameQuery.length;
-        tagNameQuery = tagNameQuery.substring((startTagFound ? 1 : 0), (endTagFound ? (tagNameQueryLength - 1) : tagNameQueryLength));
-    }
-
-    // Check the tagNameQuery is it is a possibly valid tag name.
-    if (!/^[a-zA-Z0-9\-_:]+$/.test(tagNameQuery))
-        tagNameQuery = null;
-
-    // Check the attributeNameQuery is it is a possibly valid tag name.
-    if (!/^[a-zA-Z0-9\-_:]+$/.test(attributeNameQuery))
-        attributeNameQuery = null;
-
-    const escapedQuery = whitespaceTrimmedQuery.escapeCharacters("'");
-    const escapedTagNameQuery = (tagNameQuery ? tagNameQuery.escapeCharacters("'") : null);
-    const escapedWhitespaceTrimmedQuery = whitespaceTrimmedQuery.escapeCharacters("'");
-    const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
-
-    function addNodesToResults(nodes, length, getItem)
-    {
-        if (!length)
-            return;
-
-        var nodeIds = [];
-        for (var i = 0; i < length; ++i) {
-            var node = getItem.call(nodes, i);
-            // Skip this node if it already has the property.
-            if (searchResultsProperty in node)
-                continue;
-
-            if (!InjectedScript._searchResults.length) {
-                InjectedScript._currentSearchResultIndex = 0;
-            }
-
-            node[searchResultsProperty] = true;
-            InjectedScript._searchResults.push(node);
-            var nodeId = InjectedScriptHost.pushNodePathToFrontend(node, false, false);
-            nodeIds.push(nodeId);
-        }
-        InjectedScriptHost.addNodesToSearchResult(nodeIds.join(","));
-    }
-
-    function matchExactItems(doc)
-    {
-        matchExactId.call(this, doc);
-        matchExactClassNames.call(this, doc);
-        matchExactTagNames.call(this, doc);
-        matchExactAttributeNames.call(this, doc);
-    }
-
-    function matchExactId(doc)
-    {
-        const result = doc.__proto__.getElementById.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, (result ? 1 : 0), function() { return this });
-    }
-
-    function matchExactClassNames(doc)
-    {
-        const result = doc.__proto__.getElementsByClassName.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchExactTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.getElementsByTagName.call(doc, tagNameQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchExactAttributeNames(doc)
-    {
-        if (!attributeNameQuery)
-            return;
-        const result = doc.__proto__.querySelectorAll.call(doc, "[" + attributeNameQuery + "]");
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchPartialTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchStartOfTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.evaluate.call(doc, "//*[starts-with(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchPartialTagNamesAndAttributeValues(doc)
-    {
-        if (!tagNameQuery) {
-            matchPartialAttributeValues.call(this, doc);
-            return;
-        }
-
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "') or contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchPartialAttributeValues(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchStyleSelector(doc)
-    {
-        const result = doc.__proto__.querySelectorAll.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchPlainText(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, "//text()[contains(., '" + escapedQuery + "')] | //comment()[contains(., '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchXPathQuery(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, whitespaceTrimmedQuery, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function finishedSearching()
-    {
-        // Remove the searchResultsProperty now that the search is finished.
-        for (var i = 0; i < InjectedScript._searchResults.length; ++i)
-            delete InjectedScript._searchResults[i][searchResultsProperty];
-    }
-
-    const mainFrameDocument = InjectedScript._window().document;
-    const searchDocuments = [mainFrameDocument];
-    var searchFunctions;
-    if (tagNameQuery && startTagFound && endTagFound)
-        searchFunctions = [matchExactTagNames, matchPlainText];
-    else if (tagNameQuery && startTagFound)
-        searchFunctions = [matchStartOfTagNames, matchPlainText];
-    else if (tagNameQuery && endTagFound) {
-        // FIXME: we should have a matchEndOfTagNames search function if endTagFound is true but not startTagFound.
-        // This requires ends-with() support in XPath, WebKit only supports starts-with() and contains().
-        searchFunctions = [matchPartialTagNames, matchPlainText];
-    } else if (whitespaceTrimmedQuery === "//*" || whitespaceTrimmedQuery === "*") {
-        // These queries will match every node. Matching everything isn't useful and can be slow for large pages,
-        // so limit the search functions list to plain text and attribute matching.
-        searchFunctions = [matchPartialAttributeValues, matchPlainText];
-    } else
-        searchFunctions = [matchExactItems, matchStyleSelector, matchPartialTagNamesAndAttributeValues, matchPlainText, matchXPathQuery];
-
-    // Find all frames, iframes and object elements to search their documents.
-    const querySelectorAllFunction = InjectedScript._window().Document.prototype.querySelectorAll;
-    const subdocumentResult = querySelectorAllFunction.call(mainFrameDocument, "iframe, frame, object");
-
-    for (var i = 0; i < subdocumentResult.length; ++i) {
-        var element = subdocumentResult.item(i);
-        if (element.contentDocument)
-            searchDocuments.push(element.contentDocument);
-    }
-
-    const panel = InjectedScript;
-    var documentIndex = 0;
-    var searchFunctionIndex = 0;
-    var chunkIntervalIdentifier = null;
-
-    // Split up the work into chunks so we don't block the UI thread while processing.
-
-    function processChunk()
-    {
-        var searchDocument = searchDocuments[documentIndex];
-        var searchFunction = searchFunctions[searchFunctionIndex];
-
-        if (++searchFunctionIndex > searchFunctions.length) {
-            searchFunction = searchFunctions[0];
-            searchFunctionIndex = 0;
-
-            if (++documentIndex > searchDocuments.length) {
-                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
-                    delete panel._currentSearchChunkIntervalIdentifier;
-                clearInterval(chunkIntervalIdentifier);
-                finishedSearching.call(panel);
-                return;
-            }
-
-            searchDocument = searchDocuments[documentIndex];
-        }
-
-        if (!searchDocument || !searchFunction)
-            return;
-
-        try {
-            searchFunction.call(panel, searchDocument);
-        } catch(err) {
-            // ignore any exceptions. the query might be malformed, but we allow that.
-        }
-    }
-
-    processChunk();
-
-    chunkIntervalIdentifier = setInterval(processChunk, 25);
-    InjectedScript._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
-    return true;
-}
-
-InjectedScript.searchCanceled = function()
-{
-    if (InjectedScript._searchResults) {
-        const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
-        for (var i = 0; i < this._searchResults.length; ++i) {
-            var node = this._searchResults[i];
-
-            // Remove the searchResultsProperty since there might be an unfinished search.
-            delete node[searchResultsProperty];
-        }
-    }
-
-    if (InjectedScript._currentSearchChunkIntervalIdentifier) {
-        clearInterval(InjectedScript._currentSearchChunkIntervalIdentifier);
-        delete InjectedScript._currentSearchChunkIntervalIdentifier;
-    }
-    InjectedScript._searchResults = [];
-    return true;
-}
-
-InjectedScript.openInInspectedWindow = function(url)
-{
-    // Don't call window.open on wrapper - popup blocker mutes it.
-    // URIs should have no double quotes.
-    InjectedScript._window().eval("window.open(\"" + url + "\")");
-    return true;
-}
-
-InjectedScript.getCallFrames = function()
-{
-    var callFrame = InjectedScriptHost.currentCallFrame();
-    if (!callFrame)
-        return false;
-
-    var result = [];
-    var depth = 0;
-    do {
-        result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
-        callFrame = callFrame.caller;
-    } while (callFrame);
-    return result;
-}
-
-InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
-{
-    var callFrame = InjectedScript._callFrameForId(callFrameId);
-    if (!callFrame)
-        return false;
-    return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
-}
-
-InjectedScript._callFrameForId = function(id)
-{
-    var callFrame = InjectedScriptHost.currentCallFrame();
-    while (--id >= 0 && callFrame)
-        callFrame = callFrame.caller;
-    return callFrame;
-}
-
-InjectedScript.clearConsoleMessages = function()
-{
-    InjectedScriptHost.clearConsoleMessages();
-    return true;
-}
-
-InjectedScript._inspectObject = function(o)
-{
-    if (arguments.length === 0)
-        return;
-
-    var inspectedWindow = InjectedScript._window();
-    inspectedWindow.console.log(o);
-    if (Object.type(o) === "node") {
-        InjectedScriptHost.pushNodePathToFrontend(o, false, true);
-    } else {
-        switch (Object.describe(o)) {
-            case "Database":
-                InjectedScriptHost.selectDatabase(o);
-                break;
-            case "Storage":
-                InjectedScriptHost.selectDOMStorage(o);
-                break;
-        }
-    }
-}
-
-InjectedScript._copy = function(o)
-{
-    if (Object.type(o) === "node") {
-        var nodeId = InjectedScriptHost.pushNodePathToFrontend(o, false, false);
-        InjectedScriptHost.copyNode(nodeId);
-    } else {
-        InjectedScriptHost.copyText(o);
-    }
-}
-
-InjectedScript._ensureCommandLineAPIInstalled = function(evalFunction, evalObject)
-{
-    if (evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI"))
-        return;
-    var inspectorCommandLineAPI = evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI = { \n\
-        $: function() { return document.getElementById.apply(document, arguments) }, \n\
-        $$: function() { return document.querySelectorAll.apply(document, arguments) }, \n\
-        $x: function(xpath, context) \n\
-        { \n\
-            var nodes = []; \n\
-            try { \n\
-                var doc = context || document; \n\
-                var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); \n\
-                var node; \n\
-                while (node = results.iterateNext()) nodes.push(node); \n\
-            } catch (e) {} \n\
-            return nodes; \n\
-        }, \n\
-        dir: function() { return console.dir.apply(console, arguments) }, \n\
-        dirxml: function() { return console.dirxml.apply(console, arguments) }, \n\
-        keys: function(o) { var a = []; for (var k in o) a.push(k); return a; }, \n\
-        values: function(o) { var a = []; for (var k in o) a.push(o[k]); return a; }, \n\
-        profile: function() { return console.profile.apply(console, arguments) }, \n\
-        profileEnd: function() { return console.profileEnd.apply(console, arguments) }, \n\
-        _logEvent: function _inspectorCommandLineAPI_logEvent(e) { console.log(e.type, e); }, \n\
-        _allEventTypes: [\"mouse\", \"key\", \"load\", \"unload\", \"abort\", \"error\", \n\
-            \"select\", \"change\", \"submit\", \"reset\", \"focus\", \"blur\", \n\
-            \"resize\", \"scroll\"], \n\
-        _normalizeEventTypes: function(t) \n\
-        { \n\
-            if (typeof t === \"undefined\") \n\
-                t = console._inspectorCommandLineAPI._allEventTypes; \n\
-            else if (typeof t === \"string\") \n\
-                t = [t]; \n\
-            var i, te = []; \n\
-            for (i = 0; i < t.length; i++) { \n\
-                if (t[i] === \"mouse\") \n\
-                    te.splice(0, 0, \"mousedown\", \"mouseup\", \"click\", \"dblclick\", \n\
-                        \"mousemove\", \"mouseover\", \"mouseout\"); \n\
-                else if (t[i] === \"key\") \n\
-                    te.splice(0, 0, \"keydown\", \"keyup\", \"keypress\"); \n\
-                else \n\
-                    te.push(t[i]); \n\
-            } \n\
-            return te; \n\
-        }, \n\
-        monitorEvents: function(o, t) \n\
-        { \n\
-            if (!o || !o.addEventListener || !o.removeEventListener) \n\
-                return; \n\
-            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
-            for (i = 0; i < t.length; i++) { \n\
-                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-                o.addEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-            } \n\
-        }, \n\
-        unmonitorEvents: function(o, t) \n\
-        { \n\
-            if (!o || !o.removeEventListener) \n\
-                return; \n\
-            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
-            for (i = 0; i < t.length; i++) { \n\
-                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-            } \n\
-        }, \n\
-        _inspectedNodes: [], \n\
-        get $0() { return console._inspectorCommandLineAPI._inspectedNodes[0] }, \n\
-        get $1() { return console._inspectorCommandLineAPI._inspectedNodes[1] }, \n\
-        get $2() { return console._inspectorCommandLineAPI._inspectedNodes[2] }, \n\
-        get $3() { return console._inspectorCommandLineAPI._inspectedNodes[3] }, \n\
-        get $4() { return console._inspectorCommandLineAPI._inspectedNodes[4] }, \n\
-    };");
-
-    inspectorCommandLineAPI.clear = InjectedScriptHost.wrapCallback(InjectedScript.clearConsoleMessages);
-    inspectorCommandLineAPI.inspect = InjectedScriptHost.wrapCallback(InjectedScript._inspectObject);
-    inspectorCommandLineAPI.copy = InjectedScriptHost.wrapCallback(InjectedScript._copy);
-}
-
-InjectedScript._resolveObject = function(objectProxy)
-{
-    var object = InjectedScript._objectForId(objectProxy.objectId);
-    var path = objectProxy.path;
-    var protoDepth = objectProxy.protoDepth;
-
-    // Follow the property path.
-    for (var i = 0; object && path && i < path.length; ++i)
-        object = object[path[i]];
-
-    // Get to the necessary proto layer.
-    for (var i = 0; object && protoDepth && i < protoDepth; ++i)
-        object = object.__proto__;
-
-    return object;
-}
-
-InjectedScript._window = function()
-{
-    // TODO: replace with 'return window;' once this script is injected into
-    // the page's context.
-    return InjectedScriptHost.inspectedWindow();
-}
-
-InjectedScript._nodeForId = function(nodeId)
-{
-    if (!nodeId)
-        return null;
-    return InjectedScriptHost.nodeForId(nodeId);
-}
-
-InjectedScript._objectForId = function(objectId)
-{
-    // There are three types of object ids used:
-    // - numbers point to DOM Node via the InspectorDOMAgent mapping
-    // - strings point to console objects cached in InspectorController for lazy evaluation upon them
-    // - objects contain complex ids and are currently used for scoped objects
-    if (typeof objectId === "number") {
-        return InjectedScript._nodeForId(objectId);
-    } else if (typeof objectId === "string") {
-        return InjectedScriptHost.unwrapObject(objectId);
-    } else if (typeof objectId === "object") {
-        var callFrame = InjectedScript._callFrameForId(objectId.callFrame);
-        if (objectId.thisObject)
-            return callFrame.thisObject;
-        else
-            return callFrame.scopeChain[objectId.chainIndex];
-    }
-    return objectId;
-}
-
-InjectedScript.pushNodeToFrontend = function(objectProxy)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object || Object.type(object) !== "node")
-        return false;
-    return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
-}
-
-InjectedScript.nodeByPath = function(path)
-{
-    // We make this call through the injected script only to get a nice
-    // callback for it.
-    return InjectedScriptHost.pushNodeByPathToFrontend(path.join(","));
-}
-
-// Called from within InspectorController on the 'inspected page' side.
-InjectedScript.createProxyObject = function(object, objectId, abbreviate)
-{
-    var result = {};
-    result.objectId = objectId;
-    result.type = Object.type(object);
-
-    var type = typeof object;
-    if ((type === "object" && object !== null) || type === "function") {
-        for (var subPropertyName in object) {
-            result.hasChildren = true;
-            break;
-        }
-    }
-    try {
-        result.description = Object.describe(object, abbreviate);
-    } catch (e) {
-        result.errorText = e.toString();
-    }
-    return result;
-}
-
-InjectedScript.evaluateOnSelf = function(funcBody)
-{
-    return window.eval("(" + funcBody + ")();");
-}
-
-InjectedScript.CallFrameProxy = function(id, callFrame)
-{
-    this.id = id;
-    this.type = callFrame.type;
-    this.functionName = (this.type === "function" ? callFrame.functionName : "");
-    this.sourceID = callFrame.sourceID;
-    this.line = callFrame.line;
-    this.scopeChain = this._wrapScopeChain(callFrame);
-}
-
-InjectedScript.CallFrameProxy.prototype = {
-    _wrapScopeChain: function(callFrame)
-    {
-        var foundLocalScope = false;
-        var scopeChain = callFrame.scopeChain;
-        var scopeChainProxy = [];
-        for (var i = 0; i < scopeChain.length; ++i) {
-            var scopeObject = scopeChain[i];
-            var scopeObjectProxy = InjectedScript.createProxyObject(scopeObject, { callFrame: this.id, chainIndex: i }, true);
-
-            if (Object.prototype.toString.call(scopeObject) === "[object JSActivation]") {
-                if (!foundLocalScope)
-                    scopeObjectProxy.thisObject = InjectedScript.createProxyObject(callFrame.thisObject, { callFrame: this.id, thisObject: true }, true);
-                else
-                    scopeObjectProxy.isClosure = true;
-                foundLocalScope = true;
-                scopeObjectProxy.isLocal = true;
-            } else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Element)
-                scopeObjectProxy.isElement = true;
-            else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Document)
-                scopeObjectProxy.isDocument = true;
-            else if (!foundLocalScope)
-                scopeObjectProxy.isWithBlock = true;
-            scopeChainProxy.push(scopeObjectProxy);
-        }
-        return scopeChainProxy;
-    }
-}
-
-InjectedScript.executeSql = function(callId, databaseId, query)
-{
-    function successCallback(tx, result)
-    {
-        var rows = result.rows;
-        var result = [];
-        var length = rows.length;
-        for (var i = 0; i < length; ++i) {
-            var data = {};
-            result.push(data);
-            var row = rows.item(i);
-            for (var columnIdentifier in row) {
-                // FIXME: (Bug 19439) We should specially format SQL NULL here
-                // (which is represented by JavaScript null here, and turned
-                // into the string "null" by the String() function).
-                var text = row[columnIdentifier];
-                data[columnIdentifier] = String(text);
-            }
-        }
-        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, JSON.stringify(result), false);
-    }
-
-    function errorCallback(tx, error)
-    {
-        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, JSON.stringify(error), false);
-    }
-
-    function queryTransaction(tx)
-    {
-        tx.executeSql(query, null, InjectedScriptHost.wrapCallback(successCallback), InjectedScriptHost.wrapCallback(errorCallback));
-    }
-
-    var database = InjectedScriptHost.databaseForId(databaseId);
-    if (!database)
-        errorCallback(null, { code : 2 });  // Return as unexpected version.
-    database.transaction(InjectedScriptHost.wrapCallback(queryTransaction), InjectedScriptHost.wrapCallback(errorCallback));
-    return true;
-}
-
-Object.type = function(obj)
-{
-    if (obj === null)
-        return "null";
-
-    var type = typeof obj;
-    if (type !== "object" && type !== "function")
-        return type;
-
-    var win = InjectedScript._window();
-
-    if (obj instanceof win.Node)
-        return (obj.nodeType === undefined ? type : "node");
-    if (obj instanceof win.String)
-        return "string";
-    if (obj instanceof win.Array)
-        return "array";
-    if (obj instanceof win.Boolean)
-        return "boolean";
-    if (obj instanceof win.Number)
-        return "number";
-    if (obj instanceof win.Date)
-        return "date";
-    if (obj instanceof win.RegExp)
-        return "regexp";
-    if (obj instanceof win.NodeList)
-        return "array";
-    if (obj instanceof win.HTMLCollection || obj instanceof win.HTMLAllCollection)
-        return "array";
-    if (obj instanceof win.Error)
-        return "error";
-    return type;
-}
-
-Object.hasProperties = function(obj)
-{
-    if (typeof obj === "undefined" || typeof obj === "null")
-        return false;
-    for (var name in obj)
-        return true;
-    return false;
-}
-
-Object.describe = function(obj, abbreviated)
-{
-    var type1 = Object.type(obj);
-    var type2 = Object.className(obj);
-
-    switch (type1) {
-    case "object":
-    case "node":
-    case "array":
-        return type2;
-    case "string":
-        if (!abbreviated)
-            return obj;
-        if (obj.length > 100)
-            return "\"" + obj.substring(0, 100) + "\u2026\"";
-        return "\"" + obj + "\"";
-    case "function":
-        var objectText = String(obj);
-        if (!/^function /.test(objectText))
-            objectText = (type2 == "object") ? type1 : type2;
-        else if (abbreviated)
-            objectText = /.*/.exec(obj)[0].replace(/ +$/g, "");
-        return objectText;
-    default:
-        return String(obj);
-    }
-}
-
-Object.className = function(obj)
-{
-    return Object.prototype.toString.call(obj).replace(/^\[object (.*)\]$/i, "$1")
-}
-
-// Although Function.prototype.bind and String.prototype.escapeCharacters are defined in utilities.js they will soon become
-// unavailable in the InjectedScript context. So we define them here for the local use.
-// TODO: remove this comment once InjectedScript runs in a separate context.
-Function.prototype.bind = function(thisObject)
-{
-    var func = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
-}
-
-String.prototype.escapeCharacters = function(chars)
-{
-    var foundChar = false;
-    for (var i = 0; i < chars.length; ++i) {
-        if (this.indexOf(chars.charAt(i)) !== -1) {
-            foundChar = true;
-            break;
-        }
-    }
-
-    if (!foundChar)
-        return this;
-
-    var result = "";
-    for (var i = 0; i < this.length; ++i) {
-        if (chars.indexOf(this.charAt(i)) !== -1)
-            result += "\\";
-        result += this.charAt(i);
-    }
-
-    return result;
-}
-
-/* InjectedScriptAccess.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var InjectedScriptAccess = {};
-
-InjectedScriptAccess._installHandler = function(methodName, async)
-{
-    InjectedScriptAccess[methodName] = function()
-    {
-        var allArgs = Array.prototype.slice.call(arguments);
-        var callback = allArgs[allArgs.length - 1];
-        var argsString = JSON.stringify(Array.prototype.slice.call(allArgs, 0, allArgs.length - 1));
-        
-        function myCallback(result, isException)
-        {
-            if (!isException)
-                callback(JSON.parse(result));
-            else
-                WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage("Error dispatching: " + methodName));
-        }
-        var callId = WebInspector.Callback.wrap(myCallback);
-        InspectorBackend.dispatchOnInjectedScript(callId, methodName, argsString, !!async);
-    };
-}
-
-// InjectedScriptAccess message forwarding puts some constraints on the way methods are implemented and called:
-// - Make sure corresponding methods in InjectedScript return non-null and non-undefined values,
-// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
-// We keep these sorted.
-InjectedScriptAccess._installHandler("addInspectedNode");
-InjectedScriptAccess._installHandler("addStyleSelector");
-InjectedScriptAccess._installHandler("applyStyleRuleText");
-InjectedScriptAccess._installHandler("applyStyleText");
-InjectedScriptAccess._installHandler("clearConsoleMessages");
-InjectedScriptAccess._installHandler("evaluate");
-InjectedScriptAccess._installHandler("evaluateInCallFrame");
-InjectedScriptAccess._installHandler("getCompletions");
-InjectedScriptAccess._installHandler("getComputedStyle");
-InjectedScriptAccess._installHandler("getInlineStyle");
-InjectedScriptAccess._installHandler("getNodePropertyValue");
-InjectedScriptAccess._installHandler("getProperties");
-InjectedScriptAccess._installHandler("getPrototypes");
-InjectedScriptAccess._installHandler("getStyles");
-InjectedScriptAccess._installHandler("openInInspectedWindow");
-InjectedScriptAccess._installHandler("performSearch");
-InjectedScriptAccess._installHandler("pushNodeToFrontend");
-InjectedScriptAccess._installHandler("nodeByPath");
-InjectedScriptAccess._installHandler("searchCanceled");
-InjectedScriptAccess._installHandler("setOuterHTML");
-InjectedScriptAccess._installHandler("setPropertyValue");
-InjectedScriptAccess._installHandler("setStyleProperty");
-InjectedScriptAccess._installHandler("setStyleText");
-InjectedScriptAccess._installHandler("toggleStyleEnabled");
-InjectedScriptAccess._installHandler("evaluateOnSelf");
-
-// Some methods can't run synchronously even on the injected script side (such as DB transactions).
-// Mark them as asynchronous here.
-InjectedScriptAccess._installHandler("executeSql", true);
-
-WebInspector.didDispatchOnInjectedScript = WebInspector.Callback.processCallback;
-
-/* TimelineAgent.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineAgent = function() {
-    // Not implemented.
-}
-
-// Must be kept in sync with TimelineItem.h
-WebInspector.TimelineAgent.RecordType = {
-    EventDispatch : 0,
-    Layout : 1,
-    RecalculateStyles : 2,
-    Paint : 3,
-    ParseHTML : 4,
-    TimerInstall : 5,
-    TimerRemove : 6,
-    TimerFire : 7,
-    XHRReadyStateChange : 8,
-    XHRLoad : 9,
-    EvaluateScript : 10,
-    MarkTimeline : 11,
-    ResourceSendRequest : 12,
-    ResourceReceiveResponse : 13,
-    ResourceFinish : 14
-};
-
-WebInspector.addRecordToTimeline = function(record) {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.addRecordToTimeline(record);
-}
-
-WebInspector.timelineProfilerWasStarted = function() {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.timelineWasStarted();
-}
-
-WebInspector.timelineProfilerWasStopped = function() {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.timelineWasStopped();
-}
-
-/* TimelinePanel.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelinePanel = function()
-{
-    WebInspector.Panel.call(this);
-    this.element.addStyleClass("timeline");
-
-    this._overviewPane = new WebInspector.TimelineOverviewPane(this.categories);
-    this._overviewPane.addEventListener("window changed", this._scheduleRefresh, this);
-    this._overviewPane.addEventListener("filter changed", this._refresh, this);
-    this.element.appendChild(this._overviewPane.element);
-
-    this._sidebarBackgroundElement = document.createElement("div");
-    this._sidebarBackgroundElement.className = "sidebar timeline-sidebar-background";
-    this.element.appendChild(this._sidebarBackgroundElement);
-
-    this._containerElement = document.createElement("div");
-    this._containerElement.id = "timeline-container";
-    this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);
-    this.element.appendChild(this._containerElement);
-
-    this.createSidebar(this._containerElement, this._containerElement);
-    var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);
-    itemsTreeElement.expanded = true;
-    this.sidebarTree.appendChild(itemsTreeElement);
-
-    this._sidebarListElement = document.createElement("div");
-    this.sidebarElement.appendChild(this._sidebarListElement);
-
-    this._containerContentElement = document.createElement("div");
-    this._containerContentElement.id = "resources-container-content";
-    this._containerElement.appendChild(this._containerContentElement);
-
-    this._timelineGrid = new WebInspector.TimelineGrid();
-    this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
-    this._itemsGraphsElement.id = "timeline-graphs";
-    this._containerContentElement.appendChild(this._timelineGrid.element);
-
-    this._topGapElement = document.createElement("div");
-    this._topGapElement.className = "timeline-gap";
-    this._itemsGraphsElement.appendChild(this._topGapElement);
-
-    this._graphRowsElement = document.createElement("div");
-    this._itemsGraphsElement.appendChild(this._graphRowsElement);
-
-    this._bottomGapElement = document.createElement("div");
-    this._bottomGapElement.className = "timeline-gap";
-    this._itemsGraphsElement.appendChild(this._bottomGapElement);
-
-    this._createStatusbarButtons();
-
-    this._records = [];
-    this._sendRequestRecords = {};
-    this._calculator = new WebInspector.TimelineCalculator();
-}
-
-WebInspector.TimelinePanel.prototype = {
-    toolbarItemClass: "timeline",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Timeline");
-    },
-
-    get statusBarItems()
-    {
-        return [this.toggleTimelineButton.element, this.clearButton.element];
-    },
-
-    get categories()
-    {
-        if (!this._categories) {
-            this._categories = {
-                loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), "rgb(47,102,236)"),
-                scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), "rgb(157,231,119)"),
-                rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), "rgb(164,60,255)")
-            };
-        }
-        return this._categories;
-    },
-
-    _createStatusbarButtons: function()
-    {
-        this.toggleTimelineButton = new WebInspector.StatusBarButton("", "record-profile-status-bar-item");
-        this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked.bind(this), false);
-
-        this.clearButton = new WebInspector.StatusBarButton("", "timeline-clear-status-bar-item");
-        this.clearButton.addEventListener("click", this.reset.bind(this), false);
-    },
-
-    _toggleTimelineButtonClicked: function()
-    {
-        if (this.toggleTimelineButton.toggled)
-            InspectorBackend.stopTimelineProfiler();
-        else
-            InspectorBackend.startTimelineProfiler();
-    },
-
-    timelineWasStarted: function()
-    {
-        this.toggleTimelineButton.toggled = true;
-    },
-
-    timelineWasStopped: function()
-    {
-        this.toggleTimelineButton.toggled = false;
-    },
-
-    addRecordToTimeline: function(record)
-    {
-        this._innerAddRecordToTimeline(record, this._records);
-        this._scheduleRefresh();
-    },
-
-    _innerAddRecordToTimeline: function(record, collection)
-    {
-        var formattedRecord = this._formatRecord(record);
-
-        // Glue subsequent records with same category and title together if they are closer than 100ms to each other.
-        if (this._lastRecord && (!record.children || !record.children.length) &&
-                this._lastRecord.category == formattedRecord.category &&
-                this._lastRecord.title == formattedRecord.title &&
-                this._lastRecord.details == formattedRecord.details &&
-                formattedRecord.startTime - this._lastRecord.endTime < 0.1) {
-            this._lastRecord.endTime = formattedRecord.endTime;
-            this._lastRecord.count++;
-        } else {
-            collection.push(formattedRecord);
-            for (var i = 0; record.children && i < record.children.length; ++i) {
-                if (!formattedRecord.children)
-                    formattedRecord.children = [];
-                var formattedChild = this._innerAddRecordToTimeline(record.children[i], formattedRecord.children);
-                formattedChild.parent = formattedRecord;
-            }
-            this._lastRecord = record.children && record.children.length ? null : formattedRecord;
-        }
-        return formattedRecord;
-    },
-
-    _formatRecord: function(record)
-    {
-        var recordTypes = WebInspector.TimelineAgent.RecordType;
-        if (!this._recordStyles) {
-            this._recordStyles = {};
-            this._recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse"), category: this.categories.loading };
-            this._recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.MarkTimeline] = { title: WebInspector.UIString("Mark"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: this.categories.loading };
-            this._recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: this.categories.loading };
-            this._recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: this.categories.loading };
-        }
-
-        var style = this._recordStyles[record.type];
-        if (!style)
-            style = this._recordStyles[recordTypes.EventDispatch];
-
-        var formattedRecord = {};
-        formattedRecord.category = style.category;
-        formattedRecord.title = style.title;
-        formattedRecord.startTime = record.startTime / 1000;
-        formattedRecord.data = record.data;
-        formattedRecord.count = 1;
-        formattedRecord.type = record.type;
-        formattedRecord.endTime = (typeof record.endTime !== "undefined") ? record.endTime / 1000 : formattedRecord.startTime;
-        formattedRecord.record = record;
-
-        // Make resource receive record last since request was sent; make finish record last since response received.
-        if (record.type === WebInspector.TimelineAgent.RecordType.ResourceSendRequest) {
-            this._sendRequestRecords[record.data.identifier] = formattedRecord;
-        } else if (record.type === WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse) {
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            if (sendRequestRecord) { // False if we started instrumentation in the middle of request.
-                sendRequestRecord._responseReceivedFormattedTime = formattedRecord.startTime;
-                formattedRecord.startTime = sendRequestRecord.startTime;
-                sendRequestRecord.details = this._getRecordDetails(record);
-            }
-        } else if (record.type === WebInspector.TimelineAgent.RecordType.ResourceFinish) {
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            if (sendRequestRecord) // False for main resource.
-                formattedRecord.startTime = sendRequestRecord._responseReceivedFormattedTime;
-        }
-        formattedRecord.details = this._getRecordDetails(record);
-
-        return formattedRecord;
-    },
-
-    _getRecordDetails: function(record)
-    {
-        switch (record.type) {
-        case WebInspector.TimelineAgent.RecordType.EventDispatch:
-            return record.data ? record.data.type : "";
-        case WebInspector.TimelineAgent.RecordType.Paint:
-            return record.data.width + "\u2009\u00d7\u2009" + record.data.height;
-        case WebInspector.TimelineAgent.RecordType.TimerInstall:
-        case WebInspector.TimelineAgent.RecordType.TimerRemove:
-        case WebInspector.TimelineAgent.RecordType.TimerFire:
-            return record.data.timerId;
-        case WebInspector.TimelineAgent.RecordType.XHRReadyStateChange:
-        case WebInspector.TimelineAgent.RecordType.XHRLoad:
-        case WebInspector.TimelineAgent.RecordType.EvaluateScript:
-        case WebInspector.TimelineAgent.RecordType.ResourceSendRequest:
-            return WebInspector.displayNameForURL(record.data.url);
-        case WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse:
-        case WebInspector.TimelineAgent.RecordType.ResourceFinish:
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            return sendRequestRecord ? WebInspector.displayNameForURL(sendRequestRecord.data.url) : "";
-        case WebInspector.TimelineAgent.RecordType.MarkTimeline:
-            return record.data.message;
-        default:
-            return "";
-        }
-    },
-
-    setSidebarWidth: function(width)
-    {
-        WebInspector.Panel.prototype.setSidebarWidth.call(this, width);
-        this._sidebarBackgroundElement.style.width = width + "px";
-        this._overviewPane.setSidebarWidth(width);
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._containerContentElement.style.left = width + "px";
-        this._scheduleRefresh();
-        this._overviewPane.updateMainViewWidth(width);
-    },
-
-    resize: function() {
-        this._scheduleRefresh();
-    },
-
-    reset: function()
-    {
-        this._lastRecord = null;
-        this._sendRequestRecords = {};
-        this._overviewPane.reset();
-        this._records = [];
-        this._refresh();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        if (this._needsRefresh)
-            this._refresh();
-    },
-
-    _onScroll: function(event)
-    {
-        var scrollTop = this._containerElement.scrollTop;
-        var dividersTop = Math.max(0, scrollTop);
-        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
-        this._scheduleRefresh(true);
-    },
-
-    _scheduleRefresh: function(immediate)
-    {
-        if (this._needsRefresh)
-            return;
-        this._needsRefresh = true;
-
-        if (this.visible && !("_refreshTimeout" in this))
-            this._refreshTimeout = setTimeout(this._refresh.bind(this), immediate ? 0 : 100);
-    },
-
-    _refresh: function()
-    {
-        this._needsRefresh = false;
-        if ("_refreshTimeout" in this) {
-            clearTimeout(this._refreshTimeout);
-            delete this._refreshTimeout;
-        }
-        this._overviewPane.update(this._records);
-        this._refreshRecords();
-    },
-
-    _refreshRecords: function()
-    {
-        this._calculator.windowLeft = this._overviewPane.windowLeft;
-        this._calculator.windowRight = this._overviewPane.windowRight;
-        this._calculator.reset();
-
-        for (var i = 0; i < this._records.length; ++i)
-            this._calculator.updateBoundaries(this._records[i]);
-
-        var recordsInWindow = [];
-        for (var i = 0; i < this._records.length; ++i) {
-            var record = this._records[i];
-            var percentages = this._calculator.computeBarGraphPercentages(record);
-            if (percentages.start < 100 && percentages.end >= 0 && !record.category.hidden)
-                this._addToRecordsWindow(record, recordsInWindow);
-        }
-
-        // Calculate the visible area.
-        var visibleTop = this._containerElement.scrollTop;
-        var visibleBottom = visibleTop + this._containerElement.clientHeight;
-
-        // Define row height, should be in sync with styles for timeline graphs.
-        const rowHeight = 18;
-        const expandOffset = 15;
-
-        // Convert visible area to visible indexes. Always include top-level record for a visible nested record.
-        var startIndex = Math.max(0, Math.floor(visibleTop / rowHeight) - 1);
-        while (startIndex > 0 && recordsInWindow[startIndex].parent)
-            startIndex--;
-        var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
-        while (endIndex < recordsInWindow.length - 1 && recordsInWindow[startIndex].parent)
-            endIndex++;
-
-        // Resize gaps first.
-        const top = (startIndex * rowHeight) + "px";
-        this._topGapElement.style.height = top;
-        this.sidebarElement.style.top = top;
-        this.sidebarResizeElement.style.top = top;
-        this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";
-
-        // Update visible rows.
-        var listRowElement = this._sidebarListElement.firstChild;
-        var graphRowElement = this._graphRowsElement.firstChild;
-        var width = this._graphRowsElement.offsetWidth;
-        var scheduleRefreshCallback = this._scheduleRefresh.bind(this, true);
-        for (var i = startIndex; i < endIndex; ++i) {
-            var record = recordsInWindow[i];
-            var isEven = !(i % 2);
-
-            if (!listRowElement) {
-                listRowElement = new WebInspector.TimelineRecordListRow().element;
-                this._sidebarListElement.appendChild(listRowElement);
-            }
-            if (!graphRowElement) {
-                graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback, rowHeight).element;
-                this._graphRowsElement.appendChild(graphRowElement);
-            }
-
-            listRowElement.listRow.update(record, isEven);
-            graphRowElement.graphRow.update(record, isEven, this._calculator, width, expandOffset);
-
-            listRowElement = listRowElement.nextSibling;
-            graphRowElement = graphRowElement.nextSibling;
-        }
-
-        // Remove extra rows.
-        while (listRowElement) {
-            var nextElement = listRowElement.nextSibling;
-            listRowElement.listRow.dispose();
-            listRowElement = nextElement;
-        }
-        while (graphRowElement) {
-            var nextElement = graphRowElement.nextSibling;
-            graphRowElement.graphRow.dispose();
-            graphRowElement = nextElement;
-        }
-
-        // Reserve some room for expand / collapse controls to the left for records that start at 0ms.
-        var timelinePaddingLeft = this._calculator.windowLeft === 0 ? expandOffset : 0;
-        this._timelineGrid.updateDividers(true, this._calculator, timelinePaddingLeft);
-        this._adjustScrollPosition((recordsInWindow.length + 1) * rowHeight);
-    },
-
-    _addToRecordsWindow: function(record, recordsWindow)
-    {
-        recordsWindow.push(record);
-        if (!record.collapsed) {
-            var index = recordsWindow.length;
-            for (var i = 0; record.children && i < record.children.length; ++i)
-                this._addToRecordsWindow(record.children[i], recordsWindow);
-            record.visibleChildrenCount = recordsWindow.length - index;
-        }
-    },
-
-    _adjustScrollPosition: function(totalHeight)
-    {
-        // Prevent the container from being scrolled off the end.
-        if ((this._containerElement.scrollTop + this._containerElement.offsetHeight) > totalHeight + 1)
-            this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);
-    }
-}
-
-WebInspector.TimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-
-WebInspector.TimelineCategory = function(name, title, color)
-{
-    this.name = name;
-    this.title = title;
-    this.color = color;
-}
-
-
-WebInspector.TimelineCalculator = function()
-{
-    this.windowLeft = 0.0;
-    this.windowRight = 1.0;
-    this._uiString = WebInspector.UIString.bind(WebInspector);
-}
-
-WebInspector.TimelineCalculator.prototype = {
-    computeBarGraphPercentages: function(record)
-    {
-        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
-        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
-        return {start: start, end: end};
-    },
-
-    get minimumBoundary()
-    {
-        if (typeof this._minimumBoundary === "number")
-            return this._minimumBoundary;
-
-        if (typeof this.windowLeft === "number")
-            this._minimumBoundary = this._absoluteMinimumBoundary + this.windowLeft * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
-        else
-            this._minimumBoundary = this._absoluteMinimumBoundary;
-        return this._minimumBoundary;
-    },
-
-    get maximumBoundary()
-    {
-        if (typeof this._maximumBoundary === "number")
-            return this._maximumBoundary;
-
-        if (typeof this.windowLeft === "number")
-            this._maximumBoundary = this._absoluteMinimumBoundary + this.windowRight * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
-        else
-            this._maximumBoundary = this._absoluteMaximumBoundary;
-        return this._maximumBoundary;
-    },
-
-    reset: function()
-    {
-        delete this._absoluteMinimumBoundary;
-        delete this._absoluteMaximumBoundary;
-        delete this._minimumBoundary;
-        delete this._maximumBoundary;
-    },
-
-    updateBoundaries: function(record)
-    {
-        var didChange = false;
-
-        var lowerBound = record.startTime;
-
-        if (typeof this._absoluteMinimumBoundary === "undefined" || lowerBound < this._absoluteMinimumBoundary) {
-            this._absoluteMinimumBoundary = lowerBound;
-            delete this._minimumBoundary;
-            didChange = true;
-        }
-
-        var upperBound = record.endTime;
-        if (typeof this._absoluteMaximumBoundary === "undefined" || upperBound > this._absoluteMaximumBoundary) {
-            this._absoluteMaximumBoundary = upperBound;
-            delete this._maximumBoundary;
-            didChange = true;
-        }
-
-        return didChange;
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value + this.minimumBoundary - this._absoluteMinimumBoundary, this._uiString);
-    }
-}
-
-
-WebInspector.TimelineRecordListRow = function()
-{
-    this.element = document.createElement("div");
-    this.element.listRow = this;
-    var iconElement = document.createElement("span");
-    iconElement.className = "timeline-tree-icon";
-    this.element.appendChild(iconElement);
-
-    this._typeElement = document.createElement("span");
-    this._typeElement.className = "type";
-    this.element.appendChild(this._typeElement);
-
-    var separatorElement = document.createElement("span");
-    separatorElement.className = "separator";
-    separatorElement.textContent = " ";
-
-    this._dataElement = document.createElement("span");
-    this._dataElement.className = "data dimmed";
-
-    this._repeatCountElement = document.createElement("span");
-    this._repeatCountElement.className = "count";
-
-    this.element.appendChild(separatorElement);
-    this.element.appendChild(this._dataElement);
-    this.element.appendChild(this._repeatCountElement);
-}
-
-WebInspector.TimelineRecordListRow.prototype = {
-    update: function(record, isEven)
-    {
-        this.element.className = "timeline-tree-item timeline-category-" + record.category.name + (isEven ? " even" : "");
-        this._typeElement.textContent = record.title;
-
-        if (record.details) {
-            this._dataElement.textContent = "(" + record.details + ")";
-            this._dataElement.title = record.details;
-        } else {
-            this._dataElement.textContent = "";
-            this._dataElement.title = "";
-        }
-
-        if (record.count > 1)
-            this._repeatCountElement.textContent = "\u2009\u00d7\u2009" + record.count;
-        else
-            this._repeatCountElement.textContent = "";
-    },
-
-    dispose: function()
-    {
-        this.element.parentElement.removeChild(this.element);
-    }
-}
-
-
-WebInspector.TimelineRecordGraphRow = function(graphContainer, refreshCallback, rowHeight)
-{
-    this.element = document.createElement("div");
-    this.element.graphRow = this;
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "timeline-graph-bar-area";
-    this.element.appendChild(this._barAreaElement);
-
-    this._barElement = document.createElement("div");
-    this._barElement.className = "timeline-graph-bar";
-    this._barAreaElement.appendChild(this._barElement);
-
-    this._expandElement = document.createElement("div");
-    this._expandElement.className = "timeline-expandable";
-    graphContainer.appendChild(this._expandElement);
-
-    var leftBorder = document.createElement("div");
-    leftBorder.className = "timeline-expandable-left";
-    this._expandElement.appendChild(leftBorder);
-
-    this._expandElement.addEventListener("click", this._onClick.bind(this));
-    this._refreshCallback = refreshCallback;
-    this._rowHeight = rowHeight;
-}
-
-WebInspector.TimelineRecordGraphRow.prototype = {
-    update: function(record, isEven, calculator, clientWidth, expandOffset)
-    {
-        this._record = record;
-        this.element.className = "timeline-graph-side timeline-category-" + record.category.name + (isEven ? " even" : "");
-        var percentages = calculator.computeBarGraphPercentages(record);
-        var left = percentages.start / 100 * clientWidth;
-        var width = (percentages.end - percentages.start) / 100 * clientWidth;
-        this._barElement.style.left = (left + expandOffset) + "px";
-        this._barElement.style.width = width + "px";
-
-        if (record.visibleChildrenCount) {
-            this._expandElement.style.top = this.element.offsetTop + "px";
-            this._expandElement.style.left = left + "px";
-            this._expandElement.style.width = Math.max(12, width + 25) + "px";
-            if (!record.collapsed) {
-                this._expandElement.style.height = (record.visibleChildrenCount + 1) * this._rowHeight + "px";
-                this._expandElement.addStyleClass("timeline-expandable-expanded");
-                this._expandElement.removeStyleClass("timeline-expandable-collapsed");
-            } else {
-                this._expandElement.style.height = this._rowHeight + "px";
-                this._expandElement.addStyleClass("timeline-expandable-collapsed");
-                this._expandElement.removeStyleClass("timeline-expandable-expanded");
-            }
-            this._expandElement.removeStyleClass("hidden");
-        } else {
-            this._expandElement.addStyleClass("hidden");
-        }
-    },
-
-    _onClick: function(event)
-    {
-        this._record.collapsed = !this._record.collapsed;
-        this._refreshCallback();
-    },
-
-    dispose: function()
-    {
-        this.element.parentElement.removeChild(this.element);
-        this._expandElement.parentElement.removeChild(this._expandElement);
-    }
-}
-
-/* TimelineOverviewPane.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineOverviewPane = function(categories)
-{
-    this.element = document.createElement("div");
-    this.element.id = "timeline-overview-panel";
-
-    this._categories = categories;
-    this._overviewSidebarElement = document.createElement("div");
-    this._overviewSidebarElement.id = "timeline-overview-sidebar";
-    this.element.appendChild(this._overviewSidebarElement);
-
-    var overviewTreeElement = document.createElement("ol");
-    overviewTreeElement.className = "sidebar-tree";
-    this._overviewSidebarElement.appendChild(overviewTreeElement);
-    var sidebarTree = new TreeOutline(overviewTreeElement);
-
-    var categoriesTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("TIMELINES"), {}, true);
-    categoriesTreeElement.expanded = true;
-    sidebarTree.appendChild(categoriesTreeElement);
-    for (var categoryName in this._categories) {
-        var category = this._categories[categoryName];
-        categoriesTreeElement.appendChild(new WebInspector.TimelineCategoryTreeElement(category, this._onCheckboxClicked.bind(this, category)));
-    }
-
-    this._overviewGrid = new WebInspector.TimelineGrid();
-    this._overviewGrid.element.id = "timeline-overview-grid";
-    this._overviewGrid.itemsGraphsElement.id = "timeline-overview-graphs";
-    this.element.appendChild(this._overviewGrid.element);
-
-    this._categoryGraphs = {};
-    var i = 0;
-    for (var category in this._categories) {
-        var categoryGraph = new WebInspector.TimelineCategoryGraph(this._categories[category], i++ % 2);
-        this._categoryGraphs[category] = categoryGraph;
-        this._overviewGrid.itemsGraphsElement.appendChild(categoryGraph.graphElement);
-    }
-    this._overviewGrid.setScrollAndDividerTop(0, 0);
-
-    this._overviewWindowElement = document.createElement("div");
-    this._overviewWindowElement.id = "timeline-overview-window";
-    this._overviewWindowElement.addEventListener("mousedown", this._dragWindow.bind(this), false);
-    this._overviewGrid.element.appendChild(this._overviewWindowElement);
-
-    this._leftResizeElement = document.createElement("div");
-    this._leftResizeElement.className = "timeline-window-resizer";
-    this._leftResizeElement.style.left = 0;
-    this._overviewGrid.element.appendChild(this._leftResizeElement);
-    this._leftResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._leftResizeElement), false);
-
-    this._rightResizeElement = document.createElement("div");
-    this._rightResizeElement.className = "timeline-window-resizer timeline-window-resizer-right";
-    this._rightResizeElement.style.right = 0;
-    this._overviewGrid.element.appendChild(this._rightResizeElement);
-    this._rightResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._rightResizeElement), false);
-
-    this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();
-
-    var separatorElement = document.createElement("div");
-    separatorElement.id = "timeline-overview-separator";
-    this.element.appendChild(separatorElement);
-
-    this.windowLeft = 0.0;
-    this.windowRight = 1.0;
-}
-
-
-WebInspector.TimelineOverviewPane.prototype = {
-    _onCheckboxClicked: function (category, event) {
-        if (event.target.checked)
-            category.hidden = false;
-        else
-            category.hidden = true;
-        this._categoryGraphs[category.name].dimmed = !event.target.checked;
-        this.dispatchEventToListeners("filter changed");
-    },
-
-    update: function(records)
-    {
-        // Clear summary bars.
-        var timelines = {};
-        for (var category in this._categories) {
-            timelines[category] = [];
-            this._categoryGraphs[category].clearChunks();
-        }
-
-        function forAllRecords(recordsArray, callback)
-        {
-            if (!recordsArray)
-                return;
-            for (var i = 0; i < recordsArray.length; ++i) {
-                callback(recordsArray[i]);
-                forAllRecords(recordsArray[i].children, callback);
-            }
-        }
-
-        // Create sparse arrays with 101 cells each to fill with chunks for a given category.
-        this._overviewCalculator.reset();
-        forAllRecords(records, this._overviewCalculator.updateBoundaries.bind(this._overviewCalculator));
-
-        function markTimeline(record)
-        {
-            var percentages = this._overviewCalculator.computeBarGraphPercentages(record);
-
-            var end = Math.round(percentages.end);
-            var categoryName = record.category.name;
-            for (var j = Math.round(percentages.start); j <= end; ++j)
-                timelines[categoryName][j] = true;
-        }
-        forAllRecords(records, markTimeline.bind(this));
-
-        // Convert sparse arrays to continuous segments, render graphs for each.
-        for (var category in this._categories) {
-            var timeline = timelines[category];
-            window.timelineSaved = timeline;
-            var chunkStart = -1;
-            for (var j = 0; j < 101; ++j) {
-                if (timeline[j]) {
-                    if (chunkStart === -1)
-                        chunkStart = j;
-                } else {
-                    if (chunkStart !== -1) {
-                        this._categoryGraphs[category].addChunk(chunkStart, j);
-                        chunkStart = -1;
-                    }
-                }
-            }
-            if (chunkStart !== -1) {
-                this._categoryGraphs[category].addChunk(chunkStart, 100);
-                chunkStart = -1;
-            }
-        }
-        this._overviewGrid.updateDividers(true, this._overviewCalculator);
-    },
-
-    setSidebarWidth: function(width)
-    {
-        this._overviewSidebarElement.style.width = width + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._overviewGrid.element.style.left = width + "px";
-    },
-
-    reset: function()
-    {
-        this._overviewCalculator.reset();
-        this._overviewGrid.updateDividers(true, this._overviewCalculator);
-        this.windowLeft = 0.0;
-        this.windowRight = 1.0;
-    },
-
-    _resizeWindow: function(resizeElement, event)
-    {
-        WebInspector.elementDragStart(resizeElement, this._windowResizeDragging.bind(this, resizeElement), this._endWindowDragging.bind(this), event, "col-resize");
-    },
-
-    _windowResizeDragging: function(resizeElement, event)
-    {
-        if (resizeElement === this._leftResizeElement)
-            this._resizeWindowLeft(event.pageX - this._overviewGrid.element.offsetLeft);
-        else
-            this._resizeWindowRight(event.pageX - this._overviewGrid.element.offsetLeft);
-        event.preventDefault();
-    },
-
-    _dragWindow: function(event)
-    {
-        WebInspector.elementDragStart(this._overviewWindowElement, this._windowDragging.bind(this, event.pageX,
-            this._leftResizeElement.offsetLeft, this._rightResizeElement.offsetLeft), this._endWindowDragging.bind(this), event, "ew-resize");
-    },
-
-    _windowDragging: function(startX, windowLeft, windowRight, event)
-    {
-        var delta = event.pageX - startX;
-        var start = windowLeft + delta;
-        var end = windowRight + delta;
-        var windowSize = windowRight - windowLeft;
-
-        if (start < 0) {
-            start = 0;
-            end = windowSize;
-        }
-
-        if (end > this._overviewGrid.element.clientWidth) {
-            end = this._overviewGrid.element.clientWidth;
-            start = end - windowSize;
-        }
-        this._setWindowPosition(start, end);
-
-        event.preventDefault();
-    },
-
-    _resizeWindowLeft: function(start)
-    {
-        // Glue to edge.
-        if (start < 10)
-            start = 0;
-        this._setWindowPosition(start, null);
-    },
-
-    _resizeWindowRight: function(end)
-    {
-        // Glue to edge.
-        if (end > this._overviewGrid.element.clientWidth - 10)
-            end = this._overviewGrid.element.clientWidth;
-        this._setWindowPosition(null, end);
-    },
-
-    _setWindowPosition: function(start, end)
-    {
-        if (typeof start === "number") {
-            if (start > this._rightResizeElement.offsetLeft - 4)
-                start = this._rightResizeElement.offsetLeft - 4;
-
-            this.windowLeft = start / this._overviewGrid.element.clientWidth;
-            this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
-            this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";
-        }
-        if (typeof end === "number") {
-            if (end < this._leftResizeElement.offsetLeft + 12)
-                end = this._leftResizeElement.offsetLeft + 12;
-
-            this.windowRight = end / this._overviewGrid.element.clientWidth;
-            this._rightResizeElement.style.left = this.windowRight * 100 + "%";
-        }
-        this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";
-        this.dispatchEventToListeners("window changed");
-    },
-
-    _endWindowDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    }
-}
-
-WebInspector.TimelineOverviewPane.prototype.__proto__ = WebInspector.Object.prototype;
-
-
-WebInspector.TimelineOverviewCalculator = function()
-{
-    this._uiString = WebInspector.UIString.bind(WebInspector);
-}
-
-WebInspector.TimelineOverviewCalculator.prototype = {
-    computeBarGraphPercentages: function(record)
-    {
-        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
-        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
-        return {start: start, end: end};
-    },
-
-    reset: function()
-    {
-        delete this.minimumBoundary;
-        delete this.maximumBoundary;
-    },
-
-    updateBoundaries: function(record)
-    {
-        if (typeof this.minimumBoundary === "undefined" || record.startTime < this.minimumBoundary) {
-            this.minimumBoundary = record.startTime;
-            return true;
-        }
-        if (typeof this.maximumBoundary === "undefined" || record.endTime > this.maximumBoundary) {
-            this.maximumBoundary = record.endTime;
-            return true;
-        }
-        return false;
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, this._uiString);
-    }
-}
-
-
-WebInspector.TimelineCategoryTreeElement = function(category, onCheckboxClicked)
-{
-    this._category = category;
-    this._onCheckboxClicked = onCheckboxClicked;
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, false);
-}
-
-WebInspector.TimelineCategoryTreeElement.prototype = {
-    onattach: function()
-    {
-        this.listItemElement.removeChildren();
-        this.listItemElement.addStyleClass("timeline-category-tree-item");
-        this.listItemElement.addStyleClass("timeline-category-" + this._category.name);
-
-        var label = document.createElement("label");
-
-        var checkElement = document.createElement("input");
-        checkElement.type = "checkbox";
-        checkElement.className = "timeline-category-checkbox";
-        checkElement.checked = true;
-        checkElement.addEventListener("click", this._onCheckboxClicked);
-        label.appendChild(checkElement);
-
-        var typeElement = document.createElement("span");
-        typeElement.className = "type";
-        typeElement.textContent = this._category.title;
-        label.appendChild(typeElement);
-
-        this.listItemElement.appendChild(label);
-    }
-}
-
-WebInspector.TimelineCategoryTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.TimelineCategoryGraph = function(category, isEven)
-{
-    this._category = category;
-
-    this._graphElement = document.createElement("div");
-    this._graphElement.className = "timeline-graph-side timeline-overview-graph-side" + (isEven ? " even" : "");
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "timeline-graph-bar-area timeline-category-" + category.name;
-    this._graphElement.appendChild(this._barAreaElement);
-}
-
-WebInspector.TimelineCategoryGraph.prototype = {
-    get graphElement()
-    {
-        return this._graphElement;
-    },
-
-    addChunk: function(start, end)
-    {
-        var chunk = document.createElement("div");
-        chunk.className = "timeline-graph-bar";
-        this._barAreaElement.appendChild(chunk);
-        chunk.style.setProperty("left", start + "%");
-        chunk.style.setProperty("width", (end - start) + "%");
-    },
-
-    clearChunks: function()
-    {
-        this._barAreaElement.removeChildren();
-    },
-
-    set dimmed(dimmed)
-    {
-        if (dimmed)
-            this._barAreaElement.removeStyleClass("timeline-category-" + this._category.name);
-        else
-            this._barAreaElement.addStyleClass("timeline-category-" + this._category.name);
-    }
-}
-
-/* TestController.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TestController = function(callId)
-{
-    this._callId = callId;
-    this._waitUntilDone = false;
-}
-
-WebInspector.TestController.prototype = {
-    waitUntilDone: function()
-    {
-        this._waitUntilDone = true;
-    },
-
-    notifyDone: function(result)
-    {
-        var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);
-        InspectorBackend.didEvaluateForTestInFrontend(this._callId, message);
-    },
-
-    runAfterPendingDispatches: function(callback)
-    {
-        if (WebInspector.pendingDispatches === 0) {
-            callback();
-            return;
-        }
-        setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);
-    }
-}
-
-WebInspector.evaluateForTestInFrontend = function(callId, script)
-{
-    var controller = new WebInspector.TestController(callId);
-    function invokeMethod()
-    {
-        try {
-            var result;
-            if (window[script] && typeof window[script] === "function")
-                result = window[script].call(WebInspector, controller);
-            else
-                result = window.eval(script);
-
-            if (!controller._waitUntilDone)
-                controller.notifyDone(result);
-        } catch (e) {
-            controller.notifyDone(e.toString());
-        }
-    }
-    controller.runAfterPendingDispatches(invokeMethod);
-}
-
-/* base.js */
-
-// Copyright 2006 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//  * Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//  * Redistributions in binary form must reproduce the above copyright
-//    notice, this list of conditions and the following disclaimer in
-//    the documentation and/or other materials provided with the
-//    distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-// NOTE: This file has been changed from the one on doctype. The following
-// changes were made:
-// - Removed goog.globalEval because it calls eval() which is not allowed from
-//   inside v8 extensions. If we ever need to use globalEval, we will need to
-//   find a way to work around this problem.
-// - Remove Function.prototype.apply() emulation for the same reason. This one
-//   is useless anyway because V8 supports apply() natively.
-
-/**
- * @fileoverview Bootstrap for the Google JS Library
- */
-
-/**
- * @define {boolean} Overridden to true by the compiler when
- *     --mark_as_compiled is specified.
- */
-var COMPILED = true;
-
-
-/**
- * Base namespace for the Google JS library.  Checks to see goog is
- * already defined in the current scope before assigning to prevent
- * clobbering if base.js is loaded more than once.
- */
-var goog = {}; // Check to see if already defined in current scope
-
-
-/**
- * Reference to the global context.  In most cases this will be 'window'.
- */
-goog.global = this;
-
-
-/**
- * Indicates whether or not we can call 'eval' directly to eval code in the
- * global scope. Set to a Boolean by the first call to goog.globalEval (which
- * empirically tests whether eval works for globals). @see goog.globalEval
- * @type {boolean?}
- * @private
- */
-goog.evalWorksForGlobals_ = null;
-
-
-/**
- * Creates object stubs for a namespace. When present in a file, goog.provide
- * also indicates that the file defines the indicated object.
- * @param {string} name name of the object that this file defines.
- */
-goog.provide = function(name) {
-  if (!COMPILED) {
-    // Ensure that the same namespace isn't provided twice. This is intended
-    // to teach new developers that 'goog.provide' is effectively a variable
-    // declaration. And when JSCompiler transforms goog.provide into a real
-    // variable declaration, the compiled JS should work the same as the raw
-    // JS--even when the raw JS uses goog.provide incorrectly.
-    if (goog.getObjectByName(name) && !goog.implicitNamespaces_[name]) {
-      throw 'Namespace "' + name + '" already declared.';
-    }
-
-    var namespace = name;
-    while ((namespace = namespace.substr(0, namespace.lastIndexOf('.')))) {
-      goog.implicitNamespaces_[namespace] = true;
-    }
-  }
-
-  goog.exportPath_(name);
-};
-
-
-if (!COMPILED) {
-  /**
-   * Namespaces implicitly defined by goog.provide. For example,
-   * goog.provide('goog.events.Event') implicitly declares
-   * that 'goog' and 'goog.events' must be namespaces.
-   *
-   * @type {Object}
-   * @private
-   */
-  goog.implicitNamespaces_ = {};
-}
-
-
-/**
- * Builds an object structure for the provided namespace path,
- * ensuring that names that already exist are not overwritten. For
- * example:
- * "a.b.c" -> a = {};a.b={};a.b.c={};
- * Used by goog.provide and goog.exportSymbol.
- * @param {string} name name of the object that this file defines.
- * @param {Object} opt_object the object to expose at the end of the path.
- * @private
- */
-goog.exportPath_ = function(name, opt_object) {
-  var parts = name.split('.');
-  var cur = goog.global;
-  var part;
-
-  // Internet Explorer exhibits strange behavior when throwing errors from
-  // methods externed in this manner.  See the testExportSymbolExceptions in
-  // base_test.html for an example.
-  if (!(parts[0] in cur) && cur.execScript) {
-    cur.execScript('var ' + parts[0]);
-  }
-
-  // Parentheses added to eliminate strict JS warning in Firefox.
-  while ((part = parts.shift())) {
-    if (!parts.length && goog.isDef(opt_object)) {
-      // last part and we have an object; use it
-      cur[part] = opt_object;
-    } else if (cur[part]) {
-      cur = cur[part];
-    } else {
-      cur = cur[part] = {};
-    }
-  }
-};
-
-
-/**
- * Returns an object based on its fully qualified name
- * @param {string} name The fully qualified name.
- * @return {Object?} The object or, if not found, null.
- */
-goog.getObjectByName = function(name) {
-  var parts = name.split('.');
-  var cur = goog.global;
-  for (var part; part = parts.shift(); ) {
-    if (cur[part]) {
-      cur = cur[part];
-    } else {
-      return null;
-    }
-  }
-  return cur;
-};
-
-
-/**
- * Globalizes a whole namespace, such as goog or goog.lang.
- *
- * @param {Object} obj The namespace to globalize.
- * @param {Object} opt_global The object to add the properties to.
- * @deprecated Properties may be explicitly exported to the global scope, but
- *     this should no longer be done in bulk.
- */
-goog.globalize = function(obj, opt_global) {
-  var global = opt_global || goog.global;
-  for (var x in obj) {
-    global[x] = obj[x];
-  }
-};
-
-
-/**
- * Adds a dependency from a file to the files it requires.
- * @param {string} relPath The path to the js file.
- * @param {Array} provides An array of strings with the names of the objects
- *                         this file provides.
- * @param {Array} requires An array of strings with the names of the objects
- *                         this file requires.
- */
-goog.addDependency = function(relPath, provides, requires) {
-  if (!COMPILED) {
-    var provide, require;
-    var path = relPath.replace(/\\/g, '/');
-    var deps = goog.dependencies_;
-    for (var i = 0; provide = provides[i]; i++) {
-      deps.nameToPath[provide] = path;
-      if (!(path in deps.pathToNames)) {
-        deps.pathToNames[path] = {};
-      }
-      deps.pathToNames[path][provide] = true;
-    }
-    for (var j = 0; require = requires[j]; j++) {
-      if (!(path in deps.requires)) {
-        deps.requires[path] = {};
-      }
-      deps.requires[path][require] = true;
-    }
-  }
-};
-
-
-/**
- * Implements a system for the dynamic resolution of dependencies
- * that works in parallel with the BUILD system.
- * @param {string} rule Rule to include, in the form goog.package.part.
- */
-goog.require = function(rule) {
-
-  // if the object already exists we do not need do do anything
-  if (!COMPILED) {
-    if (goog.getObjectByName(rule)) {
-      return;
-    }
-    var path = goog.getPathFromDeps_(rule);
-    if (path) {
-      goog.included_[path] = true;
-      goog.writeScripts_();
-    } else {
-      // NOTE(nicksantos): We could throw an error, but this would break
-      // legacy users that depended on this failing silently. Instead, the
-      // compiler should warn us when there are invalid goog.require calls.
-    }
-  }
-};
-
-
-/**
- * Path for included scripts
- * @type {string}
- */
-goog.basePath = '';
-
-
-/**
- * Null function used for default values of callbacks, etc.
- * @type {Function}
- */
-goog.nullFunction = function() {};
-
-
-/**
- * When defining a class Foo with an abstract method bar(), you can do:
- *
- * Foo.prototype.bar = goog.abstractMethod
- *
- * Now if a subclass of Foo fails to override bar(), an error
- * will be thrown when bar() is invoked.
- *
- * Note: This does not take the name of the function to override as
- * an argument because that would make it more difficult to obfuscate
- * our JavaScript code.
- *
- * @throws {Error} when invoked to indicate the method should be
- *   overridden.
- */
-goog.abstractMethod = function() {
-  throw Error('unimplemented abstract method');
-};
-
-
-if (!COMPILED) {
-  /**
-   * Object used to keep track of urls that have already been added. This
-   * record allows the prevention of circular dependencies.
-   * @type {Object}
-   * @private
-   */
-  goog.included_ = {};
-
-
-  /**
-   * This object is used to keep track of dependencies and other data that is
-   * used for loading scripts
-   * @private
-   * @type {Object}
-   */
-  goog.dependencies_ = {
-    pathToNames: {}, // 1 to many
-    nameToPath: {}, // 1 to 1
-    requires: {}, // 1 to many
-    visited: {}, // used when resolving dependencies to prevent us from
-                 // visiting the file twice
-    written: {} // used to keep track of script files we have written
-  };
-
-
-  /**
-   * Tries to detect the base path of the base.js script that bootstraps
-   * Google JS Library
-   * @private
-   */
-  goog.findBasePath_ = function() {
-    var doc = goog.global.document;
-    if (typeof doc == 'undefined') {
-      return;
-    }
-    if (goog.global.GOOG_BASE_PATH) {
-      goog.basePath = goog.global.GOOG_BASE_PATH;
-      return;
-    } else {
-      goog.global.GOOG_BASE_PATH = null;
-    }
-    var scripts = doc.getElementsByTagName('script');
-    for (var script, i = 0; script = scripts[i]; i++) {
-      var src = script.src;
-      var l = src.length;
-      if (src.substr(l - 7) == 'base.js') {
-        goog.basePath = src.substr(0, l - 7);
-        return;
-      }
-    }
-  };
-
-
-  /**
-   * Writes a script tag if, and only if, that script hasn't already been added
-   * to the document.  (Must be called at execution time)
-   * @param {string} src Script source.
-   * @private
-   */
-  goog.writeScriptTag_ = function(src) {
-    var doc = goog.global.document;
-    if (typeof doc != 'undefined' &&
-        !goog.dependencies_.written[src]) {
-      goog.dependencies_.written[src] = true;
-      doc.write('<script type="text/javascript" src="' +
-                src + '"></' + 'script>');
-    }
-  };
-
-
-  /**
-   * Resolves dependencies based on the dependencies added using addDependency
-   * and calls writeScriptTag_ in the correct order.
-   * @private
-   */
-  goog.writeScripts_ = function() {
-    // the scripts we need to write this time
-    var scripts = [];
-    var seenScript = {};
-    var deps = goog.dependencies_;
-
-    function visitNode(path) {
-      if (path in deps.written) {
-        return;
-      }
-
-      // we have already visited this one. We can get here if we have cyclic
-      // dependencies
-      if (path in deps.visited) {
-        if (!(path in seenScript)) {
-          seenScript[path] = true;
-          scripts.push(path);
-        }
-        return;
-      }
-
-      deps.visited[path] = true;
-
-      if (path in deps.requires) {
-        for (var requireName in deps.requires[path]) {
-          visitNode(deps.nameToPath[requireName]);
-        }
-      }
-
-      if (!(path in seenScript)) {
-        seenScript[path] = true;
-        scripts.push(path);
-      }
-    }
-
-    for (var path in goog.included_) {
-      if (!deps.written[path]) {
-        visitNode(path);
-      }
-    }
-
-    for (var i = 0; i < scripts.length; i++) {
-      if (scripts[i]) {
-        goog.writeScriptTag_(goog.basePath + scripts[i]);
-      } else {
-        throw Error('Undefined script input');
-      }
-    }
-  };
-
-
-  /**
-   * Looks at the dependency rules and tries to determine the script file that
-   * fulfills a particular rule.
-   * @param {string} rule In the form goog.namespace.Class or project.script.
-   * @return {string?} Url corresponding to the rule, or null.
-   * @private
-   */
-  goog.getPathFromDeps_ = function(rule) {
-    if (rule in goog.dependencies_.nameToPath) {
-      return goog.dependencies_.nameToPath[rule];
-    } else {
-      return null;
-    }
-  };
-
-  goog.findBasePath_();
-  goog.writeScriptTag_(goog.basePath + 'deps.js');
-}
-
-
-
-//==============================================================================
-// Language Enhancements
-//==============================================================================
-
-
-/**
- * This is a "fixed" version of the typeof operator.  It differs from the typeof
- * operator in such a way that null returns 'null' and arrays return 'array'.
- * @param {*} value The value to get the type of.
- * @return {string} The name of the type.
- */
-goog.typeOf = function(value) {
-  var s = typeof value;
-  if (s == 'object') {
-    if (value) {
-      // We cannot use constructor == Array or instanceof Array because
-      // different frames have different Array objects. In IE6, if the iframe
-      // where the array was created is destroyed, the array loses its
-      // prototype. Then dereferencing val.splice here throws an exception, so
-      // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
-      // so that will work. In this case, this function will return false and
-      // most array functions will still work because the array is still
-      // array-like (supports length and []) even though it has lost its
-      // prototype. Custom object cannot have non enumerable length and
-      // NodeLists don't have a slice method.
-      if (typeof value.length == 'number' &&
-          typeof value.splice != 'undefined' &&
-          !goog.propertyIsEnumerable_(value, 'length')) {
-        return 'array';
-      }
-
-      // IE in cross-window calls does not correctly marshal the function type
-      // (it appears just as an object) so we cannot use just typeof val ==
-      // 'function'. However, if the object has a call property, it is a
-      // function.
-      if (typeof value.call != 'undefined') {
-        return 'function';
-      }
-    } else {
-      return 'null';
-    }
-
-  // In Safari typeof nodeList returns function.  We would like to return
-  // object for those and we can detect an invalid function by making sure that
-  // the function object has a call method
-  } else if (s == 'function' && typeof value.call == 'undefined') {
-    return 'object';
-  }
-  return s;
-};
-
-if (Object.prototype.propertyIsEnumerable) {
-  /**
-   * Safe way to test whether a property is enumarable.  It allows testing
-   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
-   * does not exist (like DOM nodes in IE).
-   * @param {Object} object The object to test if the property is enumerable.
-   * @param {string} propName The property name to check for.
-   * @return {boolean} True if the property is enumarable.
-   * @private
-   */
-  goog.propertyIsEnumerable_ = function(object, propName) {
-    return Object.prototype.propertyIsEnumerable.call(object, propName);
-  };
-} else {
-  /**
-   * Safe way to test whether a property is enumarable.  It allows testing
-   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
-   * does not exist (like DOM nodes in IE).
-   * @param {Object} object The object to test if the property is enumerable.
-   * @param {string} propName The property name to check for.
-   * @return {boolean} True if the property is enumarable.
-   * @private
-   */
-  goog.propertyIsEnumerable_ = function(object, propName) {
-    // KJS in Safari 2 is not ECMAScript compatible and lacks crucial methods
-    // such as propertyIsEnumerable.  We therefore use a workaround.
-    // Does anyone know a more efficient work around?
-    if (propName in object) {
-      for (var key in object) {
-        if (key == propName) {
-          return true;
-        }
-      }
-    }
-    return false;
-  };
-}
-
-/**
- * Returns true if the specified value is not |undefined|.
- * WARNING: Do not use this to test if an object has a property. Use the in
- * operator instead.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is defined.
- */
-goog.isDef = function(val) {
-  return typeof val != 'undefined';
-};
-
-
-/**
- * Returns true if the specified value is |null|
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is null.
- */
-goog.isNull = function(val) {
-  return val === null;
-};
-
-
-/**
- * Returns true if the specified value is defined and not null
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is defined and not null.
- */
-goog.isDefAndNotNull = function(val) {
-  return goog.isDef(val) && !goog.isNull(val);
-};
-
-
-/**
- * Returns true if the specified value is an array
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an array.
- */
-goog.isArray = function(val) {
-  return goog.typeOf(val) == 'array';
-};
-
-
-/**
- * Returns true if the object looks like an array. To qualify as array like
- * the value needs to be either a NodeList or an object with a Number length
- * property.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an array.
- */
-goog.isArrayLike = function(val) {
-  var type = goog.typeOf(val);
-  return type == 'array' || type == 'object' && typeof val.length == 'number';
-};
-
-
-/**
- * Returns true if the object looks like a Date. To qualify as Date-like
- * the value needs to be an object and have a getFullYear() function.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a like a Date.
- */
-goog.isDateLike = function(val) {
-  return goog.isObject(val) && typeof val.getFullYear == 'function';
-};
-
-
-/**
- * Returns true if the specified value is a string
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a string.
- */
-goog.isString = function(val) {
-  return typeof val == 'string';
-};
-
-
-/**
- * Returns true if the specified value is a boolean
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is boolean.
- */
-goog.isBoolean = function(val) {
-  return typeof val == 'boolean';
-};
-
-
-/**
- * Returns true if the specified value is a number
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a number.
- */
-goog.isNumber = function(val) {
-  return typeof val == 'number';
-};
-
-
-/**
- * Returns true if the specified value is a function
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a function.
- */
-goog.isFunction = function(val) {
-  return goog.typeOf(val) == 'function';
-};
-
-
-/**
- * Returns true if the specified value is an object.  This includes arrays
- * and functions.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an object.
- */
-goog.isObject = function(val) {
-  var type = goog.typeOf(val);
-  return type == 'object' || type == 'array' || type == 'function';
-};
-
-
-/**
- * Adds a hash code field to an object. The hash code is unique for the
- * given object.
- * @param {Object} obj The object to get the hash code for.
- * @return {number} The hash code for the object.
- */
-goog.getHashCode = function(obj) {
-  // In IE, DOM nodes do not extend Object so they do not have this method.
-  // we need to check hasOwnProperty because the proto might have this set.
-
-  if (obj.hasOwnProperty && obj.hasOwnProperty(goog.HASH_CODE_PROPERTY_)) {
-    return obj[goog.HASH_CODE_PROPERTY_];
-  }
-  if (!obj[goog.HASH_CODE_PROPERTY_]) {
-    obj[goog.HASH_CODE_PROPERTY_] = ++goog.hashCodeCounter_;
-  }
-  return obj[goog.HASH_CODE_PROPERTY_];
-};
-
-
-/**
- * Removes the hash code field from an object.
- * @param {Object} obj The object to remove the field from.
- */
-goog.removeHashCode = function(obj) {
-  // DOM nodes in IE are not instance of Object and throws exception
-  // for delete. Instead we try to use removeAttribute
-  if ('removeAttribute' in obj) {
-    obj.removeAttribute(goog.HASH_CODE_PROPERTY_);
-  }
-  /** @preserveTry */
-  try {
-    delete obj[goog.HASH_CODE_PROPERTY_];
-  } catch (ex) {
-  }
-};
-
-
-/**
- * {String} Name for hash code property
- * @private
- */
-goog.HASH_CODE_PROPERTY_ = 'goog_hashCode_';
-
-
-/**
- * @type {number} Counter for hash codes.
- * @private
- */
-goog.hashCodeCounter_ = 0;
-
-
-/**
- * Clone an object/array (recursively)
- * @param {Object} proto Object to clone.
- * @return {Object} Clone of x;.
- */
-goog.cloneObject = function(proto) {
-  var type = goog.typeOf(proto);
-  if (type == 'object' || type == 'array') {
-    if (proto.clone) {
-      return proto.clone();
-    }
-    var clone = type == 'array' ? [] : {};
-    for (var key in proto) {
-      clone[key] = goog.cloneObject(proto[key]);
-    }
-    return clone;
-  }
-
-  return proto;
-};
-
-
-/**
- * Partially applies this function to a particular 'this object' and zero or
- * more arguments. The result is a new function with some arguments of the first
- * function pre-filled and the value of |this| 'pre-specified'.<br><br>
- *
- * Remaining arguments specified at call-time are appended to the pre-
- * specified ones.<br><br>
- *
- * Also see: {@link #partial}.<br><br>
- *
- * Note that bind and partial are optimized such that repeated calls to it do
- * not create more than one function object, so there is no additional cost for
- * something like:<br>
- *
- * <pre>var g = bind(f, obj);
- * var h = partial(g, 1, 2, 3);
- * var k = partial(h, a, b, c);</pre>
- *
- * Usage:
- * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
- * barMethBound('arg3', 'arg4');</pre>
- *
- * @param {Function} fn A function to partially apply.
- * @param {Object} self Specifies the object which |this| should point to
- *     when the function is run. If the value is null or undefined, it will
- *     default to the global object.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to the function.
- *
- * @return {Function} A partially-applied form of the function bind() was
- *     invoked as a method of.
- */
-goog.bind = function(fn, self, var_args) {
-  var boundArgs = fn.boundArgs_;
-
-  if (arguments.length > 2) {
-    var args = Array.prototype.slice.call(arguments, 2);
-    if (boundArgs) {
-      args.unshift.apply(args, boundArgs);
-    }
-    boundArgs = args;
-  }
-
-  self = fn.boundSelf_ || self;
-  fn = fn.boundFn_ || fn;
-
-  var newfn;
-  var context = self || goog.global;
-
-  if (boundArgs) {
-    newfn = function() {
-      // Combine the static args and the new args into one big array
-      var args = Array.prototype.slice.call(arguments);
-      args.unshift.apply(args, boundArgs);
-      return fn.apply(context, args);
-    }
-  } else {
-    newfn = function() {
-      return fn.apply(context, arguments);
-    }
-  }
-
-  newfn.boundArgs_ = boundArgs;
-  newfn.boundSelf_ = self;
-  newfn.boundFn_ = fn;
-
-  return newfn;
-};
-
-
-/**
- * Like bind(), except that a 'this object' is not required. Useful when the
- * target function is already bound.
- *
- * Usage:
- * var g = partial(f, arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Function} fn A function to partially apply.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the function bind() was
- *     invoked as a method of.
- */
-goog.partial = function(fn, var_args) {
-  var args = Array.prototype.slice.call(arguments, 1);
-  args.unshift(fn, null);
-  return goog.bind.apply(null, args);
-};
-
-
-/**
- * Copies all the members of a source object to a target object.
- * This is deprecated. Use goog.object.extend instead.
- * @param {Object} target Target.
- * @param {Object} source Source.
- * @deprecated
- */
-goog.mixin = function(target, source) {
-  for (var x in source) {
-    target[x] = source[x];
-  }
-
-  // For IE the for-in-loop does not contain any properties that are not
-  // enumerable on the prototype object (for example, isPrototypeOf from
-  // Object.prototype) but also it will not include 'replace' on objects that
-  // extend String and change 'replace' (not that it is common for anyone to
-  // extend anything except Object).
-};
-
-
-/**
- * A simple wrapper for new Date().getTime().
- *
- * @return {number} An integer value representing the number of milliseconds
- *     between midnight, January 1, 1970 and the current time.
- */
-goog.now = Date.now || (function() {
-  return new Date().getTime();
-});
-
-
-/**
- * Abstract implementation of goog.getMsg for use with localized messages
- * @param {string} str Translatable string, places holders in the form.{$foo}
- * @param {Object} opt_values Map of place holder name to value.
- */
-goog.getMsg = function(str, opt_values) {
-  var values = opt_values || {};
-  for (var key in values) {
-    str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), values[key]);
-  }
-  return str;
-};
-
-
-/**
- * Exposes an unobfuscated global namespace path for the given object.
- * Note that fields of the exported object *will* be obfuscated,
- * unless they are exported in turn via this function or
- * goog.exportProperty
- *
- * <p>Also handy for making public items that are defined in anonymous
- * closures.
- *
- * ex. goog.exportSymbol('Foo', Foo);
- *
- * ex. goog.exportSymbol('public.path.Foo.staticFunction',
- *                       Foo.staticFunction);
- *     public.path.Foo.staticFunction();
- *
- * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
- *                       Foo.prototype.myMethod);
- *     new public.path.Foo().myMethod();
- *
- * @param {string} publicPath Unobfuscated name to export.
- * @param {Object} object Object the name should point to.
- */
-goog.exportSymbol = function(publicPath, object) {
-  goog.exportPath_(publicPath, object);
-};
-
-
-/**
- * Exports a property unobfuscated into the object's namespace.
- * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
- * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
- * @param {Object} object Object whose static property is being exported.
- * @param {string} publicName Unobfuscated name to export.
- * @param {Object} symbol Object the name should point to.
- */
-goog.exportProperty = function(object, publicName, symbol) {
-  object[publicName] = symbol;
-};
-
-
-
-//==============================================================================
-// Extending Function
-//==============================================================================
-
-
-/**
- * An alias to the {@link goog.bind()} global function.
- *
- * Usage:
- * var g = f.bind(obj, arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Object} self Specifies the object to which |this| should point
- *     when the function is run. If the value is null or undefined, it will
- *     default to the global object.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the Function on which bind()
- *     was invoked as a method.
- * @deprecated
- */
-Function.prototype.bind = function(self, var_args) {
-  if (arguments.length > 1) {
-    var args = Array.prototype.slice.call(arguments, 1);
-    args.unshift(this, self);
-    return goog.bind.apply(null, args);
-  } else {
-    return goog.bind(this, self);
-  }
-};
-
-
-/**
- * An alias to the {@link goog.partial()} global function.
- *
- * Usage:
- * var g = f.partial(arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the function partial() was
- *     invoked as a method of.
- * @deprecated
- */
-Function.prototype.partial = function(var_args) {
-  var args = Array.prototype.slice.call(arguments);
-  args.unshift(this, null);
-  return goog.bind.apply(null, args);
-};
-
-
-/**
- * Inherit the prototype methods from one constructor into another.
- *
- * Usage:
- * <pre>
- * function ParentClass(a, b) { }
- * ParentClass.prototype.foo = function(a) { }
- *
- * function ChildClass(a, b, c) {
- *   ParentClass.call(this, a, b);
- * }
- *
- * ChildClass.inherits(ParentClass);
- *
- * var child = new ChildClass('a', 'b', 'see');
- * child.foo(); // works
- * </pre>
- *
- * In addition, a superclass' implementation of a method can be invoked
- * as follows:
- *
- * <pre>
- * ChildClass.prototype.foo = function(a) {
- *   ChildClass.superClass_.foo.call(this, a);
- *   // other code
- * };
- * </pre>
- *
- * @param {Function} parentCtor Parent class.
- */
-Function.prototype.inherits = function(parentCtor) {
-  goog.inherits(this, parentCtor);
-};
-
-
-/**
- * Static variant of Function.prototype.inherits.
- * @param {Function} childCtor Child class.
- * @param {Function} parentCtor Parent class.
- */
-goog.inherits = function(childCtor, parentCtor) {
-  /** @constructor */
-  function tempCtor() {};
-  tempCtor.prototype = parentCtor.prototype;
-  childCtor.superClass_ = parentCtor.prototype;
-  childCtor.prototype = new tempCtor();
-  childCtor.prototype.constructor = childCtor;
-};
-
-
-/**
- * Mixes in an object's properties and methods into the callee's prototype.
- * Basically mixin based inheritance, thus providing an alternative method for
- * adding properties and methods to a class' prototype.
- *
- * <pre>
- * function X() {}
- * X.mixin({
- *   one: 1,
- *   two: 2,
- *   three: 3,
- *   doit: function() { return this.one + this.two + this.three; }
- * });
- *
- * function Y() { }
- * Y.mixin(X.prototype);
- * Y.prototype.four = 15;
- * Y.prototype.doit2 = function() { return this.doit() + this.four; }
- * });
- *
- * // or
- *
- * function Y() { }
- * Y.inherits(X);
- * Y.mixin({
- *   one: 10,
- *   four: 15,
- *   doit2: function() { return this.doit() + this.four; }
- * });
- * </pre>
- *
- * @param {Object} source from which to copy properties.
- * @see goog.mixin
- * @deprecated
- */
-Function.prototype.mixin = function(source) {
-  goog.mixin(this.prototype, source);
-};
-
-/* inspector_controller_impl.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview DevTools' implementation of the InspectorController API.
- */
-
-goog.provide('devtools.InspectorBackendImpl');
-goog.provide('devtools.InspectorFrontendHostImpl');
-
-devtools.InspectorBackendImpl = function() {
-  WebInspector.InspectorBackendStub.call(this);
-  this.installInspectorControllerDelegate_('clearMessages');
-  this.installInspectorControllerDelegate_('copyNode');
-  this.installInspectorControllerDelegate_('deleteCookie');
-  this.installInspectorControllerDelegate_('didEvaluateForTestInFrontend');
-  this.installInspectorControllerDelegate_('disableResourceTracking');
-  this.installInspectorControllerDelegate_('disableTimeline');
-  this.installInspectorControllerDelegate_('enableResourceTracking');
-  this.installInspectorControllerDelegate_('enableTimeline');
-  this.installInspectorControllerDelegate_('getChildNodes');
-  this.installInspectorControllerDelegate_('getCookies');
-  this.installInspectorControllerDelegate_('getDatabaseTableNames');
-  this.installInspectorControllerDelegate_('getDOMStorageEntries');
-  this.installInspectorControllerDelegate_('getEventListenersForNode');
-  this.installInspectorControllerDelegate_('highlightDOMNode');
-  this.installInspectorControllerDelegate_('hideDOMNodeHighlight');
-  this.installInspectorControllerDelegate_('releaseWrapperObjectGroup');
-  this.installInspectorControllerDelegate_('removeAttribute');
-  this.installInspectorControllerDelegate_('removeDOMStorageItem');
-  this.installInspectorControllerDelegate_('removeNode');
-  this.installInspectorControllerDelegate_('saveFrontendSettings');
-  this.installInspectorControllerDelegate_('setAttribute');
-  this.installInspectorControllerDelegate_('setDOMStorageItem');
-  this.installInspectorControllerDelegate_('setTextNodeValue');
-  this.installInspectorControllerDelegate_('startTimelineProfiler');
-  this.installInspectorControllerDelegate_('stopTimelineProfiler');
-  this.installInspectorControllerDelegate_('storeLastActivePanel');
-};
-goog.inherits(devtools.InspectorBackendImpl,
-    WebInspector.InspectorBackendStub);
-
-
-/**
- * {@inheritDoc}.
- */
-devtools.InspectorBackendImpl.prototype.toggleNodeSearch = function() {
-  WebInspector.InspectorBackendStub.prototype.toggleNodeSearch.call(this);
-  this.callInspectorController_.call(this, 'toggleNodeSearch');
-  if (!this.searchingForNode()) {
-    // This is called from ElementsPanel treeOutline's focusNodeChanged().
-    DevToolsHost.activateWindow();
-  }
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.debuggerEnabled = function() {
-  return true;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.profilerEnabled = function() {
-  return true;
-};
-
-
-devtools.InspectorBackendImpl.prototype.addBreakpoint = function(
-    sourceID, line, condition) {
-  devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
-};
-
-
-devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(
-    sourceID, line) {
-  devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
-};
-
-devtools.InspectorBackendImpl.prototype.updateBreakpoint = function(
-    sourceID, line, condition) {
-  devtools.tools.getDebuggerAgent().updateBreakpoint(
-      sourceID, line, condition);
-};
-
-devtools.InspectorBackendImpl.prototype.pauseInDebugger = function() {
-  devtools.tools.getDebuggerAgent().pauseExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.resumeDebugger = function() {
-  devtools.tools.getDebuggerAgent().resumeExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepIntoStatement();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepOutOfFunction();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepOverStatement();
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function() {
-  return devtools.tools.getDebuggerAgent().pauseOnExceptions();
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(
-    value) {
-  return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.startProfiling = function() {
-  devtools.tools.getProfilerAgent().startProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.stopProfiling = function() {
-  devtools.tools.getProfilerAgent().stopProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId) {
-  WebInspector.didGetProfileHeaders(callId, []);
-};
-
-
-/**
- * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
- * and is able to retrieve them by uid using 'getProfile'.
- */
-devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile) {
-  WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
-  WebInspector.__fullProfiles[profile.uid] = profile;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid) {
-  if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles)) {
-    WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
-  }
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function() {
-  devtools.tools.getProfilerAgent().startProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
-      | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
-      | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript =
-    RemoteToolsAgent.DispatchOnInjectedScript.bind(RemoteToolsAgent);
-
-
-/**
- * Installs delegating handler into the inspector controller.
- * @param {string} methodName Method to install delegating handler for.
- */
-devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_
-    = function(methodName) {
-  this[methodName] = goog.bind(this.callInspectorController_, this,
-      methodName);
-};
-
-
-/**
- * Bound function with the installInjectedScriptDelegate_ actual
- * implementation.
- */
-devtools.InspectorBackendImpl.prototype.callInspectorController_ =
-    function(methodName, var_arg) {
-  var args = Array.prototype.slice.call(arguments, 1);
-  RemoteToolsAgent.DispatchOnInspectorController(
-      WebInspector.Callback.wrap(function(){}),
-      methodName,
-      JSON.stringify(args));
-};
-
-
-InspectorBackend = new devtools.InspectorBackendImpl();
-
-/* debugger_agent.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Provides communication interface to remote v8 debugger. See
- * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol
- */
-goog.provide('devtools.DebuggerAgent');
-
-
-/**
- * @constructor
- */
-devtools.DebuggerAgent = function() {
-  RemoteDebuggerAgent.DebuggerOutput =
-      goog.bind(this.handleDebuggerOutput_, this);
-  RemoteDebuggerAgent.SetContextId =
-      goog.bind(this.setContextId_, this);
-
-  /**
-   * Id of the inspected page global context. It is used for filtering scripts.
-   * @type {number}
-   */
-  this.contextId_ = null;
-
-  /**
-   * Mapping from script id to script info.
-   * @type {Object}
-   */
-  this.parsedScripts_ = null;
-
-  /**
-   * Mapping from the request id to the devtools.BreakpointInfo for the
-   * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for
-   * 'setbreakpoint' responses to learn their ids in the v8 debugger.
-   * @see #handleSetBreakpointResponse_
-   * @type {Object}
-   */
-  this.requestNumberToBreakpointInfo_ = null;
-
-  /**
-   * Information on current stack frames.
-   * @type {Array.<devtools.CallFrame>}
-   */
-  this.callFrames_ = [];
-
-  /**
-   * Whether to stop in the debugger on the exceptions.
-   * @type {boolean}
-   */
-  this.pauseOnExceptions_ = false;
-
-  /**
-   * Mapping: request sequence number->callback.
-   * @type {Object}
-   */
-  this.requestSeqToCallback_ = null;
-
-  /**
-   * Whether the scripts panel has been shown and initialilzed.
-   * @type {boolean}
-   */
-  this.scriptsPanelInitialized_ = false;
-
-  /**
-   * Whether the scripts list should be requested next time when context id is
-   * set.
-   * @type {boolean}
-   */
-  this.requestScriptsWhenContextIdSet_ = false;
-
-  /**
-   * Whether the agent is waiting for initial scripts response.
-   * @type {boolean}
-   */
-  this.waitingForInitialScriptsResponse_ = false;
-
-  /**
-   * If backtrace response is received when initial scripts response
-   * is not yet processed the backtrace handling will be postponed until
-   * after the scripts response processing. The handler bound to its arguments
-   * and this agent will be stored in this field then.
-   * @type {?function()}
-   */
-  this.pendingBacktraceResponseHandler_ = null;
-
-  /**
-   * Container of all breakpoints set using resource URL. These breakpoints
-   * survive page reload. Breakpoints set by script id(for scripts that don't
-   * have URLs) are stored in ScriptInfo objects.
-   * @type {Object}
-   */
-  this.urlToBreakpoints_ = {};
-
-
-  /**
-   * Exception message that is shown to user while on exception break.
-   * @type {WebInspector.ConsoleMessage}
-   */
-  this.currentExceptionMessage_ = null;
-};
-
-
-/**
- * A copy of the scope types from v8/src/mirror-delay.js
- * @enum {number}
- */
-devtools.DebuggerAgent.ScopeType = {
-  Global: 0,
-  Local: 1,
-  With: 2,
-  Closure: 3,
-  Catch: 4
-};
-
-
-/**
- * Resets debugger agent to its initial state.
- */
-devtools.DebuggerAgent.prototype.reset = function() {
-  this.contextId_ = null;
-  // No need to request scripts since they all will be pushed in AfterCompile
-  // events.
-  this.requestScriptsWhenContextIdSet_ = false;
-  this.waitingForInitialScriptsResponse_ = false;
-
-  this.parsedScripts_ = {};
-  this.requestNumberToBreakpointInfo_ = {};
-  this.callFrames_ = [];
-  this.requestSeqToCallback_ = {};
-};
-
-
-/**
- * Initializes scripts UI. This method is called every time Scripts panel
- * is shown. It will send request for context id if it's not set yet.
- */
-devtools.DebuggerAgent.prototype.initUI = function() {
-  // Initialize scripts cache when Scripts panel is shown first time.
-  if (this.scriptsPanelInitialized_) {
-    return;
-  }
-  this.scriptsPanelInitialized_ = true;
-  if (this.contextId_) {
-    // We already have context id. This means that we are here from the
-    // very beginning of the page load cycle and hence will get all scripts
-    // via after-compile events. No need to request scripts for this session.
-    //
-    // There can be a number of scripts from after-compile events that are
-    // pending addition into the UI.
-    for (var scriptId in this.parsedScripts_) {
-      var script = this.parsedScripts_[scriptId];
-      WebInspector.parsedScriptSource(scriptId, script.getUrl(),
-          undefined /* script source */, script.getLineOffset());
-    }
-    return;
-  }
-  this.waitingForInitialScriptsResponse_ = true;
-  // Script list should be requested only when current context id is known.
-  RemoteDebuggerAgent.GetContextId();
-  this.requestScriptsWhenContextIdSet_ = true;
-};
-
-
-/**
- * Asynchronously requests the debugger for the script source.
- * @param {number} scriptId Id of the script whose source should be resolved.
- * @param {function(source:?string):void} callback Function that will be called
- *     when the source resolution is completed. 'source' parameter will be null
- *     if the resolution fails.
- */
-devtools.DebuggerAgent.prototype.resolveScriptSource = function(
-    scriptId, callback) {
-  var script = this.parsedScripts_[scriptId];
-  if (!script || script.isUnresolved()) {
-    callback(null);
-    return;
-  }
-
-  var cmd = new devtools.DebugCommand('scripts', {
-    'ids': [scriptId],
-    'includeSource': true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  // Force v8 execution so that it gets to processing the requested command.
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-    if (msg.isSuccess()) {
-      var scriptJson = msg.getBody()[0];
-      callback(scriptJson.source);
-    } else {
-      callback(null);
-    }
-  };
-};
-
-
-/**
- * Tells the v8 debugger to stop on as soon as possible.
- */
-devtools.DebuggerAgent.prototype.pauseExecution = function() {
-  RemoteDebuggerCommandExecutor.DebuggerPauseScript();
-};
-
-
-/**
- * @param {number} sourceId Id of the script fot the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition The breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.addBreakpoint = function(
-    sourceId, line, condition) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var commandArguments;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    if (breakpoints && breakpoints[line]) {
-      return;
-    }
-    if (!breakpoints) {
-      breakpoints = {};
-      this.urlToBreakpoints_[script.getUrl()] = breakpoints;
-    }
-
-    var breakpointInfo = new devtools.BreakpointInfo(line);
-    breakpoints[line] = breakpointInfo;
-
-    commandArguments = {
-      'groupId': this.contextId_,
-      'type': 'script',
-      'target': script.getUrl(),
-      'line': line,
-      'condition': condition
-    };
-  } else {
-    var breakpointInfo = script.getBreakpointInfo(line);
-    if (breakpointInfo) {
-      return;
-    }
-
-    breakpointInfo = new devtools.BreakpointInfo(line);
-    script.addBreakpointInfo(breakpointInfo);
-
-    commandArguments = {
-      'groupId': this.contextId_,
-      'type': 'scriptId',
-      'target': sourceId,
-      'line': line,
-      'condition': condition
-    };
-  }
-
-  var cmd = new devtools.DebugCommand('setbreakpoint', commandArguments);
-
-  this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo;
-
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  // Force v8 execution so that it gets to processing the requested command.
-  // It is necessary for being able to change a breakpoint just after it
-  // has been created (since we need an existing breakpoint id for that).
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var breakpointInfo;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    breakpointInfo = breakpoints[line];
-    delete breakpoints[line];
-  } else {
-    breakpointInfo = script.getBreakpointInfo(line);
-    if (breakpointInfo) {
-      script.removeBreakpointInfo(breakpointInfo);
-    }
-  }
-
-  if (!breakpointInfo) {
-    return;
-  }
-
-  breakpointInfo.markAsRemoved();
-
-  var id = breakpointInfo.getV8Id();
-
-  // If we don't know id of this breakpoint in the v8 debugger we cannot send
-  // 'clearbreakpoint' request. In that case it will be removed in
-  // 'setbreakpoint' response handler when we learn the id.
-  if (id != -1) {
-    this.requestClearBreakpoint_(id);
-  }
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition New breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.updateBreakpoint = function(
-    sourceId, line, condition) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var breakpointInfo;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    breakpointInfo = breakpoints[line];
-  } else {
-    breakpointInfo = script.getBreakpointInfo(line);
-  }
-
-  var id = breakpointInfo.getV8Id();
-
-  // If we don't know id of this breakpoint in the v8 debugger we cannot send
-  // the 'changebreakpoint' request.
-  if (id != -1) {
-    // TODO(apavlov): make use of the real values for 'enabled' and
-    // 'ignoreCount' when appropriate.
-    this.requestChangeBreakpoint_(id, true, condition, null);
-  }
-};
-
-
-/**
- * Tells the v8 debugger to step into the next statement.
- */
-devtools.DebuggerAgent.prototype.stepIntoStatement = function() {
-  this.stepCommand_('in');
-};
-
-
-/**
- * Tells the v8 debugger to step out of current function.
- */
-devtools.DebuggerAgent.prototype.stepOutOfFunction = function() {
-  this.stepCommand_('out');
-};
-
-
-/**
- * Tells the v8 debugger to step over the next statement.
- */
-devtools.DebuggerAgent.prototype.stepOverStatement = function() {
-  this.stepCommand_('next');
-};
-
-
-/**
- * Tells the v8 debugger to continue execution after it has been stopped on a
- * breakpoint or an exception.
- */
-devtools.DebuggerAgent.prototype.resumeExecution = function() {
-  this.clearExceptionMessage_();
-  var cmd = new devtools.DebugCommand('continue');
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Creates exception message and schedules it for addition to the resource upon
- * backtrace availability.
- * @param {string} url Resource url.
- * @param {number} line Resource line number.
- * @param {string} message Exception text.
- */
-devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(
-    url, line, message) {
-  this.currentExceptionMessage_ = new WebInspector.ConsoleMessage(
-      WebInspector.ConsoleMessage.MessageSource.JS,
-      WebInspector.ConsoleMessage.MessageType.Log,
-      WebInspector.ConsoleMessage.MessageLevel.Error,
-      line,
-      url,
-      0 /* group level */,
-      1 /* repeat count */,
-      '[Exception] ' + message);
-};
-
-
-/**
- * Shows pending exception message that is created with createExceptionMessage_
- * earlier.
- */
-devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function() {
-  if (!this.currentExceptionMessage_) {
-    return;
-  }
-  var msg = this.currentExceptionMessage_;
-  var resource = WebInspector.resourceURLMap[msg.url];
-  if (resource) {
-    msg.resource = resource;
-    WebInspector.panels.resources.addMessageToResource(resource, msg);
-  } else {
-    this.currentExceptionMessage_ = null;
-  }
-};
-
-
-/**
- * Clears exception message from the resource.
- */
-devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function() {
-  if (this.currentExceptionMessage_) {
-    var messageElement =
-        this.currentExceptionMessage_._resourceMessageLineElement;
-    var bubble = messageElement.parentElement;
-    bubble.removeChild(messageElement);
-    if (!bubble.firstChild) {
-      // Last message in bubble removed.
-      bubble.parentElement.removeChild(bubble);
-    }
-    this.currentExceptionMessage_ = null;
-  }
-};
-
-
-/**
- * @return {boolean} True iff the debugger will pause execution on the
- * exceptions.
- */
-devtools.DebuggerAgent.prototype.pauseOnExceptions = function() {
-  return this.pauseOnExceptions_;
-};
-
-
-/**
- * Tells whether to pause in the debugger on the exceptions or not.
- * @param {boolean} value True iff execution should be stopped in the debugger
- * on the exceptions.
- */
-devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value) {
-  this.pauseOnExceptions_ = value;
-};
-
-
-/**
- * Sends 'evaluate' request to the debugger.
- * @param {Object} arguments Request arguments map.
- * @param {function(devtools.DebuggerMessage)} callback Callback to be called
- *     when response is received.
- */
-devtools.DebuggerAgent.prototype.requestEvaluate = function(
-    arguments, callback) {
-  var cmd = new devtools.DebugCommand('evaluate', arguments);
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sends 'lookup' request for each unresolved property of the object. When
- * response is received the properties will be changed with their resolved
- * values.
- * @param {Object} object Object whose properties should be resolved.
- * @param {function(devtools.DebuggerMessage)} Callback to be called when all
- *     children are resolved.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be included.
- */
-devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback,
-                                                            noIntrinsic) {
-  if ('handle' in object) {
-    var result = [];
-    devtools.DebuggerAgent.formatObjectProperties_(object, result,
-                                                   noIntrinsic);
-    callback(result);
-  } else {
-    this.requestLookup_([object.ref], function(msg) {
-      var result = [];
-      if (msg.isSuccess()) {
-        var handleToObject = msg.getBody();
-        var resolved = handleToObject[object.ref];
-        devtools.DebuggerAgent.formatObjectProperties_(resolved, result,
-                                                       noIntrinsic);
-        callback(result);
-      } else {
-        callback([]);
-      }
-    });
-  }
-};
-
-
-/**
- * Sends 'scope' request for the scope object to resolve its variables.
- * @param {Object} scope Scope to be resolved.
- * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback
- *     Callback to be called when all scope variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback) {
-  var cmd = new devtools.DebugCommand('scope', {
-    'frameNumber': scope.frameNumber,
-    'number': scope.index,
-    'compactFormat': true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-      var result = [];
-    if (msg.isSuccess()) {
-      var scopeObjectJson = msg.getBody().object;
-      devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result,
-                                                     true /* no intrinsic */);
-    }
-    callback(result);
-  };
-};
-
-
-/**
- * Sends 'scopes' request for the frame object to resolve all variables
- * available in the frame.
- * @param {number} callFrameId Id of call frame whose variables need to
- *     be resolved.
- * @param {function(Object)} callback Callback to be called when all frame
- *     variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(
-    callFrameId, callback) {
-  var result = {};
-
-  var frame = this.callFrames_[callFrameId];
-  if (!frame) {
-    callback(result);
-    return;
-  }
-
-  var waitingResponses = 0;
-  function scopeResponseHandler(msg) {
-    waitingResponses--;
-
-    if (msg.isSuccess()) {
-      var properties = msg.getBody().object.properties;
-      for (var j = 0; j < properties.length; j++) {
-        result[properties[j].name] = true;
-      }
-    }
-
-    // When all scopes are resolved invoke the callback.
-    if (waitingResponses == 0) {
-      callback(result);
-    }
-  };
-
-  for (var i = 0; i < frame.scopeChain.length; i++) {
-    var scope = frame.scopeChain[i].objectId;
-    if (scope.type == devtools.DebuggerAgent.ScopeType.Global) {
-      // Do not resolve global scope since it takes for too long.
-      // TODO(yurys): allow to send only property names in the response.
-      continue;
-    }
-    var cmd = new devtools.DebugCommand('scope', {
-      'frameNumber': scope.frameNumber,
-      'number': scope.index,
-      'compactFormat': true
-    });
-    devtools.DebuggerAgent.sendCommand_(cmd);
-    this.requestSeqToCallback_[cmd.getSequenceNumber()] =
-        scopeResponseHandler;
-    waitingResponses++;
-  }
-};
-
-/**
- * Evaluates the expressionString to an object in the call frame and reports
- * all its properties.
- * @param{string} expressionString Expression whose properties should be
- *     collected.
- * @param{number} callFrameId The frame id.
- * @param{function(Object result,bool isException)} reportCompletions Callback
- *     function.
- */
-devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(
-      expressionString, callFrameId, reportCompletions) {
-    if (expressionString) {
-      expressionString = 'var obj = ' + expressionString +
-          '; var names = {}; for (var n in obj) { names[n] = true; };' +
-          'names;';
-      this.evaluateInCallFrame(
-          callFrameId,
-          expressionString,
-          function(result) {
-            var names = {};
-            if (!result.isException) {
-              var props = result.value.objectId.properties;
-              // Put all object properties into the map.
-              for (var i = 0; i < props.length; i++) {
-                names[props[i].name] = true;
-              }
-            }
-            reportCompletions(names, result.isException);
-          });
-    } else {
-      this.resolveFrameVariables_(callFrameId,
-          function(result) {
-            reportCompletions(result, false /* isException */);
-          });
-    }
-};
-
-
-/**
- * @param{number} scriptId
- * @return {string} Type of the context of the script with specified id.
- */
-devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId) {
-  return this.parsedScripts_[scriptId].getContextType();
-};
-
-
-/**
- * Removes specified breakpoint from the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- */
-devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(
-    breakpointId) {
-  var cmd = new devtools.DebugCommand('clearbreakpoint', {
-    'breakpoint': breakpointId
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Changes breakpoint parameters in the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- * @param {boolean} enabled Whether to enable the breakpoint.
- * @param {?string} condition New breakpoint condition.
- * @param {number} ignoreCount New ignore count for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.requestChangeBreakpoint_ = function(
-    breakpointId, enabled, condition, ignoreCount) {
-  var cmd = new devtools.DebugCommand('changebreakpoint', {
-    'breakpoint': breakpointId,
-    'enabled': enabled,
-    'condition': condition,
-    'ignoreCount': ignoreCount
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends 'backtrace' request to v8.
- */
-devtools.DebuggerAgent.prototype.requestBacktrace_ = function() {
-  var cmd = new devtools.DebugCommand('backtrace', {
-    'compactFormat':true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends command to v8 debugger.
- * @param {devtools.DebugCommand} cmd Command to execute.
- */
-devtools.DebuggerAgent.sendCommand_ = function(cmd) {
-  RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol());
-};
-
-
-/**
- * Tells the v8 debugger to make the next execution step.
- * @param {string} action 'in', 'out' or 'next' action.
- */
-devtools.DebuggerAgent.prototype.stepCommand_ = function(action) {
-  this.clearExceptionMessage_();
-  var cmd = new devtools.DebugCommand('continue', {
-    'stepaction': action,
-    'stepcount': 1
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends 'lookup' request to v8.
- * @param {number} handle Handle to the object to lookup.
- */
-devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback) {
-  var cmd = new devtools.DebugCommand('lookup', {
-    'compactFormat':true,
-    'handles': handles
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sets debugger context id for scripts filtering.
- * @param {number} contextId Id of the inspected page global context.
- */
-devtools.DebuggerAgent.prototype.setContextId_ = function(contextId) {
-  this.contextId_ = contextId;
-
-  // If it's the first time context id is set request scripts list.
-  if (this.requestScriptsWhenContextIdSet_) {
-    this.requestScriptsWhenContextIdSet_ = false;
-    var cmd = new devtools.DebugCommand('scripts', {
-      'includeSource': false
-    });
-    devtools.DebuggerAgent.sendCommand_(cmd);
-    // Force v8 execution so that it gets to processing the requested command.
-    RemoteToolsAgent.ExecuteVoidJavaScript();
-
-    var debuggerAgent = this;
-    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-      // Handle the response iff the context id hasn't changed since the request
-      // was issued. Otherwise if the context id did change all up-to-date
-      // scripts will be pushed in after compile events and there is no need to
-      // handle the response.
-      if (contextId == debuggerAgent.contextId_) {
-        debuggerAgent.handleScriptsResponse_(msg);
-      }
-
-      // We received initial scripts response so flush the flag and
-      // see if there is an unhandled backtrace response.
-      debuggerAgent.waitingForInitialScriptsResponse_ = false;
-      if (debuggerAgent.pendingBacktraceResponseHandler_) {
-        debuggerAgent.pendingBacktraceResponseHandler_();
-        debuggerAgent.pendingBacktraceResponseHandler_ = null;
-      }
-    };
-  }
-};
-
-
-/**
- * Handles output sent by v8 debugger. The output is either asynchronous event
- * or response to a previously sent request.  See protocol definitioun for more
- * details on the output format.
- * @param {string} output
- */
-devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output) {
-  var msg;
-  try {
-    msg = new devtools.DebuggerMessage(output);
-  } catch(e) {
-    debugPrint('Failed to handle debugger reponse:\n' + e);
-    throw e;
-  }
-
-  if (msg.getType() == 'event') {
-    if (msg.getEvent() == 'break') {
-      this.handleBreakEvent_(msg);
-    } else if (msg.getEvent() == 'exception') {
-      this.handleExceptionEvent_(msg);
-    } else if (msg.getEvent() == 'afterCompile') {
-      this.handleAfterCompileEvent_(msg);
-    }
-  } else if (msg.getType() == 'response') {
-    if (msg.getCommand() == 'scripts') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'setbreakpoint') {
-      this.handleSetBreakpointResponse_(msg);
-    } else if (msg.getCommand() == 'clearbreakpoint') {
-      this.handleClearBreakpointResponse_(msg);
-    } else if (msg.getCommand() == 'backtrace') {
-      this.handleBacktraceResponse_(msg);
-    } else if (msg.getCommand() == 'lookup') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'evaluate') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'scope') {
-      this.invokeCallbackForResponse_(msg);
-    }
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg) {
-  // Force scrips panel to be shown first.
-  WebInspector.currentPanel = WebInspector.panels.scripts;
-
-  var body = msg.getBody();
-
-  var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
-  this.requestBacktrace_();
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg) {
-  // Force scrips panel to be shown first.
-  WebInspector.currentPanel = WebInspector.panels.scripts;
-
-  var body = msg.getBody();
-  // No script field in the body means that v8 failed to parse the script. We
-  // resume execution on parser errors automatically.
-  if (this.pauseOnExceptions_ && body.script) {
-    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
-    this.createExceptionMessage_(body.script.name, line, body.exception.text);
-    this.requestBacktrace_();
-  } else {
-    this.resumeExecution();
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg) {
-  var scripts = msg.getBody();
-  for (var i = 0; i < scripts.length; i++) {
-    var script = scripts[i];
-
-    // Skip scripts from other tabs.
-    if (!this.isScriptFromInspectedContext_(script, msg)) {
-      continue;
-    }
-
-    // We may already have received the info in an afterCompile event.
-    if (script.id in this.parsedScripts_) {
-      continue;
-    }
-    this.addScriptInfo_(script, msg);
-  }
-};
-
-
-/**
- * @param {Object} script Json object representing script.
- * @param {devtools.DebuggerMessage} msg Debugger response.
- */
-devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(
-    script, msg) {
-  if (!script.context) {
-    // Always ignore scripts from the utility context.
-    return false;
-  }
-  var context = msg.lookup(script.context.ref);
-  var scriptContextId = context.data;
-  if (!goog.isDef(scriptContextId)) {
-    return false; // Always ignore scripts from the utility context.
-  }
-  if (this.contextId_ === null) {
-    return true;
-  }
-  if (goog.isString(context.data)) {
-    // Find the id from context data. The context data has the format "type,id".
-    var comma = context.data.indexOf(',');
-    if (comma < 0) {
-      return false;
-    }
-    return (parseInt(context.data.substring(comma + 1)) == this.contextId_);
-  } else {
-    // TODO(sgjesse) remove this when patch for
-    // https://bugs.webkit.org/show_bug.cgi?id=31873 has landed in Chromium.
-    return (scriptContextId.value == this.contextId_);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg) {
-  var requestSeq = msg.getRequestSeq();
-  var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq];
-  if (!breakpointInfo) {
-    // TODO(yurys): handle this case
-    return;
-  }
-  delete this.requestNumberToBreakpointInfo_[requestSeq];
-  if (!msg.isSuccess()) {
-    // TODO(yurys): handle this case
-    return;
-  }
-  var idInV8 = msg.getBody().breakpoint;
-  breakpointInfo.setV8Id(idInV8);
-
-  if (breakpointInfo.isRemoved()) {
-    this.requestClearBreakpoint_(idInV8);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg) {
-  if (!this.contextId_) {
-    // Ignore scripts delta if main request has not been issued yet.
-    return;
-  }
-  var script = msg.getBody().script;
-
-  // Ignore scripts from other tabs.
-  if (!this.isScriptFromInspectedContext_(script, msg)) {
-    return;
-  }
-  this.addScriptInfo_(script, msg);
-};
-
-
-/**
- * Adds the script info to the local cache. This method assumes that the script
- * is not in the cache yet.
- * @param {Object} script Script json object from the debugger message.
- * @param {devtools.DebuggerMessage} msg Debugger message containing the script
- *     data.
- */
-devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg) {
-  var context = msg.lookup(script.context.ref);
-  var contextType;
-  if (goog.isString(context.data)) {
-    // Find the type from context data. The context data has the format
-    // "type,id".
-    var comma = context.data.indexOf(',');
-    if (comma < 0) {
-      return
-    }
-    contextType = context.data.substring(0, comma);
-  } else {
-    // TODO(sgjesse) remove this when patch for
-    // https://bugs.webkit.org/show_bug.cgi?id=31873 has landed in Chromium.
-    contextType = context.data.type;
-  }
-  this.parsedScripts_[script.id] = new devtools.ScriptInfo(
-      script.id, script.name, script.lineOffset, contextType);
-  if (this.scriptsPanelInitialized_) {
-    // Only report script as parsed after scripts panel has been shown.
-    WebInspector.parsedScriptSource(
-        script.id, script.name, script.source, script.lineOffset);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(
-    msg) {
-  // Do nothing.
-};
-
-
-/**
- * Handles response to 'backtrace' command.
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg) {
-  if (this.waitingForInitialScriptsResponse_) {
-    this.pendingBacktraceResponseHandler_ =
-        this.doHandleBacktraceResponse_.bind(this, msg);
-  } else {
-    this.doHandleBacktraceResponse_(msg);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg) {
-  var frames = msg.getBody().frames;
-  this.callFrames_ = [];
-  for (var i = 0; i <  frames.length; ++i) {
-    this.callFrames_.push(this.formatCallFrame_(frames[i]));
-  }
-  WebInspector.pausedScript(this.callFrames_);
-  this.showPendingExceptionMessage_();
-  InspectorFrontendHost.activateWindow();
-};
-
-
-/**
- * Evaluates code on given callframe.
- */
-devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(
-    callFrameId, code, callback) {
-  var callFrame = this.callFrames_[callFrameId];
-  callFrame.evaluate_(code, callback);
-};
-
-
-/**
- * Handles response to a command by invoking its callback (if any).
- * @param {devtools.DebuggerMessage} msg
- * @return {boolean} Whether a callback for the given message was found and
- *     excuted.
- */
-devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg) {
-  var callback = this.requestSeqToCallback_[msg.getRequestSeq()];
-  if (!callback) {
-    // It may happend if reset was called.
-    return false;
-  }
-  delete this.requestSeqToCallback_[msg.getRequestSeq()];
-  callback(msg);
-  return true;
-};
-
-
-/**
- * @param {Object} stackFrame Frame json object from 'backtrace' response.
- * @return {!devtools.CallFrame} Object containing information related to the
- *     call frame in the format expected by ScriptsPanel and its panes.
- */
-devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame) {
-  var func = stackFrame.func;
-  var sourceId = func.scriptId;
-
-  // Add service script if it does not exist.
-  var existingScript = this.parsedScripts_[sourceId];
-  if (!existingScript) {
-    this.parsedScripts_[sourceId] = new devtools.ScriptInfo(
-        sourceId, null /* name */, 0 /* line */, 'unknown' /* type */,
-        true /* unresolved */);
-    WebInspector.parsedScriptSource(sourceId, null, null, 0);
-  }
-
-  var funcName = func.name || func.inferredName || '(anonymous function)';
-  var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line);
-
-  // Add basic scope chain info with scope variables.
-  var scopeChain = [];
-  var ScopeType = devtools.DebuggerAgent.ScopeType;
-  for (var i = 0; i < stackFrame.scopes.length; i++) {
-    var scope = stackFrame.scopes[i];
-    scope.frameNumber = stackFrame.index;
-    var scopeObjectProxy = new WebInspector.ObjectProxy(scope, [], 0, '', true);
-    scopeObjectProxy.isScope = true;
-    switch(scope.type) {
-      case ScopeType.Global:
-        scopeObjectProxy.isDocument = true;
-        break;
-      case ScopeType.Local:
-        scopeObjectProxy.isLocal = true;
-        scopeObjectProxy.thisObject =
-            devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver);
-        break;
-      case ScopeType.With:
-      // Catch scope is treated as a regular with scope by WebKit so we
-      // also treat it this way.
-      case ScopeType.Catch:
-        scopeObjectProxy.isWithBlock = true;
-        break;
-      case ScopeType.Closure:
-        scopeObjectProxy.isClosure = true;
-        break;
-    }
-    scopeChain.push(scopeObjectProxy);
-  }
-  return new devtools.CallFrame(stackFrame.index, 'function', funcName,
-      sourceId, line, scopeChain);
-};
-
-
-/**
- * Collects properties for an object from the debugger response.
- * @param {Object} object An object from the debugger protocol response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the
- *     properties into.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be
- *     included.
- */
-devtools.DebuggerAgent.formatObjectProperties_ = function(object, result,
-                                                          noIntrinsic) {
-  devtools.DebuggerAgent.propertiesToProxies_(object.properties, result);
-  if (noIntrinsic) {
-    return;
-  }
-
-  result.push(new WebInspector.ObjectPropertyProxy('__proto__',
-      devtools.DebuggerAgent.formatObjectProxy_(object.protoObject)));
-  result.push(new WebInspector.ObjectPropertyProxy('constructor',
-      devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction)));
-  // Don't add 'prototype' property since it is one of the regualar properties.
-};
-
-
-/**
- * For each property in 'properties' creates its proxy representative.
- * @param {Array.<Object>} properties Receiver properties or locals array from
- *     'backtrace' response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder.
- */
-devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result) {
-  var map = {};
-  for (var i = 0; i < properties.length; ++i) {
-    var property = properties[i];
-    var name = String(property.name);
-    if (name in map) {
-      continue;
-    }
-    map[name] = true;
-    var value = devtools.DebuggerAgent.formatObjectProxy_(property.value);
-    var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value);
-    result.push(propertyProxy);
-  }
-};
-
-
-/**
- * @param {Object} v An object reference from the debugger response.
- * @return {*} The value representation expected by ScriptsPanel.
- */
-devtools.DebuggerAgent.formatObjectProxy_ = function(v) {
-  var description;
-  var hasChildren = false;
-  if (v.type == 'object') {
-    description = v.className;
-    hasChildren = true;
-  } else if (v.type == 'function') {
-    if (v.source) {
-      description = v.source;
-    } else {
-      description = 'function ' + v.name + '()';
-    }
-    hasChildren = true;
-  } else if (v.type == 'undefined') {
-    description = 'undefined';
-  } else if (v.type == 'null') {
-    description = 'null';
-  } else if (goog.isDef(v.value)) {
-    // Check for undefined and null types before checking the value, otherwise
-    // null/undefined may have blank value.
-    description = v.value;
-  } else {
-    description = '<unresolved ref: ' + v.ref + ', type: ' + v.type + '>';
-  }
-  var proxy = new WebInspector.ObjectProxy(v, [], 0, description, hasChildren);
-  proxy.type = v.type;
-  proxy.isV8Ref = true;
-  return proxy;
-};
-
-
-/**
- * Converts line number from Web Inspector UI(1-based) to v8(0-based).
- * @param {number} line Resource line number in Web Inspector UI.
- * @return {number} The line number in v8.
- */
-devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line) {
-  return line - 1;
-};
-
-
-/**
- * Converts line number from v8(0-based) to Web Inspector UI(1-based).
- * @param {number} line Resource line number in v8.
- * @return {number} The line number in Web Inspector.
- */
-devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line) {
-  return line + 1;
-};
-
-
-/**
- * @param {number} scriptId Id of the script.
- * @param {?string} url Script resource URL if any.
- * @param {number} lineOffset First line 0-based offset in the containing
- *     document.
- * @param {string} contextType Type of the script's context:
- *     "page" - regular script from html page
- *     "injected" - extension content script
- * @param {bool} opt_isUnresolved If true, script will not be resolved.
- * @constructor
- */
-devtools.ScriptInfo = function(
-    scriptId, url, lineOffset, contextType, opt_isUnresolved) {
-  this.scriptId_ = scriptId;
-  this.lineOffset_ = lineOffset;
-  this.contextType_ = contextType;
-  this.url_ = url;
-  this.isUnresolved_ = opt_isUnresolved;
-
-  this.lineToBreakpointInfo_ = {};
-};
-
-
-/**
- * @return {number}
- */
-devtools.ScriptInfo.prototype.getLineOffset = function() {
-  return this.lineOffset_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.ScriptInfo.prototype.getContextType = function() {
-  return this.contextType_;
-};
-
-
-/**
- * @return {?string}
- */
-devtools.ScriptInfo.prototype.getUrl = function() {
-  return this.url_;
-};
-
-
-/**
- * @return {?bool}
- */
-devtools.ScriptInfo.prototype.isUnresolved = function() {
-  return this.isUnresolved_;
-};
-
-
-/**
- * @param {number} line 0-based line number in the script.
- * @return {?devtools.BreakpointInfo} Information on a breakpoint at the
- *     specified line in the script or undefined if there is no breakpoint at
- *     that line.
- */
-devtools.ScriptInfo.prototype.getBreakpointInfo = function(line) {
-  return this.lineToBreakpointInfo_[line];
-};
-
-
-/**
- * Adds breakpoint info to the script.
- * @param {devtools.BreakpointInfo} breakpoint
- */
-devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint) {
-  this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint;
-};
-
-
-/**
- * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed.
- */
-devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint) {
-  var line = breakpoint.getLine();
-  delete this.lineToBreakpointInfo_[line];
-};
-
-
-
-/**
- * @param {number} line Breakpoint 0-based line number in the containing script.
- * @constructor
- */
-devtools.BreakpointInfo = function(line) {
-  this.line_ = line;
-  this.v8id_ = -1;
-  this.removed_ = false;
-};
-
-
-/**
- * @return {number}
- */
-devtools.BreakpointInfo.prototype.getLine = function(n) {
-  return this.line_;
-};
-
-
-/**
- * @return {number} Unique identifier of this breakpoint in the v8 debugger.
- */
-devtools.BreakpointInfo.prototype.getV8Id = function(n) {
-  return this.v8id_;
-};
-
-
-/**
- * Sets id of this breakpoint in the v8 debugger.
- * @param {number} id
- */
-devtools.BreakpointInfo.prototype.setV8Id = function(id) {
-  this.v8id_ = id;
-};
-
-
-/**
- * Marks this breakpoint as removed from the  front-end.
- */
-devtools.BreakpointInfo.prototype.markAsRemoved = function() {
-  this.removed_ = true;
-};
-
-
-/**
- * @return {boolean} Whether this breakpoint has been removed from the
- *     front-end.
- */
-devtools.BreakpointInfo.prototype.isRemoved = function() {
-  return this.removed_;
-};
-
-
-/**
- * Call stack frame data.
- * @param {string} id CallFrame id.
- * @param {string} type CallFrame type.
- * @param {string} functionName CallFrame type.
- * @param {string} sourceID Source id.
- * @param {number} line Source line.
- * @param {Array.<Object>} scopeChain Array of scoped objects.
- * @construnctor
- */
-devtools.CallFrame = function(id, type, functionName, sourceID, line,
-    scopeChain) {
-  this.id = id;
-  this.type = type;
-  this.functionName = functionName;
-  this.sourceID = sourceID;
-  this.line = line;
-  this.scopeChain = scopeChain;
-};
-
-
-/**
- * This method issues asynchronous evaluate request, reports result to the
- * callback.
- * @param {string} expression An expression to be evaluated in the context of
- *     this call frame.
- * @param {function(Object):undefined} callback Callback to report result to.
- */
-devtools.CallFrame.prototype.evaluate_ = function(expression, callback) {
-  devtools.tools.getDebuggerAgent().requestEvaluate({
-      'expression': expression,
-      'frame': this.id,
-      'global': false,
-      'disable_break': false,
-      'compactFormat': true
-    },
-    function(response) {
-      var result = {};
-      if (response.isSuccess()) {
-        result.value = devtools.DebuggerAgent.formatObjectProxy_(
-            response.getBody());
-      } else {
-        result.value = response.getMessage();
-        result.isException = true;
-      }
-      callback(result);
-    });
-};
-
-
-/**
- * JSON based commands sent to v8 debugger.
- * @param {string} command Name of the command to execute.
- * @param {Object} opt_arguments Command-specific arguments map.
- * @constructor
- */
-devtools.DebugCommand = function(command, opt_arguments) {
-  this.command_ = command;
-  this.type_ = 'request';
-  this.seq_ = ++devtools.DebugCommand.nextSeq_;
-  if (opt_arguments) {
-    this.arguments_ = opt_arguments;
-  }
-};
-
-
-/**
- * Next unique number to be used as debugger request sequence number.
- * @type {number}
- */
-devtools.DebugCommand.nextSeq_ = 1;
-
-
-/**
- * @return {number}
- */
-devtools.DebugCommand.prototype.getSequenceNumber = function() {
-  return this.seq_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebugCommand.prototype.toJSONProtocol = function() {
-  var json = {
-    'seq': this.seq_,
-    'type': this.type_,
-    'command': this.command_
-  }
-  if (this.arguments_) {
-    json.arguments = this.arguments_;
-  }
-  return JSON.stringify(json);
-};
-
-
-/**
- * JSON messages sent from v8 debugger. See protocol definition for more
- * details: http://code.google.com/p/v8/wiki/DebuggerProtocol
- * @param {string} msg Raw protocol packet as JSON string.
- * @constructor
- */
-devtools.DebuggerMessage = function(msg) {
-  this.packet_ = JSON.parse(msg);
-  this.refs_ = [];
-  if (this.packet_.refs) {
-    for (var i = 0; i < this.packet_.refs.length; i++) {
-      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
-    }
-  }
-};
-
-
-/**
- * @return {string} The packet type.
- */
-devtools.DebuggerMessage.prototype.getType = function() {
-  return this.packet_.type;
-};
-
-
-/**
- * @return {?string} The packet event if the message is an event.
- */
-devtools.DebuggerMessage.prototype.getEvent = function() {
-  return this.packet_.event;
-};
-
-
-/**
- * @return {?string} The packet command if the message is a response to a
- *     command.
- */
-devtools.DebuggerMessage.prototype.getCommand = function() {
-  return this.packet_.command;
-};
-
-
-/**
- * @return {number} The packet request sequence.
- */
-devtools.DebuggerMessage.prototype.getRequestSeq = function() {
-  return this.packet_.request_seq;
-};
-
-
-/**
- * @return {number} Whether the v8 is running after processing the request.
- */
-devtools.DebuggerMessage.prototype.isRunning = function() {
-  return this.packet_.running ? true : false;
-};
-
-
-/**
- * @return {boolean} Whether the request succeeded.
- */
-devtools.DebuggerMessage.prototype.isSuccess = function() {
-  return this.packet_.success ? true : false;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebuggerMessage.prototype.getMessage = function() {
-  return this.packet_.message;
-};
-
-
-/**
- * @return {Object} Parsed message body json.
- */
-devtools.DebuggerMessage.prototype.getBody = function() {
-  return this.packet_.body;
-};
-
-
-/**
- * @param {number} handle Object handle.
- * @return {?Object} Returns the object with the handle if it was sent in this
- *    message(some objects referenced by handles may be missing in the message).
- */
-devtools.DebuggerMessage.prototype.lookup = function(handle) {
-  return this.refs_[handle];
-};
-
-/* codemap.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Constructs a mapper that maps addresses into code entries.
- *
- * @constructor
- */
-devtools.profiler.CodeMap = function() {
-  /**
-   * Dynamic code entries. Used for JIT compiled code.
-   */
-  this.dynamics_ = new goog.structs.SplayTree();
-
-  /**
-   * Name generator for entries having duplicate names.
-   */
-  this.dynamicsNameGen_ = new devtools.profiler.CodeMap.NameGenerator();
-
-  /**
-   * Static code entries. Used for statically compiled code.
-   */
-  this.statics_ = new goog.structs.SplayTree();
-
-  /**
-   * Libraries entries. Used for the whole static code libraries.
-   */
-  this.libraries_ = new goog.structs.SplayTree();
-
-  /**
-   * Map of memory pages occupied with static code.
-   */
-  this.pages_ = [];
-};
-
-
-/**
- * The number of alignment bits in a page address.
- */
-devtools.profiler.CodeMap.PAGE_ALIGNMENT = 12;
-
-
-/**
- * Page size in bytes.
- */
-devtools.profiler.CodeMap.PAGE_SIZE =
-    1 << devtools.profiler.CodeMap.PAGE_ALIGNMENT;
-
-
-/**
- * Adds a dynamic (i.e. moveable and discardable) code entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addCode = function(start, codeEntry) {
-  this.dynamics_.insert(start, codeEntry);
-};
-
-
-/**
- * Moves a dynamic code entry. Throws an exception if there is no dynamic
- * code entry with the specified starting address.
- *
- * @param {number} from The starting address of the entry being moved.
- * @param {number} to The destination address.
- */
-devtools.profiler.CodeMap.prototype.moveCode = function(from, to) {
-  var removedNode = this.dynamics_.remove(from);
-  this.dynamics_.insert(to, removedNode.value);
-};
-
-
-/**
- * Discards a dynamic code entry. Throws an exception if there is no dynamic
- * code entry with the specified starting address.
- *
- * @param {number} start The starting address of the entry being deleted.
- */
-devtools.profiler.CodeMap.prototype.deleteCode = function(start) {
-  var removedNode = this.dynamics_.remove(start);
-};
-
-
-/**
- * Adds a library entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addLibrary = function(
-    start, codeEntry) {
-  this.markPages_(start, start + codeEntry.size);
-  this.libraries_.insert(start, codeEntry);
-};
-
-
-/**
- * Adds a static code entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addStaticCode = function(
-    start, codeEntry) {
-  this.statics_.insert(start, codeEntry);
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.markPages_ = function(start, end) {
-  for (var addr = start; addr <= end;
-       addr += devtools.profiler.CodeMap.PAGE_SIZE) {
-    this.pages_[addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT] = 1;
-  }
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
-  return addr >= node.key && addr < (node.key + node.value.size);
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.findInTree_ = function(tree, addr) {
-  var node = tree.findGreatestLessThan(addr);
-  return node && this.isAddressBelongsTo_(addr, node) ? node.value : null;
-};
-
-
-/**
- * Finds a code entry that contains the specified address. Both static and
- * dynamic code entries are considered.
- *
- * @param {number} addr Address.
- */
-devtools.profiler.CodeMap.prototype.findEntry = function(addr) {
-  var pageAddr = addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT;
-  if (pageAddr in this.pages_) {
-    // Static code entries can contain "holes" of unnamed code.
-    // In this case, the whole library is assigned to this address.
-    return this.findInTree_(this.statics_, addr) ||
-        this.findInTree_(this.libraries_, addr);
-  }
-  var min = this.dynamics_.findMin();
-  var max = this.dynamics_.findMax();
-  if (max != null && addr < (max.key + max.value.size) && addr >= min.key) {
-    var dynaEntry = this.findInTree_(this.dynamics_, addr);
-    if (dynaEntry == null) return null;
-    // Dedupe entry name.
-    if (!dynaEntry.nameUpdated_) {
-      dynaEntry.name = this.dynamicsNameGen_.getName(dynaEntry.name);
-      dynaEntry.nameUpdated_ = true;
-    }
-    return dynaEntry;
-  }
-  return null;
-};
-
-
-/**
- * Returns an array of all dynamic code entries.
- */
-devtools.profiler.CodeMap.prototype.getAllDynamicEntries = function() {
-  return this.dynamics_.exportValues();
-};
-
-
-/**
- * Returns an array of all static code entries.
- */
-devtools.profiler.CodeMap.prototype.getAllStaticEntries = function() {
-  return this.statics_.exportValues();
-};
-
-
-/**
- * Returns an array of all libraries entries.
- */
-devtools.profiler.CodeMap.prototype.getAllLibrariesEntries = function() {
-  return this.libraries_.exportValues();
-};
-
-
-/**
- * Creates a code entry object.
- *
- * @param {number} size Code entry size in bytes.
- * @param {string} opt_name Code entry name.
- * @constructor
- */
-devtools.profiler.CodeMap.CodeEntry = function(size, opt_name) {
-  this.size = size;
-  this.name = opt_name || '';
-  this.nameUpdated_ = false;
-};
-
-
-devtools.profiler.CodeMap.CodeEntry.prototype.getName = function() {
-  return this.name;
-};
-
-
-devtools.profiler.CodeMap.CodeEntry.prototype.toString = function() {
-  return this.name + ': ' + this.size.toString(16);
-};
-
-
-devtools.profiler.CodeMap.NameGenerator = function() {
-  this.knownNames_ = {};
-};
-
-
-devtools.profiler.CodeMap.NameGenerator.prototype.getName = function(name) {
-  if (!(name in this.knownNames_)) {
-    this.knownNames_[name] = 0;
-    return name;
-  }
-  var count = ++this.knownNames_[name];
-  return name + ' {' + count + '}';
-};
-
-/* consarray.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-/**
- * Constructs a ConsArray object. It is used mainly for tree traversal.
- * In this use case we have lots of arrays that we need to iterate
- * sequentally. The internal Array implementation is horribly slow
- * when concatenating on large (10K items) arrays due to memory copying.
- * That's why we avoid copying memory and insead build a linked list
- * of arrays to iterate through.
- *
- * @constructor
- */
-function ConsArray() {
-  this.tail_ = new ConsArray.Cell(null, null);
-  this.currCell_ = this.tail_;
-  this.currCellPos_ = 0;
-};
-
-
-/**
- * Concatenates another array for iterating. Empty arrays are ignored.
- * This operation can be safely performed during ongoing ConsArray
- * iteration.
- *
- * @param {Array} arr Array to concatenate.
- */
-ConsArray.prototype.concat = function(arr) {
-  if (arr.length > 0) {
-    this.tail_.data = arr;
-    this.tail_ = this.tail_.next = new ConsArray.Cell(null, null);
-  }
-};
-
-
-/**
- * Whether the end of iteration is reached.
- */
-ConsArray.prototype.atEnd = function() {
-  return this.currCell_ === null ||
-      this.currCell_.data === null ||
-      this.currCellPos_ >= this.currCell_.data.length;
-};
-
-
-/**
- * Returns the current item, moves to the next one.
- */
-ConsArray.prototype.next = function() {
-  var result = this.currCell_.data[this.currCellPos_++];
-  if (this.currCellPos_ >= this.currCell_.data.length) {
-    this.currCell_ = this.currCell_.next;
-    this.currCellPos_ = 0;
-  }
-  return result;
-};
-
-
-/**
- * A cell object used for constructing a list in ConsArray.
- *
- * @constructor
- */
-ConsArray.Cell = function(data, next) {
-  this.data = data;
-  this.next = next;
-};
-
-
-/* csvparser.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces.
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a CSV lines parser.
- */
-devtools.profiler.CsvParser = function() {
-};
-
-
-/**
- * A regex for matching a trailing quote.
- * @private
- */
-devtools.profiler.CsvParser.TRAILING_QUOTE_RE_ = /\"$/;
-
-
-/**
- * A regex for matching a double quote.
- * @private
- */
-devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
-
-
-/**
- * Parses a line of CSV-encoded values. Returns an array of fields.
- *
- * @param {string} line Input line.
- */
-devtools.profiler.CsvParser.prototype.parseLine = function(line) {
-  var insideQuotes = false;
-  var fields = [];
-  var prevPos = 0;
-  for (var i = 0, n = line.length; i < n; ++i) {
-    switch (line.charAt(i)) {
-      case ',':
-        if (!insideQuotes) {
-          fields.push(line.substring(prevPos, i));
-          prevPos = i + 1;
-        }
-        break;
-      case '"':
-        if (!insideQuotes) {
-          insideQuotes = true;
-          // Skip the leading quote.
-          prevPos++;
-        } else {
-          if (i + 1 < n && line.charAt(i + 1) != '"') {
-            insideQuotes = false;
-          } else {
-            i++;
-          }
-        }
-        break;
-    }
-  }
-  if (n > 0) {
-    fields.push(line.substring(prevPos));
-  }
-
-  for (i = 0; i < fields.length; ++i) {
-    // Eliminate trailing quotes.
-    fields[i] = fields[i].replace(devtools.profiler.CsvParser.TRAILING_QUOTE_RE_, '');
-    // Convert quoted quotes into single ones.
-    fields[i] = fields[i].replace(devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_, '"');
-  }
-  return fields;
-};
-
-/* logreader.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/**
- * @fileoverview Log Reader is used to process log file produced by V8.
- */
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Base class for processing log files.
- *
- * @param {Array.<Object>} dispatchTable A table used for parsing and processing
- *     log records.
- * @constructor
- */
-devtools.profiler.LogReader = function(dispatchTable) {
-  /**
-   * @type {Array.<Object>}
-   */
-  this.dispatchTable_ = dispatchTable;
-  this.dispatchTable_['alias'] =
-      { parsers: [null, null], processor: this.processAlias_ };
-  this.dispatchTable_['repeat'] =
-      { parsers: [parseInt, 'var-args'], processor: this.processRepeat_,
-        backrefs: true };
-
-  /**
-   * A key-value map for aliases. Translates short name -> full name.
-   * @type {Object}
-   */
-  this.aliases_ = {};
-
-  /**
-   * A key-value map for previous address values.
-   * @type {Object}
-   */
-  this.prevAddresses_ = {};
-
-  /**
-   * A key-value map for events than can be backreference-compressed.
-   * @type {Object}
-   */
-  this.backRefsCommands_ = {};
-  this.initBackRefsCommands_();
-
-  /**
-   * Back references for decompression.
-   * @type {Array.<string>}
-   */
-  this.backRefs_ = [];
-};
-
-
-/**
- * Creates a parser for an address entry.
- *
- * @param {string} addressTag Address tag to perform offset decoding.
- * @return {function(string):number} Address parser.
- */
-devtools.profiler.LogReader.prototype.createAddressParser = function(
-    addressTag) {
-  var self = this;
-  return (function (str) {
-    var value = parseInt(str, 16);
-    var firstChar = str.charAt(0);
-    if (firstChar == '+' || firstChar == '-') {
-      var addr = self.prevAddresses_[addressTag];
-      addr += value;
-      self.prevAddresses_[addressTag] = addr;
-      return addr;
-    } else if (firstChar != '0' || str.charAt(1) != 'x') {
-      self.prevAddresses_[addressTag] = value;
-    }
-    return value;
-  });
-};
-
-
-/**
- * Expands an alias symbol, if applicable.
- *
- * @param {string} symbol Symbol to expand.
- * @return {string} Expanded symbol, or the input symbol itself.
- */
-devtools.profiler.LogReader.prototype.expandAlias = function(symbol) {
-  return symbol in this.aliases_ ? this.aliases_[symbol] : symbol;
-};
-
-
-/**
- * Used for printing error messages.
- *
- * @param {string} str Error message.
- */
-devtools.profiler.LogReader.prototype.printError = function(str) {
-  // Do nothing.
-};
-
-
-/**
- * Processes a portion of V8 profiler event log.
- *
- * @param {string} chunk A portion of log.
- */
-devtools.profiler.LogReader.prototype.processLogChunk = function(chunk) {
-  this.processLog_(chunk.split('\n'));
-};
-
-
-/**
- * Processes stack record.
- *
- * @param {number} pc Program counter.
- * @param {Array.<string>} stack String representation of a stack.
- * @return {Array.<number>} Processed stack.
- */
-devtools.profiler.LogReader.prototype.processStack = function(pc, stack) {
-  var fullStack = [pc];
-  var prevFrame = pc;
-  for (var i = 0, n = stack.length; i < n; ++i) {
-    var frame = stack[i];
-    var firstChar = frame.charAt(0);
-    if (firstChar == '+' || firstChar == '-') {
-      // An offset from the previous frame.
-      prevFrame += parseInt(frame, 16);
-      fullStack.push(prevFrame);
-    // Filter out possible 'overflow' string.
-    } else if (firstChar != 'o') {
-      fullStack.push(parseInt(frame, 16));
-    }
-  }
-  return fullStack;
-};
-
-
-/**
- * Returns whether a particular dispatch must be skipped.
- *
- * @param {!Object} dispatch Dispatch record.
- * @return {boolean} True if dispatch must be skipped.
- */
-devtools.profiler.LogReader.prototype.skipDispatch = function(dispatch) {
-  return false;
-};
-
-
-/**
- * Does a dispatch of a log record.
- *
- * @param {Array.<string>} fields Log record.
- * @private
- */
-devtools.profiler.LogReader.prototype.dispatchLogRow_ = function(fields) {
-  // Obtain the dispatch.
-  var command = fields[0];
-  if (!(command in this.dispatchTable_)) {
-    throw new Error('unknown command: ' + command);
-  }
-  var dispatch = this.dispatchTable_[command];
-
-  if (dispatch === null || this.skipDispatch(dispatch)) {
-    return;
-  }
-
-  // Parse fields.
-  var parsedFields = [];
-  for (var i = 0; i < dispatch.parsers.length; ++i) {
-    var parser = dispatch.parsers[i];
-    if (parser === null) {
-      parsedFields.push(fields[1 + i]);
-    } else if (typeof parser == 'function') {
-      parsedFields.push(parser(fields[1 + i]));
-    } else {
-      // var-args
-      parsedFields.push(fields.slice(1 + i));
-      break;
-    }
-  }
-
-  // Run the processor.
-  dispatch.processor.apply(this, parsedFields);
-};
-
-
-/**
- * Decompresses a line if it was backreference-compressed.
- *
- * @param {string} line Possibly compressed line.
- * @return {string} Decompressed line.
- * @private
- */
-devtools.profiler.LogReader.prototype.expandBackRef_ = function(line) {
-  var backRefPos;
-  // Filter out case when a regexp is created containing '#'.
-  if (line.charAt(line.length - 1) != '"'
-      && (backRefPos = line.lastIndexOf('#')) != -1) {
-    var backRef = line.substr(backRefPos + 1);
-    var backRefIdx = parseInt(backRef, 10) - 1;
-    var colonPos = backRef.indexOf(':');
-    var backRefStart =
-        colonPos != -1 ? parseInt(backRef.substr(colonPos + 1), 10) : 0;
-    line = line.substr(0, backRefPos) +
-        this.backRefs_[backRefIdx].substr(backRefStart);
-  }
-  this.backRefs_.unshift(line);
-  if (this.backRefs_.length > 10) {
-    this.backRefs_.length = 10;
-  }
-  return line;
-};
-
-
-/**
- * Initializes the map of backward reference compressible commands.
- * @private
- */
-devtools.profiler.LogReader.prototype.initBackRefsCommands_ = function() {
-  for (var event in this.dispatchTable_) {
-    var dispatch = this.dispatchTable_[event];
-    if (dispatch && dispatch.backrefs) {
-      this.backRefsCommands_[event] = true;
-    }
-  }
-};
-
-
-/**
- * Processes alias log record. Adds an alias to a corresponding map.
- *
- * @param {string} symbol Short name.
- * @param {string} expansion Long name.
- * @private
- */
-devtools.profiler.LogReader.prototype.processAlias_ = function(
-    symbol, expansion) {
-  if (expansion in this.dispatchTable_) {
-    this.dispatchTable_[symbol] = this.dispatchTable_[expansion];
-    if (expansion in this.backRefsCommands_) {
-      this.backRefsCommands_[symbol] = true;
-    }
-  } else {
-    this.aliases_[symbol] = expansion;
-  }
-};
-
-
-/**
- * Processes log lines.
- *
- * @param {Array.<string>} lines Log lines.
- * @private
- */
-devtools.profiler.LogReader.prototype.processLog_ = function(lines) {
-  var csvParser = new devtools.profiler.CsvParser();
-  try {
-    for (var i = 0, n = lines.length; i < n; ++i) {
-      var line = lines[i];
-      if (!line) {
-        continue;
-      }
-      if (line.charAt(0) == '#' ||
-          line.substr(0, line.indexOf(',')) in this.backRefsCommands_) {
-        line = this.expandBackRef_(line);
-      }
-      var fields = csvParser.parseLine(line);
-      this.dispatchLogRow_(fields);
-    }
-  } catch (e) {
-    // An error on the last line is acceptable since log file can be truncated.
-    if (i < n - 1) {
-      this.printError('line ' + (i + 1) + ': ' + (e.message || e));
-      throw e;
-    }
-  }
-};
-
-
-/**
- * Processes repeat log record. Expands it according to calls count and
- * invokes processing.
- *
- * @param {number} count Count.
- * @param {Array.<string>} cmd Parsed command.
- * @private
- */
-devtools.profiler.LogReader.prototype.processRepeat_ = function(count, cmd) {
-  // Replace the repeat-prefixed command from backrefs list with a non-prefixed.
-  this.backRefs_[0] = cmd.join(',');
-  for (var i = 0; i < count; ++i) {
-    this.dispatchLogRow_(cmd);
-  }
-};
-
-/* profile.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a profile object for processing profiling-related events
- * and calculating function execution times.
- *
- * @constructor
- */
-devtools.profiler.Profile = function() {
-  this.codeMap_ = new devtools.profiler.CodeMap();
-  this.topDownTree_ = new devtools.profiler.CallTree();
-  this.bottomUpTree_ = new devtools.profiler.CallTree();
-};
-
-
-/**
- * Returns whether a function with the specified name must be skipped.
- * Should be overriden by subclasses.
- *
- * @param {string} name Function name.
- */
-devtools.profiler.Profile.prototype.skipThisFunction = function(name) {
-  return false;
-};
-
-
-/**
- * Enum for profiler operations that involve looking up existing
- * code entries.
- *
- * @enum {number}
- */
-devtools.profiler.Profile.Operation = {
-  MOVE: 0,
-  DELETE: 1,
-  TICK: 2
-};
-
-
-/**
- * Called whenever the specified operation has failed finding a function
- * containing the specified address. Should be overriden by subclasses.
- * See the devtools.profiler.Profile.Operation enum for the list of
- * possible operations.
- *
- * @param {number} operation Operation.
- * @param {number} addr Address of the unknown code.
- * @param {number} opt_stackPos If an unknown address is encountered
- *     during stack strace processing, specifies a position of the frame
- *     containing the address.
- */
-devtools.profiler.Profile.prototype.handleUnknownCode = function(
-    operation, addr, opt_stackPos) {
-};
-
-
-/**
- * Registers a library.
- *
- * @param {string} name Code entry name.
- * @param {number} startAddr Starting address.
- * @param {number} endAddr Ending address.
- */
-devtools.profiler.Profile.prototype.addLibrary = function(
-    name, startAddr, endAddr) {
-  var entry = new devtools.profiler.CodeMap.CodeEntry(
-      endAddr - startAddr, name);
-  this.codeMap_.addLibrary(startAddr, entry);
-  return entry;
-};
-
-
-/**
- * Registers statically compiled code entry.
- *
- * @param {string} name Code entry name.
- * @param {number} startAddr Starting address.
- * @param {number} endAddr Ending address.
- */
-devtools.profiler.Profile.prototype.addStaticCode = function(
-    name, startAddr, endAddr) {
-  var entry = new devtools.profiler.CodeMap.CodeEntry(
-      endAddr - startAddr, name);
-  this.codeMap_.addStaticCode(startAddr, entry);
-  return entry;
-};
-
-
-/**
- * Registers dynamic (JIT-compiled) code entry.
- *
- * @param {string} type Code entry type.
- * @param {string} name Code entry name.
- * @param {number} start Starting address.
- * @param {number} size Code entry size.
- */
-devtools.profiler.Profile.prototype.addCode = function(
-    type, name, start, size) {
-  var entry = new devtools.profiler.Profile.DynamicCodeEntry(size, type, name);
-  this.codeMap_.addCode(start, entry);
-  return entry;
-};
-
-
-/**
- * Reports about moving of a dynamic code entry.
- *
- * @param {number} from Current code entry address.
- * @param {number} to New code entry address.
- */
-devtools.profiler.Profile.prototype.moveCode = function(from, to) {
-  try {
-    this.codeMap_.moveCode(from, to);
-  } catch (e) {
-    this.handleUnknownCode(devtools.profiler.Profile.Operation.MOVE, from);
-  }
-};
-
-
-/**
- * Reports about deletion of a dynamic code entry.
- *
- * @param {number} start Starting address.
- */
-devtools.profiler.Profile.prototype.deleteCode = function(start) {
-  try {
-    this.codeMap_.deleteCode(start);
-  } catch (e) {
-    this.handleUnknownCode(devtools.profiler.Profile.Operation.DELETE, start);
-  }
-};
-
-
-/**
- * Records a tick event. Stack must contain a sequence of
- * addresses starting with the program counter value.
- *
- * @param {Array<number>} stack Stack sample.
- */
-devtools.profiler.Profile.prototype.recordTick = function(stack) {
-  var processedStack = this.resolveAndFilterFuncs_(stack);
-  this.bottomUpTree_.addPath(processedStack);
-  processedStack.reverse();
-  this.topDownTree_.addPath(processedStack);
-};
-
-
-/**
- * Translates addresses into function names and filters unneeded
- * functions.
- *
- * @param {Array<number>} stack Stack sample.
- */
-devtools.profiler.Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
-  var result = [];
-  for (var i = 0; i < stack.length; ++i) {
-    var entry = this.codeMap_.findEntry(stack[i]);
-    if (entry) {
-      var name = entry.getName();
-      if (!this.skipThisFunction(name)) {
-        result.push(name);
-      }
-    } else {
-      this.handleUnknownCode(
-          devtools.profiler.Profile.Operation.TICK, stack[i], i);
-    }
-  }
-  return result;
-};
-
-
-/**
- * Performs a BF traversal of the top down call graph.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.Profile.prototype.traverseTopDownTree = function(f) {
-  this.topDownTree_.traverse(f);
-};
-
-
-/**
- * Performs a BF traversal of the bottom up call graph.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.Profile.prototype.traverseBottomUpTree = function(f) {
-  this.bottomUpTree_.traverse(f);
-};
-
-
-/**
- * Calculates a top down profile for a node with the specified label.
- * If no name specified, returns the whole top down calls tree.
- *
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getTopDownProfile = function(opt_label) {
-  return this.getTreeProfile_(this.topDownTree_, opt_label);
-};
-
-
-/**
- * Calculates a bottom up profile for a node with the specified label.
- * If no name specified, returns the whole bottom up calls tree.
- *
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getBottomUpProfile = function(opt_label) {
-  return this.getTreeProfile_(this.bottomUpTree_, opt_label);
-};
-
-
-/**
- * Helper function for calculating a tree profile.
- *
- * @param {devtools.profiler.Profile.CallTree} tree Call tree.
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
-  if (!opt_label) {
-    tree.computeTotalWeights();
-    return tree;
-  } else {
-    var subTree = tree.cloneSubtree(opt_label);
-    subTree.computeTotalWeights();
-    return subTree;
-  }
-};
-
-
-/**
- * Calculates a flat profile of callees starting from a node with
- * the specified label. If no name specified, starts from the root.
- *
- * @param {string} opt_label Starting node label.
- */
-devtools.profiler.Profile.prototype.getFlatProfile = function(opt_label) {
-  var counters = new devtools.profiler.CallTree();
-  var rootLabel = opt_label || devtools.profiler.CallTree.ROOT_NODE_LABEL;
-  var precs = {};
-  precs[rootLabel] = 0;
-  var root = counters.findOrAddChild(rootLabel);
-
-  this.topDownTree_.computeTotalWeights();
-  this.topDownTree_.traverseInDepth(
-    function onEnter(node) {
-      if (!(node.label in precs)) {
-        precs[node.label] = 0;
-      }
-      var nodeLabelIsRootLabel = node.label == rootLabel;
-      if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
-        if (precs[rootLabel] == 0) {
-          root.selfWeight += node.selfWeight;
-          root.totalWeight += node.totalWeight;
-        } else {
-          var rec = root.findOrAddChild(node.label);
-          rec.selfWeight += node.selfWeight;
-          if (nodeLabelIsRootLabel || precs[node.label] == 0) {
-            rec.totalWeight += node.totalWeight;
-          }
-        }
-        precs[node.label]++;
-      }
-    },
-    function onExit(node) {
-      if (node.label == rootLabel || precs[rootLabel] > 0) {
-        precs[node.label]--;
-      }
-    },
-    null);
-
-  if (!opt_label) {
-    // If we have created a flat profile for the whole program, we don't
-    // need an explicit root in it. Thus, replace the counters tree
-    // root with the node corresponding to the whole program.
-    counters.root_ = root;
-  } else {
-    // Propagate weights so percents can be calculated correctly.
-    counters.getRoot().selfWeight = root.selfWeight;
-    counters.getRoot().totalWeight = root.totalWeight;
-  }
-  return counters;
-};
-
-
-/**
- * Creates a dynamic code entry.
- *
- * @param {number} size Code size.
- * @param {string} type Code type.
- * @param {string} name Function name.
- * @constructor
- */
-devtools.profiler.Profile.DynamicCodeEntry = function(size, type, name) {
-  devtools.profiler.CodeMap.CodeEntry.call(this, size, name);
-  this.type = type;
-};
-
-
-/**
- * Returns node name.
- */
-devtools.profiler.Profile.DynamicCodeEntry.prototype.getName = function() {
-  var name = this.name;
-  if (name.length == 0) {
-    name = '<anonymous>';
-  } else if (name.charAt(0) == ' ') {
-    // An anonymous function with location: " aaa.js:10".
-    name = '<anonymous>' + name;
-  }
-  return this.type + ': ' + name;
-};
-
-
-/**
- * Constructs a call graph.
- *
- * @constructor
- */
-devtools.profiler.CallTree = function() {
-  this.root_ = new devtools.profiler.CallTree.Node(
-      devtools.profiler.CallTree.ROOT_NODE_LABEL);
-};
-
-
-/**
- * The label of the root node.
- */
-devtools.profiler.CallTree.ROOT_NODE_LABEL = '';
-
-
-/**
- * @private
- */
-devtools.profiler.CallTree.prototype.totalsComputed_ = false;
-
-
-/**
- * Returns the tree root.
- */
-devtools.profiler.CallTree.prototype.getRoot = function() {
-  return this.root_;
-};
-
-
-/**
- * Adds the specified call path, constructing nodes as necessary.
- *
- * @param {Array<string>} path Call path.
- */
-devtools.profiler.CallTree.prototype.addPath = function(path) {
-  if (path.length == 0) {
-    return;
-  }
-  var curr = this.root_;
-  for (var i = 0; i < path.length; ++i) {
-    curr = curr.findOrAddChild(path[i]);
-  }
-  curr.selfWeight++;
-  this.totalsComputed_ = false;
-};
-
-
-/**
- * Finds an immediate child of the specified parent with the specified
- * label, creates a child node if necessary. If a parent node isn't
- * specified, uses tree root.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.prototype.findOrAddChild = function(label) {
-  return this.root_.findOrAddChild(label);
-};
-
-
-/**
- * Creates a subtree by cloning and merging all subtrees rooted at nodes
- * with a given label. E.g. cloning the following call tree on label 'A'
- * will give the following result:
- *
- *           <A>--<B>                                     <B>
- *          /                                            /
- *     <root>             == clone on 'A' ==>  <root>--<A>
- *          \                                            \
- *           <C>--<A>--<D>                                <D>
- *
- * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
- * source call tree.
- *
- * @param {string} label The label of the new root node.
- */
-devtools.profiler.CallTree.prototype.cloneSubtree = function(label) {
-  var subTree = new devtools.profiler.CallTree();
-  this.traverse(function(node, parent) {
-    if (!parent && node.label != label) {
-      return null;
-    }
-    var child = (parent ? parent : subTree).findOrAddChild(node.label);
-    child.selfWeight += node.selfWeight;
-    return child;
-  });
-  return subTree;
-};
-
-
-/**
- * Computes total weights in the call graph.
- */
-devtools.profiler.CallTree.prototype.computeTotalWeights = function() {
-  if (this.totalsComputed_) {
-    return;
-  }
-  this.root_.computeTotalWeight();
-  this.totalsComputed_ = true;
-};
-
-
-/**
- * Traverses the call graph in preorder. This function can be used for
- * building optionally modified tree clones. This is the boilerplate code
- * for this scenario:
- *
- * callTree.traverse(function(node, parentClone) {
- *   var nodeClone = cloneNode(node);
- *   if (parentClone)
- *     parentClone.addChild(nodeClone);
- *   return nodeClone;
- * });
- *
- * @param {function(devtools.profiler.CallTree.Node, *)} f Visitor function.
- *    The second parameter is the result of calling 'f' on the parent node.
- */
-devtools.profiler.CallTree.prototype.traverse = function(f) {
-  var pairsToProcess = new ConsArray();
-  pairsToProcess.concat([{node: this.root_, param: null}]);
-  while (!pairsToProcess.atEnd()) {
-    var pair = pairsToProcess.next();
-    var node = pair.node;
-    var newParam = f(node, pair.param);
-    var morePairsToProcess = [];
-    node.forEachChild(function (child) {
-        morePairsToProcess.push({node: child, param: newParam}); });
-    pairsToProcess.concat(morePairsToProcess);
-  }
-};
-
-
-/**
- * Performs an indepth call graph traversal.
- *
- * @param {function(devtools.profiler.CallTree.Node)} enter A function called
- *     prior to visiting node's children.
- * @param {function(devtools.profiler.CallTree.Node)} exit A function called
- *     after visiting node's children.
- */
-devtools.profiler.CallTree.prototype.traverseInDepth = function(enter, exit) {
-  function traverse(node) {
-    enter(node);
-    node.forEachChild(traverse);
-    exit(node);
-  }
-  traverse(this.root_);
-};
-
-
-/**
- * Constructs a call graph node.
- *
- * @param {string} label Node label.
- * @param {devtools.profiler.CallTree.Node} opt_parent Node parent.
- */
-devtools.profiler.CallTree.Node = function(label, opt_parent) {
-  this.label = label;
-  this.parent = opt_parent;
-  this.children = {};
-};
-
-
-/**
- * Node self weight (how many times this node was the last node in
- * a call path).
- * @type {number}
- */
-devtools.profiler.CallTree.Node.prototype.selfWeight = 0;
-
-
-/**
- * Node total weight (includes weights of all children).
- * @type {number}
- */
-devtools.profiler.CallTree.Node.prototype.totalWeight = 0;
-
-
-/**
- * Adds a child node.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.addChild = function(label) {
-  var child = new devtools.profiler.CallTree.Node(label, this);
-  this.children[label] = child;
-  return child;
-};
-
-
-/**
- * Computes node's total weight.
- */
-devtools.profiler.CallTree.Node.prototype.computeTotalWeight =
-    function() {
-  var totalWeight = this.selfWeight;
-  this.forEachChild(function(child) {
-      totalWeight += child.computeTotalWeight(); });
-  return this.totalWeight = totalWeight;
-};
-
-
-/**
- * Returns all node's children as an array.
- */
-devtools.profiler.CallTree.Node.prototype.exportChildren = function() {
-  var result = [];
-  this.forEachChild(function (node) { result.push(node); });
-  return result;
-};
-
-
-/**
- * Finds an immediate child with the specified label.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.findChild = function(label) {
-  return this.children[label] || null;
-};
-
-
-/**
- * Finds an immediate child with the specified label, creates a child
- * node if necessary.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.findOrAddChild = function(label) {
-  return this.findChild(label) || this.addChild(label);
-};
-
-
-/**
- * Calls the specified function for every child.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.forEachChild = function(f) {
-  for (var c in this.children) {
-    f(this.children[c]);
-  }
-};
-
-
-/**
- * Walks up from the current node up to the call tree root.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.walkUpToRoot = function(f) {
-  for (var curr = this; curr != null; curr = curr.parent) {
-    f(curr);
-  }
-};
-
-
-/**
- * Tries to find a node with the specified path.
- *
- * @param {Array<string>} labels The path.
- * @param {function(devtools.profiler.CallTree.Node)} opt_f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.descendToChild = function(
-    labels, opt_f) {
-  for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
-    var child = curr.findChild(labels[pos]);
-    if (opt_f) {
-      opt_f(child, pos);
-    }
-    curr = child;
-  }
-  return curr;
-};
-
-/* profile_view.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a Profile View builder object.
- *
- * @param {number} samplingRate Number of ms between profiler ticks.
- * @constructor
- */
-devtools.profiler.ViewBuilder = function(samplingRate) {
-  this.samplingRate = samplingRate;
-};
-
-
-/**
- * Builds a profile view for the specified call tree.
- *
- * @param {devtools.profiler.CallTree} callTree A call tree.
- * @param {boolean} opt_bottomUpViewWeights Whether remapping
- *     of self weights for a bottom up view is needed.
- */
-devtools.profiler.ViewBuilder.prototype.buildView = function(
-    callTree, opt_bottomUpViewWeights) {
-  var head;
-  var samplingRate = this.samplingRate;
-  var createViewNode = this.createViewNode;
-  callTree.traverse(function(node, viewParent) {
-    var totalWeight = node.totalWeight * samplingRate;
-    var selfWeight = node.selfWeight * samplingRate;
-    if (opt_bottomUpViewWeights === true) {
-      if (viewParent === head) {
-        selfWeight = totalWeight;
-      } else {
-        selfWeight = 0;
-      }
-    }
-    var viewNode = createViewNode(node.label, totalWeight, selfWeight, head);
-    if (viewParent) {
-      viewParent.addChild(viewNode);
-    } else {
-      head = viewNode;
-    }
-    return viewNode;
-  });
-  var view = this.createView(head);
-  return view;
-};
-
-
-/**
- * Factory method for a profile view.
- *
- * @param {devtools.profiler.ProfileView.Node} head View head node.
- * @return {devtools.profiler.ProfileView} Profile view.
- */
-devtools.profiler.ViewBuilder.prototype.createView = function(head) {
-  return new devtools.profiler.ProfileView(head);
-};
-
-
-/**
- * Factory method for a profile view node.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @return {devtools.profiler.ProfileView.Node} Profile view node.
- */
-devtools.profiler.ViewBuilder.prototype.createViewNode = function(
-    funcName, totalTime, selfTime, head) {
-  return new devtools.profiler.ProfileView.Node(
-      funcName, totalTime, selfTime, head);
-};
-
-
-/**
- * Creates a Profile View object. It allows to perform sorting
- * and filtering actions on the profile.
- *
- * @param {devtools.profiler.ProfileView.Node} head Head (root) node.
- * @constructor
- */
-devtools.profiler.ProfileView = function(head) {
-  this.head = head;
-};
-
-
-/**
- * Sorts the profile view using the specified sort function.
- *
- * @param {function(devtools.profiler.ProfileView.Node,
- *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
- *     functions. Must comply with Array.sort sorting function requirements.
- */
-devtools.profiler.ProfileView.prototype.sort = function(sortFunc) {
-  this.traverse(function (node) {
-    node.sortChildren(sortFunc);
-  });
-};
-
-
-/**
- * Traverses profile view nodes in preorder.
- *
- * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function.
- */
-devtools.profiler.ProfileView.prototype.traverse = function(f) {
-  var nodesToTraverse = new ConsArray();
-  nodesToTraverse.concat([this.head]);
-  while (!nodesToTraverse.atEnd()) {
-    var node = nodesToTraverse.next();
-    f(node);
-    nodesToTraverse.concat(node.children);
-  }
-};
-
-
-/**
- * Constructs a Profile View node object. Each node object corresponds to
- * a function call.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @constructor
- */
-devtools.profiler.ProfileView.Node = function(
-    internalFuncName, totalTime, selfTime, head) {
-  this.internalFuncName = internalFuncName;
-  this.totalTime = totalTime;
-  this.selfTime = selfTime;
-  this.head = head;
-  this.parent = null;
-  this.children = [];
-};
-
-
-/**
- * Returns a share of the function's total time in application's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'totalPercent',
-    function() { return this.totalTime /
-      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Returns a share of the function's self time in application's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'selfPercent',
-    function() { return this.selfTime /
-      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Returns a share of the function's total time in its parent's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'parentTotalPercent',
-    function() { return this.totalTime /
-      (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Adds a child to the node.
- *
- * @param {devtools.profiler.ProfileView.Node} node Child node.
- */
-devtools.profiler.ProfileView.Node.prototype.addChild = function(node) {
-  node.parent = this;
-  this.children.push(node);
-};
-
-
-/**
- * Sorts all the node's children recursively.
- *
- * @param {function(devtools.profiler.ProfileView.Node,
- *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
- *     functions. Must comply with Array.sort sorting function requirements.
- */
-devtools.profiler.ProfileView.Node.prototype.sortChildren = function(
-    sortFunc) {
-  this.children.sort(sortFunc);
-};
-
-/* splaytree.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// A namespace stub. It will become more clear how to declare it properly
-// during integration of this script into Dev Tools.
-var goog = goog || {};
-goog.structs = goog.structs || {};
-
-
-/**
- * Constructs a Splay tree.  A splay tree is a self-balancing binary
- * search tree with the additional property that recently accessed
- * elements are quick to access again. It performs basic operations
- * such as insertion, look-up and removal in O(log(n)) amortized time.
- *
- * @constructor
- */
-goog.structs.SplayTree = function() {
-};
-
-
-/**
- * Pointer to the root node of the tree.
- *
- * @type {goog.structs.SplayTree.Node}
- * @private
- */
-goog.structs.SplayTree.prototype.root_ = null;
-
-
-/**
- * @return {boolean} Whether the tree is empty.
- */
-goog.structs.SplayTree.prototype.isEmpty = function() {
-  return !this.root_;
-};
-
-
-
-/**
- * Inserts a node into the tree with the specified key and value if
- * the tree does not already contain a node with the specified key. If
- * the value is inserted, it becomes the root of the tree.
- *
- * @param {number} key Key to insert into the tree.
- * @param {*} value Value to insert into the tree.
- */
-goog.structs.SplayTree.prototype.insert = function(key, value) {
-  if (this.isEmpty()) {
-    this.root_ = new goog.structs.SplayTree.Node(key, value);
-    return;
-  }
-  // Splay on the key to move the last node on the search path for
-  // the key to the root of the tree.
-  this.splay_(key);
-  if (this.root_.key == key) {
-    return;
-  }
-  var node = new goog.structs.SplayTree.Node(key, value);
-  if (key > this.root_.key) {
-    node.left = this.root_;
-    node.right = this.root_.right;
-    this.root_.right = null;
-  } else {
-    node.right = this.root_;
-    node.left = this.root_.left;
-    this.root_.left = null;
-  }
-  this.root_ = node;
-};
-
-
-/**
- * Removes a node with the specified key from the tree if the tree
- * contains a node with this key. The removed node is returned. If the
- * key is not found, an exception is thrown.
- *
- * @param {number} key Key to find and remove from the tree.
- * @return {goog.structs.SplayTree.Node} The removed node.
- */
-goog.structs.SplayTree.prototype.remove = function(key) {
-  if (this.isEmpty()) {
-    throw Error('Key not found: ' + key);
-  }
-  this.splay_(key);
-  if (this.root_.key != key) {
-    throw Error('Key not found: ' + key);
-  }
-  var removed = this.root_;
-  if (!this.root_.left) {
-    this.root_ = this.root_.right;
-  } else {
-    var right = this.root_.right;
-    this.root_ = this.root_.left;
-    // Splay to make sure that the new root has an empty right child.
-    this.splay_(key);
-    // Insert the original right child as the right child of the new
-    // root.
-    this.root_.right = right;
-  }
-  return removed;
-};
-
-
-/**
- * Returns the node having the specified key or null if the tree doesn't contain
- * a node with the specified key.
- *
- * @param {number} key Key to find in the tree.
- * @return {goog.structs.SplayTree.Node} Node having the specified key.
- */
-goog.structs.SplayTree.prototype.find = function(key) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  this.splay_(key);
-  return this.root_.key == key ? this.root_ : null;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the minimum key value.
- */
-goog.structs.SplayTree.prototype.findMin = function() {
-  if (this.isEmpty()) {
-    return null;
-  }
-  var current = this.root_;
-  while (current.left) {
-    current = current.left;
-  }
-  return current;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the maximum key value.
- */
-goog.structs.SplayTree.prototype.findMax = function(opt_startNode) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  var current = opt_startNode || this.root_;
-  while (current.right) {
-    current = current.right;
-  }
-  return current;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the maximum key value that
- *     is less or equal to the specified key value.
- */
-goog.structs.SplayTree.prototype.findGreatestLessThan = function(key) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  // Splay on the key to move the node with the given key or the last
-  // node on the search path to the top of the tree.
-  this.splay_(key);
-  // Now the result is either the root node or the greatest node in
-  // the left subtree.
-  if (this.root_.key <= key) {
-    return this.root_;
-  } else if (this.root_.left) {
-    return this.findMax(this.root_.left);
-  } else {
-    return null;
-  }
-};
-
-
-/**
- * @return {Array<*>} An array containing all the values of tree's nodes.
- */
-goog.structs.SplayTree.prototype.exportValues = function() {
-  var result = [];
-  this.traverse_(function(node) { result.push(node.value); });
-  return result;
-};
-
-
-/**
- * Perform the splay operation for the given key. Moves the node with
- * the given key to the top of the tree.  If no node has the given
- * key, the last node on the search path is moved to the top of the
- * tree. This is the simplified top-down splaying algorithm from:
- * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
- *
- * @param {number} key Key to splay the tree on.
- * @private
- */
-goog.structs.SplayTree.prototype.splay_ = function(key) {
-  if (this.isEmpty()) {
-    return;
-  }
-  // Create a dummy node.  The use of the dummy node is a bit
-  // counter-intuitive: The right child of the dummy node will hold
-  // the L tree of the algorithm.  The left child of the dummy node
-  // will hold the R tree of the algorithm.  Using a dummy node, left
-  // and right will always be nodes and we avoid special cases.
-  var dummy, left, right;
-  dummy = left = right = new goog.structs.SplayTree.Node(null, null);
-  var current = this.root_;
-  while (true) {
-    if (key < current.key) {
-      if (!current.left) {
-        break;
-      }
-      if (key < current.left.key) {
-        // Rotate right.
-        var tmp = current.left;
-        current.left = tmp.right;
-        tmp.right = current;
-        current = tmp;
-        if (!current.left) {
-          break;
-        }
-      }
-      // Link right.
-      right.left = current;
-      right = current;
-      current = current.left;
-    } else if (key > current.key) {
-      if (!current.right) {
-        break;
-      }
-      if (key > current.right.key) {
-        // Rotate left.
-        var tmp = current.right;
-        current.right = tmp.left;
-        tmp.left = current;
-        current = tmp;
-        if (!current.right) {
-          break;
-        }
-      }
-      // Link left.
-      left.right = current;
-      left = current;
-      current = current.right;
-    } else {
-      break;
-    }
-  }
-  // Assemble.
-  left.right = current.left;
-  right.left = current.right;
-  current.left = dummy.right;
-  current.right = dummy.left;
-  this.root_ = current;
-};
-
-
-/**
- * Performs a preorder traversal of the tree.
- *
- * @param {function(goog.structs.SplayTree.Node)} f Visitor function.
- * @private
- */
-goog.structs.SplayTree.prototype.traverse_ = function(f) {
-  var nodesToVisit = [this.root_];
-  while (nodesToVisit.length > 0) {
-    var node = nodesToVisit.shift();
-    if (node == null) {
-      continue;
-    }
-    f(node);
-    nodesToVisit.push(node.left);
-    nodesToVisit.push(node.right);
-  }
-};
-
-
-/**
- * Constructs a Splay tree node.
- *
- * @param {number} key Key.
- * @param {*} value Value.
- */
-goog.structs.SplayTree.Node = function(key, value) {
-  this.key = key;
-  this.value = value;
-};
-
-
-/**
- * @type {goog.structs.SplayTree.Node}
- */
-goog.structs.SplayTree.Node.prototype.left = null;
-
-
-/**
- * @type {goog.structs.SplayTree.Node}
- */
-goog.structs.SplayTree.Node.prototype.right = null;
-
-/* profiler_agent.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Provides communication interface to remote v8 profiler.
- */
-goog.provide('devtools.ProfilerAgent');
-
-/**
- * @constructor
- */
-devtools.ProfilerAgent = function() {
-  RemoteProfilerAgent.DidGetActiveProfilerModules =
-      goog.bind(this.didGetActiveProfilerModules_, this);
-  RemoteProfilerAgent.DidGetLogLines =
-      goog.bind(this.didGetLogLines_, this);
-
-  /**
-   * Active profiler modules flags.
-   * @type {number}
-   */
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-
-  /**
-   * Interval for polling profiler state.
-   * @type {number}
-   */
-  this.getActiveProfilerModulesInterval_ = null;
-
-  /**
-   * Profiler log position.
-   * @type {number}
-   */
-  this.logPosition_ = 0;
-
-  /**
-   * Whether log contents retrieval must be forced next time.
-   * @type {boolean}
-   */
-  this.forceGetLogLines_ = false;
-
-  /**
-   * Profiler processor instance.
-   * @type {devtools.profiler.Processor}
-   */
-  this.profilerProcessor_ = new devtools.profiler.Processor();
-};
-
-
-/**
- * A copy of enum from include/v8.h
- * @enum {number}
- */
-devtools.ProfilerAgent.ProfilerModules = {
-  PROFILER_MODULE_NONE: 0,
-  PROFILER_MODULE_CPU: 1,
-  PROFILER_MODULE_HEAP_STATS: 1 << 1,
-  PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2,
-  PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16
-};
-
-
-/**
- * Resets profiler agent to its initial state.
- */
-devtools.ProfilerAgent.prototype.reset = function() {
-  this.logPosition_ = 0;
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-};
-
-
-/**
- * Sets up callbacks that deal with profiles processing.
- */
-devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function() {
-  // A temporary icon indicating that the profile is being processed.
-  var processingIcon = new WebInspector.SidebarTreeElement(
-      'profile-sidebar-tree-item',
-      WebInspector.UIString('Processing...'),
-      '', null, false);
-  var profilesSidebar = WebInspector.panels.profiles.getProfileType(
-      WebInspector.CPUProfileType.TypeId).treeElement;
-
-  this.profilerProcessor_.setCallbacks(
-      function onProfileProcessingStarted() {
-        // Set visually empty string. Subtitle hiding is done via styles
-        // manipulation which doesn't play well with dynamic append / removal.
-        processingIcon.subtitle = ' ';
-        profilesSidebar.appendChild(processingIcon);
-      },
-      function onProfileProcessingStatus(ticksCount) {
-        processingIcon.subtitle =
-            WebInspector.UIString('%d ticks processed', ticksCount);
-      },
-      function onProfileProcessingFinished(profile) {
-        profilesSidebar.removeChild(processingIcon);
-        profile.typeId = WebInspector.CPUProfileType.TypeId;
-        InspectorBackend.addFullProfile(profile);
-        WebInspector.addProfileHeader(profile);
-        // If no profile is currently shown, show the new one.
-        var profilesPanel = WebInspector.panels.profiles;
-        if (!profilesPanel.visibleView) {
-          profilesPanel.showProfile(profile);
-        }
-      }
-  );
-};
-
-
-/**
- * Initializes profiling state.
- */
-devtools.ProfilerAgent.prototype.initializeProfiling = function() {
-  this.setupProfilerProcessorCallbacks();
-  this.forceGetLogLines_ = true;
-  this.getActiveProfilerModulesInterval_ = setInterval(
-        function() { RemoteProfilerAgent.GetActiveProfilerModules(); }, 1000);
-};
-
-
-/**
- * Starts profiling.
- * @param {number} modules List of modules to enable.
- */
-devtools.ProfilerAgent.prototype.startProfiling = function(modules) {
-  var cmd = new devtools.DebugCommand('profile', {
-      'modules': modules,
-      'command': 'resume'});
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-  if (modules &
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
-    var pos = this.logPosition_;
-    // Active modules will not change, instead, a snapshot will be logged.
-    setTimeout(function() { RemoteProfilerAgent.GetLogLines(pos); }, 500);
-  }
-};
-
-
-/**
- * Stops profiling.
- */
-devtools.ProfilerAgent.prototype.stopProfiling = function(modules) {
-  var cmd = new devtools.DebugCommand('profile', {
-      'modules': modules,
-      'command': 'pause'});
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-};
-
-
-/**
- * Handles current profiler status.
- * @param {number} modules List of active (started) modules.
- */
-devtools.ProfilerAgent.prototype.didGetActiveProfilerModules_ = function(
-    modules) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  var profModuleNone = profModules.PROFILER_MODULE_NONE;
-  if (this.forceGetLogLines_ ||
-      (modules != profModuleNone &&
-      this.activeProfilerModules_ == profModuleNone)) {
-    this.forceGetLogLines_ = false;
-    // Start to query log data.
-    RemoteProfilerAgent.GetLogLines(this.logPosition_);
-  }
-  this.activeProfilerModules_ = modules;
-  // Update buttons.
-  WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * Handles a portion of a profiler log retrieved by GetLogLines call.
- * @param {number} pos Current position in log.
- * @param {string} log A portion of profiler log.
- */
-devtools.ProfilerAgent.prototype.didGetLogLines_ = function(pos, log) {
-  this.logPosition_ = pos;
-  if (log.length > 0) {
-    this.profilerProcessor_.processLogChunk(log);
-  } else if (this.activeProfilerModules_ ==
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE) {
-    // No new data and profiling is stopped---suspend log reading.
-    return;
-  }
-  setTimeout(function() { RemoteProfilerAgent.GetLogLines(pos); }, 500);
-};
-
-/* profiler_processor.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Profiler processor is used to process log file produced
- * by V8 and produce an internal profile representation which is used
- * for building profile views in 'Profiles' tab.
- */
-goog.provide('devtools.profiler.Processor');
-
-
-/**
- * Creates a Profile View builder object compatible with WebKit Profiler UI.
- *
- * @param {number} samplingRate Number of ms between profiler ticks.
- * @constructor
- */
-devtools.profiler.WebKitViewBuilder = function(samplingRate) {
-  devtools.profiler.ViewBuilder.call(this, samplingRate);
-};
-goog.inherits(devtools.profiler.WebKitViewBuilder,
-    devtools.profiler.ViewBuilder);
-
-
-/**
- * @override
- */
-devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(
-    funcName, totalTime, selfTime, head) {
-  return new devtools.profiler.WebKitViewNode(
-      funcName, totalTime, selfTime, head);
-};
-
-
-/**
- * Constructs a Profile View node object for displaying in WebKit Profiler UI.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @constructor
- */
-devtools.profiler.WebKitViewNode = function(
-    internalFuncName, totalTime, selfTime, head) {
-  devtools.profiler.ProfileView.Node.call(this,
-      internalFuncName, totalTime, selfTime, head);
-  this.initFuncInfo_();
-  this.callUID = internalFuncName;
-};
-goog.inherits(devtools.profiler.WebKitViewNode,
-    devtools.profiler.ProfileView.Node);
-
-
-/**
- * RegEx for stripping V8's prefixes of compiled functions.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE =
-    /^(?:LazyCompile|Function|Callback): (.*)$/;
-
-
-/**
- * RegEx for extracting script source URL and line number.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE =
-    /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/;
-
-
-/**
- * Inits 'functionName', 'url', and 'lineNumber' fields using 'internalFuncName'
- * field.
- * @private
- */
-devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function() {
-  var nodeAlias = devtools.profiler.WebKitViewNode;
-  this.functionName = this.internalFuncName;
-
-  var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName);
-  if (strippedName) {
-    this.functionName = strippedName[1];
-  }
-
-  var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName);
-  if (parsedName) {
-    this.functionName = parsedName[1];
-    if (parsedName[4]) {
-      this.functionName += parsedName[4];
-    }
-    this.url = parsedName[2];
-    this.lineNumber = parsedName[3];
-  } else {
-    this.url = '';
-    this.lineNumber = 0;
-  }
-};
-
-
-/**
- * Ancestor of a profile object that leaves out only JS-related functions.
- * @constructor
- */
-devtools.profiler.JsProfile = function() {
-  devtools.profiler.Profile.call(this);
-};
-goog.inherits(devtools.profiler.JsProfile, devtools.profiler.Profile);
-
-
-/**
- * RegExp that leaves only JS functions.
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_FUNC_RE = /^(LazyCompile|Function|Script|Callback):/;
-
-/**
- * RegExp that filters out native code (ending with "native src.js:xxx").
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_NATIVE_FUNC_RE = /\ native\ \w+\.js:\d+$/;
-
-/**
- * RegExp that filters out native scripts.
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_NATIVE_SCRIPT_RE = /^Script:\ native/;
-
-
-/**
- * @override
- */
-devtools.profiler.JsProfile.prototype.skipThisFunction = function(name) {
-  return !devtools.profiler.JsProfile.JS_FUNC_RE.test(name) ||
-      // To profile V8's natives comment out two lines below and '||' above.
-      devtools.profiler.JsProfile.JS_NATIVE_FUNC_RE.test(name) ||
-      devtools.profiler.JsProfile.JS_NATIVE_SCRIPT_RE.test(name);
-};
-
-
-/**
- * Profiler processor. Consumes profiler log and builds profile views.
- *
- * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
- *     that receives a new processed profile.
- * @constructor
- */
-devtools.profiler.Processor = function() {
-  devtools.profiler.LogReader.call(this, {
-      'code-creation': {
-          parsers: [null, this.createAddressParser('code'), parseInt, null],
-          processor: this.processCodeCreation_, backrefs: true,
-          needsProfile: true },
-      'code-move': { parsers: [this.createAddressParser('code'),
-          this.createAddressParser('code-move-to')],
-          processor: this.processCodeMove_, backrefs: true,
-          needsProfile: true },
-      'code-delete': { parsers: [this.createAddressParser('code')],
-          processor: this.processCodeDelete_, backrefs: true,
-          needsProfile: true },
-      'tick': { parsers: [this.createAddressParser('code'),
-          this.createAddressParser('stack'), parseInt, 'var-args'],
-          processor: this.processTick_, backrefs: true, needProfile: true },
-      'profiler': { parsers: [null, 'var-args'],
-          processor: this.processProfiler_, needsProfile: false },
-      'heap-sample-begin': { parsers: [null, null, parseInt],
-          processor: this.processHeapSampleBegin_ },
-      'heap-sample-stats': { parsers: [null, null, parseInt, parseInt],
-          processor: this.processHeapSampleStats_ },
-      'heap-sample-item': { parsers: [null, parseInt, parseInt],
-          processor: this.processHeapSampleItem_ },
-      'heap-js-cons-item': { parsers: [null, parseInt, parseInt],
-          processor: this.processHeapJsConsItem_ },
-      'heap-js-ret-item': { parsers: [null, 'var-args'],
-          processor: this.processHeapJsRetItem_ },
-      'heap-sample-end': { parsers: [null, null],
-          processor: this.processHeapSampleEnd_ },
-      // Not used in DevTools Profiler.
-      'shared-library': null,
-      // Obsolete row types.
-      'code-allocate': null,
-      'begin-code-region': null,
-      'end-code-region': null});
-
-
-  /**
-   * Callback that is called when a new profile is encountered in the log.
-   * @type {function()}
-   */
-  this.startedProfileProcessing_ = null;
-
-  /**
-   * Callback that is called periodically to display processing status.
-   * @type {function()}
-   */
-  this.profileProcessingStatus_ = null;
-
-  /**
-   * Callback that is called when a profile has been processed and is ready
-   * to be shown.
-   * @type {function(devtools.profiler.ProfileView)}
-   */
-  this.finishedProfileProcessing_ = null;
-
-  /**
-   * The current profile.
-   * @type {devtools.profiler.JsProfile}
-   */
-  this.currentProfile_ = null;
-
-  /**
-   * Builder of profile views. Created during "profiler,begin" event processing.
-   * @type {devtools.profiler.WebKitViewBuilder}
-   */
-  this.viewBuilder_ = null;
-
-  /**
-   * Next profile id.
-   * @type {number}
-   */
-  this.profileId_ = 1;
-
-  /**
-   * Counter for processed ticks.
-   * @type {number}
-   */
-  this.ticksCount_ = 0;
-
-  /**
-   * Interval id for updating processing status.
-   * @type {number}
-   */
-  this.processingInterval_ = null;
-
-  /**
-   * The current heap snapshot.
-   * @type {string}
-   */
-  this.currentHeapSnapshot_ = null;
-
-  /**
-   * Next heap snapshot id.
-   * @type {number}
-   */
-  this.heapSnapshotId_ = 1;
-};
-goog.inherits(devtools.profiler.Processor, devtools.profiler.LogReader);
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.printError = function(str) {
-  debugPrint(str);
-};
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.skipDispatch = function(dispatch) {
-  return dispatch.needsProfile && this.currentProfile_ == null;
-};
-
-
-/**
- * Sets profile processing callbacks.
- *
- * @param {function()} started Started processing callback.
- * @param {function(devtools.profiler.ProfileView)} finished Finished
- *     processing callback.
- */
-devtools.profiler.Processor.prototype.setCallbacks = function(
-    started, processing, finished) {
-  this.startedProfileProcessing_ = started;
-  this.profileProcessingStatus_ = processing;
-  this.finishedProfileProcessing_ = finished;
-};
-
-
-/**
- * An address for the fake "(program)" entry. WebKit's visualisation
- * has assumptions on how the top of the call tree should look like,
- * and we need to add a fake entry as the topmost function. This
- * address is chosen because it's the end address of the first memory
- * page, which is never used for code or data, but only as a guard
- * page for catching AV errors.
- *
- * @type {number}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff;
-/**
- * @type {string}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY_STR = '0xffff';
-
-
-/**
- * Sets new profile callback.
- * @param {function(devtools.profiler.ProfileView)} callback Callback function.
- */
-devtools.profiler.Processor.prototype.setNewProfileCallback = function(
-    callback) {
-  this.newProfileCallback_ = callback;
-};
-
-
-devtools.profiler.Processor.prototype.processProfiler_ = function(
-    state, params) {
-  switch (state) {
-    case 'resume':
-      if (this.currentProfile_ == null) {
-        this.currentProfile_ = new devtools.profiler.JsProfile();
-        // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
-        this.currentProfile_.addCode(
-          'Function', '(program)',
-          devtools.profiler.Processor.PROGRAM_ENTRY, 1);
-        if (this.startedProfileProcessing_) {
-          this.startedProfileProcessing_();
-        }
-        this.ticksCount_ = 0;
-        var self = this;
-        if (this.profileProcessingStatus_) {
-          this.processingInterval_ = window.setInterval(
-              function() { self.profileProcessingStatus_(self.ticksCount_); },
-              1000);
-        }
-      }
-      break;
-    case 'pause':
-      if (this.currentProfile_ != null) {
-        window.clearInterval(this.processingInterval_);
-        this.processingInterval_ = null;
-        if (this.finishedProfileProcessing_) {
-          this.finishedProfileProcessing_(this.createProfileForView());
-        }
-        this.currentProfile_ = null;
-      }
-      break;
-    case 'begin':
-      var samplingRate = NaN;
-      if (params.length > 0) {
-        samplingRate = parseInt(params[0]);
-      }
-      if (isNaN(samplingRate)) {
-        samplingRate = 1;
-      }
-      this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate);
-      break;
-    // These events are valid but aren't used.
-    case 'compression':
-    case 'end': break;
-    default:
-      throw new Error('unknown profiler state: ' + state);
-  }
-};
-
-
-devtools.profiler.Processor.prototype.processCodeCreation_ = function(
-    type, start, size, name) {
-  this.currentProfile_.addCode(this.expandAlias(type), name, start, size);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to) {
-  this.currentProfile_.moveCode(from, to);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeDelete_ = function(start) {
-  this.currentProfile_.deleteCode(start);
-};
-
-
-devtools.profiler.Processor.prototype.processTick_ = function(
-    pc, sp, vmState, stack) {
-  // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
-  stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
-  this.currentProfile_.recordTick(this.processStack(pc, stack));
-  this.ticksCount_++;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(
-    space, state, ticks) {
-  if (space != 'Heap') return;
-  this.currentHeapSnapshot_ = {
-      number: this.heapSnapshotId_++,
-      entries: {},
-      clusters: {},
-      lowlevels: {},
-      ticks: ticks
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(
-    space, state, capacity, used) {
-  if (space != 'Heap') return;
-  this.currentHeapSnapshot_.capacity = capacity;
-  this.currentHeapSnapshot_.used = used;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(
-    item, number, size) {
-  if (!this.currentHeapSnapshot_) return;
-  this.currentHeapSnapshot_.lowlevels[item] = {
-    type: item, count: number, size: size
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(
-    item, number, size) {
-  if (!this.currentHeapSnapshot_) return;
-  this.currentHeapSnapshot_.entries[item] = {
-    cons: item, count: number, size: size, retainers: {}
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(
-    item, retainersArray) {
-  if (!this.currentHeapSnapshot_) return;
-  var rawRetainers = {};
-  for (var i = 0, n = retainersArray.length; i < n; ++i) {
-    var entry = retainersArray[i].split(';');
-    rawRetainers[entry[0]] = parseInt(entry[1], 10);
-  }
-
-  function mergeRetainers(entry) {
-    for (var rawRetainer in rawRetainers) {
-      var consName = rawRetainer.indexOf(':') != -1 ?
-          rawRetainer.split(':')[0] : rawRetainer;
-      if (!(consName in entry.retainers))
-        entry.retainers[consName] = { cons: consName, count: 0, clusters: {} };
-      var retainer = entry.retainers[consName];
-      retainer.count += rawRetainers[rawRetainer];
-      if (consName != rawRetainer)
-        retainer.clusters[rawRetainer] = true;
-    }
-  }
-
-  if (item.indexOf(':') != -1) {
-    // Array, Function, or Object instances cluster case.
-    if (!(item in this.currentHeapSnapshot_.clusters)) {
-      this.currentHeapSnapshot_.clusters[item] = {
-        cons: item, retainers: {}
-      };
-    }
-    mergeRetainers(this.currentHeapSnapshot_.clusters[item]);
-    item = item.split(':')[0];
-  }
-  mergeRetainers(this.currentHeapSnapshot_.entries[item]);
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(
-    space, state) {
-  if (space != 'Heap') return;
-  var snapshot = this.currentHeapSnapshot_;
-  this.currentHeapSnapshot_ = null;
-  // For some reason, 'used' from 'heap-sample-stats' sometimes differ from
-  // the sum of objects sizes. To avoid discrepancy, we re-calculate 'used'.
-  snapshot.used = 0;
-  for (var item in snapshot.lowlevels) {
-      snapshot.used += snapshot.lowlevels[item].size;
-  }
-  WebInspector.panels.profiles.addSnapshot(snapshot);
-};
-
-
-/**
- * Creates a profile for further displaying in ProfileView.
- */
-devtools.profiler.Processor.prototype.createProfileForView = function() {
-  var profile = this.viewBuilder_.buildView(
-      this.currentProfile_.getTopDownProfile());
-  profile.uid = this.profileId_++;
-  profile.title = UserInitiatedProfileName + '.' + profile.uid;
-  return profile;
-};
-
-/* heap_profiler_panel.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Heap profiler panel implementation.
- */
-
-WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
-    snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
-    snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId;
-
-    var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
-    snapshots.push(snapshot);
-
-    snapshot.listIndex = snapshots.length - 1;
-
-    if (WebInspector.CPUProfile)
-        this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
-    else
-        this.addProfileHeader(snapshot);
-
-    this.dispatchEventToListeners("snapshot added");
-}
-
-
-WebInspector.HeapSnapshotView = function(parent, profile)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("heap-snapshot-view");
-
-    this.parent = parent;
-    this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
-
-    this.showCountAsPercent = false;
-    this.showSizeAsPercent = false;
-    this.showCountDeltaAsPercent = false;
-    this.showSizeDeltaAsPercent = false;
-
-    this.categories = {
-        code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),
-        data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects and Data"), "rgb(47,102,236)"),
-        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
-    };
-
-    this.summaryBar = new WebInspector.SummaryBar(this.categories);
-    this.summaryBar.element.id = "heap-snapshot-summary";
-    this.summaryBar.calculator = new WebInspector.HeapSummaryCalculator(profile.used);
-    this.element.appendChild(this.summaryBar.element);
-
-    var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
-                    "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
-                    "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
-                    "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
-                    "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
-
-    this.dataGrid = new WebInspector.DataGrid(columns);
-    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
-    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
-    this.element.appendChild(this.dataGrid.element);
-
-    this.profile = profile;
-
-    this.baseSelectElement = document.createElement("select");
-    this.baseSelectElement.className = "status-bar-item";
-    this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
-    this._updateBaseOptions();
-    if (this.profile.listIndex > 0)
-        this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
-    else
-        this.baseSelectElement.selectedIndex = this.profile.listIndex;
-    this._resetDataGridList();
-
-    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
-    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
-
-    this.refresh();
-
-    this._updatePercentButton();
-};
-
-WebInspector.HeapSnapshotView.prototype = {
-
-    get statusBarItems()
-    {
-        return [this.baseSelectElement, this.percentButton.element];
-    },
-
-    get profile()
-    {
-        return this._profile;
-    },
-
-    set profile(profile)
-    {
-        this._profile = profile;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.dataGrid.updateWidths();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.dataGrid)
-            this.dataGrid.updateWidths();
-    },
-
-    refresh: function()
-    {
-        this.dataGrid.removeChildren();
-
-        var children = this.snapshotDataGridList.children;
-        var count = children.length;
-        for (var index = 0; index < count; ++index)
-            this.dataGrid.appendChild(children[index]);
-
-        this._updateSummaryGraph();
-    },
-
-    refreshShowAsPercents: function()
-    {
-        this._updatePercentButton();
-        this.refreshVisibleData();
-    },
-
-    _deleteSearchMatchedFlags: function(node)
-    {
-        delete node._searchMatchedConsColumn;
-        delete node._searchMatchedCountColumn;
-        delete node._searchMatchedSizeColumn;
-        delete node._searchMatchedCountDeltaColumn;
-        delete node._searchMatchedSizeDeltaColumn;
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var profileNode = this._searchResults[i].profileNode;
-                this._deleteSearchMatchedFlags(profileNode);
-                profileNode.refresh();
-            }
-        }
-
-        delete this._searchFinishedCallback;
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        query = query.trimWhitespace();
-
-        if (!query.length)
-            return;
-
-        this._searchFinishedCallback = finishedCallback;
-
-        var helper = WebInspector.HeapSnapshotView.SearchHelper;
-
-        var operationAndNumber = helper.parseOperationAndNumber(query);
-        var operation = operationAndNumber[0];
-        var queryNumber = operationAndNumber[1];
-
-        var percentUnits = helper.percents.test(query);
-        var megaBytesUnits = helper.megaBytes.test(query);
-        var kiloBytesUnits = helper.kiloBytes.test(query);
-        var bytesUnits = helper.bytes.test(query);
-
-        var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));
-
-        function matchesQuery(heapSnapshotDataGridNode)
-        {
-            WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);
-
-            if (percentUnits) {
-                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);
-            } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {
-                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);
-            } else {
-                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);
-            }
-
-            if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))
-                heapSnapshotDataGridNode._searchMatchedConsColumn = true;
-
-            if (heapSnapshotDataGridNode._searchMatchedConsColumn ||
-                heapSnapshotDataGridNode._searchMatchedCountColumn ||
-                heapSnapshotDataGridNode._searchMatchedSizeColumn ||
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {
-                heapSnapshotDataGridNode.refresh();
-                return true;
-            }
-
-            return false;
-        }
-
-        var current = this.snapshotDataGridList.children[0];
-        var depth = 0;
-        var info = {};
-
-        // The second and subsequent levels of heap snapshot nodes represent retainers,
-        // so recursive expansion will be infinite, since a graph is being traversed.
-        // So default to a recursion cap of 2 levels.
-        var maxDepth = 2;
-
-        while (current) {
-            if (matchesQuery(current))
-                this._searchResults.push({ profileNode: current });
-            current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
-            depth += info.depthChange;
-        }
-
-        finishedCallback(this, this._searchResults.length);
-    },
-
-    jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,
-    jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,
-    jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,
-    jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,
-    showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,
-    showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,
-    _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,
-
-    refreshVisibleData: function()
-    {
-        var child = this.dataGrid.children[0];
-        while (child) {
-            child.refresh();
-            child = child.traverseNextNode(false, null, true);
-        }
-        this._updateSummaryGraph();
-    },
-
-    _changeBase: function() {
-        if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
-            return;
-
-        this._resetDataGridList();
-        this.refresh();
-
-        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
-            return;
-
-        // The current search needs to be performed again. First negate out previous match
-        // count by calling the search finished callback with a negative number of matches.
-        // Then perform the search again with the same query and callback.
-        this._searchFinishedCallback(this, -this._searchResults.length);
-        this.performSearch(this.currentQuery, this._searchFinishedCallback);
-    },
-
-    _createSnapshotDataGridList: function()
-    {
-        if (this._snapshotDataGridList)
-          delete this._snapshotDataGridList;
-
-        this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
-        return this._snapshotDataGridList;
-    },
-
-    _mouseDownInDataGrid: function(event)
-    {
-        if (event.detail < 2)
-            return;
-
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
-            return;
-
-        if (cell.hasStyleClass("count-column"))
-            this.showCountAsPercent = !this.showCountAsPercent;
-        else if (cell.hasStyleClass("size-column"))
-            this.showSizeAsPercent = !this.showSizeAsPercent;
-        else if (cell.hasStyleClass("countDelta-column"))
-            this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
-        else if (cell.hasStyleClass("sizeDelta-column"))
-            this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
-
-        this.refreshShowAsPercents();
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    get _isShowingAsPercent()
-    {
-        return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
-    },
-
-    _percentClicked: function(event)
-    {
-        var currentState = this._isShowingAsPercent;
-        this.showCountAsPercent = !currentState;
-        this.showSizeAsPercent = !currentState;
-        this.showCountDeltaAsPercent = !currentState;
-        this.showSizeDeltaAsPercent = !currentState;
-        this.refreshShowAsPercents();
-    },
-
-    _resetDataGridList: function()
-    {
-        this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
-        var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
-        if (this.snapshotDataGridList)
-            lastComparator = this.snapshotDataGridList.lastComparator;
-        this.snapshotDataGridList = this._createSnapshotDataGridList();
-        this.snapshotDataGridList.sort(lastComparator, true);
-    },
-
-    _sortData: function()
-    {
-        var sortAscending = this.dataGrid.sortOrder === "ascending";
-        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
-        var sortProperty = {
-                "cons": ["constructorName", null],
-                "count": ["count", null],
-                "size": ["size", "count"],
-                "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],
-                "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]
-        }[sortColumnIdentifier];
-
-        this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));
-
-        this.refresh();
-    },
-
-    _updateBaseOptions: function()
-    {
-        var list = WebInspector.HeapSnapshotProfileType.snapshots;
-        // We're assuming that snapshots can only be added.
-        if (this.baseSelectElement.length == list.length)
-            return;
-
-        for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
-            var baseOption = document.createElement("option");
-            baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
-            this.baseSelectElement.appendChild(baseOption);
-        }
-    },
-
-    _updatePercentButton: function()
-    {
-        if (this._isShowingAsPercent) {
-            this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
-            this.percentButton.toggled = true;
-        } else {
-            this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
-            this.percentButton.toggled = false;
-        }
-    },
-
-    _updateSummaryGraph: function()
-    {
-        this.summaryBar.calculator.showAsPercent = this._isShowingAsPercent;
-        this.summaryBar.update(this.profile.lowlevels);
-    }
-};
-
-WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.HeapSnapshotView.SearchHelper = {
-    // In comparators, we assume that a value from a node is passed as the first parameter.
-    operations: { LESS: function (a, b) { return a !== null && a < b; },
-                  LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },
-                  EQUAL: function (a, b) { return a !== null && a == b; },
-                  GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },
-                  GREATER: function (a, b) { return a !== null && a > b; } },
-
-    operationParsers: { LESS: /^<(\d+)/,
-                        LESS_OR_EQUAL: /^<=(\d+)/,
-                        GREATER_OR_EQUAL: /^>=(\d+)/,
-                        GREATER: /^>(\d+)/ },
-
-    parseOperationAndNumber: function(query)
-    {
-        var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;
-        var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;
-        for (var operation in parsers) {
-            var match = query.match(parsers[operation]);
-            if (match != null)
-                return [operations[operation], parseFloat(match[1])];
-        }
-        return [operations.EQUAL, parseFloat(query)];
-    },
-
-    percents: /%$/,
-
-    megaBytes: /MB$/i,
-
-    kiloBytes: /KB$/i,
-
-    bytes: /B$/i
-}
-
-WebInspector.HeapSummaryCalculator = function(total)
-{
-    this.total = total;
-}
-
-WebInspector.HeapSummaryCalculator.prototype = {
-    computeSummaryValues: function(lowLevels)
-    {
-        function highFromLow(type) {
-            if (type == "CODE_TYPE" || type == "SHARED_FUNCTION_INFO_TYPE" || type == "SCRIPT_TYPE") return "code";
-            if (type == "STRING_TYPE" || type == "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
-            return "other";
-        }
-        var highLevels = {data: 0, code: 0, other: 0};
-        for (var item in lowLevels) {
-            var highItem = highFromLow(item);
-            highLevels[highItem] += lowLevels[item].size;
-        }
-        return {categoryValues: highLevels};
-    },
-
-    formatValue: function(value)
-    {
-        if (this.showAsPercent)
-            return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
-        else
-            return Number.bytesToString(value);
-    },
-
-    get showAsPercent()
-    {
-        return this._showAsPercent;
-    },
-
-    set showAsPercent(x)
-    {
-        this._showAsPercent = x;
-    }
-}
-
-WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
-{
-    this.profile = snapshot;
-
-    WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
-
-    this.refreshTitles();
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
-    get mainTitle()
-    {
-        if (this._mainTitle)
-            return this._mainTitle;
-        return this.profile.title;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        if (this._subTitle)
-            return this._subTitle;
-        return WebInspector.UIString("Used %s of %s (%.0f%%)", Number.bytesToString(this.profile.used, null, false), Number.bytesToString(this.profile.capacity, null, false), this.profile.used / this.profile.capacity * 100.0);
-    },
-
-    set subtitle(x)
-    {
-        this._subTitle = x;
-        this.refreshTitles();
-    }
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
-{
-    this.tree = owningTree;
-
-    WebInspector.DataGridNode.call(this, null, this._hasRetainers);
-
-    this.addEventListener("populate", this._populate, this);
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
-    isEmptySet: function(set)
-    {
-        for (var x in set)
-            return false;
-        return true;
-    },
-
-    get _hasRetainers()
-    {
-        return !this.isEmptySet(this.retainers);
-    },
-
-    get _parent()
-    {
-        // For top-level nodes, return owning tree as a parent, not data grid.
-        return this.parent !== this.dataGrid ? this.parent : this.tree;
-    },
-
-    _populate: function(event)
-    {
-        var self = this;
-        this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
-            self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
-        });
-
-        if (this._parent) {
-            var currentComparator = this._parent.lastComparator;
-            if (currentComparator)
-                this.sort(currentComparator, true);
-        }
-
-        this.removeEventListener("populate", this._populate, this);
-    },
-
-    produceDiff: function(baseEntries, currentEntries, callback)
-    {
-        for (var item in currentEntries)
-            callback(baseEntries[item], currentEntries[item]);
-
-        for (item in baseEntries) {
-            if (!(item in currentEntries))
-                callback(baseEntries[item], null);
-        }
-    },
-
-    sort: function(comparator, force) {
-        if (!force && this.lastComparator === comparator)
-            return;
-
-        this.children.sort(comparator);
-        var childCount = this.children.length;
-        for (var childIndex = 0; childIndex < childCount; ++childIndex)
-            this.children[childIndex]._recalculateSiblings(childIndex);
-        for (var i = 0; i < this.children.length; ++i) {
-            var child = this.children[i];
-            if (!force && (!child.expanded || child.lastComparator === comparator))
-                continue;
-            child.sort(comparator, force);
-        }
-        this.lastComparator = comparator;
-    },
-
-    signForDelta: function(delta) {
-        if (delta == 0)
-            return "";
-        if (delta > 0)
-            return "+";
-        else
-            // Math minus sign, same width as plus.
-            return "\u2212";
-    },
-
-    showDeltaAsPercent: function(value) {
-        if (value === Number.POSITIVE_INFINITY)
-            return WebInspector.UIString("new");
-        else if (value === Number.NEGATIVE_INFINITY)
-            return WebInspector.UIString("deleted");
-        if (value > 1000.0)
-            return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
-        return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
-    },
-
-    getTotalCount: function() {
-        if (!this._count) {
-            this._count = 0;
-            for (var i = 0, n = this.children.length; i < n; ++i)
-                this._count += this.children[i].count;
-        }
-        return this._count;
-    },
-
-    getTotalSize: function() {
-        if (!this._size) {
-            this._size = 0;
-            for (var i = 0, n = this.children.length; i < n; ++i)
-                this._size += this.children[i].size;
-        }
-        return this._size;
-    },
-
-    get countPercent()
-    {
-        return this.count / this._parent.getTotalCount() * 100.0;
-    },
-
-    get sizePercent()
-    {
-        return this.size / this._parent.getTotalSize() * 100.0;
-    },
-
-    get countDeltaPercent()
-    {
-        if (this.baseCount > 0) {
-            if (this.count > 0)
-                return this.countDelta / this.baseCount * 100.0;
-            else
-                return Number.NEGATIVE_INFINITY;
-        } else
-            return Number.POSITIVE_INFINITY;
-    },
-
-    get sizeDeltaPercent()
-    {
-        if (this.baseSize > 0) {
-            if (this.size > 0)
-                return this.sizeDelta / this.baseSize * 100.0;
-            else
-                return Number.NEGATIVE_INFINITY;
-        } else
-            return Number.POSITIVE_INFINITY;
-    },
-
-    get data()
-    {
-        var data = {};
-
-        data["cons"] = this.constructorName;
-
-        if (this.snapshotView.showCountAsPercent)
-            data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
-        else
-            data["count"] = this.count;
-
-        if (this.size !== null) {
-            if (this.snapshotView.showSizeAsPercent)
-                data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
-            else
-                data["size"] = Number.bytesToString(this.size);
-        } else
-            data["size"] = "";
-
-        if (this.snapshotView.showCountDeltaAsPercent)
-            data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
-        else
-            data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
-
-        if (this.sizeDelta != null) {
-            if (this.snapshotView.showSizeDeltaAsPercent)
-                data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
-            else
-                data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
-        } else
-            data["sizeDelta"] = "";
-
-        return data;
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
-
-        if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||
-            (columnIdentifier === "count" && this._searchMatchedCountColumn) ||
-            (columnIdentifier === "size" && this._searchMatchedSizeColumn) ||
-            (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||
-            (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))
-            cell.addStyleClass("highlight");
-
-        return cell;
-    }
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
-    this.snapshotView = snapshotView;
-
-    if (!snapshotEntry)
-        snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
-    this.constructorName = snapshotEntry.cons;
-    this.count = snapshotEntry.count;
-    this.size = snapshotEntry.size;
-    this.retainers = snapshotEntry.retainers;
-
-    if (!baseEntry)
-        baseEntry = { count: 0, size: 0, retainers: {} };
-    this.baseCount = baseEntry.count;
-    this.countDelta = this.count - this.baseCount;
-    this.baseSize = baseEntry.size;
-    this.sizeDelta = this.size - this.baseSize;
-    this.baseRetainers = baseEntry.retainers;
-
-    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-};
-
-WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
-{
-    this.tree = this;
-    this.snapshotView = snapshotView;
-    this.children = [];
-    this.lastComparator = null;
-    this.populateChildren(baseEntries, snapshotEntries);
-};
-
-WebInspector.HeapSnapshotDataGridList.prototype = {
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        this.children.splice(index, 0, child);
-    },
-
-    removeChildren: function()
-    {
-        this.children = [];
-    },
-
-    populateChildren: function(baseEntries, snapshotEntries)
-    {
-        var self = this;
-        this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
-            self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
-        });
-    },
-
-    produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
-    sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
-    getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
-    getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
-};
-
-WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
-
-WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)
-{
-    var propertyHash = property + '#' + property2;
-    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];
-    if (!comparator) {
-        comparator = function(lhs, rhs) {
-            var l = lhs[property], r = rhs[property];
-            if ((l === null || r === null) && property2 !== null)
-                l = lhs[property2], r = rhs[property2];
-            var result = l < r ? -1 : (l > r ? 1 : 0);
-            return isAscending ? result : -result;
-        };
-        this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;
-    }
-    return comparator;
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
-    this.snapshotView = snapshotView;
-
-    if (!snapshotEntry)
-        snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
-    this.constructorName = snapshotEntry.cons;
-    this.count = snapshotEntry.count;
-    this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
-
-    if (!baseEntry)
-        baseEntry = { count: 0, clusters: {} };
-    this.baseCount = baseEntry.count;
-    this.countDelta = this.count - this.baseCount;
-    this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
-
-    this.size = null;
-    this.sizeDelta = null;
-
-    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-}
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
-    get sizePercent()
-    {
-        return null;
-    },
-
-    get sizeDeltaPercent()
-    {
-        return null;
-    },
-
-    _calculateRetainers: function(snapshot, clusters) {
-        var retainers = {};
-        if (this.isEmptySet(clusters)) {
-            if (this.constructorName in snapshot.entries)
-                return snapshot.entries[this.constructorName].retainers;
-        } else {
-            // In case when an entry is retained by clusters, we need to gather up the list
-            // of retainers by merging retainers of every cluster.
-            // E.g. having such a tree:
-            //   A
-            //     Object:1  10
-            //       X       3
-            //       Y       4
-            //     Object:2  5
-            //       X       6
-            //
-            // will result in a following retainers list: X 9, Y 4.
-            for (var clusterName in clusters) {
-                if (clusterName in snapshot.clusters) {
-                    var clusterRetainers = snapshot.clusters[clusterName].retainers;
-                    for (var clusterRetainer in clusterRetainers) {
-                        var clusterRetainerEntry = clusterRetainers[clusterRetainer];
-                        if (!(clusterRetainer in retainers))
-                            retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
-                        retainers[clusterRetainer].count += clusterRetainerEntry.count;
-                        for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
-                            retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
-                    }
-                }
-            }
-        }
-        return retainers;
-    }
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-
-WebInspector.HeapSnapshotProfileType = function()
-{
-    WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
-}
-
-WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
-
-WebInspector.HeapSnapshotProfileType.snapshots = [];
-
-WebInspector.HeapSnapshotProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return WebInspector.UIString("Take heap snapshot.");
-    },
-
-    get buttonStyle()
-    {
-        return "heap-snapshot-status-bar-item status-bar-item";
-    },
-
-    buttonClicked: function()
-    {
-        InspectorBackend.takeHeapSnapshot();
-    },
-
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
-        element.small = false;
-        return element;
-    },
-
-    createView: function(profile)
-    {
-        return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
-    }
-}
-
-WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
-
-
-(function() {
-    var originalCreatePanels = WebInspector._createPanels;
-    WebInspector._createPanels = function() {
-        originalCreatePanels.apply(this, arguments);
-        if (WebInspector.panels.profiles)
-            WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
-    }
-})();
-
-/* devtools.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Tools is a main class that wires all components of the
- * DevTools frontend together. It is also responsible for overriding existing
- * WebInspector functionality while it is getting upstreamed into WebCore.
- */
-goog.provide('devtools.Tools');
-
-goog.require('devtools.DebuggerAgent');
-
-
-/**
- * Dispatches raw message from the host.
- * @param {string} remoteName
- * @prama {string} methodName
- * @param {string} param1, param2, param3 Arguments to dispatch.
- */
-devtools$$dispatch = function(remoteName, methodName, param1, param2, param3) {
-  remoteName = 'Remote' + remoteName.substring(0, remoteName.length - 8);
-  var agent = window[remoteName];
-  if (!agent) {
-    debugPrint('No remote agent "' + remoteName + '" found.');
-    return;
-  }
-  var method = agent[methodName];
-  if (!method) {
-    debugPrint('No method "' + remoteName + '.' + methodName + '" found.');
-    return;
-  }
-  method.call(this, param1, param2, param3);
-};
-
-
-devtools.ToolsAgent = function() {
-  RemoteToolsAgent.DidDispatchOn =
-      WebInspector.Callback.processCallback;
-  RemoteToolsAgent.FrameNavigate =
-      goog.bind(this.frameNavigate_, this);
-  RemoteToolsAgent.DispatchOnClient =
-      goog.bind(this.dispatchOnClient_, this);
-  this.debuggerAgent_ = new devtools.DebuggerAgent();
-  this.profilerAgent_ = new devtools.ProfilerAgent();
-};
-
-
-/**
- * Resets tools agent to its initial state.
- */
-devtools.ToolsAgent.prototype.reset = function() {
-  InspectorFrontendHost.reset();
-  this.debuggerAgent_.reset();
-  this.profilerAgent_.reset();
-};
-
-
-/**
- * @param {string} script Script exression to be evaluated in the context of the
- *     inspected page.
- * @param {function(Object|string, boolean):undefined} opt_callback Function to
- *     call with the result.
- */
-devtools.ToolsAgent.prototype.evaluateJavaScript = function(script,
-    opt_callback) {
-  InspectorBackend.evaluate(script, opt_callback || function() {});
-};
-
-
-/**
- * @return {devtools.DebuggerAgent} Debugger agent instance.
- */
-devtools.ToolsAgent.prototype.getDebuggerAgent = function() {
-  return this.debuggerAgent_;
-};
-
-
-/**
- * @return {devtools.ProfilerAgent} Profiler agent instance.
- */
-devtools.ToolsAgent.prototype.getProfilerAgent = function() {
-  return this.profilerAgent_;
-};
-
-
-/**
- * @param {string} url Url frame navigated to.
- * @see tools_agent.h
- * @private
- */
-devtools.ToolsAgent.prototype.frameNavigate_ = function(url) {
-  this.reset();
-  // Do not reset Profiles panel.
-  var profiles = null;
-  if ('profiles' in WebInspector.panels) {
-    profiles = WebInspector.panels['profiles'];
-    delete WebInspector.panels['profiles'];
-  }
-  WebInspector.reset();
-  if (profiles != null) {
-    WebInspector.panels['profiles'] = profiles;
-  }
-};
-
-
-/**
- * @param {string} message Serialized call to be dispatched on WebInspector.
- * @private
- */
-devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message) {
-  var args = JSON.parse(message);
-  var methodName = args[0];
-  var parameters = args.slice(1);
-  WebInspector[methodName].apply(WebInspector, parameters);
-};
-
-
-/**
- * Evaluates js expression.
- * @param {string} expr
- */
-devtools.ToolsAgent.prototype.evaluate = function(expr) {
-  RemoteToolsAgent.evaluate(expr);
-};
-
-
-/**
- * Enables / disables resources panel in the ui.
- * @param {boolean} enabled New panel status.
- */
-WebInspector.setResourcesPanelEnabled = function(enabled) {
-  InspectorBackend._resourceTrackingEnabled = enabled;
-  WebInspector.panels.resources.reset();
-};
-
-
-/**
- * Prints string  to the inspector console or shows alert if the console doesn't
- * exist.
- * @param {string} text
- */
-function debugPrint(text) {
-  var console = WebInspector.console;
-  if (console) {
-    console.addMessage(new WebInspector.ConsoleMessage(
-        WebInspector.ConsoleMessage.MessageSource.JS,
-        WebInspector.ConsoleMessage.MessageType.Log,
-        WebInspector.ConsoleMessage.MessageLevel.Log,
-        1, 'chrome://devtools/<internal>', undefined, -1, text));
-  } else {
-    alert(text);
-  }
-}
-
-
-/**
- * Global instance of the tools agent.
- * @type {devtools.ToolsAgent}
- */
-devtools.tools = null;
-
-
-var context = {};  // Used by WebCore's inspector routines.
-
-///////////////////////////////////////////////////////////////////////////////
-// Here and below are overrides to existing WebInspector methods only.
-// TODO(pfeldman): Patch WebCore and upstream changes.
-var oldLoaded = WebInspector.loaded;
-WebInspector.loaded = function() {
-  devtools.tools = new devtools.ToolsAgent();
-  devtools.tools.reset();
-
-  Preferences.ignoreWhitespace = false;
-  Preferences.samplingCPUProfiler = true;
-  Preferences.heapProfilerPresent = true;
-  oldLoaded.call(this);
-
-  // Hide dock button on Mac OS.
-  // TODO(pfeldman): remove once Mac OS docking is implemented.
-  if (InspectorFrontendHost.platform().indexOf('mac') == 0) {
-    document.getElementById('dock-status-bar-item').addStyleClass('hidden');
-  }
-
-  InspectorFrontendHost.loaded();
-};
-
-
-(function() {
-
-  /**
-   * Handles an F3 keydown event to focus the Inspector search box.
-   * @param {KeyboardEvent} event Event to optionally handle
-   * @return {boolean} whether the event has been handled
-   */
-  function handleF3Keydown(event) {
-    if (event.keyIdentifier == 'F3' && !event.altKey && !event.ctrlKey &&
-        !event.shiftKey && !event.metaKey) {
-      var searchField = document.getElementById("search");
-      searchField.focus();
-      searchField.select();
-      event.preventDefault();
-      return true;
-    }
-    return false;
-  }
-
-
-  var oldKeyDown = WebInspector.documentKeyDown;
-  /**
-   * This override allows to intercept keydown events we want to handle in a
-   * custom way. Some nested documents (iframes) delegate keydown handling to
-   * WebInspector.documentKeyDown (e.g. SourceFrame).
-   * @param {KeyboardEvent} event
-   * @override
-   */
-  WebInspector.documentKeyDown = function(event) {
-    var isHandled = handleF3Keydown(event);
-    if (!isHandled) {
-      // Mute refresh action.
-      if (event.keyIdentifier == 'F5') {
-        event.preventDefault();
-      } else if (event.keyIdentifier == 'U+0052' /* 'R' */ &&
-          (event.ctrlKey || event.metaKey)) {
-        event.preventDefault();
-      } else {
-        oldKeyDown.call(this, event);
-      }
-    }
-  };
-})();
-
-
-/**
- * This override is necessary for adding script source asynchronously.
- * @override
- */
-WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function() {
-  if (!this._frameNeedsSetup) {
-    return;
-  }
-
-  this.attach();
-
-  if (this.script.source) {
-    this.didResolveScriptSource_();
-  } else {
-    var self = this;
-    devtools.tools.getDebuggerAgent().resolveScriptSource(
-        this.script.sourceID,
-        function(source) {
-          self.script.source = source ||
-              WebInspector.UIString('<source is not available>');
-          self.didResolveScriptSource_();
-        });
-  }
-};
-
-
-/**
- * Performs source frame setup when script source is aready resolved.
- */
-WebInspector.ScriptView.prototype.didResolveScriptSource_ = function() {
-  if (!InspectorFrontendHost.addSourceToFrame(
-      "text/javascript", this.script.source, this.sourceFrame.element)) {
-    return;
-  }
-
-  delete this._frameNeedsSetup;
-
-  this.sourceFrame.addEventListener(
-      "syntax highlighting complete", this._syntaxHighlightingComplete, this);
-  this.sourceFrame.syntaxHighlightJavascript();
-};
-
-
-/**
- * @param {string} type Type of the the property value('object' or 'function').
- * @param {string} className Class name of the property value.
- * @constructor
- */
-WebInspector.UnresolvedPropertyValue = function(type, className) {
-  this.type = type;
-  this.className = className;
-};
-
-
-/**
- * This function overrides standard searchableViews getters to perform search
- * only in the current view (other views are loaded asynchronously, no way to
- * search them yet).
- */
-WebInspector.searchableViews_ = function() {
-  var views = [];
-  const visibleView = this.visibleView;
-  if (visibleView && visibleView.performSearch) {
-    views.push(visibleView);
-  }
-  return views;
-};
-
-
-/**
- * @override
- */
-WebInspector.ResourcesPanel.prototype.__defineGetter__(
-    'searchableViews',
-    WebInspector.searchableViews_);
-
-
-/**
- * @override
- */
-WebInspector.ScriptsPanel.prototype.__defineGetter__(
-    'searchableViews',
-    WebInspector.searchableViews_);
-
-
-(function() {
-  var oldShow = WebInspector.ScriptsPanel.prototype.show;
-  WebInspector.ScriptsPanel.prototype.show =  function() {
-    devtools.tools.getDebuggerAgent().initUI();
-    this.enableToggleButton.visible = false;
-    oldShow.call(this);
-  };
-})();
-
-
-(function InterceptProfilesPanelEvents() {
-  var oldShow = WebInspector.ProfilesPanel.prototype.show;
-  WebInspector.ProfilesPanel.prototype.show = function() {
-    devtools.tools.getProfilerAgent().initializeProfiling();
-    this.enableToggleButton.visible = false;
-    oldShow.call(this);
-    // Show is called on every show event of a panel, so
-    // we only need to intercept it once.
-    WebInspector.ProfilesPanel.prototype.show = oldShow;
-  };
-})();
-
-
-/*
- * @override
- * TODO(mnaganov): Restore l10n when it will be agreed that it is needed.
- */
-WebInspector.UIString = function(string) {
-  return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
-};
-
-
-// There is no clear way of setting frame title yet. So sniffing main resource
-// load.
-(function OverrideUpdateResource() {
-  var originalUpdateResource = WebInspector.updateResource;
-  WebInspector.updateResource = function(identifier, payload) {
-    originalUpdateResource.call(this, identifier, payload);
-    var resource = this.resources[identifier];
-    if (resource && resource.mainResource && resource.finished) {
-      document.title =
-          WebInspector.UIString('Developer Tools - %s', resource.url);
-    }
-  };
-})();
-
-
-// Highlight extension content scripts in the scripts list.
-(function () {
-  var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu;
-  WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script) {
-    var result = original.apply(this, arguments);
-    var debuggerAgent = devtools.tools.getDebuggerAgent();
-    var type = debuggerAgent.getScriptContextType(script.sourceID);
-    var option = script.filesSelectOption;
-    if (type == 'injected' && option) {
-      option.addStyleClass('injected');
-    }
-    return result;
-  };
-})();
-
-
-/** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */
-(function() {
-  var originalDragStart = WebInspector.elementDragStart;
-  WebInspector.elementDragStart = function(element) {
-    if (element) {
-      var glassPane = document.createElement("div");
-      glassPane.style.cssText =
-          'position:absolute;width:100%;height:100%;opacity:0;z-index:1';
-      glassPane.id = 'glass-pane-for-drag';
-      element.parentElement.appendChild(glassPane);
-    }
-
-    originalDragStart.apply(this, arguments);
-  };
-
-  var originalDragEnd = WebInspector.elementDragEnd;
-  WebInspector.elementDragEnd = function() {
-    originalDragEnd.apply(this, arguments);
-
-    var glassPane = document.getElementById('glass-pane-for-drag');
-    if (glassPane) {
-      glassPane.parentElement.removeChild(glassPane);
-    }
-  };
-})();
-
-
-(function () {
-var orig = InjectedScriptAccess.getProperties;
-InjectedScriptAccess.getProperties = function(
-    objectProxy, ignoreHasOwnProperty, abbreviate, callback) {
-  if (objectProxy.isScope) {
-    devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId,
-        callback);
-  } else if (objectProxy.isV8Ref) {
-    devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId,
-        callback, false);
-  } else {
-    orig.apply(this, arguments);
-  }
-};
-})();
-
-
-InjectedScriptAccess.evaluateInCallFrame = function(callFrameId, code,
-                                                    objectGroup, callback)
-{
-  //TODO(pfeldman): remove once 49084 is rolled.
-  if (!callback) {
-    callback = objectGroup;
-  }
-  devtools.tools.getDebuggerAgent().evaluateInCallFrame(
-      callFrameId, code, callback);
-};
-
-
-WebInspector.resourceTrackingWasEnabled = function()
-{
-    InspectorBackend._resourceTrackingEnabled = true;
-    this.panels.resources.resourceTrackingWasEnabled();
-};
-
-WebInspector.resourceTrackingWasDisabled = function()
-{
-    InspectorBackend._resourceTrackingEnabled = false;
-    this.panels.resources.resourceTrackingWasDisabled();
-};
-
-(function() {
-var orig = WebInspector.ConsoleMessage.prototype.setMessageBody;
-WebInspector.ConsoleMessage.prototype.setMessageBody = function(args) {
-  for (var i = 0; i < args.length; ++i) {
-    if (typeof args[i] == "string") {
-      args[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(args[i]);
-    }
-  }
-  orig.call(this, args);
-};
-})();
-
-
-(function() {
-var orig = InjectedScriptAccess.getCompletions;
-InjectedScriptAccess.getCompletions = function(expressionString,
-    includeInspectorCommandLineAPI, callFrameId, reportCompletions) {
-  if (goog.isDef(callFrameId)) {
-    devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(
-        expressionString, callFrameId, reportCompletions);
-  } else {
-    return orig.apply(this, arguments);
-  }
-};
-})();
-
-
-(function() {
-WebInspector.ElementsPanel.prototype._nodeSearchButtonClicked = function(
-    event) {
-  InspectorBackend.toggleNodeSearch();
-  this.nodeSearchButton.toggled = !this.nodeSearchButton.toggled;
-};
-})();
-
-
-// We need to have a place for postponed tasks
-// which should be executed when all the messages between agent and frontend
-// are processed.
-
-WebInspector.runAfterPendingDispatchesQueue = [];
-
-WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback) {
-  WebInspector.runAfterPendingDispatchesQueue.push(callback);
-};
-
-WebInspector.queuesAreEmpty = function() {
-  var copy = this.runAfterPendingDispatchesQueue.slice();
-  this.runAfterPendingDispatchesQueue = [];
-  for (var i = 0; i < copy.length; ++i)
-    copy[i].call(this);
-};
-
-(function() {
-var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame;
-InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element) {
-  var resource = WebInspector.resources[identifier];
-  if (!resource) {
-    return;
-  }
-  originalAddToFrame.call(this, identifier, resource.mimeType, element);
-};
-})();
-
-/* devtools_host_stub.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview These stubs emulate backend functionality and allows
- * DevTools frontend to function as a standalone web app.
- */
-
-if (!window['RemoteDebuggerAgent']) {
-
-/**
- * @constructor
- */
-RemoteDebuggerAgentStub = function() {
-};
-
-
-RemoteDebuggerAgentStub.prototype.GetContextId = function() {
-  RemoteDebuggerAgent.SetContextId(3);
-};
-
-
-/**
- * @constructor
- */
-RemoteProfilerAgentStub = function() {
-};
-
-
-RemoteProfilerAgentStub.prototype.GetActiveProfilerModules = function() {
-  ProfilerStubHelper.GetInstance().GetActiveProfilerModules();
-};
-
-
-RemoteProfilerAgentStub.prototype.GetLogLines = function(pos) {
-  ProfilerStubHelper.GetInstance().GetLogLines(pos);
-};
-
-
-/**
- * @constructor
- */
-RemoteToolsAgentStub = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.DispatchOnInjectedScript = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.DispatchOnInspectorController = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.ExecuteVoidJavaScript = function() {
-};
-
-
-/**
- * @constructor
- */
-ProfilerStubHelper = function() {
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-  this.heapProfSample_ = 0;
-  this.log_ = '';
-};
-
-
-ProfilerStubHelper.GetInstance = function() {
-  if (!ProfilerStubHelper.instance_) {
-    ProfilerStubHelper.instance_ = new ProfilerStubHelper();
-  }
-  return ProfilerStubHelper.instance_;
-};
-
-
-ProfilerStubHelper.prototype.StopProfiling = function(modules) {
-  this.activeProfilerModules_ &= ~modules;
-};
-
-
-ProfilerStubHelper.prototype.StartProfiling = function(modules) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
-    if (modules & profModules.PROFILER_MODULE_HEAP_STATS) {
-      this.log_ +=
-          'heap-sample-begin,"Heap","allocated",' +
-              (new Date()).getTime() + '\n' +
-          'heap-sample-stats,"Heap","allocated",10000,1000\n';
-      this.log_ +=
-          'heap-sample-item,STRING_TYPE,100,1000\n' +
-          'heap-sample-item,CODE_TYPE,10,200\n' +
-          'heap-sample-item,MAP_TYPE,20,350\n';
-      this.log_ +=
-          ProfilerStubHelper.HeapSamples[this.heapProfSample_++];
-      this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length;
-      this.log_ +=
-          'heap-sample-end,"Heap","allocated"\n';
-    }
-  } else {
-    if (modules & profModules.PROFILER_MODULE_CPU) {
-      this.log_ += ProfilerStubHelper.ProfilerLogBuffer;
-    }
-    this.activeProfilerModules_ |= modules;
-  }
-};
-
-
-ProfilerStubHelper.prototype.GetActiveProfilerModules = function() {
-  var self = this;
-  setTimeout(function() {
-      RemoteProfilerAgent.DidGetActiveProfilerModules(
-          self.activeProfilerModules_);
-  }, 100);
-};
-
-
-ProfilerStubHelper.prototype.GetLogLines = function(pos) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  var logLines = this.log_.substr(pos);
-  setTimeout(function() {
-    RemoteProfilerAgent.DidGetLogLines(pos + logLines.length, logLines);
-  }, 100);
-};
-
-
-ProfilerStubHelper.ProfilerLogBuffer =
-  'profiler,begin,1\n' +
-  'profiler,resume\n' +
-  'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' +
-  'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' +
-  'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' +
-  'tick,0x1010,0x0,3\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x3010,0x0,3,0x2020, 0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x2030,0x0,3,0x2020, 0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x1010,0x0,3\n' +
-  'profiler,pause\n';
-
-
-ProfilerStubHelper.HeapSamples = [
-  'heap-js-cons-item,foo,1,100\n' +
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,Object,5,100\n' +
-  'heap-js-ret-item,foo,bar;3\n' +
-  'heap-js-ret-item,bar,foo;5\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
-  'heap-js-cons-item,foo,2000,200000\n' +
-  'heap-js-cons-item,bar,10,1000\n' +
-  'heap-js-cons-item,Object,6,120\n' +
-  'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' +
-  'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
-  'heap-js-cons-item,foo,15,1500\n' +
-  'heap-js-cons-item,bar,15,1500\n' +
-  'heap-js-cons-item,Object,5,100\n' +
-  'heap-js-cons-item,Array,3,1000\n' +
-  'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' +
-  'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' +
-  'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' +
-  'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n',
-
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,Object,6,120\n' +
-  'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' +
-  'heap-js-ret-item,Object:0x1234,(global property);3\n' +
-  'heap-js-ret-item,Object:0x1235,(global property);5\n',
-
-  'heap-js-cons-item,foo,15,1500\n' +
-  'heap-js-cons-item,bar,15,1500\n' +
-  'heap-js-cons-item,Array,10,1000\n' +
-  'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' +
-  'heap-js-ret-item,bar,foo;5\n' +
-  'heap-js-ret-item,Array:0x5678,(roots);3\n',
-
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,baz,15,1500\n' +
-  'heap-js-ret-item,bar,baz;3\n' +
-  'heap-js-ret-item,baz,bar;3\n'
-];
-
-
-/**
- * @constructor
- */
-RemoteDebuggerCommandExecutorStub = function() {
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd) {
-  if ('{"seq":2,"type":"request","command":"scripts","arguments":{"' +
-      'includeSource":false}}' == cmd) {
-    var response1 =
-        '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' +
-        'success":true,"body":[{"handle":61,"type":"script","name":"' +
-        'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
-        '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' +
-        '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' +
-        '"handle":60,"type":"context","data":"page,3"}],"running":false}';
-    this.sendResponse_(response1);
-  } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{' +
-             '"ids":[59],"includeSource":true}}' == cmd) {
-    this.sendResponse_(
-        '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' +
-        '"success":true,"body":[{"handle":1,"type":"script","name":' +
-        '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
-        '"lineCount":1,"source":"function fib(n) {return n+1;}",' +
-        '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' +
-        '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' +
-        '"running":false}');
-  } else if (cmd.indexOf('"command":"profile"') != -1) {
-    var cmdObj = JSON.parse(cmd);
-    if (cmdObj.arguments.command == 'resume') {
-      ProfilerStubHelper.GetInstance().StartProfiling(
-          parseInt(cmdObj.arguments.modules));
-    } else if (cmdObj.arguments.command == 'pause') {
-      ProfilerStubHelper.GetInstance().StopProfiling(
-          parseInt(cmdObj.arguments.modules));
-    } else {
-      debugPrint('Unexpected profile command: ' + cmdObj.arguments.command);
-    }
-  } else {
-    debugPrint('Unexpected command: ' + cmd);
-  }
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function() {
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response) {
-  setTimeout(function() {
-    RemoteDebuggerAgent.DebuggerOutput(response);
-  }, 0);
-};
-
-
-DevToolsHostStub = function() {
-  this.isStub = true;
-};
-goog.inherits(DevToolsHostStub,
-    WebInspector.InspectorFrontendHostStub);
-
-
-DevToolsHostStub.prototype.reset = function() {
-};
-
-
-DevToolsHostStub.prototype.setting = function() {
-};
-
-
-DevToolsHostStub.prototype.setSetting = function() {
-};
-
-
-window['RemoteDebuggerAgent'] = new RemoteDebuggerAgentStub();
-window['RemoteDebuggerCommandExecutor'] =
-    new RemoteDebuggerCommandExecutorStub();
-window['RemoteProfilerAgent'] = new RemoteProfilerAgentStub();
-window['RemoteToolsAgent'] = new RemoteToolsAgentStub();
-InspectorFrontendHost = new DevToolsHostStub();
-
-}
-
-/* tests.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-/**
- * @fileoverview This file contains small testing framework along with the
- * test suite for the frontend. These tests are a part of the continues build
- * and are executed by the devtools_sanity_unittest.cc as a part of the
- * Interactive UI Test suite.
- */
-
-if (window.domAutomationController) {
-
-var ___interactiveUiTestsMode = true;
-
-/**
- * Test suite for interactive UI tests.
- * @constructor
- */
-TestSuite = function() {
-  this.controlTaken_ = false;
-  this.timerId_ = -1;
-};
-
-
-/**
- * Reports test failure.
- * @param {string} message Failure description.
- */
-TestSuite.prototype.fail = function(message) {
-  if (this.controlTaken_) {
-    this.reportFailure_(message);
-  } else {
-    throw message;
-  }
-};
-
-
-/**
- * Equals assertion tests that expected == actual.
- * @param {Object} expected Expected object.
- * @param {Object} actual Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
-TestSuite.prototype.assertEquals = function(expected, actual, opt_message) {
-  if (expected != actual) {
-    var message = 'Expected: "' + expected + '", but was "' + actual + '"';
-    if (opt_message) {
-      message = opt_message + '(' + message + ')';
-    }
-    this.fail(message);
-  }
-};
-
-
-/**
- * True assertion tests that value == true.
- * @param {Object} value Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
-TestSuite.prototype.assertTrue = function(value, opt_message) {
-  this.assertEquals(true, !!value, opt_message);
-};
-
-
-/**
- * Contains assertion tests that string contains substring.
- * @param {string} string Outer.
- * @param {string} substring Inner.
- */
-TestSuite.prototype.assertContains = function(string, substring) {
-  if (string.indexOf(substring) == -1) {
-    this.fail('Expected to: "' + string + '" to contain "' + substring + '"');
-  }
-};
-
-
-/**
- * Takes control over execution.
- */
-TestSuite.prototype.takeControl = function() {
-  this.controlTaken_ = true;
-  // Set up guard timer.
-  var self = this;
-  this.timerId_ = setTimeout(function() {
-    self.reportFailure_('Timeout exceeded: 20 sec');
-  }, 20000);
-};
-
-
-/**
- * Releases control over execution.
- */
-TestSuite.prototype.releaseControl = function() {
-  if (this.timerId_ != -1) {
-    clearTimeout(this.timerId_);
-    this.timerId_ = -1;
-  }
-  this.reportOk_();
-};
-
-
-/**
- * Async tests use this one to report that they are completed.
- */
-TestSuite.prototype.reportOk_ = function() {
-  window.domAutomationController.send('[OK]');
-};
-
-
-/**
- * Async tests use this one to report failures.
- */
-TestSuite.prototype.reportFailure_ = function(error) {
-  if (this.timerId_ != -1) {
-    clearTimeout(this.timerId_);
-    this.timerId_ = -1;
-  }
-  window.domAutomationController.send('[FAILED] ' + error);
-};
-
-
-/**
- * Runs all global functions starting with 'test' as unit tests.
- */
-TestSuite.prototype.runTest = function(testName) {
-  try {
-    this[testName]();
-    if (!this.controlTaken_) {
-      this.reportOk_();
-    }
-  } catch (e) {
-    this.reportFailure_(e);
-  }
-};
-
-
-/**
- * @param {string} panelName Name of the panel to show.
- */
-TestSuite.prototype.showPanel = function(panelName) {
-  // Open Scripts panel.
-  var toolbar = document.getElementById('toolbar');
-  var button = toolbar.getElementsByClassName(panelName)[0];
-  button.click();
-  this.assertEquals(WebInspector.panels[panelName],
-      WebInspector.currentPanel);
-};
-
-
-/**
- * Overrides the method with specified name until it's called first time.
- * @param {Object} receiver An object whose method to override.
- * @param {string} methodName Name of the method to override.
- * @param {Function} override A function that should be called right after the
- *     overriden method returns.
- * @param {boolean} opt_sticky Whether restore original method after first run
- *     or not.
- */
-TestSuite.prototype.addSniffer = function(receiver, methodName, override,
-                                          opt_sticky) {
-  var orig = receiver[methodName];
-  if (typeof orig != 'function') {
-    this.fail('Cannot find method to override: ' + methodName);
-  }
-  var test = this;
-  receiver[methodName] = function(var_args) {
-    try {
-      var result = orig.apply(this, arguments);
-    } finally {
-      if (!opt_sticky) {
-        receiver[methodName] = orig;
-      }
-    }
-    // In case of exception the override won't be called.
-    try {
-      override.apply(this, arguments);
-    } catch (e) {
-      test.fail('Exception in overriden method "' + methodName + '": ' + e);
-    }
-    return result;
-  };
-};
-
-
-// UI Tests
-
-
-/**
- * Tests that the real injected host is present in the context.
- */
-TestSuite.prototype.testHostIsPresent = function() {
-  this.assertTrue(typeof InspectorFrontendHost == 'object' &&
-      !InspectorFrontendHost.isStub);
-};
-
-
-/**
- * Tests elements tree has an 'HTML' root.
- */
-TestSuite.prototype.testElementsTreeRoot = function() {
-  var doc = WebInspector.domAgent.document;
-  this.assertEquals('HTML', doc.documentElement.nodeName);
-  this.assertTrue(doc.documentElement.hasChildNodes());
-};
-
-
-/**
- * Tests that main resource is present in the system and that it is
- * the only resource.
- */
-TestSuite.prototype.testMainResource = function() {
-  var tokens = [];
-  var resources = WebInspector.resources;
-  for (var id in resources) {
-    tokens.push(resources[id].lastPathComponent);
-  }
-  this.assertEquals('simple_page.html', tokens.join(','));
-};
-
-
-/**
- * Tests that resources tab is enabled when corresponding item is selected.
- */
-TestSuite.prototype.testEnableResourcesTab = function() {
-  this.showPanel('resources');
-
-  var test = this;
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        test.assertEquals('simple_page.html', payload.lastPathComponent);
-        WebInspector.panels.resources.refresh();
-        WebInspector.panels.resources.revealAndSelectItem(
-            WebInspector.resources[identifier]);
-
-        test.releaseControl();
-      });
-
-  // Following call should lead to reload that we capture in the
-  // addResource override.
-  WebInspector.panels.resources._enableResourceTracking();
-
-  // We now have some time to report results to controller.
-  this.takeControl();
-};
-
-
-/**
- * Tests that correct content length is reported for resources.
- */
-TestSuite.prototype.testResourceContentLength = function() {
-  this.showPanel('resources');
-  var test = this;
-
-  var png = false;
-  var html = false;
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        if (!payload.didLengthChange)
-          return;
-        var resource = WebInspector.resources[identifier];
-        if (!resource || !resource.url)
-          return;
-        if (resource.url.search('image.html$') != -1) {
-          var expectedLength = 87;
-          test.assertTrue(
-              resource.contentLength <= expectedLength,
-              'image.html content length is greater thatn expected.');
-          if (expectedLength == resource.contentLength) {
-            html = true;
-          }
-        } else if (resource.url.search('image.png') != -1) {
-          var expectedLength = 257796;
-          test.assertTrue(
-              resource.contentLength <= expectedLength,
-              'image.png content length is greater than expected.');
-          if (expectedLength == resource.contentLength) {
-            png = true;
-          }
-        }
-        if (html && png) {
-          // Wait 1 second before releasing control to check that the content
-          // lengths are not updated anymore.
-          setTimeout(function() {
-            test.releaseControl();
-          }, 1000);
-        }
-      }, true);
-
-  // Make sure resource tracking is on.
-  WebInspector.panels.resources._enableResourceTracking();
-  // Reload inspected page to update all resources.
-  test.evaluateInConsole_(
-      'window.location.reload(true);',
-       function(resultText) {
-           test.assertEquals('undefined', resultText,
-                             'Unexpected result of reload().');
-       });
-
-  // We now have some time to report results to controller.
-  this.takeControl();
-};
-
-
-/**
- * Tests resource headers.
- */
-TestSuite.prototype.testResourceHeaders = function() {
-  this.showPanel('resources');
-
-  var test = this;
-
-  var responseOk = false;
-  var timingOk = false;
-
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        var resource = this.resources[identifier];
-        if (!resource || resource.mainResource) {
-          // We are only interested in secondary resources in this test.
-          return;
-        }
-
-        var requestHeaders = JSON.stringify(resource.requestHeaders);
-        test.assertContains(requestHeaders, 'Accept');
-
-        if (payload.didResponseChange) {
-          var responseHeaders = JSON.stringify(resource.responseHeaders);
-          test.assertContains(responseHeaders, 'Content-type');
-          test.assertContains(responseHeaders, 'Content-Length');
-          test.assertTrue(typeof resource.responseReceivedTime != 'undefined');
-          responseOk = true;
-        }
-
-        if (payload.didTimingChange) {
-          test.assertTrue(typeof resource.startTime != 'undefined');
-          timingOk = true;
-        }
-
-        if (payload.didCompletionChange) {
-          test.assertTrue(responseOk);
-          test.assertTrue(timingOk);
-          test.assertTrue(typeof resource.endTime != 'undefined');
-          test.releaseControl();
-        }
-      }, true);
-
-  WebInspector.panels.resources._enableResourceTracking();
-  this.takeControl();
-};
-
-
-/**
- * Tests the mime type of a cached (HTTP 304) resource.
- */
-TestSuite.prototype.testCachedResourceMimeType = function() {
-  this.showPanel('resources');
-
-  var test = this;
-  var hasReloaded = false;
-
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        var resource = this.resources[identifier];
-        if (!resource || resource.mainResource) {
-          // We are only interested in secondary resources in this test.
-          return;
-        }
-
-        if (payload.didResponseChange) {
-          // Test server uses a default mime type for JavaScript files.
-          test.assertEquals('text/html', payload.mimeType);
-          if (!hasReloaded) {
-            hasReloaded = true;
-            // Reload inspected page to update all resources.
-            test.evaluateInConsole_(
-                'window.location.reload(true);',
-                 function() {});
-          } else {
-            test.releaseControl();
-          }
-        }
-
-      }, true);
-
-  WebInspector.panels.resources._enableResourceTracking();
-  this.takeControl();
-};
-
-
-/**
- * Tests that profiler works.
- */
-TestSuite.prototype.testProfilerTab = function() {
-  this.showPanel('profiles');
-
-  var test = this;
-  this.addSniffer(WebInspector.panels.profiles, 'addProfileHeader',
-      function(typeOrProfile, profile) {
-        if (!profile) {
-          profile = typeOrProfile;
-        }
-        var panel = WebInspector.panels.profiles;
-        panel.showProfile(profile);
-        var node = panel.visibleView.profileDataGridTree.children[0];
-        // Iterate over displayed functions and search for a function
-        // that is called 'fib' or 'eternal_fib'. If found, it will mean
-        // that we actually have profiled page's code.
-        while (node) {
-          if (node.functionName.indexOf('fib') != -1) {
-            test.releaseControl();
-          }
-          node = node.traverseNextNode(true, null, true);
-        }
-
-        test.fail();
-      });
-  var ticksCount = 0;
-  var tickRecord = '\nt,';
-  this.addSniffer(RemoteProfilerAgent, 'DidGetLogLines',
-      function(posIgnored, log) {
-        var pos = 0;
-        while ((pos = log.indexOf(tickRecord, pos)) != -1) {
-          pos += tickRecord.length;
-          ticksCount++;
-        }
-        if (ticksCount > 100) {
-          InspectorBackend.stopProfiling();
-        }
-      }, true);
-
-  InspectorBackend.startProfiling();
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts tab can be open and populated with inspected scripts.
- */
-TestSuite.prototype.testShowScriptsTab = function() {
-  var parsedDebuggerTestPageHtml = false;
-
-  // Intercept parsedScriptSource calls to check that all expected scripts are
-  // added to the debugger.
-  var test = this;
-  var receivedConsoleApiSource = false;
-  this.addSniffer(WebInspector, 'parsedScriptSource',
-      function(sourceID, sourceURL, source, startingLine) {
-        if (sourceURL == undefined) {
-          if (receivedConsoleApiSource) {
-            test.fail('Unexpected script without URL');
-          } else {
-            receivedConsoleApiSource = true;
-          }
-        } else if (sourceURL.search(/debugger_test_page.html$/) != -1) {
-          if (parsedDebuggerTestPageHtml) {
-            test.fail('Unexpected parse event: ' + sourceURL);
-          }
-          parsedDebuggerTestPageHtml = true;
-          if (!WebInspector.panels.scripts.visibleView) {
-            test.fail('No visible script view: ' + sourceURL);
-          }
-        } else {
-          test.fail('Unexpected script URL: ' + sourceURL);
-        }
-
-        // There should be two scripts: one for the main page and another
-        // one which is source of console API(see
-        // InjectedScript._ensureCommandLineAPIInstalled).
-        if (parsedDebuggerTestPageHtml && receivedConsoleApiSource) {
-           test.releaseControl();
-        }
-      }, true /* sticky */);
-
-  this.showPanel('scripts');
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts tab is populated with inspected scripts even if it
- * hadn't been shown by the moment inspected paged refreshed.
- * @see http://crbug.com/26312
- */
-TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh =
-    function() {
-  var test = this;
-  this.assertEquals(WebInspector.panels.elements,
-      WebInspector.currentPanel, 'Elements panel should be current one.');
-
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'reset',
-      waitUntilScriptIsParsed);
-
-  // Reload inspected page. It will reset the debugger agent.
-  test.evaluateInConsole_(
-      'window.location.reload(true);',
-      function(resultText) {
-        test.assertEquals('undefined', resultText,
-                          'Unexpected result of reload().');
-      });
-
-  function waitUntilScriptIsParsed() {
-    var parsed = devtools.tools.getDebuggerAgent().parsedScripts_;
-    for (var id in parsed) {
-      var url = parsed[id].getUrl();
-      if (url && url.search('debugger_test_page.html$') != -1) {
-        checkScriptsPanel();
-        return;
-      }
-    }
-    test.addSniffer(devtools.DebuggerAgent.prototype, 'addScriptInfo_',
-        waitUntilScriptIsParsed);
-  }
-
-  function checkScriptsPanel() {
-    test.showPanel('scripts');
-    test.assertTrue(test._scriptsAreParsed(['debugger_test_page.html$']),
-                    'Inspected script not found in the scripts list');
-    test.releaseControl();
-  }
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts list contains content scripts.
- */
-TestSuite.prototype.testContentScriptIsPresent = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  test._waitUntilScriptsAreParsed(
-      ['page_with_content_script.html$', 'simple_content_script.js$'],
-      function() {
-        test.releaseControl();
-      });
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts are not duplicaed on Scripts tab switch.
- */
-TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() {
-  var test = this;
-
-  // There should be two scripts: one for the main page and another
-  // one which is source of console API(see
-  // InjectedScript._ensureCommandLineAPIInstalled).
-  var expectedScriptsCount = 2;
-  var parsedScripts = [];
-
-  this.showPanel('scripts');
-
-
-  function switchToElementsTab() {
-    test.showPanel('elements');
-    setTimeout(switchToScriptsTab, 0);
-  }
-
-  function switchToScriptsTab() {
-    test.showPanel('scripts');
-    setTimeout(checkScriptsPanel, 0);
-  }
-
-  function checkScriptsPanel() {
-    test.assertTrue(!!WebInspector.panels.scripts.visibleView,
-                    'No visible script view.');
-    test.assertTrue(test._scriptsAreParsed(['debugger_test_page.html$']),
-                    'Some scripts are missing.');
-    checkNoDuplicates();
-    test.releaseControl();
-  }
-
-  function checkNoDuplicates() {
-    var scriptSelect = document.getElementById('scripts-files');
-    var options = scriptSelect.options;
-    for (var i = 0; i < options.length; i++) {
-      var scriptName = options[i].text;
-      for (var j = i + 1; j < options.length; j++) {
-        test.assertTrue(scriptName != options[j].text,
-            'Found script duplicates: ' + test.optionsToString_(options));
-      }
-    }
-  }
-
-  test._waitUntilScriptsAreParsed(
-      ['debugger_test_page.html$'],
-      function() {
-        checkNoDuplicates();
-        setTimeout(switchToElementsTab, 0);
-      });
-
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that a breakpoint can be set.
- */
-TestSuite.prototype.testSetBreakpoint = function() {
-  var test = this;
-  this.showPanel('scripts');
-
-  var breakpointLine = 12;
-
-  this._waitUntilScriptsAreParsed(['debugger_test_page.html'],
-      function() {
-        test.showMainPageScriptSource_(
-            'debugger_test_page.html',
-            function(view, url) {
-              view._addBreakpoint(breakpointLine);
-              // Force v8 execution.
-              RemoteToolsAgent.ExecuteVoidJavaScript();
-              test.waitForSetBreakpointResponse_(url, breakpointLine,
-                  function() {
-                    test.releaseControl();
-                  });
-            });
-      });
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that pause on exception works.
- */
-TestSuite.prototype.testPauseOnException = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  // Make sure pause on exceptions is on.
-  if (!WebInspector.currentPanel.pauseOnExceptionButton.toggled) {
-    WebInspector.currentPanel.pauseOnExceptionButton.element.click();
-  }
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['pause_on_exception.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['throwAnException', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 6,
-        lineText: '  return unknown_var;'
-      },
-      function() {
-        test.releaseControl();
-      });
-
-  this.takeControl();
-};
-
-
-// Tests that debugger works correctly if pause event occurs when DevTools
-// frontend is being loaded.
-TestSuite.prototype.testPauseWhenLoadingDevTools = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  var expectations = {
-        functionsOnStack: ['callDebugger'],
-        lineNumber: 8,
-        lineText: '  debugger;'
-      };
-
-
-  // Script execution can already be paused.
-  if (WebInspector.currentPanel.paused) {
-    var callFrame =
-        WebInspector.currentPanel.sidebarPanes.callstack.selectedCallFrame;
-    this.assertEquals(expectations.functionsOnStack[0],
-                      callFrame.functionName);
-    var callbackInvoked = false;
-    this._checkSourceFrameWhenLoaded(expectations, function() {
-          callbackInvoked = true;
-          if (test.controlTaken_) {
-            test.releaseControl();
-          }
-        });
-    if (!callbackInvoked) {
-      test.takeControl();
-    }
-    return;
-  }
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['callDebugger'],
-        lineNumber: 8,
-        lineText: '  debugger;'
-      },
-      function() {
-        test.releaseControl();
-      });
-  this.takeControl();
-};
-
-
-// Tests that pressing 'Pause' will pause script execution if the script
-// is already running.
-TestSuite.prototype.testPauseWhenScriptIsRunning = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  test.evaluateInConsole_(
-      'setTimeout("handleClick()" , 0)',
-      function(resultText) {
-        test.assertTrue(!isNaN(resultText),
-                        'Failed to get timer id: ' + resultText);
-        testScriptPauseAfterDelay();
-      });
-
-  // Wait for some time to make sure that inspected page is running the
-  // infinite loop.
-  function testScriptPauseAfterDelay() {
-    setTimeout(testScriptPause, 300);
-  }
-
-  function testScriptPause() {
-    // The script should be in infinite loop. Click 'Pause' button to
-    // pause it and wait for the result.
-    WebInspector.panels.scripts.pauseButton.click();
-
-    test._waitForScriptPause(
-        {
-          functionsOnStack: ['handleClick', '(anonymous function)'],
-          lineNumber: 5,
-          lineText: '  while(true) {'
-        },
-        function() {
-          test.releaseControl();
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Serializes options collection to string.
- * @param {HTMLOptionsCollection} options
- * @return {string}
- */
-TestSuite.prototype.optionsToString_ = function(options) {
-  var names = [];
-  for (var i = 0; i < options.length; i++) {
-    names.push('"' + options[i].text + '"');
-  }
-  return names.join(',');
-};
-
-
-/**
- * Ensures that main HTML resource is selected in Scripts panel and that its
- * source frame is setup. Invokes the callback when the condition is satisfied.
- * @param {HTMLOptionsCollection} options
- * @param {function(WebInspector.SourceView,string)} callback
- */
-TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback) {
-  var test = this;
-
-  var scriptSelect = document.getElementById('scripts-files');
-  var options = scriptSelect.options;
-
-  test.assertTrue(options.length, 'Scripts list is empty');
-
-  // Select page's script if it's not current option.
-  var scriptResource;
-  if (options[scriptSelect.selectedIndex].text === scriptName) {
-    scriptResource = options[scriptSelect.selectedIndex].representedObject;
-  } else {
-    var pageScriptIndex = -1;
-    for (var i = 0; i < options.length; i++) {
-      if (options[i].text === scriptName) {
-        pageScriptIndex = i;
-        break;
-      }
-    }
-    test.assertTrue(-1 !== pageScriptIndex,
-                    'Script with url ' + scriptName + ' not found among ' +
-                        test.optionsToString_(options));
-    scriptResource = options[pageScriptIndex].representedObject;
-
-    // Current panel is 'Scripts'.
-    WebInspector.currentPanel._showScriptOrResource(scriptResource);
-    test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex,
-                      'Unexpected selected option index.');
-  }
-
-  test.assertTrue(scriptResource instanceof WebInspector.Resource,
-                  'Unexpected resource class.');
-  test.assertTrue(!!scriptResource.url, 'Resource URL is null.');
-  test.assertTrue(
-      scriptResource.url.search(scriptName + '$') != -1,
-      'Main HTML resource should be selected.');
-
-  var scriptsPanel = WebInspector.panels.scripts;
-
-  var view = scriptsPanel.visibleView;
-  test.assertTrue(view instanceof WebInspector.SourceView);
-
-  if (!view.sourceFrame._isContentLoaded()) {
-    test.addSniffer(view, '_sourceFrameSetupFinished', function(event) {
-      callback(view, scriptResource.url);
-    });
-  } else {
-    callback(view, scriptResource.url);
-  }
-};
-
-
-/*
- * Evaluates the code in the console as if user typed it manually and invokes
- * the callback when the result message is received and added to the console.
- * @param {string} code
- * @param {function(string)} callback
- */
-TestSuite.prototype.evaluateInConsole_ = function(code, callback) {
-  WebInspector.console.visible = true;
-  WebInspector.console.prompt.text = code;
-  WebInspector.console.promptElement.dispatchEvent(
-      TestSuite.createKeyEvent('Enter'));
-
-  this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage',
-      function(commandResult) {
-        callback(commandResult.toMessageElement().textContent);
-      });
-};
-
-
-/*
- * Waits for 'setbreakpoint' response, checks that corresponding breakpoint
- * was successfully set and invokes the callback if it was.
- * @param {string} scriptUrl
- * @param {number} breakpointLine
- * @param {function()} callback
- */
-TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl,
-                                                             breakpointLine,
-                                                             callback) {
-  var test = this;
-  test.addSniffer(
-      devtools.DebuggerAgent.prototype,
-      'handleSetBreakpointResponse_',
-      function(msg) {
-        var bps = this.urlToBreakpoints_[scriptUrl];
-        test.assertTrue(!!bps, 'No breakpoints for line ' + breakpointLine);
-        var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine);
-        test.assertTrue(!!bps[line].getV8Id(),
-                        'Breakpoint id was not assigned.');
-        callback();
-      });
-};
-
-
-/**
- * Tests eval on call frame.
- */
-TestSuite.prototype.testEvalOnCallFrame = function() {
-  this.showPanel('scripts');
-
-  var breakpointLine = 16;
-
-  var test = this;
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'handleScriptsResponse_',
-      function(msg) {
-        test.showMainPageScriptSource_(
-            'debugger_test_page.html',
-            function(view, url) {
-              view._addBreakpoint(breakpointLine);
-              // Force v8 execution.
-              RemoteToolsAgent.ExecuteVoidJavaScript();
-              test.waitForSetBreakpointResponse_(url, breakpointLine,
-                                                 setBreakpointCallback);
-            });
-      });
-
-  function setBreakpointCallback() {
-    // Since breakpoints are ignored in evals' calculate() function is
-    // execute after zero-timeout so that the breakpoint is hit.
-    test.evaluateInConsole_(
-        'setTimeout("calculate(123)" , 0)',
-        function(resultText) {
-          test.assertTrue(!isNaN(resultText),
-                          'Failed to get timer id: ' + resultText);
-          waitForBreakpointHit();
-        });
-  }
-
-  function waitForBreakpointHit() {
-    test.addSniffer(
-        devtools.DebuggerAgent.prototype,
-        'handleBacktraceResponse_',
-        function(msg) {
-          test.assertEquals(2, this.callFrames_.length,
-                            'Unexpected stack depth on the breakpoint. ' +
-                                JSON.stringify(msg));
-          test.assertEquals('calculate', this.callFrames_[0].functionName,
-                            'Unexpected top frame function.');
-          // Evaluate 'e+1' where 'e' is an argument of 'calculate' function.
-          test.evaluateInConsole_(
-              'e+1',
-              function(resultText) {
-                test.assertEquals('124', resultText, 'Unexpected "e+1" value.');
-                test.releaseControl();
-              });
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that console auto completion works when script execution is paused.
- */
-TestSuite.prototype.testCompletionOnPause = function() {
-  this.showPanel('scripts');
-  var test = this;
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['completion_on_pause.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['innerFunction', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 9,
-        lineText: '    debugger;'
-      },
-      showConsole);
-
-  function showConsole() {
-    test.addSniffer(WebInspector.console, 'afterShow', testLocalsCompletion);
-    WebInspector.showConsole();
-  }
-
-  function testLocalsCompletion() {
-    checkCompletions(
-        'th',
-        ['parameter1', 'closureLocal', 'p', 'createClosureLocal'],
-        testThisCompletion);
-  }
-
-  function testThisCompletion() {
-    checkCompletions(
-        'this.',
-        ['field1', 'field2', 'm'],
-        testFieldCompletion);
-  }
-
-  function testFieldCompletion() {
-    checkCompletions(
-        'this.field1.',
-        ['id', 'name'],
-        function() {
-          test.releaseControl();
-        });
-  }
-
-  function checkCompletions(expression, expectedProperties, callback) {
-      test.addSniffer(WebInspector.console, '_reportCompletions',
-        function(bestMatchOnly, completionsReadyCallback, dotNotation,
-            bracketNotation, prefix, result, isException) {
-          test.assertTrue(!isException,
-                          'Exception while collecting completions');
-          for (var i = 0; i < expectedProperties.length; i++) {
-            var name = expectedProperties[i];
-            test.assertTrue(result[name], 'Name ' + name +
-                ' not found among the completions: ' +
-                JSON.stringify(result));
-          }
-          setTimeout(callback, 0);
-        });
-    WebInspector.console.prompt.text = expression;
-    WebInspector.console.prompt.autoCompleteSoon();
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that inspected page doesn't hang on reload if it contains a syntax
- * error and DevTools window is open.
- */
-TestSuite.prototype.testAutoContinueOnSyntaxError = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  function checkScriptsList() {
-    var scriptSelect = document.getElementById('scripts-files');
-    var options = scriptSelect.options;
-    // There should be only console API source (see
-    // InjectedScript._ensureCommandLineAPIInstalled) since the page script
-    // contains a syntax error.
-    for (var i = 0 ; i < options.length; i++) {
-      if (options[i].text.search('script_syntax_error.html$') != -1) {
-        test.fail('Script with syntax error should not be in the list of ' +
-                  'parsed scripts.');
-      }
-    }
-  }
-
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'handleScriptsResponse_',
-      function(msg) {
-        checkScriptsList();
-
-        // Reload inspected page.
-        test.evaluateInConsole_(
-            'window.location.reload(true);',
-            function(resultText) {
-              test.assertEquals('undefined', resultText,
-                                'Unexpected result of reload().');
-              waitForExceptionEvent();
-            });
-      });
-
-  function waitForExceptionEvent() {
-    var exceptionCount = 0;
-    test.addSniffer(
-        devtools.DebuggerAgent.prototype,
-        'handleExceptionEvent_',
-        function(msg) {
-          exceptionCount++;
-          test.assertEquals(1, exceptionCount, 'Too many exceptions.');
-          test.assertEquals(undefined, msg.getBody().script,
-                            'Unexpected exception: ' + JSON.stringify(msg));
-          test.releaseControl();
-        });
-
-    // Check that the script is not paused on parse error.
-    test.addSniffer(
-        WebInspector,
-        'pausedScript',
-        function(callFrames) {
-          test.fail('Script execution should not pause on syntax error.');
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Checks current execution line against expectations.
- * @param {WebInspector.SourceFrame} sourceFrame
- * @param {number} lineNumber Expected line number
- * @param {string} lineContent Expected line text
- */
-TestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber,
-                                                   lineContent) {
-  var sourceRow = sourceFrame.sourceRow(lineNumber);
-
-  var line = sourceRow.getElementsByClassName('webkit-line-content')[0];
-  this.assertEquals(lineNumber, sourceFrame.executionLine,
-                    'Unexpected execution line number.');
-  this.assertEquals(lineContent, line.textContent,
-                    'Unexpected execution line text.');
-
-  this.assertTrue(!!sourceRow, 'Execution line not found');
-  this.assertTrue(sourceRow.hasStyleClass('webkit-execution-line'),
-      'Execution line ' + lineNumber + ' is not highlighted. Class: ' +
-          sourceRow.className);
-}
-
-
-/**
- * Checks that all expected scripts are present in the scripts list
- * in the Scripts panel.
- * @param {Array.<string>} expected Regular expressions describing
- *     expected script names.
- * @return {boolean} Whether all the scripts are in 'scripts-files' select
- *     box
- */
-TestSuite.prototype._scriptsAreParsed = function(expected) {
-  var scriptSelect = document.getElementById('scripts-files');
-  var options = scriptSelect.options;
-
-  // Check that at least all the expected scripts are present.
-  var missing = expected.slice(0);
-  for (var i = 0 ; i < options.length; i++) {
-    for (var j = 0; j < missing.length; j++) {
-      if (options[i].text.search(missing[j]) != -1) {
-        missing.splice(j, 1);
-        break;
-      }
-    }
-  }
-  return missing.length == 0;
-};
-
-
-/**
- * Waits for script pause, checks expectations, and invokes the callback.
- * @param {Object} expectations  Dictionary of expectations
- * @param {function():void} callback
- */
-TestSuite.prototype._waitForScriptPause = function(expectations, callback) {
-  var test = this;
-  // Wait until script is paused.
-  test.addSniffer(
-      WebInspector,
-      'pausedScript',
-      function(callFrames) {
-        var functionsOnStack = [];
-        for (var i = 0; i < callFrames.length; i++) {
-          functionsOnStack.push(callFrames[i].functionName);
-        }
-
-        test.assertEquals(
-            expectations.functionsOnStack.join(','),
-            functionsOnStack.join(','), 'Unexpected stack.');
-
-        // Check that execution line where the script is paused is
-        // expected one.
-        test._checkSourceFrameWhenLoaded(expectations, callback);
-      });
-};
-
-
-/**
- * Waits for current source frame to load, checks expectations, and invokes
- * the callback.
- * @param {Object} expectations  Dictionary of expectations
- * @param {function():void} callback
- */
-TestSuite.prototype._checkSourceFrameWhenLoaded = function(
-    expectations, callback) {
-  var test = this;
-
-  var frame = WebInspector.currentPanel.visibleView.sourceFrame;
-  if (frame._isContentLoaded()) {
-    checkExecLine();
-  } else {
-    frame.addEventListener('content loaded', checkExecLine);
-  }
-  function checkExecLine() {
-    test._checkExecutionLine(frame, expectations.lineNumber,
-                             expectations.lineText);
-    // Make sure we don't listen anymore.
-    frame.removeEventListener('content loaded', checkExecLine);
-    callback();
-  }
-};
-
-
-/**
- * Performs sequence of steps.
- * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2,
- *     action2,...,actionN].
- */
-TestSuite.prototype._performSteps = function(actions) {
-  var test = this;
-  var i = 0;
-  function doNextAction() {
-    if (i > 0) {
-      actions[i++]();
-    }
-    if (i < actions.length - 1) {
-      test._waitForScriptPause(actions[i++], doNextAction);
-    }
-  }
-  doNextAction();
-};
-
-
-/**
- * Waits until all the scripts are parsed and asynchronously executes the code
- * in the inspected page.
- */
-TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(
-    code, expectedScripts) {
-  var test = this;
-
-  function executeFunctionInInspectedPage() {
-    // Since breakpoints are ignored in evals' calculate() function is
-    // execute after zero-timeout so that the breakpoint is hit.
-    test.evaluateInConsole_(
-        'setTimeout("' + code + '" , 0)',
-        function(resultText) {
-          test.assertTrue(!isNaN(resultText),
-                          'Failed to get timer id: ' + resultText);
-        });
-  }
-
-  test._waitUntilScriptsAreParsed(
-      expectedScripts, executeFunctionInInspectedPage);
-};
-
-
-/**
- * Waits until all the scripts are parsed and invokes the callback.
- */
-TestSuite.prototype._waitUntilScriptsAreParsed = function(
-    expectedScripts, callback) {
-  var test = this;
-
-  function waitForAllScripts() {
-    if (test._scriptsAreParsed(expectedScripts)) {
-      callback();
-    } else {
-      test.addSniffer(WebInspector, 'parsedScriptSource', waitForAllScripts);
-    }
-  }
-
-  waitForAllScripts();
-};
-
-
-/**
- * Waits until all debugger scripts are parsed and executes 'a()' in the
- * inspected page.
- */
-TestSuite.prototype._executeFunctionForStepTest = function() {
-  this._executeCodeWhenScriptsAreParsed(
-      'a()',
-      ['debugger_step.html$', 'debugger_step.js$']);
-};
-
-
-/**
- * Tests step over in the debugger.
- */
-TestSuite.prototype.testStepOver = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 5,
-        lineText: '  var y = fact(10);'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 6,
-        lineText: '  return y;'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Tests step out in the debugger.
- */
-TestSuite.prototype.testStepOut = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-out').click();
-      },
-      {
-        functionsOnStack: ['a','(anonymous function)'],
-        lineNumber: 8,
-        lineText: '  printResult(result);'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Tests step in in the debugger.
- */
-TestSuite.prototype.testStepIn = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 5,
-        lineText: '  var y = fact(10);'
-      },
-      function() {
-        document.getElementById('scripts-step-into').click();
-      },
-      {
-        functionsOnStack: ['fact','d','a','(anonymous function)'],
-        lineNumber: 15,
-        lineText: '  return r;'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Gets a XPathResult matching given xpath.
- * @param {string} xpath
- * @param {number} resultType
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {XPathResult} Type of returned value is determined by 'resultType' parameter
- */
-
-TestSuite.prototype._evaluateXpath = function(
-    xpath, resultType, opt_ancestor) {
-  if (!opt_ancestor) {
-    opt_ancestor = document.documentElement;
-  }
-  try {
-    return document.evaluate(xpath, opt_ancestor, null, resultType, null);
-  } catch(e) {
-    this.fail('Error in expression: "' + xpath + '".' + e);
-  }
-};
-
-
-/**
- * Gets first Node matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {?Node}
- */
-TestSuite.prototype._findNode = function(xpath, opt_ancestor) {
-  var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE,
-      opt_ancestor).singleNodeValue;
-  this.assertTrue(!!result, 'Cannot find node on path: ' + xpath);
-  return result;
-};
-
-
-/**
- * Gets a text matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {?string}
- */
-TestSuite.prototype._findText = function(xpath, opt_ancestor) {
-  var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE,
-      opt_ancestor).stringValue;
-  this.assertTrue(!!result, 'Cannot find text on path: ' + xpath);
-  return result;
-};
-
-
-/**
- * Gets an iterator over nodes matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified, documentElement
- *     will be used
- * @return {XPathResult} Iterator over the nodes
- */
-TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor) {
-  return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-      opt_ancestor);
-};
-
-
-/**
- * Checks the scopeSectionDiv against the expectations.
- * @param {Node} scopeSectionDiv The section div
- * @param {Object} expectations Expectations dictionary
- */
-TestSuite.prototype._checkScopeSectionDiv = function(
-    scopeSectionDiv, expectations) {
-  var scopeTitle = this._findText(
-      './div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv);
-  this.assertEquals(expectations.title, scopeTitle,
-      'Unexpected scope section title.');
-  if (!expectations.properties) {
-    return;
-  }
-  this.assertTrue(scopeSectionDiv.hasStyleClass('expanded'), 'Section "' +
-      scopeTitle + '" is collapsed.');
-
-  var propertyIt = this._nodeIterator('./ol/li',
-                                      scopeSectionDiv);
-  var propertyLi;
-  var foundProps = [];
-  while (propertyLi = propertyIt.iterateNext()) {
-    var name = this._findText('./span[@class="name"]/text()', propertyLi);
-    var value = this._findText('./span[@class="value"]/text()', propertyLi);
-    this.assertTrue(!!name, 'Invalid variable name: "' + name + '"');
-    this.assertTrue(name in expectations.properties,
-                    'Unexpected property: ' + name);
-    this.assertEquals(expectations.properties[name], value,
-                      'Unexpected "' + name + '" property value.');
-    delete expectations.properties[name];
-    foundProps.push(name + ' = ' + value);
-  }
-
-  // Check that all expected properties were found.
-  for (var p in expectations.properties) {
-    this.fail('Property "' + p + '" was not found in scope "' + scopeTitle +
-        '". Found properties: "' + foundProps.join(',') + '"');
-  }
-};
-
-
-/**
- * Expands scope sections matching the filter and invokes the callback on
- * success.
- * @param {function(WebInspector.ObjectPropertiesSection, number):boolean}
- *     filter
- * @param {Function} callback
- */
-TestSuite.prototype._expandScopeSections = function(filter, callback) {
-  var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections;
-
-  var toBeUpdatedCount = 0;
-  function updateListener() {
-    --toBeUpdatedCount;
-    if (toBeUpdatedCount == 0) {
-      // Report when all scopes are expanded and populated.
-      callback();
-    }
-  }
-
-  // Global scope is always the last one.
-  for (var i = 0; i < sections.length - 1; i++) {
-    var section = sections[i];
-    if (!filter(sections, i)) {
-      continue;
-    }
-    ++toBeUpdatedCount;
-    var populated = section.populated;
-
-    this._hookGetPropertiesCallback(updateListener,
-      function() {
-        section.expand();
-        if (populated) {
-          // Make sure 'updateProperties' callback will be called at least once
-          // after it was overridden.
-          section.update();
-        }
-      });
-  }
-};
-
-
-/**
- * Tests that scopes can be expanded and contain expected data.
- */
-TestSuite.prototype.testExpandScope = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['debugger_closure.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['innerFunction', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 8,
-        lineText: '    debugger;'
-      },
-      expandAllSectionsExceptGlobal);
-
-  // Expanding Global scope takes for too long so we skeep it.
-  function expandAllSectionsExceptGlobal() {
-      test._expandScopeSections(function(sections, i) {
-        return i < sections.length - 1;
-      },
-      examineScopes /* When all scopes are expanded and populated check
-          them. */);
-  }
-
-  // Check scope sections contents.
-  function examineScopes() {
-    var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/' +
-        'div[div[@class="title"]/text()="Scope Variables"]');
-    var expectedScopes = [
-      {
-        title: 'Local',
-        properties: {
-          x:2009,
-          innerFunctionLocalVar:2011,
-          'this': 'global',
-        }
-      },
-      {
-        title: 'Closure',
-        properties: {
-          n:'TextParam',
-          makeClosureLocalVar:'local.TextParam',
-        }
-      },
-      {
-        title: 'Global',
-      },
-    ];
-    var it = test._nodeIterator('./div[@class="body"]/div',
-                                scopeVariablesSection);
-    var scopeIndex = 0;
-    var scopeDiv;
-    while (scopeDiv = it.iterateNext()) {
-       test.assertTrue(scopeIndex < expectedScopes.length,
-                       'Too many scopes.');
-       test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]);
-       ++scopeIndex;
-    }
-    test.assertEquals(expectedScopes.length, scopeIndex,
-                      'Unexpected number of scopes.');
-
-    test.releaseControl();
-  }
-
-  test.takeControl();
-};
-
-
-/**
- * Returns child tree element for a property with given name.
- * @param {TreeElement} parent Parent tree element.
- * @param {string} childName
- * @param {string} objectPath Path to the object. Will be printed in the case
- *     of failure.
- * @return {TreeElement}
- */
-TestSuite.prototype._findChildProperty = function(
-    parent, childName, objectPath) {
-  var children = parent.children;
-  for (var i = 0; i < children.length; i++) {
-    var treeElement = children[i];
-    var property = treeElement.property;
-    if (property.name == childName) {
-      return treeElement;
-    }
-  }
-  this.fail('Cannot find property "' + childName + '" in ' + objectPath);
-};
-
-
-/**
- * Executes the 'code' with InjectedScriptAccess.getProperties overriden
- * so that all callbacks passed to InjectedScriptAccess.getProperties are
- * extended with the 'hook'.
- * @param {Function} hook The hook function.
- * @param {Function} code A code snippet to be executed.
- */
-TestSuite.prototype._hookGetPropertiesCallback = function(hook, code) {
-  var orig = InjectedScriptAccess.getProperties;
-  InjectedScriptAccess.getProperties = function(objectProxy,
-      ignoreHasOwnProperty, abbreviate, callback) {
-    orig.call(InjectedScriptAccess, objectProxy, ignoreHasOwnProperty, abbreviate,
-        function() {
-          callback.apply(this, arguments);
-          hook();
-        });
-  };
-  try {
-    code();
-  } finally {
-    InjectedScriptAccess.getProperties = orig;
-  }
-};
-
-
-/**
- * Tests that all elements in prototype chain of an object have expected
- * intrinic proprties(__proto__, constructor, prototype).
- */
-TestSuite.prototype.testDebugIntrinsicProperties = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['debugger_intrinsic_properties.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['callDebugger', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 29,
-        lineText: '  debugger;'
-      },
-      expandLocalScope);
-
-  var localScopeSection = null;
-  function expandLocalScope() {
-    test._expandScopeSections(function(sections, i) {
-        if (i == 0) {
-          test.assertTrue(sections[i].object.isLocal, 'Scope #0 is not Local.');
-          localScopeSection = sections[i];
-          return true;
-        }
-        return false;
-      },
-      examineLocalScope);
-  }
-
-  function examineLocalScope() {
-    var scopeExpectations = [
-      'a', 'Object', [
-        'constructor', 'function Child()', [
-          'constructor', 'function Function()', null,
-          'name', 'Child', null,
-          'prototype', 'Object', [
-            'childProtoField', '21', null
-          ]
-        ],
-
-        '__proto__', 'Object', [
-          '__proto__', 'Object', [
-            '__proto__', 'Object', [
-              '__proto__', 'null', null,
-              'constructor', 'function Object()', null,
-            ],
-            'constructor', 'function Parent()', [
-              'name', 'Parent', null,
-              'prototype', 'Object', [
-                'parentProtoField', '11', null,
-              ]
-            ],
-            'parentProtoField', '11', null,
-          ],
-          'constructor', 'function Child()', null,
-          'childProtoField', '21', null,
-        ],
-
-        'parentField', '10', null,
-        'childField', '20', null,
-      ]
-    ];
-
-    checkProperty(
-        localScopeSection.propertiesTreeOutline,
-        '<Local Scope>',
-        scopeExpectations);
-  }
-
-  var propQueue = [];
-  var index = 0;
-  var expectedFinalIndex = 8;
-
-  function expandAndCheckNextProperty() {
-    if (index == propQueue.length) {
-      test.assertEquals(expectedFinalIndex, index,
-          'Unexpected number of expanded objects.');
-      test.releaseControl();
-      return;
-    }
-
-    // Read next property data from the queue.
-    var treeElement = propQueue[index].treeElement;
-    var path = propQueue[index].path;
-    var expectations = propQueue[index].expectations;
-    index++;
-
-    // Expand the property.
-    test._hookGetPropertiesCallback(function() {
-          checkProperty(treeElement, path, expectations);
-        },
-        function() {
-          treeElement.expand();
-        });
-  }
-
-  function checkProperty(treeElement, path, expectations) {
-    for (var i = 0; i < expectations.length; i += 3) {
-      var name = expectations[i];
-      var description = expectations[i+1];
-      var value = expectations[i+2];
-
-      var propertyPath = path + '.' + name;
-      var propertyTreeElement = test._findChildProperty(
-          treeElement, name, path);
-      test.assertTrue(propertyTreeElement,
-          'Property "' + propertyPath + '" not found.');
-      test.assertEquals(description,
-          propertyTreeElement.property.value.description,
-          'Unexpected "' + propertyPath + '" description.');
-      if (value) {
-        // Schedule property content check.
-        propQueue.push({
-          treeElement: propertyTreeElement,
-          path: propertyPath,
-          expectations: value,
-        });
-      }
-    }
-    // Check next property in the queue.
-    expandAndCheckNextProperty();
-  }
-
-  test.takeControl();
-};
-
-
-/**
- * Tests 'Pause' button will pause debugger when a snippet is evaluated.
- */
-TestSuite.prototype.testPauseInEval = function() {
-  this.showPanel('scripts');
-
-  var test = this;
-
-  var pauseButton = document.getElementById('scripts-pause');
-  pauseButton.click();
-
-  devtools.tools.evaluateJavaScript('fib(10)');
-
-  this.addSniffer(WebInspector, 'pausedScript',
-      function() {
-        test.releaseControl();
-      });
-
-  test.takeControl();
-};
-
-
-/**
- * Key event with given key identifier.
- */
-TestSuite.createKeyEvent = function(keyIdentifier) {
-  var evt = document.createEvent('KeyboardEvent');
-  evt.initKeyboardEvent('keydown', true /* can bubble */, true /* can cancel */,
-                        null /* view */, keyIdentifier, "");
-  return evt;
-};
-
-
-/**
- * Tests console eval.
- */
-TestSuite.prototype.testConsoleEval = function() {
-  var test = this;
-  this.evaluateInConsole_('123',
-      function(resultText) {
-        test.assertEquals('123', resultText);
-        test.releaseControl();
-      });
-
-  this.takeControl();
-};
-
-
-/**
- * Tests console log.
- */
-TestSuite.prototype.testConsoleLog = function() {
-  WebInspector.console.visible = true;
-  var messages = WebInspector.console.messages;
-  var index = 0;
-
-  var test = this;
-  var assertNext = function(line, message, opt_class, opt_count, opt_substr) {
-    var elem = messages[index++].toMessageElement();
-    var clazz = elem.getAttribute('class');
-    var expectation = (opt_count || '') + 'console_test_page.html:' +
-        line + message;
-    if (opt_substr) {
-      test.assertContains(elem.textContent, expectation);
-    } else {
-      test.assertEquals(expectation, elem.textContent);
-    }
-    if (opt_class) {
-      test.assertContains(clazz, 'console-' + opt_class);
-    }
-  };
-
-  assertNext('5', 'log', 'log-level');
-  assertNext('7', 'debug', 'log-level');
-  assertNext('9', 'info', 'log-level');
-  assertNext('11', 'warn', 'warning-level');
-  assertNext('13', 'error', 'error-level');
-  assertNext('15', 'Message format number 1, 2 and 3.5');
-  assertNext('17', 'Message format for string');
-  assertNext('19', 'Object Object');
-  assertNext('22', 'repeated', 'log-level', 5);
-  assertNext('26', 'count: 1');
-  assertNext('26', 'count: 2');
-  assertNext('29', 'group', 'group-title');
-  index++;
-  assertNext('33', 'timer:', 'log-level', '', true);
-  assertNext('35', '1 2 3', 'log-level');
-  assertNext('37', 'HTMLDocument', 'log-level');
-  assertNext('39', '<html>', 'log-level', '', true);
-};
-
-
-/**
- * Tests eval of global objects.
- */
-TestSuite.prototype.testEvalGlobal = function() {
-  WebInspector.console.visible = true;
-
-  var inputs = ['foo', 'foobar'];
-  var expectations = ['foo', 'fooValue',
-                      'foobar', 'ReferenceError: foobar is not defined'];
-
-  // Do not change code below - simply add inputs and expectations above.
-  var initEval = function(input) {
-    WebInspector.console.prompt.text = input;
-    WebInspector.console.promptElement.dispatchEvent(
-        TestSuite.createKeyEvent('Enter'));
-  };
-  var test = this;
-  var messagesCount = 0;
-  var inputIndex = 0;
-  this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage',
-      function(commandResult) {
-        messagesCount++;
-        if (messagesCount == expectations.length) {
-          var messages = WebInspector.console.messages;
-          for (var i = 0; i < expectations; ++i) {
-            var elem = messages[i++].toMessageElement();
-            test.assertEquals(elem.textContent, expectations[i]);
-          }
-          test.releaseControl();
-        } else if (messagesCount % 2 == 0) {
-          initEval(inputs[inputIndex++]);
-        }
-      }, true);
-
-  initEval(inputs[inputIndex++]);
-  this.takeControl();
-};
-
-
-/**
- * Tests that Storage panel can be open and that local DOM storage is added
- * to the panel.
- */
-TestSuite.prototype.testShowStoragePanel = function() {
-  var test = this;
-  this.addSniffer(WebInspector.panels.storage, 'addDOMStorage',
-      function(storage) {
-        var orig = storage.getEntries;
-        storage.getEntries = function(callback) {
-          orig.call(this, function(entries) {
-            callback(entries);
-            test.releaseControl();
-          });
-        };
-        try {
-          WebInspector.currentPanel.selectDOMStorage(storage.id);
-          storage.getEntries = orig;
-        } catch (e) {
-          test.fail('Exception in selectDOMStorage: ' + e);
-        }
-      });
-  this.showPanel('storage');
-
-  // Access localStorage so that it's pushed to the frontend.
-  this.evaluateInConsole_(
-      'setTimeout("localStorage.x = 10" , 0)',
-      function(resultText) {
-        test.assertTrue(!isNaN(resultText),
-                        'Failed to get timer id: ' + resultText);
-      });
-
-  // Wait until DOM storage is added to the panel.
-  this.takeControl();
-};
-
-
-/**
- * Test runner for the test suite.
- */
-var uiTests = {};
-
-
-/**
- * Run each test from the test suit on a fresh instance of the suite.
- */
-uiTests.runAllTests = function() {
-  // For debugging purposes.
-  for (var name in TestSuite.prototype) {
-    if (name.substring(0, 4) == 'test' &&
-        typeof TestSuite.prototype[name] == 'function') {
-      uiTests.runTest(name);
-    }
-  }
-};
-
-
-/**
- * Run specified test on a fresh instance of the test suite.
- * @param {string} name Name of a test method from TestSuite class.
- */
-uiTests.runTest = function(name) {
-  new TestSuite().runTest(name);
-};
-
-
-}
-
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.css b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.css
deleted file mode 100644
index b676175..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.css
+++ /dev/null
@@ -1,3760 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-body {
-    cursor: default;
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    font-family: Lucida Grande, sans-serif;
-    font-size: 10px;
-    margin: 0;
-    -webkit-text-size-adjust: none;
-    -webkit-user-select: none;
-}
-
-* {
-    -webkit-box-sizing: border-box;
-}
-
-:focus {
-    outline: none;
-}
-
-input[type="search"]:focus, input[type="text"]:focus {
-    outline: auto 5px -webkit-focus-ring-color;
-}
-
-iframe, a img {
-    border: none;
-}
-
-img {
-    -webkit-user-drag: none;
-}
-
-.hidden {
-    display: none !important;
-}
-
-#toolbar {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 56px;
-    display: -webkit-box;
-    padding: 0 5px;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(191, 191, 191)), to(rgb(151, 151, 151)));
-    border-bottom: 1px solid rgb(80, 80, 80);
-    -webkit-box-orient: horizontal;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-body.inactive #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(207, 207, 207)));
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-}
-
-body.detached.platform-mac-leopard #toolbar {
-    background: transparent !important;
-}
-
-body.attached #toolbar {
-    height: 34px;
-    border-top: 1px solid rgb(100, 100, 100);
-    cursor: row-resize;
-    padding-left: 0;
-}
-
-body.attached.port-qt #toolbar {
-    cursor: auto;
-}
-
-body.attached.inactive #toolbar {
-    border-top: 1px solid rgb(64%, 64%, 64%);
-}
-
-.toolbar-item {
-    display: -webkit-box;
-    padding: 4px 6px;
-    margin: 0;
-    background-color: transparent;
-    border-style: none;
-    border-color: transparent;
-    -webkit-box-orient: vertical;
-    -webkit-box-align: center;
-    -webkit-box-pack: end;
-}
-
-.toolbar-item.toggleable.toggled-on {
-    border-width: 0 2px 0 2px;
-    padding: 4px 4px;
-    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;
-}
-
-.toolbar-item.flexable-space {
-    -webkit-box-flex: 1;
-    visibility: hidden;
-}
-
-.toolbar-item input {
-    margin-bottom: 8px;
-}
-
-.toolbar-icon {
-    display: inline-block;
-    width: 32px;
-    height: 32px;
-    -webkit-background-size: 100% auto;
-}
-
-body.attached .toolbar-icon {
-    width: 24px;
-    height: 24px;
-    vertical-align: middle;
-}
-
-.toolbar-item:active .toolbar-icon {
-    background-position: 0 32px;
-}
-
-body.attached .toolbar-item:active .toolbar-icon {
-    background-position: 0 24px;
-}
-
-.toolbar-label {
-    font-size: 11px;
-    font-family: Lucida Grande, sans-serif;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-}
-
-.toolbar-item.toggleable:active .toolbar-label {
-    text-shadow: none;
-}
-
-body.attached .toolbar-label {
-    display: inline-block;
-    vertical-align: middle;
-    margin-left: 3px;
-}
-
-body.attached #search-toolbar-label {
-    display: none;
-}
-
-#search {
-    width: 205px;
-    font-size: 16px;
-    margin-bottom: 5px;
-}
-
-body.attached #search {
-    font-size: 11px;
-    margin-bottom: 8px;
-}
-
-#search-results-matches {
-    font-size: 11px;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-    margin-bottom: 22px;
-}
-
-body.attached #search-results-matches {
-    margin-bottom: 6px;
-}
-
-.toolbar-item.elements .toolbar-icon {
-    background-image: url(Images/elementsIcon.png);
-}
-
-.toolbar-item.resources .toolbar-icon {
-    background-image: url(Images/resourcesIcon.png);
-}
-
-.toolbar-item.scripts .toolbar-icon {
-    background-image: url(Images/scriptsIcon.png);
-}
-
-.toolbar-item.timeline .toolbar-icon {
-    background-image: url(Images/timelineIcon.png);
-}
-
-.toolbar-item.storage .toolbar-icon {
-    background-image: url(Images/storageIcon.png);
-}
-
-.toolbar-item.profiles .toolbar-icon {
-    background-image: url(Images/profilesIcon.png);
-}
-
-.toolbar-item.console .toolbar-icon {
-    background-image: url(Images/consoleIcon.png);
-}
-
-#close-button-left, #close-button-right {
-    width: 14px;
-    height: 14px;
-    background-image: url(Images/closeButtons.png);
-    background-position: 0 0;
-    background-color: transparent;
-    border: 0 none transparent;
-    margin: 5px 0;
-}
-
-#close-button-left:hover, #close-button-right:hover {
-    background-position: 14px 0;
-}
-
-#close-button-left:active, #close-button-right:active {
-    background-position: 28px 0;
-}
-
-body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {
-    display: none;
-}
-
-body.attached.port-qt .toolbar-item.close-left, body.attached.port-qt .toolbar-item.close-right {
-    display: none;
-}
-
-body.platform-mac-tiger .toolbar-item.close-right, body.platform-mac-leopard .toolbar-item.close-right { 
-    display: none;
-}
-
-body:not(.platform-mac-tiger):not(.platform-mac-leopard) .toolbar-item.close-left { 
-    display: none;
-}
-
-#main {
-    position: absolute;
-    z-index: 1;
-    top: 56px;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    overflow: hidden;
-    background-color: white;
-}
-
-body.attached #main {
-    top: 34px;
-}
-
-#main-panels {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 23px;
-    overflow: hidden;
-}
-
-#main-status-bar {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-}
-
-body.drawer-visible #main-status-bar {
-    height: 24px;
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackground.png);
-    background-repeat: no-repeat, repeat-x;
-    background-position: right center, center;
-    cursor: row-resize;
-}
-
-body.drawer-visible #main-status-bar * {
-    cursor: default;
-}
-
-body.drawer-visible #main-panels {
-    bottom: 24px;
-}
-
-.status-bar {
-    background-color: rgb(235, 235, 235);
-    background-image: url(Images/statusbarBackground.png);
-    background-repeat: repeat-x;
-    white-space: nowrap;
-    height: 23px;
-    overflow: hidden;
-    z-index: 12;
-}
-
-.status-bar > div {
-    display: inline-block;
-    vertical-align: top;
-}
-
-.status-bar-item {
-    display: inline-block;
-    height: 24px;
-    padding: 0;
-    margin-left: -1px;
-    margin-right: 0;
-    vertical-align: top;
-    border: 0 transparent none;
-    background-color: transparent;
-}
-
-.status-bar-item:active {
-    position: relative;
-    z-index: 200;
-}
-
-.glyph {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.75);
-    z-index: 1;
-}
-
-.glyph.shadow {
-    top: 1px;
-    background-color: white !important;
-    z-index: 0;
-}
-
-button.status-bar-item {
-    position: relative;
-    width: 32px;
-    background-image: url(Images/statusbarButtons.png);
-    background-position: 0 0;
-}
-
-button.status-bar-item:active {
-    background-position: 32px 0 !important;
-}
-
-button.status-bar-item .glyph.shadow {
-    background-color: rgba(255, 255, 255, 0.33) !important;
-}
-
-button.status-bar-item.toggled-on .glyph {
-    background-color: rgb(66, 129, 235);
-}
-
-button.status-bar-item:disabled {
-    opacity: 0.5;
-    background-position: 0 0 !important;
-}
-
-select.status-bar-item {
-    min-width: 48px;
-    border-width: 0 17px 0 2px;
-    padding: 0 2px 0 6px;
-    font-weight: bold;
-    color: rgb(48, 48, 48);
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-    -webkit-border-image: url(Images/statusbarMenuButton.png) 0 17 0 2;
-    -webkit-border-radius: 0;
-    -webkit-appearance: none;
-}
-
-select.status-bar-item:active {
-    color: black;
-    -webkit-border-image: url(Images/statusbarMenuButtonSelected.png) 0 17 0 2;
-}
-
-#dock-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/undockButtonGlyph.png);
-}
-
-body.detached #dock-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/dockButtonGlyph.png);
-}
-
-body.port-qt #dock-status-bar-item {
-    display: none
-}
-
-#console-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png);
-}
-
-#clear-console-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#changes-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png); /* TODO: Needs Image for Changes Toggle Button */
-}
-
-#clear-changes-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#count-items {
-    position: absolute;
-    right: 16px;
-    top: 0;
-    cursor: pointer;
-    padding: 6px 2px;
-    font-size: 10px;
-    height: 19px;
-}
-
-#changes-count, #error-warning-count {
-    display: inline;
-}
-
-#error-warning-count:hover, #changes-count:hover {
-    border-bottom: 1px solid rgb(96, 96, 96);
-}
-
-#style-changes-count::before {
-    content: url(Images/styleIcon.png); /* TODO: Needs Image for Style Changes Icon */
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-
-#error-count::before {
-    content: url(Images/errorIcon.png);
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-    
-#changes-count + #error-warning-count, #error-count + #warning-count {
-    margin-left: 6px;
-}
-
-#warning-count::before {
-    content: url(Images/warningIcon.png);
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-
-#drawer {
-    display: none;
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: 200px;
-    background-color: white;
-    background-image: url(Images/statusbarBottomBackground.png);
-    background-repeat: repeat-x;
-    background-position: bottom;
-}
-
-body.drawer-visible #drawer {
-    display: block;
-}
-
-#drawer-status-bar {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    background: none;
-}
-
-#console-messages {
-    position: absolute;
-    z-index: 0;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 23px;
-    font-size: initial;
-    font-family: monospace;
-    padding: 2px 0;
-    overflow-y: overlay;
-    word-wrap: break-word;
-    -webkit-user-select: text;
-    -webkit-text-size-adjust: auto;
-}
-
-#console-prompt {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-    white-space: pre-wrap;
-    -webkit-user-modify: read-write-plaintext-only;
-}
-
-#console-prompt::before {
-    background-image: url(Images/userInputIcon.png);
-}
-
-.console-user-command-result.console-log-level::before {
-    background-image: url(Images/userInputResultIcon.png);
-}
-
-.console-message, .console-user-command {
-    position: relative;
-    border-bottom: 1px solid rgb(240, 240, 240);
-    padding: 1px 22px 1px 24px;
-    min-height: 16px;
-}
-
-.console-adjacent-user-command-result {
-    border-bottom: none;
-}
-
-.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {
-    background-image: none;
-}
-
-.console-message::before, .console-user-command::before, #console-prompt::before, .console-group-title::before {
-    position: absolute;
-    display: block;
-    content: "";
-    left: 7px;
-    top: 0.8em;
-    width: 10px;
-    height: 10px;
-    margin-top: -5px;
-    -webkit-user-select: none;
-}
-
-.console-message .bubble {
-    display: inline-block;
-    height: 14px;
-    background-color: rgb(128, 151, 189);
-    vertical-align: middle;
-    white-space: nowrap;
-    padding: 1px 4px;
-    margin-top: -2px;
-    margin-right: 4px;
-    text-align: left;
-    font-size: 11px;
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-    text-shadow: none;
-    color: white;
-    -webkit-border-radius: 7px;
-}
-
-.console-message-text {
-    white-space: pre-wrap;
-}
-
-.repeated-message {
-    padding-left: 6px;
-}
-
-.repeated-message.console-error-level::before, .repeated-message.console-warning-level:before, .repeated-message.console-debug-level:before {
-    visibility: hidden;
-}
-
-.console-group .console-group > .console-group-messages {
-    margin-left: 16px;
-}
-
-.console-group-title {
-    font-weight: bold;
-}
-
-.console-group-title::before {
-    background-image: url(Images/disclosureTriangleSmallDown.png);
-    top: 0.6em;
-    width: 11px;
-    height: 12px;
-}
-
-.console-group.collapsed .console-group-title::before {
-    background-image: url(Images/disclosureTriangleSmallRight.png);
-}
-
-.console-group.collapsed > .console-group-messages {
-    display: none;
-}
-
-.console-error-level .console-message-text {
-    color: red;
-}
-
-.console-debug-level .console-message-text {
-    color: blue;
-}
-
-.console-debug-level::before {
-    background-image: url(Images/searchSmallBrightBlue.png);
-}
-
-.console-error-level::before {
-    background-image: url(Images/errorIcon.png);
-}
-
-.console-warning-level::before {
-    background-image: url(Images/warningIcon.png);
-}
-
-.console-user-command .console-message {
-    margin-left: -24px;
-    padding-right: 0;
-    border-bottom: none;
-}
-
-.console-user-command::before {
-    background-image: url(Images/userInputPreviousIcon.png);
-}
-
-.console-user-command > .console-message-text {
-    color: rgb(0, 128, 255);
-}
-
-#console-messages a {
-    color: rgb(33%, 33%, 33%);
-    cursor: pointer;
-}
-
-#console-messages a:hover {
-    color: rgb(15%, 15%, 15%);
-}
-
-.console-message-url {
-    float: right;
-}
-
-.console-group-messages .section {
-    margin: 0 0 0 12px !important;
-}
-
-.console-group-messages .section .header {
-    padding: 0 8px 0 0;
-    background-image: none;
-    border: none;
-    min-height: 0;
-}
-
-.console-group-messages .section .header::before {
-    position: absolute;
-    top: 1px;
-    left: 1px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.console-group-messages .section.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.console-group-messages .section .header .title {
-    color: black;
-    font-weight: normal;
-}
-
-.console-group-messages .section .properties li .info {
-    padding-top: 0;
-    padding-bottom: 0;
-    color: rgb(60%, 60%, 60%);
-}
-
-.console-group-messages .outline-disclosure {
-    padding-left: 0;
-}
-
-.console-group-messages .outline-disclosure > ol {
-    padding: 0 0 0 12px !important;
-}
-
-.console-group-messages .outline-disclosure, .console-group-messages .outline-disclosure ol {
-    font-size: inherit;
-    line-height: 12px;
-}
-
-.console-group-messages .outline-disclosure.single-node li {
-    padding-left: 2px;
-}
-
-.console-group-messages .outline-disclosure li .selection {
-    margin-left: -6px;
-    margin-right: -6px;
-}
-
-.console-group-messages .add-attribute {
-    display: none;
-}
-
-.console-formatted-object, .console-formatted-node {
-    position: relative;
-    display: inline-block;
-    vertical-align: top;
-}
-
-.console-formatted-object .section, .console-formatted-node .section {
-    position: static;
-}
-
-.console-formatted-object .properties, .console-formatted-node .properties {
-    padding-left: 0 !important;
-}
-
-.console-formatted-number {
-    color: rgb(28, 0, 207);
-}
-
-.console-formatted-string, .console-formatted-regexp {
-    color: rgb(196, 26, 22);
-}
-
-.console-formatted-null, .console-formatted-undefined {
-    color: rgb(128, 128, 128);
-}
-
-.error-message {
-    color: red;
-}
-
-.auto-complete-text {
-    color: rgb(128, 128, 128);
-    -webkit-user-select: none;
-    -webkit-user-modify: read-only;
-}
-
-.panel {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.panel.visible {
-    display: block;
-}
-
-.resource-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    overflow: hidden;
-}
-
-.resource-view.visible {
-    display: block;
-}
-
-.resource-view.headers-visible {
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.resource-view-headers {
-    display: none;
-    padding: 6px;
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-    background-color: white;
-    -webkit-user-select: text;
-}
-
-.resource-view-headers .outline-disclosure .parent {
-    -webkit-user-select: none;
-    font-weight: bold;
-}
-
-.resource-view.headers-visible .resource-view-headers {
-    display: block;
-}
-
-.resource-view-headers .outline-disclosure .children li {
-    white-space: nowrap;
-}
-
-.resource-view-headers .outline-disclosure li.expanded .header-count {
-    display: none;
-}
-
-.resource-view-headers .outline-disclosure .header-name {
-    color: rgb(33%, 33%, 33%);
-    display: inline-block;
-    margin-right: 0.5em;
-    font-weight: bold;
-    vertical-align: top;
-    white-space: pre-wrap;
-}
-
-.resource-view-headers .outline-disclosure .header-value {
-    display: inline;
-    margin-right: 100px;
-    white-space: pre-wrap;
-    word-break: break-all;
-    margin-top: 1px;
-}
-
-.resource-view-headers .outline-disclosure .raw-form-data {
-    white-space:pre-wrap;
-}
-
-.resource-view .resource-view-content {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-}
-
-.resource-view.headers-visible .resource-view-content {
-    position: relative;
-    top: auto;
-    right: auto;
-    left: auto;
-    bottom: auto;
-}
-
-.resource-view.headers-visible .source-view-frame {
-    height: auto;
-    vertical-align: top;
-}
-
-.webkit-line-gutter-backdrop {
-    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
-    width: 31px;
-    background-color: rgb(240, 240, 240);
-    border-right: 1px solid rgb(187, 187, 187);
-    position: absolute;
-    z-index: -1;
-    left: 0;
-    top: 0;
-    height: 100%
-}
-
-.resource-view.font .resource-view-content {
-    font-size: 60px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    text-align: center;
-    padding: 15px;
-}
-
-.resource-view.image .resource-view-content > .image {
-    padding: 20px 20px 10px 20px;
-    text-align: center;
-}
-
-.resource-view.image .resource-view-content > .info {
-    padding-bottom: 10px;
-    font-size: 11px;
-    -webkit-user-select: text;
-}
-
-.resource-view.image img.resource-image-view {
-    max-width: 100%;
-    max-height: 1000px;
-    background-image: url(Images/checker.png);
-    -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
-    -webkit-user-select: text;
-    -webkit-user-drag: auto;
-}
-
-.resource-url {
-    vertical-align: middle;
-}
-
-.resource-status-image {
-    margin-top: -3px;
-    vertical-align: middle;
-}
-
-.resource-view.image .title {
-    text-align: center;
-    font-size: 13px;
-}
-
-.resource-view.image .infoList {
-    margin: 0;
-}
-
-.resource-view.image .infoList dt {
-    font-weight: bold;
-    display: inline-block;
-    width: 50%;
-    text-align: right;
-    color: rgb(76, 76, 76);
-}
-
-.resource-view.image .infoList dd {
-    display: inline-block;
-    padding-left: 8px;
-    width: 50%;
-    text-align: left;
-    margin: 0;
-}
-
-.resource-view.image .infoList dd::after {
-    white-space: pre;
-    content: "\A";
-}
-
-#elements-content {
-    display: block;
-    overflow: auto;
-    padding: 0;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 225px;
-    bottom: 0;
-}
-
-#elements-sidebar {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    width: 225px;
-    background-color: rgb(245, 245, 245);
-    border-left: 1px solid rgb(64%, 64%, 64%);
-    cursor: default;
-    overflow: auto;
-}
-
-.crumbs {
-    display: inline-block;
-    font-size: 11px;
-    line-height: 19px;
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-    color: rgb(20, 20, 20);
-    margin-left: -1px;
-    padding-right: 12px;
-}
-
-.crumbs .crumb {
-    height: 24px;
-    border-width: 0 12px 0 2px;
-    -webkit-border-image: url(Images/segment.png) 0 12 0 2;
-    margin-right: -12px;
-    padding-left: 18px;
-    padding-right: 2px;
-    white-space: nowrap;
-    line-height: 23px;
-    float: right;
-}
-
-.crumbs .crumb.collapsed > * {
-    display: none;
-}
-
-.crumbs .crumb.collapsed::before {
-    content: "\2026";
-    font-weight: bold;
-}
-
-.crumbs .crumb.compact .extra {
-    display: none;
-}
-
-.crumbs .crumb.dimmed {
-    color: rgba(0, 0, 0, 0.45);
-}
-
-.crumbs .crumb.start {
-    padding-left: 7px;
-}
-
-.crumbs .crumb.end {
-    border-width: 0 2px 0 2px;
-    padding-right: 6px;
-    -webkit-border-image: url(Images/segmentEnd.png) 0 2 0 2;
-}
-
-.crumbs .crumb.selected {
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
-    color: black;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-}
-
-.crumbs .crumb.selected:hover {
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
-}
-
-.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
-    -webkit-border-image: url(Images/segmentSelectedEnd.png) 0 2 0 2;
-}
-
-.crumbs .crumb:hover {
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
-    color: black;
-}
-
-.crumbs .crumb.dimmed:hover {
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
-    color: rgba(0, 0, 0, 0.75);
-}
-
-.crumbs .crumb.end:hover {
-    -webkit-border-image: url(Images/segmentHoverEnd.png) 0 2 0 2;
-}
-
-.outline-disclosure li.hovered:not(.selected) .selection {
-    display: block;
-    left: 3px;
-    right: 3px;
-    background-color: rgba(56, 121, 217, 0.1);
-    -webkit-border-radius: 5px;
-}
-
-.outline-disclosure li.highlighted .highlight {
-    background-color: rgb(255, 230, 179);
-    -webkit-border-radius: 4px;
-    padding-bottom: 2px;
-    margin-bottom: -2px;
-}
-
-.outline-disclosure li.selected.highlighted .highlight {
-    background-color: transparent;
-    padding-bottom: 0;
-    margin-bottom: 0;
-}
-
-.outline-disclosure li .selection {
-    display: none;
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 15px;
-    z-index: -1;
-}
-
-.outline-disclosure li.selected .selection {
-    display: block;
-    background-color: rgb(212, 212, 212);
-}
-
-.outline-disclosure ol:focus li.selected .selection {
-    background-color: rgb(56, 121, 217);
-}
-
-.outline-disclosure {
-    font-size: 11px;
-}
-
-.outline-disclosure > ol {
-    position: relative;
-    padding: 2px 6px !important;
-    margin: 0;
-    color: black;
-    cursor: default;
-    min-width: 100%;
-}
-
-.outline-disclosure, .outline-disclosure ol {
-    list-style-type: none;
-    -webkit-padding-start: 12px;
-    margin: 0;
-}
-
-.source-code {
-    font-family: monospace;
-    font-size: medium;
-    white-space: pre-wrap;
-}
-
-body.platform-windows .source-code {
-    font-family: Consolas, Lucida Console, monospace;
-    font-size: 12px;
-}
-
-.outline-disclosure li {
-    padding: 0 0 0 14px;
-    margin-top: 1px;
-    margin-bottom: 1px;
-    word-wrap: break-word;
-    text-indent: -2px;
-}
-
-.resources .outline-disclosure li {
-    text-indent: -1px;
-}
-
-.outline-disclosure ol:focus li.selected {
-    color: white;
-}
-
-.outline-disclosure ol:focus li.selected * {
-    color: inherit;
-}
-
-.outline-disclosure li.parent {
-    text-indent: -12px
-}
-
-.outline-disclosure li .webkit-html-tag.close {
-    margin-left: -12px;
-}
-
-.outline-disclosure li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-    float: left;
-    width: 8px;
-    height: 8px;
-    margin-top: 1px;
-    padding-right: 2px;
-}
-
-.outline-disclosure li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.outline-disclosure ol:focus li.parent.selected::before {
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.outline-disclosure li.parent.expanded::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.outline-disclosure ol:focus li.parent.expanded.selected::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.outline-disclosure ol.children {
-    display: none;
-}
-
-.outline-disclosure ol.children.expanded {
-    display: block;
-}
-
-.webkit-html-comment {
-    /* Keep this in sync with view-source.css (.webkit-html-comment) */
-    color: rgb(35, 110, 37);
-}
-
-.webkit-html-tag {
-    /* Keep this in sync with view-source.css (.webkit-html-tag) */
-    color: rgb(136, 18, 128);
-}
-
-.webkit-html-doctype {
-    /* Keep this in sync with view-source.css (.webkit-html-doctype) */
-    color: rgb(192, 192, 192);
-}
-
-.webkit-html-attribute-name {
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
-    color: rgb(153, 69, 0);
-}
-
-.webkit-html-attribute-value {
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
-    color: rgb(26, 26, 166);
-}
-
-.webkit-html-external-link, .webkit-html-resource-link {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */
-    color: #00e;
-}
-
-.webkit-html-external-link {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link) */
-    text-decoration: none;
-}
-
-.webkit-html-external-link:hover {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */
-    text-decoration: underline;
-}
-
-.add-attribute {
-    margin-left: 1px;
-    margin-right: 1px;
-    white-space: nowrap;
-}
-
-.placard {
-    position: relative;
-    margin-top: 1px;
-    padding: 3px 8px 4px 18px;
-    min-height: 18px;
-    white-space: nowrap;
-}
-
-.placard:nth-of-type(2n) {
-    background-color: rgb(234, 243, 255);
-}
-
-.placard.selected {
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-:focus .placard.selected {
-    border-top: 1px solid rgb(68, 128, 200);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
-}
-
-body.inactive .placard.selected {
-    border-top: 1px solid rgb(151, 151, 151);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
-}
-
-.placard .title {
-    color: black;
-    font-weight: normal;
-    word-wrap: break-word;
-    white-space: normal;
-}
-
-.placard.selected .title {
-    color: white;
-    font-weight: bold;
-}
-
-.placard .subtitle {
-    float: right;
-    font-size: 10px;
-    margin-left: 5px;
-    max-width: 55%;
-    color: rgba(0, 0, 0, 0.7);
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.placard.selected .subtitle {
-    color: rgba(255, 255, 255, 0.7);
-}
-
-.placard .subtitle a {
-    color: inherit;
-}
-
-.section {
-    position: relative;
-    margin-top: 1px;
-}
-
-.section:nth-last-of-type(1), .event-bar:nth-last-of-type(1) {
-    margin-bottom: 1px;
-}
-
-.watch-expressions-buttons-container {
-    text-align: center;
-}
-
-.event-bar:first-child {
-    margin-top: 1px;
-}
-
-.event-bar:nth-last-of-type(1) .header {
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.section .header {
-    padding: 2px 8px 4px 18px;
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    min-height: 18px;
-    white-space: nowrap;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.section.no-affect .header {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(167, 167, 167)), to(rgb(123, 123, 123)))
-}
-
-.section .header::before {
-    position: absolute;
-    top: 4px;
-    left: 7px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.section.blank-section .header::before {
-    display: none;
-}
-
-.section.expanded .header::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.section .header .title, .event-bar .header .title {
-    color: white;
-    font-weight: bold;
-    word-wrap: break-word;
-    white-space: normal;
-}
-
-.section .header .title.blank-title {
-    font-style: italic;
-}
-
-.section .header label, .event-bar .header label {
-    display: none;
-}
-
-.section.expanded .header label, .event-bar.expanded .header label {
-    display: inline;
-}
-
-.section .header input[type=checkbox] {
-    height: 10px;
-    width: 10px;
-    margin-left: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: 2px;
-}
-
-.section .header .subtitle, .event-bar .header .subtitle {
-    float: right;
-    font-size: 10px;
-    margin-left: 5px;
-    max-width: 55%;
-    color: rgba(255, 255, 255, 0.7);
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.section .header .subtitle a {
-    color: inherit;
-}
-
-.section .properties, .event-bar .event-properties {
-    display: none;
-    margin: 0;
-    padding: 2px 6px 3px;
-    list-style: none;
-    background-color: white;
-    min-height: 18px;
-}
-
-.section.no-affect .properties li {
-    opacity: 0.5;
-}
-
-.section.no-affect .properties li.editing {
-    opacity: 1.0;
-}
-
-.section.expanded .properties, .event-bar.expanded .event-properties {
-    display: block;
-}
-
-.section .properties li, .event-properties li {
-    margin-left: 12px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    -webkit-user-select: text;
-    cursor: auto;
-}
-
-.section .properties li.parent, .event-properties li.parent {
-    margin-left: 1px;
-}
-
-.section .properties ol, .event-properties ol {
-    display: none;
-    margin: 0;
-    -webkit-padding-start: 12px;
-    list-style: none;
-}
-
-.section .properties ol.expanded, .event-properties ol.expanded {
-    display: block;
-}
-
-.section .properties li.parent::before, .event-properties li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-    opacity: 0.75;
-    float: left;
-    width: 8px;
-    height: 8px;
-    margin-top: 0;
-    padding-right: 3px;
-    -webkit-user-select: none;
-    cursor: default;
-}
-
-.section .properties li.parent.expanded::before, .event-properties li.parent.expanded::before {
-    content: url(Images/treeDownTriangleBlack.png);
-    margin-top: 1px;
-}
-
-.section .properties li .info, .event-properties li .info {
-    padding-top: 4px;
-    padding-bottom: 3px;
-}
-
-.section .event-bars {
-    display: none;
-}
-
-.section.expanded .event-bars {
-    display: block;
-}
-
-.event-bar {
-    position: relative;
-}
-
-.event-bar-connector {
-    position: absolute;
-    left: 75%;
-    bottom: -7px;
-    margin-left: -7px;
-    content: url(Images/grayConnectorPoint.png);
-    z-index: 3;
-}
-
-.event-bar.expanded .event-bar-connector {
-    content: url(Images/whiteConnectorPoint.png);
-}
-
-.event-bars .event-bar .header {
-    padding: 2px 8px 4px 18px;
-    border-top: 1px solid rgb(163, 163, 163);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), to(rgb(207, 207, 207)));
-    min-height: 18px;
-    white-space: nowrap;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.event-bars .event-bar.expanded .header {
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.event-bars .event-bar .header .title {
-    font-weight: bold;
-    color: #333;
-    text-shadow: white 0 1px 0; 
-}
-
-.event-bars .event-bar .header .subtitle {
-    color: rgba(90, 90, 90, 0.75);
-}
-
-.event-bars .event-bar .header::before {
-    position: absolute;
-    top: 4px;
-    left: 7px;
-    width: 8px;
-    height: 8px;
-    opacity: 0.75;
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.event-bars .event-bar.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.editing {
-    -webkit-user-select: text;
-    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
-    outline: 1px solid rgb(66%, 66%, 66%) !important;
-    background-color: white;
-    -webkit-user-modify: read-write-plaintext-only;
-    text-overflow: clip;
-    padding-left: 2px;
-    margin-left: -2px;
-    padding-right: 2px;
-    margin-right: -2px;
-    margin-bottom: -1px;
-    padding-bottom: 1px;
-    opacity: 1.0 !important;
-}
-
-.editing, .editing * {
-    color: black !important;
-    text-decoration: none !important;
-}
-
-.elements-tree-editor {
-    -webkit-user-select: text;
-    -webkit-user-modify: read-write-plaintext-only;
-}
-
-.section .properties li.editing {
-    margin-left: 10px;
-    text-overflow: clip;
-}
-
-li.editing .swatch, li.editing .enabled-button,  li.editing-sub-part .delete-button {
-    display: none !important;
-}
-
-.watch-expressions > li.editing-sub-part .name {
-    display: block; 
-    width: 100%;
-}
-
-.watch-expressions > li.editing-sub-part .value, .watch-expressions > li.editing-sub-part .separator  {
-    display: none;
-}
-
-.watch-expressions-error-level {
-    color: red;
-}
-
-.section .properties li.editing-sub-part {
-    padding: 3px 6px 8px 18px;
-    margin: -3px -6px -8px -6px;
-    text-overflow: clip;
-}
-
-.section .properties .overloaded, .section .properties .disabled {
-    text-decoration: line-through;
-}
-
-.section.computed-style .properties .disabled {
-    text-decoration: none;
-    opacity: 0.5;
-}
-
-.section .properties .implicit, .section .properties .inherited {
-    opacity: 0.5;
-}
-
-.section:not(.show-inherited) .properties .inherited {
-    display: none;
-}
-
-.section .properties .enabled-button {
-    display: none;
-    float: right;
-    font-size: 10px;
-    margin: 0 0 0 4px;
-    vertical-align: top;
-    position: relative;
-    z-index: 1;
-}
-
-/* FIXME: need a better icon (comment in bug 27514) */
-.section .properties .delete-button {
-    width: 10px;
-    height: 10px;
-    background-image: url(Images/errorIcon.png);
-    background-position: 0 0;
-    background-color: transparent;
-    background-repeat: no-repeat;
-    border: 0 none transparent;
-}
-
-.section:hover .properties .enabled-button {
-    display: block;
-}
-
-.section .properties .name, .event-properties .name {
-    color: rgb(136, 19, 145);
-}
-
-.section .properties .value.dimmed {
-    color: rgb(100, 100, 100);
-}
-
-.section .properties .number, .event-properties .number {
-    color: blue;
-}
-
-.section .properties .priority {
-    color: rgb(128, 0, 0);
-}
-
-.section .properties .keyword, .event-properties .keyword {
-    color: rgb(136, 19, 79);
-}
-
-.section .properties .color, .event-properties .color {
-    color: rgb(118, 15, 21);
-}
-
-.swatch {
-    display: inline-block;
-    vertical-align: baseline;
-    margin-left: 1px;
-    margin-right: 2px;
-    margin-bottom: -1px;
-    width: 1em;
-    height: 1em;
-    border: 1px solid rgba(128, 128, 128, 0.6);
-}
-
-.swatch:hover {
-    border: 1px solid rgba(64, 64, 64, 0.8);
-}
-
-.pane:not(.expanded) + .pane, .pane:first-of-type {
-    margin-top: -1px;
-}
-
-.pane > .title {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));
-    height: 20px;
-    padding: 0 5px;
-    border-top: 1px solid rgb(189, 189, 189);
-    border-bottom: 1px solid rgb(189, 189, 189);
-    font-weight: bold;
-    font-size: 12px;
-    line-height: 18px;
-    color: rgb(110, 110, 110);
-    text-shadow: white 0 1px 0;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.pane > .title:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(231, 231, 231)), color-stop(0.05, rgb(231, 231, 231)), color-stop(0.05, rgb(207, 207, 207)), to(rgb(186, 186, 186)));
-    border-top: 1px solid rgb(178, 178, 178);
-    border-bottom: 1px solid rgb(178, 178, 178);
-}
-
-.pane > .title::before {
-    content: url(Images/disclosureTriangleSmallRightBlack.png);
-    float: left;
-    width: 11px;
-    height: 12px;
-    margin-right: 2px;
-    margin-top: 1px;
-}
-
-.pane.expanded > .title::before {
-    content: url(Images/disclosureTriangleSmallDownBlack.png);
-}
-
-.pane > .title > select {
-    display: none;
-    float: right;
-    width: 23px;
-    height: 17px;
-    color: transparent;
-    background-color: transparent;
-    border: none;
-    background-image: url(Images/paneSettingsButtons.png);
-    background-repeat: no-repeat;
-    margin: 1px 0 0 0;
-    padding: 0;
-    -webkit-border-radius: 0;
-    -webkit-appearance: none;
-}
-
-.pane.expanded:hover > .title > select {
-    display: inline-block;
-}
-
-.pane > .title > select:hover {
-    background-position: -23px 0px;
-}
-
-.pane > .title > select:active {
-    background-position: -46px 0px;
-}
-
-.pane > .title > select > option, .pane > .title > select > hr {
-    color: black;
-}
-
-.pane > .body {
-    position: relative;
-    display: none;
-    background-color: white;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.pane > .body .info {
-    text-align: center;
-    font-style: italic;
-    font-size: 10px;
-    padding: 6px;
-    color: gray;
-}
-
-.pane.expanded > .body, .pane.expanded > .growbar {
-    display: block;
-}
-
-.pane.expanded:nth-last-of-type(1) {
-    border-bottom: 1px solid rgb(189, 189, 189);
-}
-
-.pane > .growbar {
-    display: none;
-    background-image: url(Images/paneGrowHandleLine.png), url(Images/paneBottomGrow.png);
-    background-repeat: no-repeat, repeat-x;
-    background-position: center center, bottom;
-    height: 5px;
-}
-
-.metrics {
-    padding: 8px;
-    font-size: 10px;
-    text-align: center;
-    white-space: nowrap;
-}
-
-.metrics .label {
-    position: absolute;
-    margin-top: -10px;
-    font-size: 9px;
-    color: grey;
-    background-color: white;
-    margin-left: 3px;
-    padding-left: 2px;
-    padding-right: 2px;
-}
-
-.metrics .position {
-    border: 1px rgb(66%, 66%, 66%) dotted;
-    display: inline-block;
-    text-align: center;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .margin {
-    border: 1px dashed;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .border {
-    border: 1px black solid;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .padding {
-    border: 1px grey dashed;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .content {
-    position: static;
-    border: 1px grey solid;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-    min-width: 80px;
-    text-align: center;
-    overflow: visible;
-}
-
-.metrics .content span {
-    display: inline-block;
-}
-
-.metrics .editing {
-    position: relative;
-    z-index: 100;
-}
-
-.metrics .left {
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.metrics .right {
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.metrics .top {
-    display: inline-block;
-}
-
-.metrics .bottom {
-    display: inline-block;
-}
-
-.sidebar {
-    position: absolute;
-    top: 0;
-    min-height: 100%;
-    left: 0;
-    width: 200px;
-    overflow-y: auto;
-    overflow-x: hidden;
-    background-color: rgb(214, 221, 229);
-    border-right: 1px solid rgb(64%, 64%, 64%);
-}
-
-body.inactive .sidebar {
-    background-color: rgb(232, 232, 232);
-}
-
-.database-sidebar-tree-item .icon {
-    content: url(Images/database.png);
-}
-
-.database-table-sidebar-tree-item .icon {
-    content: url(Images/databaseTable.png);
-}
-
-.domstorage-sidebar-tree-item.local-storage .icon {
-    content: url(Images/localStorage.png);
-}
-
-.domstorage-sidebar-tree-item.session-storage .icon {
-    content: url(Images/sessionStorage.png);
-}
-
-.cookie-sidebar-tree-item .icon {
-    content: url(Images/cookie.png);
-}
-
-#storage-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-.storage-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.storage-view.visible {
-    display: block;
-}
-
-.storage-view.table {
-    overflow: hidden;
-}
-
-.storage-view.table .data-grid {
-    border: none;
-    height: 100%;
-}
-
-.storage-view.table .storage-table-empty, .storage-view.table .storage-table-error {
-    position: absolute;
-    top: 0;
-    bottom: 25%;
-    left: 0;
-    right: 0;
-    font-size: 24px;
-    color: rgb(75%, 75%, 75%);
-    margin-top: auto;
-    margin-bottom: auto;
-    height: 50px;
-    line-height: 26px;
-    text-align: center;
-    font-weight: bold;
-    padding: 10px;
-    white-space: pre-wrap;
-}
-
-.storage-view.table .storage-table-error {
-    color: rgb(66%, 33%, 33%);
-}
-
-.data-grid {
-    position: relative;
-    border: 1px solid #aaa;
-}
-
-.data-grid .highlight {
-    background-color: rgb(255, 230, 179);
-}
-
-.data-grid tr.selected .highlight {
-    background-color: transparent;
-}
-
-.data-grid table {
-    table-layout: fixed;
-    border-spacing: 0;
-    border-collapse: collapse;
-    width: 100%;
-    font-size: 10px;
-    font-family: Lucida Grande, sans-serif;
-}
-
-.data-grid .data-container {
-    position: absolute;
-    top: 16px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    padding-right: 14px;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
-    -webkit-background-size: 1px 32px;
-}
-
-.data-grid.inline .data-container {
-    position: static;
-}
-
-.data-grid th {
-    text-align: left;
-    background-image: url(Images/glossyHeader.png);
-    background-repeat: repeat-x;
-    border-right: 1px solid rgb(179, 179, 179);
-    border-bottom: 1px solid rgb(179, 179, 179);
-    height: 15px;
-    font-weight: normal;
-    vertical-align: middle;
-    padding: 0 4px;
-    white-space: nowrap;
-}
-
-.data-grid th.corner {
-    width: 15px;
-    border-right: 0 none transparent;
-}
-
-.data-grid tr.filler {
-    display: table-row !important;
-    height: auto !important;
-}
-
-.data-grid tr.filler td {
-    height: auto !important;
-    padding: 0 !important;
-}
-
-.data-grid table.data {
-    position: absolute;
-    left: 0;
-    top: 0;
-    right: 16px;
-    bottom: 0;
-    height: 100%;
-    border-top: 0 none transparent;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
-    -webkit-background-size: 1px 32px;
-}
-
-.data-grid.inline table.data {
-    position: static;
-}
-
-.data-grid table.data tr {
-    display: none;
-}
-
-.data-grid table.data tr.revealed {
-    display: table-row;
-}
-
-.data-grid td {
-    vertical-align: top;
-    height: 12px;
-    line-height: 12px;
-    padding: 2px 4px;
-    white-space: nowrap;
-    border-right: 1px solid #aaa;
-    -webkit-user-select: text;
-}
-
-.data-grid td > div, .data-grid th > div {
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.data-grid .centered div {
-    text-align: center;
-}
-
-.data-grid .right div {
-    text-align: right;
-}
-
-.data-grid th.sortable div {
-    position: relative;
-}
-
-.data-grid th.sortable:active {
-    background-image: url(Images/glossyHeaderPressed.png);
-}
-
-.data-grid th.sort-ascending, .data-grid th.sort-descending {
-    border-right: 1px solid rgb(107, 140, 196);
-    border-bottom: 1px solid rgb(107, 140, 196);
-    background-image: url(Images/glossyHeaderSelected.png);
-    background-repeat: repeat-x;
-}
-
-.data-grid th.sortable.sort-ascending:active, .data-grid th.sortable.sort-descending:active {
-    background-image: url(Images/glossyHeaderSelectedPressed.png);
-}
-
-.data-grid th.sort-ascending div::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeUpTriangleBlack.png);
-}
-
-.data-grid th.sort-descending div::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    margin-top: 1px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-body.inactive .data-grid th.sort-ascending, body.inactive .data-grid th.sort-descending {
-    background-image: url(Images/glossyHeader.png);
-    border-right: 1px solid rgb(179, 179, 179);
-    border-bottom: 1px solid rgb(179, 179, 179);
-}
-
-.data-grid tr.parent td.disclosure::before {
-    float: left;
-    content: url(Images/treeRightTriangleBlack.png);
-    width: 8px;
-    height: 8px;
-    margin-right: 2px;
-    -webkit-user-select: none;
-}
-
-.data-grid tr.expanded td.disclosure::before {
-    content: url(Images/treeDownTriangleBlack.png);
-    width: 8px;
-    height: 8px;
-    margin-top: 1px;
-}
-
-.data-grid tr.selected {
-    background-color: rgb(212, 212, 212);
-    color: inherit;
-}
-
-.data-grid:focus tr.selected {
-    background-color: rgb(56, 121, 217);
-    color: white;
-}
-
-.data-grid:focus tr.parent.selected td.disclosure::before {
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.data-grid:focus tr.expanded.selected td.disclosure::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.data-grid tr:not(.parent) td.disclosure {
-    text-indent: 10px;
-}
-
-.data-grid-resizer {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    width: 5px;
-    z-index: 500;
-    cursor: col-resize;
-}
-
-.storage-view.query {
-    font-size: initial;
-    font-family: monospace;
-    padding: 2px 0;
-    overflow-y: overlay;
-    overflow-x: hidden;
-    -webkit-text-size-adjust: auto;
-}
-
-.database-query-prompt {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-    white-space: pre-wrap;
-    -webkit-user-modify: read-write-plaintext-only;
-    -webkit-user-select: text;
-}
-
-.database-user-query::before, .database-query-prompt::before, .database-query-result::before {
-    position: absolute;
-    display: block;
-    content: "";
-    left: 7px;
-    top: 0.8em;
-    width: 10px;
-    height: 10px;
-    margin-top: -5px;
-    -webkit-user-select: none;
-}
-
-.database-query-prompt::before {
-    background-image: url(Images/userInputIcon.png);
-}
-
-.database-user-query {
-    position: relative;
-    border-bottom: 1px solid rgb(245, 245, 245);
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-}
-
-.database-user-query::before {
-    background-image: url(Images/userInputPreviousIcon.png);
-}
-
-.database-query-text {
-    color: rgb(0, 128, 255);
-    -webkit-user-select: text;
-}
-
-.database-query-result {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px;
-    margin-left: -24px;
-    padding-right: 0;
-}
-
-.database-query-result.error {
-    color: red;
-    -webkit-user-select: text;
-}
-
-.database-query-result.error::before {
-    background-image: url(Images/errorIcon.png);
-}
-
-.panel-enabler-view {
-    z-index: 1000;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: white;
-    font-size: 13px;
-    text-align: center;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    display: none;
-}
-
-.panel-enabler-view.visible {
-    display: block;
-}
-
-.panel-enabler-view .panel-enabler-view-content {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    max-height: 390px;
-    margin: auto;
-    white-space: nowrap;
-}
-
-.panel-enabler-view h1 {
-    color: rgb(110, 116, 128);
-    font-size: 16px;
-    line-height: 20px;
-    font-weight: normal;
-    margin-top: 0;
-}
-
-.panel-enabler-disclaimer {
-    font-size: 10px;
-    color: rgb(110, 116, 128);
-    margin-bottom: 12px;
-    margin-left: 20px;
-}
-
-.panel-enabler-disclaimer:empty {
-    display: none;
-}
-
-.panel-enabler-view img {
-    height: 100%;
-    min-height: 200px;
-    max-width: 100%;
-    top: 0;
-    bottom: 0;
-    padding: 20px 0 20px 20px;
-    margin: auto;
-    vertical-align: middle;
-}
-
-.panel-enabler-view img.hidden {
-    display: initial !important;
-    width: 0;
-}
-
-.panel-enabler-view form {
-    display: inline-block;
-    vertical-align: middle;
-    width: 330px;
-    margin: 0;
-    padding: 15px;
-    white-space: normal;
-}
-
-.panel-enabler-view label {
-    position: relative;
-    display: block;
-    text-align: left;
-    word-break: break-word;
-    margin: 0 0 5px 20px;
-}
-
-.panel-enabler-view button, .pane button {
-    color: rgb(6, 6, 6);
-    background-color: transparent;
-    border: 1px solid rgb(165, 165, 165);
-    background-color: rgb(237, 237, 237);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 12px;
-    -webkit-appearance: none;
-}
-
-.panel-enabler-view button {
-    font-size: 13px;
-    margin: 6px 0 0 0;
-    padding: 3px 20px;
-    height: 24px;
-}
-
-.pane button {
-    margin: 6px 0 6px 3px;
-    padding: 2px 9px;
-}
-
-.panel-enabler-view button:active, .pane button:active {
-    background-color: rgb(215, 215, 215);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-body.inactive .panel-enabler-view button, .panel-enabler-view button:disabled, body.inactive .pane button, .pane button:disabled {
-    color: rgb(130, 130, 130);
-    border-color: rgb(212, 212, 212);
-    background-color: rgb(239, 239, 239);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
-}
-
-.panel-enabler-view input {
-    height: 17px;
-    width: 17px;
-    border: 1px solid rgb(165, 165, 165);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 8px;
-    -webkit-appearance: none;
-    vertical-align: middle;
-    margin: 0 5px 5px 0;
-}
-
-.panel-enabler-view input:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-.panel-enabler-view input:checked {
-    background: url(Images/radioDot.png) center no-repeat,
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-}
-
-.panel-enabler-view.resources img {
-    content: url(Images/resourcesSilhouette.png);
-}
-
-.panel-enabler-view.scripts img {
-    content: url(Images/scriptsSilhouette.png);
-}
-
-.panel-enabler-view.profiles img {
-    content: url(Images/profilesSilhouette.png);
-}
-
-button.enable-toggle-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/enableOutlineButtonGlyph.png);
-}
-
-button.enable-toggle-status-bar-item.toggled-on .glyph {
-    -webkit-mask-image: url(Images/enableSolidButtonGlyph.png);
-}
-
-.scripts-pause-on-exceptions-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/pauseOnExceptionButtonGlyph.png);
-}
-
-#scripts-status-bar {
-    position: absolute;
-    top: -1px;
-    left: 0;
-    right: 0;
-    height: 24px;
-}
-
-#scripts-files {
-    max-width: 250px;
-}
-
-#scripts-functions {
-    max-width: 150px;
-}
-
-#scripts-status-bar .status-bar-item img {
-    margin-top: 2px;
-}
-
-#scripts-back img {
-    content: url(Images/back.png);
-}
-
-#scripts-forward img {
-    content: url(Images/forward.png);
-}
-
-#scripts-pause img {
-    content: url(Images/debuggerPause.png);
-}
-
-#scripts-pause.paused img {
-    content: url(Images/debuggerContinue.png);
-}
-
-#scripts-step-over img {
-    content: url(Images/debuggerStepOver.png);
-}
-
-#scripts-step-into img {
-    content: url(Images/debuggerStepInto.png);
-}
-
-#scripts-step-out img {
-    content: url(Images/debuggerStepOut.png);
-}
-
-#scripts-debugger-status {
-    position: absolute;
-    line-height: 24px;
-    top: 0;
-    right: 8px;
-}
-
-#scripts-sidebar-resizer-widget {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 225px;
-    width: 16px;
-    cursor: col-resize;
-    background-image: url(Images/statusbarResizerHorizontal.png);
-    background-repeat: no-repeat;
-    background-position: center;
-}
-
-#scripts-sidebar-buttons {
-    position: absolute;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    width: 225px;
-    overflow: hidden;
-    border-left: 1px solid rgb(64%, 64%, 64%);
-}
-
-#script-resource-views {
-    display: block;
-    overflow: auto;
-    padding: 0;
-    position: absolute;
-    top: 23px;
-    left: 0;
-    right: 225px;
-    bottom: 0;
-}
-
-.script-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.script-view.visible {
-    display: block;
-}
-
-#scripts-sidebar {
-    position: absolute;
-    top: 23px;
-    right: 0;
-    bottom: 0;
-    width: 225px;
-    background-color: rgb(245, 245, 245);
-    border-left: 1px solid rgb(64%, 64%, 64%);
-    cursor: default;
-    overflow: auto;
-}
-
-.resources-larger-resources-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);
-}
-
-#resources-filter, #console-filter.console-filter-top {
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-    width: 100%;
-}
-
-#console-messages.console-filter-top {
-    margin-top: 23px;
-}
-
-#console-filter {
-    margin-top: 1px;
-}
-
-.scope-bar {
-    height: 23px;
-    padding: 2px 10px 0;
-    overflow: hidden;
-}
-
-.scope-bar li {
-    display: inline-block;
-    margin: 1px 2px 0 0;
-    padding: 1px 7px 3px;
-    font-size: 11px;
-    line-height: 12px;
-    font-weight: bold;
-    color: rgb(46, 46, 46);
-    background: transparent;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-    -webkit-border-radius: 8px;
-    vertical-align: middle;
-}
-
-.scope-bar .divider {
-    margin: 1px 9px 0 8px;
-    background-color: rgba(0, 0, 0, 0.4);
-    height: 16px;
-    width: 1px;
-    vertical-align: middle;
-    display: inline-block;
-}
-
-.scope-bar li.selected, .scope-bar li:hover, .scope-bar li:active {
-    color: white;
-    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
-}
-
-.scope-bar li:hover {
-    background: rgba(0, 0, 0, 0.2);
-}
-
-.scope-bar li.selected {
-    background: rgba(0, 0, 0, 0.3);
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.scope-bar li:active {
-    background: rgba(0, 0, 0, 0.5);
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-#resources-container {
-    position: absolute;
-    top: 23px;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    border-right: 0 none transparent;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-#resources-container.viewing-resource {
-    right: auto;
-    width: 200px;
-    border-right: 1px solid rgb(64%, 64%, 64%);
-}
-
-#resources-container.viewing-resource #resources-sidebar {
-    width: 100%;
-    border-right: 0 none transparent;
-}
-
-#resources-sidebar {
-    min-height: 100%;
-    bottom: auto;
-    overflow: visible;
-}
-
-#resources-container-content {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    min-height: 100%;
-}
-
-#resources-container.viewing-resource #resources-container-content {
-    display: none;
-}
-
-#resources-summary {
-    position: absolute;
-    padding-top: 20px;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 93px;
-    margin-left: -1px;
-    border-left: 1px solid rgb(102, 102, 102);
-    background-color: rgb(101, 111, 130);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.5)));
-    background-repeat: repeat-x;
-    background-position: bottom;
-    text-align: center;
-    text-shadow: black 0 1px 1px;
-    white-space: nowrap;
-    color: white;
-    -webkit-background-size: 1px 6px;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-    z-index: 400;
-}
-
-.summary-graph-legend {
-    margin-top: -10px;
-    padding-left: 15px;
-}
-
-.summary-graph-legend-item {
-    display: inline-block;
-    font-weight: bold;
-    margin-right: 15px;
-    vertical-align: top;
-}
-
-.summary-graph-legend-item.total {
-    margin-left: 10px;
-}
-
-.summary-graph-legend-label {
-    display: inline-block;
-    text-align: left;
-}
-
-.summary-graph-legend-header {
-    font-size: 12px;
-}
-
-.summary-graph-legend-value {
-    font-size: 10px;
-}
-
-.summary-graph-legend-swatch {
-    vertical-align: top;
-    margin-top: 1px;
-    margin-right: 3px;
-}
-
-#resources-dividers {
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 100%;
-    top: 0;
-    z-index: -100;
-}
-
-#resources-event-dividers {
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 100%;
-    top: 0;
-    z-index: 300;
-    pointer-events: none;
-}
-
-#resources-dividers-label-bar {
-    position: absolute;
-    top: 0;
-    left: 0px;
-    right: 0;
-    background-color: rgba(255, 255, 255, 0.8);
-    background-clip: padding;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
-    height: 20px;
-    z-index: 200;
-}
-
-.resources-divider {
-    position: absolute;
-    width: 1px;
-    top: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.1);
-}
-
-.resources-event-divider-padding {
-    position: absolute;
-    width: 8px;
-    top: 0;
-    bottom: 0;
-    pointer-events: auto;
-}
-
-.resources-onload-divider {
-    position: absolute;
-    width: 2px;
-    top: 0;
-    bottom: 0;
-    z-index: 300;
-    background-color: rgba(255, 0, 0, 0.5);
-}
-
-.resources-ondomcontent-divider {
-    position: absolute;
-    width: 2px;
-    top: 0;
-    bottom: 0;
-    z-index: 300;
-    background-color: rgba(0, 0, 255, 0.5);
-}
-
-.resources-divider.last {
-    background-color: transparent;
-}
-
-.resources-divider-label {
-    position: absolute;
-    top: 4px;
-    right: 3px;
-    font-size: 9px;
-    color: rgb(50%, 50%, 50%);
-    white-space: nowrap;
-}
-
-.resources-graph-label {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -7px;
-    height: 13px;
-    line-height: 13px;
-    font-size: 9px;
-    color: rgba(0, 0, 0, 0.75);
-    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;
-    z-index: 150;
-    overflow: hidden;
-    text-align: center;
-    font-weight: bold;
-    opacity: 0;
-    -webkit-transition: opacity 250ms ease-in-out;
-}
-
-.resources-graph-side:hover .resources-graph-label {
-    opacity: 1;
-}
-
-.resources-graph-label:empty {
-    display: none;
-}
-
-.resources-graph-label.waiting {
-    margin-right: 5px;
-}
-
-.resources-graph-label.before {
-    color: rgba(0, 0, 0, 0.7);
-    text-shadow: none;
-    text-align: right;
-    margin-right: 2px;
-}
-
-.resources-graph-label.before::after {
-    padding-left: 2px;
-    height: 6px;
-    content: url(Images/graphLabelCalloutLeft.png);
-}
-
-.resources-graph-label.after {
-    color: rgba(0, 0, 0, 0.7);
-    text-shadow: none;
-    text-align: left;
-    margin-left: 2px;
-}
-
-.resources-graph-label.after::before {
-    padding-right: 2px;
-    height: 6px;
-    content: url(Images/graphLabelCalloutRight.png);
-}
-
-.resources-graph-bar {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -7px;
-    border-width: 6px 7px;
-    height: 13px;
-    min-width: 14px;
-    opacity: 0.65;
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;
-}
-
-.resources-category-documents, .resources-category-stylesheets, .resources-category-images,
-.resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other {
-    display: none;
-}
-
-.filter-all .resources-category-documents, .filter-documents .resources-category-documents,
-.filter-all .resources-category-stylesheets, .filter-stylesheets .resources-category-stylesheets,
-.filter-all .resources-category-images, .filter-images .resources-category-images,
-.filter-all .resources-category-scripts, .filter-scripts .resources-category-scripts,
-.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,
-.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,
-.filter-all .resources-category-other, .filter-other .resources-category-other,
-.resource-sidebar-tree-item.selected {
-    display: list-item;
-}
-
-.console-warning-level, .console-error-level, .console-log-level {
-    display: none;
-}
-
-.filter-all .console-warning-level, .filter-warnings .console-warning-level,
-.filter-all .console-error-level, .filter-errors .console-error-level,
-.filter-all .console-log-level, .filter-logs .console-log-level {
-    display: block;
-}
-
-.console-user-command-result {
-    display: block;
-}
-
-.resources-graph-bar.waiting {
-    opacity: 0.35;
-}
-
-.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;
-}
-
-.resources-category-documents .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;
-}
-
-.resources-category-documents.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;
-}
-
-.resources-category-stylesheets .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;
-}
-
-.resources-category-stylesheets.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;
-}
-
-.resources-category-images .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;
-}
-
-.resources-category-images.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;
-}
-
-.resources-category-fonts .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;
-}
-
-.resources-category-fonts.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;
-}
-
-.resources-category-scripts .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;
-}
-
-.resources-category-scripts.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;
-}
-
-.resources-category-xhr .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;
-}
-
-.resources-category-xhr.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;
-}
-
-#resource-views {
-    position: absolute;
-    top: 23px;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-.source-view-frame {
-    width: 100%;
-    height: 100%;
-}
-
-.sidebar-resizer-vertical {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    width: 5px;
-    z-index: 500;
-    cursor: col-resize;
-}
-
-.resources .sidebar-resizer-vertical {
-    top: 23px;
-}
-
-.sidebar-tree, .sidebar-tree .children {
-    position: relative;
-    padding: 0;
-    margin: 0;
-    list-style: none;
-    font-size: 11px;
-}
-
-.sidebar-tree-section {
-    position: relative;
-    height: 18px;
-    padding: 4px 10px 6px 10px;
-    white-space: nowrap;
-    margin-top: 1px;
-    color: rgb(92, 110, 129);
-    font-weight: bold;
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-}
-
-.sidebar-tree-item {
-    position: relative;
-    height: 36px;
-    padding: 0 5px 0 5px;
-    white-space: nowrap;
-    margin-top: 1px;
-    line-height: 34px;
-    border-top: 1px solid transparent;
-}
-
-.sidebar-tree .children {
-    display: none;
-}
-
-.sidebar-tree .children.expanded {
-    display: block;
-}
-
-.sidebar-tree-section + .children > .sidebar-tree-item {
-    padding-left: 10px !important;
-}
-
-.sidebar-tree-section + .children.small > .sidebar-tree-item {
-    padding-left: 17px !important;
-}
-
-.sidebar-tree > .children > .sidebar-tree-item {
-    padding-left: 37px;
-}
-
-.sidebar-tree > .children > .children > .sidebar-tree-item {
-    padding-left: 37px;
-}
-
-.sidebar-tree.hide-disclosure-buttons > .children {
-    display: none;
-}
-
-.sidebar-tree > .children.hide-disclosure-buttons > .children {
-    display: none;
-}
-
-.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {
-    margin-left: 16px;
-}
-
-.sidebar-tree-item .disclosure-button {
-    float: left;
-    width: 16px;
-    height: 100%;
-    border: 0;
-    background-color: transparent;
-    background-image: url(Images/disclosureTriangleSmallRight.png);
-    background-repeat: no-repeat;
-    background-position: center;
-    -webkit-apearance: none;
-}
-
-.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {
-    display: none;
-}
-
-body.inactive .sidebar-tree-item .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
-}
-
-body.inactive .sidebar-tree-item.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
-}
-
-body.inactive .sidebar-tree-item .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDownBlack.png);
-}
-
-.sidebar-tree-item.selected .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallRightWhite.png) !important;
-}
-
-.sidebar-tree-item.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDown.png);
-}
-
-.sidebar-tree-item.selected.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDownWhite.png) !important;
-}
-
-.sidebar-tree-item.selected .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDownWhite.png) !important;
-}
-
-.sidebar-tree-item .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDown.png);
-}
-
-.sidebar-tree-item .icon {
-    float: left;
-    width: 32px;
-    height: 32px;
-    margin-top: 1px;
-    margin-right: 3px;
-}
-
-.sidebar-tree-item .status {
-    float: right;
-    height: 16px;
-    margin-top: 9px;
-    margin-left: 4px;
-    line-height: 1em;
-}
-
-.sidebar-tree-item .status:empty {
-    display: none;
-}
-
-.sidebar-tree-item .status .bubble {
-    display: inline-block;
-    height: 14px;
-    min-width: 16px;
-    margin-top: 1px;
-    background-color: rgb(128, 151, 189);
-    vertical-align: middle;
-    white-space: nowrap;
-    padding: 1px 4px;
-    text-align: center;
-    font-size: 11px;
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-    text-shadow: none;
-    color: white;
-    -webkit-border-radius: 7px;
-}
-
-.sidebar-tree-item .status .bubble:empty {
-    display: none;
-}
-
-.sidebar-tree-item.selected .status .bubble {
-    background-color: white !important;
-    color: rgb(132, 154, 190) !important;
-}
-
-:focus .sidebar-tree-item.selected .status .bubble {
-    color: rgb(36, 98, 172) !important;
-}
-
-body.inactive .sidebar-tree-item.selected .status .bubble {
-    color: rgb(159, 159, 159) !important;
-}
-
-.sidebar-tree.small .sidebar-tree-item, .sidebar-tree .children.small .sidebar-tree-item, .sidebar-tree-item.small, .small .resources-graph-side {
-    height: 20px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .icon, .sidebar-tree .children.small .sidebar-tree-item .icon, .sidebar-tree-item.small .icon {
-    width: 16px;
-    height: 16px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .status, .sidebar-tree .children.small .sidebar-tree-item .status, .sidebar-tree-item.small .status {
-    margin-top: 1px;
-}
-
-.sidebar-tree-item.selected {
-    color: white;
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;
-    font-weight: bold;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-:focus .sidebar-tree-item.selected {
-    border-top: 1px solid rgb(68, 128, 200);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
-}
-
-body.inactive .sidebar-tree-item.selected {
-    border-top: 1px solid rgb(151, 151, 151);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
-}
-
-.sidebar-tree-item .titles {
-    position: relative;
-    top: 5px;
-    line-height: 11px;
-    padding-bottom: 1px;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    white-space: nowrap;
-}
-
-.sidebar-tree-item .titles.no-subtitle {
-    top: 10px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .titles, .sidebar-tree .children.small .sidebar-tree-item .titles, .sidebar-tree-item.small .titles {
-    top: 2px;
-    line-height: normal;
-}
-
-.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after, .sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {
-    content: "\A";
-    white-space: pre;
-}
-
-.sidebar-tree-item .subtitle {
-    font-size: 9px;
-    color: rgba(0, 0, 0, 0.7);
-}
-
-.sidebar-tree.small .sidebar-tree-item .subtitle, .sidebar-tree .children.small .sidebar-tree-item .subtitle, .sidebar-tree-item.small .subtitle {
-    display: none;
-}
-
-.sidebar-tree-item.selected .subtitle {
-    color: rgba(255, 255, 255, 0.9);
-}
-
-#resources-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    max-height: 100%;
-    top: 112px;
-}
-
-.resources-graph-side {
-    position: relative;
-    height: 36px;
-    padding: 0 5px;
-    white-space: nowrap;
-    margin-top: 1px;
-    border-top: 1px solid transparent;
-    overflow: hidden;
-}
-
-.resources-graph-bar-area {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 8px;
-    left: 9px;
-}
-
-#resources-container:not(.viewing-resource) .resource-sidebar-tree-item:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-#resources-container:not(.viewing-resource) .resources-graph-side:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.resources-time-graph-sidebar-item .icon {
-    content: url(Images/resourcesTimeGraphIcon.png);
-}
-
-.resources-size-graph-sidebar-item .icon {
-    content: url(Images/resourcesSizeGraphIcon.png);
-}
-
-.resources-size-graph-sidebar-item .icon {
-    content: url(Images/resourcesSizeGraphIcon.png);
-}
-
-.resource-sidebar-tree-item .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item .icon {
-    content: url(Images/resourcePlainIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-documents .icon {
-    content: url(Images/resourceDocumentIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-documents .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-stylesheets .icon {
-    content: url(Images/resourceCSSIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-stylesheets .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-images .icon {
-    position: relative;
-    background-image: url(Images/resourcePlainIcon.png);
-    background-repeat: no-repeat;
-    content: "";
-}
-
-.resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
-    position: absolute;
-    margin: auto;
-    top: 3px;
-    bottom: 4px;
-    left: 5px;
-    right: 5px;
-    max-width: 18px;
-    max-height: 21px;
-    min-width: 1px;
-    min-height: 1px;
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-images .icon {
-    background-image: url(Images/resourcePlainIconSmall.png);
-    content: "";
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
-    top: 2px;
-    bottom: 1px;
-    left: 3px;
-    right: 3px;
-    max-width: 8px;
-    max-height: 11px;
-}
-
-.resource-sidebar-tree-item.resources-category-fonts .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-fonts .icon {
-    content: url(Images/resourcePlainIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-scripts .icon {
-    content: url(Images/resourceJSIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-scripts .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-xhr .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-xhr .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.bubble.debug, .console-debug-level .bubble {
-    background-color: rgb(0, 0, 255) !important;
-}
-
-.bubble.warning, .console-warning-level .bubble {
-    background-color: rgb(232, 164, 0) !important;
-}
-
-.bubble.error, .console-error-level .bubble {
-    background-color: rgb(216, 35, 35) !important;
-}
-
-.bubble.search-matches {
-    background-image: url(Images/searchSmallWhite.png);
-    background-repeat: no-repeat;
-    background-position: 3px 2px;
-    padding-left: 13px !important;
-}
-
-.sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallBlue.png);
-}
-
-:focus .sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallBrightBlue.png);
-}
-
-body.inactive .sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallGray.png);
-}
-
-/* Timeline Style */
-
-#timeline-overview-panel {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 80px;
-}
-
-.timeline-sidebar-background {
-    top: 90px;
-    bottom: 0;
-}
-
-.timeline .sidebar {
-    overflow-y: hidden;
-    z-index: 100;
-}
-
-#timeline-overview-separator {
-    position: absolute;
-    top: 80px;
-    left: 0;
-    right: 0;
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(253, 253, 253)), to(rgb(213, 213, 213)));
-    border-top: 1px solid rgb(140, 140, 140);
-    border-bottom: 1px solid rgb(115, 115, 115);
-    height: 10px;
-}
-
-#timeline-overview-sidebar {
-    position: absolute;
-    width: 200px;
-    top: 0px;
-    bottom: 0px;
-    left: 0px;
-    padding-top: 1px;
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(242, 242, 242)), to(rgb(209, 209, 209)));
-    border-right: 1px solid rgb(163, 163, 163);
-}
-
-#timeline-overview-grid {
-    position: absolute;
-    top: 0px;
-    bottom: 0px;
-    left: 200px;
-    right: 0px;
-    background-color: rgb(224, 224, 224);
-}
-
-#timeline-overview-window {
-    background-color: white;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    z-index: 150;
-}
-
-.timeline-window-resizer {
-    position: absolute;
-    top: 35px;
-    bottom: 15px;
-    width: 5px;
-    margin-left: -3px;
-    margin-right: -2px;
-    background-color: rgb(153, 153, 153);
-    z-index: 500;
-    cursor: col-resize;
-    -webkit-border-radius: 2px;
-    -webkit-box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
-}
-
-#timeline-overview-grid #resources-graphs {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 80px;
-}
-
-#timeline-container {
-    position: absolute;
-    top: 90px;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    border-right: 0 none transparent;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.timeline-clear-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-.timeline-category-tree-item {
-    height: 20px;
-    line-height: 20px;
-    padding-left: 6px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    font-weight: bold;
-}
-
-.timeline-category-tree-item .timeline-category-checkbox {
-    width: 10px;
-    height: 11px;
-    margin: 0 3px 0 5px;
-    padding: 0;
-    background-image: url(Images/timelineCheckmarks.png);
-    background-repeat: no-repeat;
-    background-position: 0 -66px;
-    vertical-align: -1px;
-    -webkit-appearance: none;
-}
-
-.timeline-category-tree-item .timeline-category-checkbox:checked {
-    background-position-x: -10px;
-}
-
-.timeline-category-tree-item.timeline-category-loading .timeline-category-checkbox {
-    background-position-y: 0;
-}
-
-.timeline-category-tree-item.timeline-category-scripting .timeline-category-checkbox {
-    background-position-y: -33px;
-}
-
-.timeline-category-tree-item.timeline-category-rendering .timeline-category-checkbox {
-    background-position-y: -11px;
-}
-
-.timeline-category-tree-item:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-tree-item {
-    height: 18px;
-    line-height: 15px;
-    padding-right: 5px;
-    padding-left: 10px;
-    padding-top: 2px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.timeline-expandable {
-    position: absolute;
-    border-left: 1px solid rgb(163, 163, 163);
-}
-
-.timeline-expandable-left {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    width: 3px;
-    border-top: 1px solid rgb(163, 163, 163);
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.timeline-expandable-collapsed {
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
-    background-position-x: 1px;
-    background-position-y: 2px;
-    background-repeat: no-repeat;
-}
-
-.timeline-expandable-expanded {
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
-    background-position-x: 1px;
-    background-position-y: 3px;
-    background-repeat: no-repeat;
-}
-
-.timeline-tree-item .type {
-    padding-left: 14px;
-}
-
-.timeline-tree-item .count {
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-}
-
-.timeline-tree-item .timeline-tree-icon {
-    background-image: url(Images/timelineDots.png);
-    margin-top: 2px;
-    width: 12px;
-    height: 12px;
-    position: absolute;
-}
-
-.timeline-tree-item.even {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-tree-item .data.dimmed {
-    color: rgba(0, 0, 0, 0.7);
-}
-
-#timeline-overview-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    top: 20px;
-}
-
-#timeline-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    max-height: 100%;
-    top: 19px;
-}
-
-.timeline-graph-side {
-    position: relative;
-    height: 18px;
-    padding: 0 5px;
-    white-space: nowrap;
-    margin-top: 0px;
-    border-top: 1px solid transparent;
-    overflow: hidden;
-    pointer-events: none;
-}
-
-.timeline-overview-graph-side {
-    height: 20px;
-    z-index: 170;
-    pointer-events: none;
-}
-
-.timeline-overview-graph-side .timeline-graph-bar {
-    height: 13px;
-}
-
-.timeline-graph-bar-area {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 0;
-    left: 3px;
-    pointer-events: none;
-}
-
-.timeline-graph-bar {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -2px;
-    border-width: 4px 4px 5px;
-    height: 9px;
-    min-width: 5px;
-    opacity: 0.8;
-    -webkit-border-image: url(Images/timelineBarGray.png) 4 4 5 4;
-    pointer-events: none;
-}
-
-.timeline-graph-side.even {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-category-loading .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;
-}
-
-.timeline-category-scripting .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;
-}
-
-.timeline-category-rendering .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;
-}
-
-.timeline-category-loading .timeline-tree-icon {
-    background-position-y: 0px;
-}
-
-.timeline-category-scripting .timeline-tree-icon {
-    background-position-y: 48px;
-}
-
-.timeline-category-rendering .timeline-tree-icon {
-    background-position-y: 72px;
-}
-
-/* Profiler Style */
-
-#profile-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-#profile-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-.profile-sidebar-tree-item .icon {
-    content: url(Images/profileIcon.png);
-}
-
-.profile-sidebar-tree-item.small .icon {
-    content: url(Images/profileSmallIcon.png);
-}
-
-.profile-group-sidebar-tree-item .icon {
-    content: url(Images/profileGroupIcon.png);
-}
-
-.profile-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.profile-view.visible {
-    display: block;
-}
-
-.profile-view .data-grid {
-    border: none;
-    height: 100%;
-}
-
-.profile-view .data-grid th.average-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.average-column {
-    text-align: right;
-}
-
-.profile-view .data-grid th.self-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.self-column {
-    text-align: right;
-}
-
-.profile-view .data-grid th.total-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.total-column {
-    text-align: right;
-}
-
-.profile-view .data-grid .calls-column {
-    text-align: center;
-}
-
-.profile-node-file {
-    float: right;
-    color: gray;
-    margin-top: -1px;
-}
-
-.data-grid tr.selected .profile-node-file {
-    color: rgb(33%, 33%, 33%);
-}
-
-.data-grid:focus tr.selected .profile-node-file {
-    color: white;
-}
-
-button.enable-toggle-status-bar-item .glyph {
-}
-
-.record-profile-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/recordButtonGlyph.png);
-}
-
-.record-profile-status-bar-item.toggled-on .glyph {
-    -webkit-mask-image: url(Images/recordToggledButtonGlyph.png);
-    background-color: rgb(216, 0, 0) !important;
-}
-
-/* FIXME: should have its own glyph. */
-.heap-snapshot-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.node-search-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/nodeSearchButtonGlyph.png);
-}
-
-.percent-time-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/percentButtonGlyph.png);
-}
-
-.focus-profile-node-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.exclude-profile-node-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
-}
-
-.reset-profile-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
-}
-
-.delete-storage-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
-}
-
-#storage-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-.refresh-storage-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
-}
-
-#storage-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-ol.breakpoint-list {
-    -webkit-padding-start: 2px;
-    list-style: none;
-    margin: 0;
-}
-
-.breakpoint-list li {
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    margin: 4px 0;
-}
-
-.breakpoint-list .checkbox-elem {
-    font-size: 10px;
-    margin: 0 4px;
-    vertical-align: top;
-    position: relative;
-    z-index: 1;
-}
-
-.breakpoint-list .source-text {
-    font-family: monospace;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    margin: 2px 0 0px 20px;
-}
-
-.breakpoint-list a {
-    color: rgb(33%, 33%, 33%);
-    cursor: pointer;
-}
-
-.breakpoint-list a:hover {
-    color: rgb(15%, 15%, 15%);
-}
-
-.webkit-html-js-node, .webkit-html-css-node {
-    white-space: pre;
-}
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.html b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.html
deleted file mode 100644
index 9f78c0f..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspector.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<!--
-Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1.  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-2.  Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-    its contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-    <link rel="stylesheet" type="text/css" href="audits.css">
-    <link rel="stylesheet" type="text/css" href="inspector.css">
-    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
-    <script type="text/javascript" src="utilities.js"></script>
-    <script type="text/javascript" src="treeoutline.js"></script>
-    <script type="text/javascript" src="inspector.js"></script>
-    <script type="text/javascript" src="InspectorBackendStub.js"></script>
-    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
-    <script type="text/javascript" src="Object.js"></script>
-    <script type="text/javascript" src="Settings.js"></script>
-    <script type="text/javascript" src="ContextMenu.js"></script>
-    <script type="text/javascript" src="KeyboardShortcut.js"></script>
-    <script type="text/javascript" src="TextPrompt.js"></script>
-    <script type="text/javascript" src="Popup.js"></script>
-    <script type="text/javascript" src="Placard.js"></script>
-    <script type="text/javascript" src="View.js"></script>
-    <script type="text/javascript" src="Callback.js"></script>
-    <script type="text/javascript" src="Drawer.js"></script>
-    <script type="text/javascript" src="ChangesView.js"></script>
-    <script type="text/javascript" src="ConsoleView.js"></script>
-    <script type="text/javascript" src="Panel.js"></script>
-    <script type="text/javascript" src="TimelineGrid.js"></script>    
-    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
-    <script type="text/javascript" src="Resource.js"></script>
-    <script type="text/javascript" src="ResourceCategory.js"></script>
-    <script type="text/javascript" src="Database.js"></script>
-    <script type="text/javascript" src="DOMStorage.js"></script>
-    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
-    <script type="text/javascript" src="DataGrid.js"></script>
-    <script type="text/javascript" src="CookieItemsView.js"></script>
-    <script type="text/javascript" src="Script.js"></script>
-    <script type="text/javascript" src="Breakpoint.js"></script>
-    <script type="text/javascript" src="SidebarPane.js"></script>
-    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
-    <script type="text/javascript" src="SidebarTreeElement.js"></script>
-    <script type="text/javascript" src="Section.js"></script>
-    <script type="text/javascript" src="PropertiesSection.js"></script>
-    <script type="text/javascript" src="ObjectProxy.js"></script>
-    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
-    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
-    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
-    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
-    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
-    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
-    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
-    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
-    <script type="text/javascript" src="Color.js"></script>
-    <script type="text/javascript" src="StylesSidebarPane.js"></script>
-    <script type="text/javascript" src="PanelEnablerView.js"></script>
-    <script type="text/javascript" src="StatusBarButton.js"></script>
-    <script type="text/javascript" src="SummaryBar.js"></script>
-    <script type="text/javascript" src="ElementsPanel.js"></script>
-    <script type="text/javascript" src="ResourcesPanel.js"></script>
-    <script type="text/javascript" src="ScriptsPanel.js"></script>
-    <script type="text/javascript" src="StoragePanel.js"></script>
-    <script type="text/javascript" src="ProfilesPanel.js"></script>
-    <script type="text/javascript" src="ConsolePanel.js"></script>
-    <script type="text/javascript" src="AuditsPanel.js"></script>
-    <script type="text/javascript" src="AuditResultView.js"></script>
-    <script type="text/javascript" src="AuditLauncherView.js"></script>
-    <script type="text/javascript" src="ResourceView.js"></script>
-    <script type="text/javascript" src="SourceFrame.js"></script>
-    <script type="text/javascript" src="SourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="CSSSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="JavaScriptSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="SourceView.js"></script>
-    <script type="text/javascript" src="FontView.js"></script>
-    <script type="text/javascript" src="ImageView.js"></script>
-    <script type="text/javascript" src="DatabaseTableView.js"></script>
-    <script type="text/javascript" src="DatabaseQueryView.js"></script>
-    <script type="text/javascript" src="ScriptView.js"></script>
-    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="ProfileView.js"></script>
-    <script type="text/javascript" src="DOMAgent.js"></script>
-    <script type="text/javascript" src="InjectedScript.js"></script>
-    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
-    <script type="text/javascript" src="TimelineAgent.js"></script>
-    <script type="text/javascript" src="TimelinePanel.js"></script>
-    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
-    <script type="text/javascript" src="TestController.js"></script>
-</head>
-<body class="detached">
-    <div id="toolbar">
-        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
-        <div class="toolbar-item flexable-space"></div>
-        <div class="toolbar-item hidden" id="search-results-matches"></div>
-        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
-        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
-    </div>
-    <div id="main">
-        <div id="main-panels" spellcheck="false"></div>
-        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
-    </div>
-    <div id="drawer">
-        <div id="console-view"><div id="console-messages"><div id="console-prompt" spellcheck="false"><br></div></div></div>
-        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
-    </div>
-</body>
-</html>
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
deleted file mode 100644
index e3e3074..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
- .webkit-css-comment { 
-     color: rgb(0, 116, 0);
- }
-
- .webkit-css-url, .webkit-css-color, .webkit-css-string, .webkit-css-keyword {
-     color: rgb(7, 144, 154);
- }
-
- .webkit-css-number {
-     color: rgb(50, 0, 255);
- }
-
- .webkit-css-property, .webkit-css-at-rule {
-     color: rgb(200, 0, 0);
- }
-
- .webkit-css-selector {
-     rgb(0, 0, 0);
- }
-
- .webkit-css-important {
-     color: rgb(200, 0, 180);
- }
-
-.webkit-javascript-comment {
-    color: rgb(0, 116, 0);
-}
-
-.webkit-javascript-keyword {
-    color: rgb(170, 13, 145);
-}
-
-.webkit-javascript-number {
-    color: rgb(28, 0, 207);
-}
-
-.webkit-javascript-string, .webkit-javascript-regexp {
-    color: rgb(196, 26, 22);
-}
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/it.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/it.lproj/locale.pak
deleted file mode 100644
index dc839e4..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/it.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak
deleted file mode 100644
index 19bc260..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak
deleted file mode 100644
index 00fd659..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak
deleted file mode 100644
index 96e318d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak
deleted file mode 100644
index fad9837..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak
deleted file mode 100644
index 69a3b61..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf
deleted file mode 100644
index f7f4e49..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf
deleted file mode 100644
index a0801dc..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_Template.pdf
deleted file mode 100644
index 6b3b0f3..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf
deleted file mode 100644
index 024640d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak
deleted file mode 100644
index 99a7947..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak
deleted file mode 100644
index bb35fd8..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nav.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nav.pdf
deleted file mode 100644
index 334b304..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nav.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak
deleted file mode 100644
index e1b69a9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab.pdf
deleted file mode 100644
index 2595ccc..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_h.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_h.pdf
deleted file mode 100644
index 4714541..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_h.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_p.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_p.pdf
deleted file mode 100644
index f049619..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/newtab_p.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak
deleted file mode 100644
index c5e30ec..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/or.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/or.lproj/locale.pak
deleted file mode 100644
index c80483f..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/or.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/otr_icon.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/otr_icon.pdf
deleted file mode 100644
index 8f8310b..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/otr_icon.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak
deleted file mode 100644
index e90e98c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak
deleted file mode 100644
index 3a5bfdb..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak
deleted file mode 100644
index 9e53bcc..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/reload_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/reload_Template.pdf
deleted file mode 100644
index 01a2c28..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/reload_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/renderer.sb b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/renderer.sb
deleted file mode 100644
index e9f6094..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/renderer.sb
+++ /dev/null
@@ -1,39 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for Fonts.
-(allow file-read-data (regex #"^/System/Library/Fonts"))  ; 10.5.6
-;10.6_ONLY (allow file-read-data (regex #"^/Library/Fonts"))  ; 10.6
-(allow mach-lookup (global-name "com.apple.FontObjectsServer"))  ; 10.5.6
-;10.6_ONLY (allow mach-lookup (global-name "com.apple.FontServer"))  ; 10.6
-
-; USER_HOMEDIR is substitued at runtime - http://crbug.com/11269 
-;10.6_ONLY (allow file-read-data (subpath "USER_HOMEDIR/Library/Fonts"))  ; 10.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak
deleted file mode 100644
index 10397b6..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak
deleted file mode 100644
index b9d036a..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak
deleted file mode 100644
index 1e56749..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak
deleted file mode 100644
index 3649760..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak
deleted file mode 100644
index dd7931c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/star_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/star_Template.pdf
deleted file mode 100644
index 3cb8f95..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/star_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/starred.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/starred.pdf
deleted file mode 100644
index 31d99ed..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/starred.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/stop_Template.pdf b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/stop_Template.pdf
deleted file mode 100644
index 5fa3680..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/stop_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak
deleted file mode 100644
index 5ee9ecf..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak
deleted file mode 100644
index d10bfce..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak
deleted file mode 100644
index 8023e89..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/te.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/te.lproj/locale.pak
deleted file mode 100644
index 992289e..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/te.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/th.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/th.lproj/locale.pak
deleted file mode 100644
index e52a37d..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/th.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak
deleted file mode 100644
index 913554e..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak
deleted file mode 100644
index 5fb82b1..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/utility.sb b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/utility.sb
deleted file mode 100644
index 3f88f1c..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/utility.sb
+++ /dev/null
@@ -1,40 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-; This is the Sandbox configuration file used for safeguarding the utility
-; process which is used for performing sandboxed operations that need to touch
-; the filesystem like decoding theme images and unpacking extensions.
-;
-; This configuration locks everything down, except access to one configurable
-; directory.  This is different from other sandbox configuration files where
-; file system access is entireley restricted.
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
-
-; Enable full access to given directory if needed.
-;ENABLE_DIRECTORY_ACCESS (allow file-read* file-write* (regex #"DIR_TO_ALLOW_ACCESS"))
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak
deleted file mode 100644
index 204cc41..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/worker.sb b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/worker.sb
deleted file mode 100644
index bc208c4..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/worker.sb
+++ /dev/null
@@ -1,35 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-; This is the Sandbox configuration file used for safeguarding the worker
-; process which is used to run web workers in a sandboxed environment.
-;
-; This is the most restrictive sandbox profile and only enables just enough
-; to allow basic use of Cocoa.
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak
deleted file mode 100644
index 8a99622..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak
deleted file mode 100644
index 72a1419..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Info.plist b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Info.plist
deleted file mode 100644
index 92d45df..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Info.plist
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleDisplayName</key>
-	<string>Chromium Helper</string>
-	<key>CFBundleExecutable</key>
-	<string>Chromium Helper</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.chromium.Chromium.helper</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>Chromium Helper</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>287.0</string>
-	<key>LSFileQuarantineEnabled</key>
-	<true/>
-	<key>LSHasLocalizedDisplayName</key>
-	<string>1</string>
-	<key>LSMinimumSystemVersion</key>
-	<string>10.5.0</string>
-	<key>LSUIElement</key>
-	<string>1</string>
-</dict>
-</plist>
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/Chromium Helper b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/Chromium Helper
deleted file mode 100755
index 935f9b7..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/Chromium Helper
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
deleted file mode 100755
index 2da7463..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
deleted file mode 100644
index 137ffd9..0000000
--- a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Chromium Framework b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Chromium Framework
new file mode 100755
index 0000000..c342802
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Chromium Framework
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib
new file mode 100755
index 0000000..fa89f74
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Libraries/libffmpegsumo.dylib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/About.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/About.nib
new file mode 100644
index 0000000..0ef84a8
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/About.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AboutIPC.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AboutIPC.nib
new file mode 100644
index 0000000..1e55043
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AboutIPC.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillAddressFormView.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillAddressFormView.nib
new file mode 100644
index 0000000..74c2a22
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillAddressFormView.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillCreditCardFormView.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillCreditCardFormView.nib
new file mode 100644
index 0000000..7a4157c
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillCreditCardFormView.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillDialog.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillDialog.nib
new file mode 100644
index 0000000..349ee63
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/AutoFillDialog.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib
new file mode 100644
index 0000000..bf5c577
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkAllTabs.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBar.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBar.nib
new file mode 100644
index 0000000..a73531a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBar.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBarFolderWindow.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBarFolderWindow.nib
new file mode 100644
index 0000000..4f9a65c
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBarFolderWindow.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBubble.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBubble.nib
new file mode 100644
index 0000000..b75cd33
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkBubble.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkEditor.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkEditor.nib
new file mode 100644
index 0000000..4cb25ac
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkEditor.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkManager.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkManager.nib
new file mode 100644
index 0000000..c3540dd
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkManager.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib
new file mode 100644
index 0000000..e1167cb
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BookmarkNameFolder.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BrowserWindow.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BrowserWindow.nib
new file mode 100644
index 0000000..110e38e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/BrowserWindow.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib
new file mode 100644
index 0000000..1c70930
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ClearBrowsingData.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedCookies.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedCookies.nib
new file mode 100644
index 0000000..507b0b1
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedCookies.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedImages.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedImages.nib
new file mode 100644
index 0000000..a51c82d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedImages.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedJavaScript.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedJavaScript.nib
new file mode 100644
index 0000000..a7e0637
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedJavaScript.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPlugins.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPlugins.nib
new file mode 100644
index 0000000..f4bb5be
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPlugins.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPopups.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPopups.nib
new file mode 100644
index 0000000..5be1407
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentBlockedPopups.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentExceptionsWindow.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentExceptionsWindow.nib
new file mode 100644
index 0000000..1f7b8dd
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentExceptionsWindow.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentSettings.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentSettings.nib
new file mode 100644
index 0000000..e568c37
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ContentSettings.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Cookies.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Cookies.nib
new file mode 100644
index 0000000..d72b1e4
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Cookies.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadItem.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadItem.nib
new file mode 100644
index 0000000..eb26240
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadItem.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadShelf.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadShelf.nib
new file mode 100644
index 0000000..c2e0f72
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/DownloadShelf.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/EditSearchEngine.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/EditSearchEngine.nib
new file mode 100644
index 0000000..8897a87
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/EditSearchEngine.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ExtensionInstalledBubble.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ExtensionInstalledBubble.nib
new file mode 100644
index 0000000..471b92e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ExtensionInstalledBubble.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FindBar.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FindBar.nib
new file mode 100644
index 0000000..486c80f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FindBar.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FirstRunDialog.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FirstRunDialog.nib
new file mode 100644
index 0000000..567bf20
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FirstRunDialog.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib
new file mode 100644
index 0000000..e18e7f3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/FontLanguageSettings.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib
new file mode 100644
index 0000000..09c1bc4
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HttpAuthLoginSheet.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HungRendererDialog.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HungRendererDialog.nib
new file mode 100644
index 0000000..4c106cd
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/HungRendererDialog.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib
new file mode 100644
index 0000000..2f07e9a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportProgressDialog.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib
new file mode 100644
index 0000000..797c951
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ImportSettingsDialog.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Info.plist b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Info.plist
new file mode 100644
index 0000000..d8d492e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>Chromium Framework</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.chromium.Chromium.framework</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>5.0.350.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>350.0</string>
+	<key>SVNPath</key>
+	<string>/trunk/src</string>
+	<key>SVNRevision</key>
+	<string>41134</string>
+</dict>
+</plist>
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBar.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBar.nib
new file mode 100644
index 0000000..f555b9d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBar.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBarContainer.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBarContainer.nib
new file mode 100644
index 0000000..27f9c3e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/InfoBarContainer.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/KeywordEditor.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/KeywordEditor.nib
new file mode 100644
index 0000000..ecb3271
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/KeywordEditor.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/MainMenu.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/MainMenu.nib
new file mode 100644
index 0000000..2c6b653
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/MainMenu.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/PageInfo.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/PageInfo.nib
new file mode 100644
index 0000000..1814fe8
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/PageInfo.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Preferences.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Preferences.nib
new file mode 100644
index 0000000..9fd9f95
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Preferences.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ReportBug.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ReportBug.nib
new file mode 100644
index 0000000..428590b
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ReportBug.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SadTab.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SadTab.nib
new file mode 100644
index 0000000..a891ce3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SadTab.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib
new file mode 100644
index 0000000..e5d04a1
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/SaveAccessoryView.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabContents.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabContents.nib
new file mode 100644
index 0000000..6ec04f3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabContents.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabView.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabView.nib
new file mode 100644
index 0000000..36e3a84
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TabView.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TaskManager.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TaskManager.nib
new file mode 100644
index 0000000..287da3a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/TaskManager.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Toolbar.nib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Toolbar.nib
new file mode 100644
index 0000000..537e24d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/Toolbar.nib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/aliasCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/aliasCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/aliasCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/aliasCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/am.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/am.lproj/locale.pak
new file mode 100644
index 0000000..ab69be9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/am.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak
new file mode 100644
index 0000000..2cfa9f7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ar.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/back_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/back_Template.pdf
new file mode 100644
index 0000000..3e5f25f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/back_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak
new file mode 100644
index 0000000..620ce3e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bg.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak
new file mode 100644
index 0000000..de61cf9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/bn.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak
new file mode 100644
index 0000000..36d81d5
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ca.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/cellCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/cellCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/cellCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/cellCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/chevron.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/chevron.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/chevron.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/chevron.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/chrome.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/chrome.pak
new file mode 100644
index 0000000..6b4fce4
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/chrome.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar.pdf
new file mode 100644
index 0000000..f119b30
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_h.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_h.pdf
new file mode 100644
index 0000000..16489ec
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_h.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_p.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_p.pdf
new file mode 100644
index 0000000..516f5b7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/close_bar_p.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/contextMenuCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/contextMenuCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/contextMenuCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/contextMenuCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/copyCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/copyCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/copyCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/copyCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/crossHairCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/crossHairCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/crossHairCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/crossHairCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak
new file mode 100644
index 0000000..c7091ff
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/cs.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/da.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/da.lproj/locale.pak
new file mode 100644
index 0000000..463cd0d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/da.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/de.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/de.lproj/locale.pak
new file mode 100644
index 0000000..005709f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/de.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/eastResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/eastResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/eastResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/eastResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/eastWestResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/eastWestResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/eastWestResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/eastWestResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/el.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/el.lproj/locale.pak
new file mode 100644
index 0000000..ea01ee7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/el.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en.lproj/locale.pak
new file mode 100644
index 0000000..56af7a9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak
new file mode 100644
index 0000000..6d06d62
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/en_GB.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es.lproj/locale.pak
new file mode 100644
index 0000000..6a850e2
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak
new file mode 100644
index 0000000..8da2c60
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/es_419.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/et.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/et.lproj/locale.pak
new file mode 100644
index 0000000..2b40144
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/et.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak
new file mode 100644
index 0000000..f51e5ca
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fi.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak
new file mode 100644
index 0000000..89e3ca7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fil.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_next_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_next_Template.pdf
new file mode 100644
index 0000000..262f9ba
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_next_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_prev_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_prev_Template.pdf
new file mode 100644
index 0000000..3c25978
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/find_prev_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/forward_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/forward_Template.pdf
new file mode 100644
index 0000000..e1b651f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/forward_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak
new file mode 100644
index 0000000..5cf109f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/fr.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/go_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/go_Template.pdf
new file mode 100644
index 0000000..de4ef4f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/go_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak
new file mode 100644
index 0000000..0ed0f4d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/gu.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/he.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/he.lproj/locale.pak
new file mode 100644
index 0000000..be152fd
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/he.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/helpCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/helpCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/helpCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/helpCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak
new file mode 100644
index 0000000..14b5aab
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hi.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/home_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/home_Template.pdf
new file mode 100644
index 0000000..b1bb7f7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/home_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak
new file mode 100644
index 0000000..9634bfe
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hr.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak
new file mode 100644
index 0000000..8b2136d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/hu.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/id.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/id.lproj/locale.pak
new file mode 100644
index 0000000..cf374d7
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/id.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/DevTools.js b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/DevTools.js
new file mode 100644
index 0000000..8c598b3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/DevTools.js
@@ -0,0 +1,44479 @@
+/* utilities.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+Object.proxyType = function(objectProxy)
+{
+    if (objectProxy === null)
+        return "null";
+
+    var type = typeof objectProxy;
+    if (type !== "object" && type !== "function")
+        return type;
+
+    return objectProxy.type;
+}
+
+Object.properties = function(obj)
+{
+    var properties = [];
+    for (var prop in obj)
+        properties.push(prop);
+    return properties;
+}
+
+Object.sortedProperties = function(obj, sortFunc)
+{
+    return Object.properties(obj).sort(sortFunc);
+}
+
+Function.prototype.bind = function(thisObject)
+{
+    var func = this;
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
+}
+
+Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)
+{
+    var startNode;
+    var startOffset = 0;
+    var endNode;
+    var endOffset = 0;
+
+    if (!stayWithinNode)
+        stayWithinNode = this;
+
+    if (!direction || direction === "backward" || direction === "both") {
+        var node = this;
+        while (node) {
+            if (node === stayWithinNode) {
+                if (!startNode)
+                    startNode = stayWithinNode;
+                break;
+            }
+
+            if (node.nodeType === Node.TEXT_NODE) {
+                var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));
+                for (var i = start; i >= 0; --i) {
+                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
+                        startNode = node;
+                        startOffset = i + 1;
+                        break;
+                    }
+                }
+            }
+
+            if (startNode)
+                break;
+
+            node = node.traversePreviousNode(stayWithinNode);
+        }
+
+        if (!startNode) {
+            startNode = stayWithinNode;
+            startOffset = 0;
+        }
+    } else {
+        startNode = this;
+        startOffset = offset;
+    }
+
+    if (!direction || direction === "forward" || direction === "both") {
+        node = this;
+        while (node) {
+            if (node === stayWithinNode) {
+                if (!endNode)
+                    endNode = stayWithinNode;
+                break;
+            }
+
+            if (node.nodeType === Node.TEXT_NODE) {
+                var start = (node === this ? offset : 0);
+                for (var i = start; i < node.nodeValue.length; ++i) {
+                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
+                        endNode = node;
+                        endOffset = i;
+                        break;
+                    }
+                }
+            }
+
+            if (endNode)
+                break;
+
+            node = node.traverseNextNode(stayWithinNode);
+        }
+
+        if (!endNode) {
+            endNode = stayWithinNode;
+            endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;
+        }
+    } else {
+        endNode = this;
+        endOffset = offset;
+    }
+
+    var result = this.ownerDocument.createRange();
+    result.setStart(startNode, startOffset);
+    result.setEnd(endNode, endOffset);
+
+    return result;
+}
+
+Node.prototype.traverseNextTextNode = function(stayWithin)
+{
+    var node = this.traverseNextNode(stayWithin);
+    if (!node)
+        return;
+
+    while (node && node.nodeType !== Node.TEXT_NODE)
+        node = node.traverseNextNode(stayWithin);
+
+    return node;
+}
+
+Node.prototype.rangeBoundaryForOffset = function(offset)
+{
+    var node = this.traverseNextTextNode(this);
+    while (node && offset > node.nodeValue.length) {
+        offset -= node.nodeValue.length;
+        node = node.traverseNextTextNode(this);
+    }
+    if (!node)
+        return { container: this, offset: 0 };
+    return { container: node, offset: offset };
+}
+
+Element.prototype.removeStyleClass = function(className) 
+{
+    // Test for the simple case first.
+    if (this.className === className) {
+        this.className = "";
+        return;
+    }
+
+    var index = this.className.indexOf(className);
+    if (index === -1)
+        return;
+
+    var newClassName = " " + this.className + " ";
+    this.className = newClassName.replace(" " + className + " ", " ");
+}
+
+Element.prototype.removeMatchingStyleClasses = function(classNameRegex)
+{
+    var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");
+    if (regex.test(this.className))
+        this.className = this.className.replace(regex, " ");
+}
+
+Element.prototype.addStyleClass = function(className) 
+{
+    if (className && !this.hasStyleClass(className))
+        this.className += (this.className.length ? " " + className : className);
+}
+
+Element.prototype.hasStyleClass = function(className) 
+{
+    if (!className)
+        return false;
+    // Test for the simple case
+    if (this.className === className)
+        return true;
+
+    var index = this.className.indexOf(className);
+    if (index === -1)
+        return false;
+    var toTest = " " + this.className + " ";
+    return toTest.indexOf(" " + className + " ", index) !== -1;
+}
+
+Element.prototype.positionAt = function(x, y)
+{
+    this.style.left = x + "px";
+    this.style.top = y + "px";
+}
+
+Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
+{
+    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
+        for (var i = 0; i < nameArray.length; ++i)
+            if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
+                return node;
+    return null;
+}
+
+Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
+{
+    return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);
+}
+
+Node.prototype.enclosingNodeOrSelfWithClass = function(className)
+{
+    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
+        if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))
+            return node;
+    return null;
+}
+
+Node.prototype.enclosingNodeWithClass = function(className)
+{
+    if (!this.parentNode)
+        return null;
+    return this.parentNode.enclosingNodeOrSelfWithClass(className);
+}
+
+Element.prototype.query = function(query) 
+{
+    return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+}
+
+Element.prototype.removeChildren = function()
+{
+    this.innerHTML = "";
+}
+
+Element.prototype.isInsertionCaretInside = function()
+{
+    var selection = window.getSelection();
+    if (!selection.rangeCount || !selection.isCollapsed)
+        return false;
+    var selectionRange = selection.getRangeAt(0);
+    return selectionRange.startContainer === this || selectionRange.startContainer.isDescendant(this);
+}
+
+Element.prototype.__defineGetter__("totalOffsetLeft", function()
+{
+    var total = 0;
+    for (var element = this; element; element = element.offsetParent)
+        total += element.offsetLeft + (this !== element ? element.clientLeft : 0);
+    return total;
+});
+
+Element.prototype.__defineGetter__("totalOffsetTop", function()
+{
+    var total = 0;
+    for (var element = this; element; element = element.offsetParent)
+        total += element.offsetTop + (this !== element ? element.clientTop : 0);
+    return total;
+});
+
+Element.prototype.offsetRelativeToWindow = function(targetWindow)
+{
+    var elementOffset = {x: 0, y: 0};
+    var curElement = this;
+    var curWindow = this.ownerDocument.defaultView;
+    while (curWindow && curElement) {
+        elementOffset.x += curElement.totalOffsetLeft;
+        elementOffset.y += curElement.totalOffsetTop;
+        if (curWindow === targetWindow)
+            break;
+
+        curElement = curWindow.frameElement;
+        curWindow = curWindow.parent;
+    }
+
+    return elementOffset;
+}
+
+Node.prototype.isWhitespace = isNodeWhitespace;
+Node.prototype.displayName = nodeDisplayName;
+Node.prototype.isAncestor = function(node)
+{
+    return isAncestorNode(this, node);
+};
+Node.prototype.isDescendant = isDescendantNode;
+Node.prototype.traverseNextNode = traverseNextNode;
+Node.prototype.traversePreviousNode = traversePreviousNode;
+Node.prototype.onlyTextChild = onlyTextChild;
+
+String.prototype.hasSubstring = function(string, caseInsensitive)
+{
+    if (!caseInsensitive)
+        return this.indexOf(string) !== -1;
+    return this.match(new RegExp(string.escapeForRegExp(), "i"));
+}
+
+String.prototype.escapeCharacters = function(chars)
+{
+    var foundChar = false;
+    for (var i = 0; i < chars.length; ++i) {
+        if (this.indexOf(chars.charAt(i)) !== -1) {
+            foundChar = true;
+            break;
+        }
+    }
+
+    if (!foundChar)
+        return this;
+
+    var result = "";
+    for (var i = 0; i < this.length; ++i) {
+        if (chars.indexOf(this.charAt(i)) !== -1)
+            result += "\\";
+        result += this.charAt(i);
+    }
+
+    return result;
+}
+
+String.prototype.escapeForRegExp = function()
+{
+    return this.escapeCharacters("^[]{}()\\.$*+?|");
+}
+
+String.prototype.escapeHTML = function()
+{
+    return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+}
+
+String.prototype.collapseWhitespace = function()
+{
+    return this.replace(/[\s\xA0]+/g, " ");
+}
+
+String.prototype.trimURL = function(baseURLDomain)
+{
+    var result = this.replace(/^https?:\/\//i, "");
+    if (baseURLDomain)
+        result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");
+    return result;
+}
+
+function isNodeWhitespace()
+{
+    if (!this || this.nodeType !== Node.TEXT_NODE)
+        return false;
+    if (!this.nodeValue.length)
+        return true;
+    return this.nodeValue.match(/^[\s\xA0]+$/);
+}
+
+function nodeDisplayName()
+{
+    if (!this)
+        return "";
+
+    switch (this.nodeType) {
+        case Node.DOCUMENT_NODE:
+            return "Document";
+
+        case Node.ELEMENT_NODE:
+            var name = "<" + this.nodeName.toLowerCase();
+
+            if (this.hasAttributes()) {
+                var value = this.getAttribute("id");
+                if (value)
+                    name += " id=\"" + value + "\"";
+                value = this.getAttribute("class");
+                if (value)
+                    name += " class=\"" + value + "\"";
+                if (this.nodeName.toLowerCase() === "a") {
+                    value = this.getAttribute("name");
+                    if (value)
+                        name += " name=\"" + value + "\"";
+                    value = this.getAttribute("href");
+                    if (value)
+                        name += " href=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "img") {
+                    value = this.getAttribute("src");
+                    if (value)
+                        name += " src=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "iframe") {
+                    value = this.getAttribute("src");
+                    if (value)
+                        name += " src=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "input") {
+                    value = this.getAttribute("name");
+                    if (value)
+                        name += " name=\"" + value + "\"";
+                    value = this.getAttribute("type");
+                    if (value)
+                        name += " type=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "form") {
+                    value = this.getAttribute("action");
+                    if (value)
+                        name += " action=\"" + value + "\"";
+                }
+            }
+
+            return name + ">";
+
+        case Node.TEXT_NODE:
+            if (isNodeWhitespace.call(this))
+                return "(whitespace)";
+            return "\"" + this.nodeValue + "\"";
+
+        case Node.COMMENT_NODE:
+            return "<!--" + this.nodeValue + "-->";
+            
+        case Node.DOCUMENT_TYPE_NODE:
+            var docType = "<!DOCTYPE " + this.nodeName;
+            if (this.publicId) {
+                docType += " PUBLIC \"" + this.publicId + "\"";
+                if (this.systemId)
+                    docType += " \"" + this.systemId + "\"";
+            } else if (this.systemId)
+                docType += " SYSTEM \"" + this.systemId + "\"";
+            if (this.internalSubset)
+                docType += " [" + this.internalSubset + "]";
+            return docType + ">";
+    }
+
+    return this.nodeName.toLowerCase().collapseWhitespace();
+}
+
+function isAncestorNode(ancestor, node)
+{
+    if (!node || !ancestor)
+        return false;
+
+    var currentNode = node.parentNode;
+    while (currentNode) {
+        if (ancestor === currentNode)
+            return true;
+        currentNode = currentNode.parentNode;
+    }
+    return false;
+}
+
+function isDescendantNode(descendant)
+{
+    return isAncestorNode(descendant, this);
+}
+
+function traverseNextNode(stayWithin)
+{
+    if (!this)
+        return;
+
+    var node = this.firstChild;
+    if (node)
+        return node;
+
+    if (stayWithin && this === stayWithin)
+        return null;
+
+    node = this.nextSibling;
+    if (node)
+        return node;
+
+    node = this;
+    while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
+        node = node.parentNode;
+    if (!node)
+        return null;
+
+    return node.nextSibling;
+}
+
+function traversePreviousNode(stayWithin)
+{
+    if (!this)
+        return;
+    if (stayWithin && this === stayWithin)
+        return null;
+    var node = this.previousSibling;
+    while (node && node.lastChild)
+        node = node.lastChild;
+    if (node)
+        return node;
+    return this.parentNode;
+}
+
+function onlyTextChild()
+{
+    if (!this)
+        return null;
+
+    var firstChild = this.firstChild;
+    if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)
+        return null;
+
+    var sibling = firstChild.nextSibling;
+    return sibling ? null : firstChild;
+}
+
+function appropriateSelectorForNode(node, justSelector)
+{
+    if (!node)
+        return "";
+
+    var lowerCaseName = node.localName || node.nodeName.toLowerCase();
+
+    var id = node.getAttribute("id");
+    if (id) {
+        var selector = "#" + id;
+        return (justSelector ? selector : lowerCaseName + selector);
+    }
+
+    var className = node.getAttribute("class");
+    if (className) {
+        var selector = "." + className.replace(/\s+/, ".");
+        return (justSelector ? selector : lowerCaseName + selector);
+    }
+
+    if (lowerCaseName === "input" && node.getAttribute("type"))
+        return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";
+
+    return lowerCaseName;
+}
+
+function getDocumentForNode(node)
+{
+    return node.nodeType == Node.DOCUMENT_NODE ? node : node.ownerDocument;
+}
+
+function parentNode(node)
+{
+    return node.parentNode;
+}
+
+Number.secondsToString = function(seconds, formatterFunction, higherResolution)
+{
+    if (!formatterFunction)
+        formatterFunction = String.sprintf;
+
+    if (seconds === 0)
+        return "0";
+
+    var ms = seconds * 1000;
+    if (higherResolution && ms < 1000)
+        return formatterFunction("%.3fms", ms);
+    else if (ms < 1000)
+        return formatterFunction("%.0fms", ms);
+
+    if (seconds < 60)
+        return formatterFunction("%.2fs", seconds);
+
+    var minutes = seconds / 60;
+    if (minutes < 60)
+        return formatterFunction("%.1fmin", minutes);
+
+    var hours = minutes / 60;
+    if (hours < 24)
+        return formatterFunction("%.1fhrs", hours);
+
+    var days = hours / 24;
+    return formatterFunction("%.1f days", days);
+}
+
+Number.bytesToString = function(bytes, formatterFunction, higherResolution)
+{
+    if (!formatterFunction)
+        formatterFunction = String.sprintf;
+    if (typeof higherResolution === "undefined")
+        higherResolution = true;
+
+    if (bytes < 1024)
+        return formatterFunction("%.0fB", bytes);
+
+    var kilobytes = bytes / 1024;
+    if (higherResolution && kilobytes < 1024)
+        return formatterFunction("%.2fKB", kilobytes);
+    else if (kilobytes < 1024)
+        return formatterFunction("%.0fKB", kilobytes);
+
+    var megabytes = kilobytes / 1024;
+    if (higherResolution)
+        return formatterFunction("%.3fMB", megabytes);
+    else
+        return formatterFunction("%.0fMB", megabytes);
+}
+
+Number.constrain = function(num, min, max)
+{
+    if (num < min)
+        num = min;
+    else if (num > max)
+        num = max;
+    return num;
+}
+
+HTMLTextAreaElement.prototype.moveCursorToEnd = function()
+{
+    var length = this.value.length;
+    this.setSelectionRange(length, length);
+}
+
+Array.prototype.remove = function(value, onlyFirst)
+{
+    if (onlyFirst) {
+        var index = this.indexOf(value);
+        if (index !== -1)
+            this.splice(index, 1);
+        return;
+    }
+
+    var length = this.length;
+    for (var i = 0; i < length; ++i) {
+        if (this[i] === value)
+            this.splice(i, 1);
+    }
+}
+
+Array.prototype.keySet = function()
+{
+    var keys = {};
+    for (var i = 0; i < this.length; ++i)
+        keys[this[i]] = true;
+    return keys;
+}
+
+function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)
+{
+    // indexOf returns (-lowerBound - 1). Taking (-result - 1) works out to lowerBound.
+    return (-indexOfObjectInListSortedByFunction(anObject, aList, aFunction) - 1);
+}
+
+function indexOfObjectInListSortedByFunction(anObject, aList, aFunction)
+{
+    var first = 0;
+    var last = aList.length - 1;
+    var floor = Math.floor;
+    var mid, c;
+
+    while (first <= last) {
+        mid = floor((first + last) / 2);
+        c = aFunction(anObject, aList[mid]);
+
+        if (c > 0)
+            first = mid + 1;
+        else if (c < 0)
+            last = mid - 1;
+        else {
+            // Return the first occurance of an item in the list.
+            while (mid > 0 && aFunction(anObject, aList[mid - 1]) === 0)
+                mid--;
+            first = mid;
+            break;
+        }
+    }
+
+    // By returning 1 less than the negative lower search bound, we can reuse this function
+    // for both indexOf and insertionIndexFor, with some simple arithmetic.
+    return (-first - 1);
+}
+
+String.sprintf = function(format)
+{
+    return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));
+}
+
+String.tokenizeFormatString = function(format)
+{
+    var tokens = [];
+    var substitutionIndex = 0;
+
+    function addStringToken(str)
+    {
+        tokens.push({ type: "string", value: str });
+    }
+
+    function addSpecifierToken(specifier, precision, substitutionIndex)
+    {
+        tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });
+    }
+
+    var index = 0;
+    for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {
+        addStringToken(format.substring(index, precentIndex));
+        index = precentIndex + 1;
+
+        if (format[index] === "%") {
+            addStringToken("%");
+            ++index;
+            continue;
+        }
+
+        if (!isNaN(format[index])) {
+            // The first character is a number, it might be a substitution index.
+            var number = parseInt(format.substring(index));
+            while (!isNaN(format[index]))
+                ++index;
+            // If the number is greater than zero and ends with a "$",
+            // then this is a substitution index.
+            if (number > 0 && format[index] === "$") {
+                substitutionIndex = (number - 1);
+                ++index;
+            }
+        }
+
+        var precision = -1;
+        if (format[index] === ".") {
+            // This is a precision specifier. If no digit follows the ".",
+            // then the precision should be zero.
+            ++index;
+            precision = parseInt(format.substring(index));
+            if (isNaN(precision))
+                precision = 0;
+            while (!isNaN(format[index]))
+                ++index;
+        }
+
+        addSpecifierToken(format[index], precision, substitutionIndex);
+
+        ++substitutionIndex;
+        ++index;
+    }
+
+    addStringToken(format.substring(index));
+
+    return tokens;
+}
+
+String.standardFormatters = {
+    d: function(substitution)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+            substitution = substitution.description;
+        substitution = parseInt(substitution);
+        return !isNaN(substitution) ? substitution : 0;
+    },
+
+    f: function(substitution, token)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+            substitution = substitution.description;
+        substitution = parseFloat(substitution);
+        if (substitution && token.precision > -1)
+            substitution = substitution.toFixed(token.precision);
+        return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);
+    },
+
+    s: function(substitution)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) !== "null")
+            substitution = substitution.description;
+        return substitution;
+    },
+};
+
+String.vsprintf = function(format, substitutions)
+{
+    return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;
+}
+
+String.format = function(format, substitutions, formatters, initialValue, append)
+{
+    if (!format || !substitutions || !substitutions.length)
+        return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };
+
+    function prettyFunctionName()
+    {
+        return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";
+    }
+
+    function warn(msg)
+    {
+        console.warn(prettyFunctionName() + ": " + msg);
+    }
+
+    function error(msg)
+    {
+        console.error(prettyFunctionName() + ": " + msg);
+    }
+
+    var result = initialValue;
+    var tokens = String.tokenizeFormatString(format);
+    var usedSubstitutionIndexes = {};
+
+    for (var i = 0; i < tokens.length; ++i) {
+        var token = tokens[i];
+
+        if (token.type === "string") {
+            result = append(result, token.value);
+            continue;
+        }
+
+        if (token.type !== "specifier") {
+            error("Unknown token type \"" + token.type + "\" found.");
+            continue;
+        }
+
+        if (token.substitutionIndex >= substitutions.length) {
+            // If there are not enough substitutions for the current substitutionIndex
+            // just output the format specifier literally and move on.
+            error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");
+            result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);
+            continue;
+        }
+
+        usedSubstitutionIndexes[token.substitutionIndex] = true;
+
+        if (!(token.specifier in formatters)) {
+            // Encountered an unsupported format character, treat as a string.
+            warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");
+            result = append(result, substitutions[token.substitutionIndex]);
+            continue;
+        }
+
+        result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
+    }
+
+    var unusedSubstitutions = [];
+    for (var i = 0; i < substitutions.length; ++i) {
+        if (i in usedSubstitutionIndexes)
+            continue;
+        unusedSubstitutions.push(substitutions[i]);
+    }
+
+    return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
+}
+
+function isEnterKey(event) {
+    // Check if in IME.
+    return event.keyCode !== 229 && event.keyIdentifier === "Enter";
+}
+
+
+function highlightSearchResult(element, offset, length)
+{
+    var lineText = element.textContent;
+    var endOffset = offset + length;
+    var highlightNode = document.createElement("span");
+    highlightNode.className = "webkit-search-result";
+    highlightNode.textContent = lineText.substring(offset, endOffset);
+
+    var boundary = element.rangeBoundaryForOffset(offset);
+    var textNode = boundary.container;
+    var text = textNode.textContent;
+
+    if (boundary.offset + length < text.length) {
+        // Selection belong to a single split mode.
+        textNode.textContent = text.substring(boundary.offset + length);
+        textNode.parentElement.insertBefore(highlightNode, textNode);
+        var prefixNode = document.createTextNode(text.substring(0, boundary.offset));
+        textNode.parentElement.insertBefore(prefixNode, highlightNode);
+        return highlightNode;
+    }
+
+    var parentElement = textNode.parentElement;
+    var anchorElement = textNode.nextSibling;
+
+    length -= text.length - boundary.offset;
+    textNode.textContent = text.substring(0, boundary.offset);
+    textNode = textNode.traverseNextTextNode(element);
+
+    while (textNode) {
+        var text = textNode.textContent;
+        if (length < text.length) {
+            textNode.textContent = text.substring(length);
+            break;
+        }
+
+        length -= text.length;
+        textNode.textContent = "";
+        textNode = textNode.traverseNextTextNode(element);
+    }
+
+    parentElement.insertBefore(highlightNode, anchorElement);
+    return highlightNode;
+}
+
+function createSearchRegex(query)
+{
+    var regex = "";
+    for (var i = 0; i < query.length; ++i) {
+        var char = query.charAt(i);
+        if (char === "]")
+            char = "\\]";
+        regex += "[" + char + "]";
+    }
+    return new RegExp(regex, "i");
+}
+
+/* treeoutline.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function TreeOutline(listNode)
+{
+    this.children = [];
+    this.selectedTreeElement = null;
+    this._childrenListNode = listNode;
+    this._childrenListNode.removeChildren();
+    this._knownTreeElements = [];
+    this._treeElementsExpandedState = [];
+    this.expandTreeElementsWhenArrowing = false;
+    this.root = true;
+    this.hasChildren = false;
+    this.expanded = true;
+    this.selected = false;
+    this.treeOutline = this;
+
+    this._childrenListNode.tabIndex = 0;
+    this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
+}
+
+TreeOutline._knownTreeElementNextIdentifier = 1;
+
+TreeOutline._appendChild = function(child)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var lastChild = this.children[this.children.length - 1];
+    if (lastChild) {
+        lastChild.nextSibling = child;
+        child.previousSibling = lastChild;
+    } else {
+        child.previousSibling = null;
+        child.nextSibling = null;
+    }
+
+    this.children.push(child);
+    this.hasChildren = true;
+    child.parent = this;
+    child.treeOutline = this.treeOutline;
+    child.treeOutline._rememberTreeElement(child);
+
+    var current = child.children[0];
+    while (current) {
+        current.treeOutline = this.treeOutline;
+        current.treeOutline._rememberTreeElement(current);
+        current = current.traverseNextTreeElement(false, child, true);
+    }
+
+    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
+        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
+
+    if (!this._childrenListNode) {
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+    }
+
+    child._attach();
+}
+
+TreeOutline._insertChild = function(child, index)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var previousChild = (index > 0 ? this.children[index - 1] : null);
+    if (previousChild) {
+        previousChild.nextSibling = child;
+        child.previousSibling = previousChild;
+    } else {
+        child.previousSibling = null;
+    }
+
+    var nextChild = this.children[index];
+    if (nextChild) {
+        nextChild.previousSibling = child;
+        child.nextSibling = nextChild;
+    } else {
+        child.nextSibling = null;
+    }
+
+    this.children.splice(index, 0, child);
+    this.hasChildren = true;
+    child.parent = this;
+    child.treeOutline = this.treeOutline;
+    child.treeOutline._rememberTreeElement(child);
+
+    var current = child.children[0];
+    while (current) {
+        current.treeOutline = this.treeOutline;
+        current.treeOutline._rememberTreeElement(current);
+        current = current.traverseNextTreeElement(false, child, true);
+    }
+
+    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
+        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
+
+    if (!this._childrenListNode) {
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+    }
+
+    child._attach();
+}
+
+TreeOutline._removeChildAtIndex = function(childIndex)
+{
+    if (childIndex < 0 || childIndex >= this.children.length)
+        throw("childIndex out of range");
+
+    var child = this.children[childIndex];
+    this.children.splice(childIndex, 1);
+
+    var parent = child.parent;
+    if (child.deselect()) {
+        if (child.previousSibling)
+            child.previousSibling.select();
+        else if (child.nextSibling)
+            child.nextSibling.select();
+        else
+            parent.select();
+    }
+
+    if (child.previousSibling)
+        child.previousSibling.nextSibling = child.nextSibling;
+    if (child.nextSibling)
+        child.nextSibling.previousSibling = child.previousSibling;
+
+    if (child.treeOutline) {
+        child.treeOutline._forgetTreeElement(child);
+        child.treeOutline._forgetChildrenRecursive(child);
+    }
+
+    child._detach();
+    child.treeOutline = null;
+    child.parent = null;
+    child.nextSibling = null;
+    child.previousSibling = null;
+}
+
+TreeOutline._removeChild = function(child)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var childIndex = this.children.indexOf(child);
+    if (childIndex === -1)
+        throw("child not found in this node's children");
+
+    TreeOutline._removeChildAtIndex.call(this, childIndex);
+}
+
+TreeOutline._removeChildren = function()
+{
+    for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i];
+        child.deselect();
+
+        if (child.treeOutline) {
+            child.treeOutline._forgetTreeElement(child);
+            child.treeOutline._forgetChildrenRecursive(child);
+        }
+
+        child._detach();
+        child.treeOutline = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+    }
+
+    this.children = [];
+}
+
+TreeOutline._removeChildrenRecursive = function()
+{
+    var childrenToRemove = this.children;
+
+    var child = this.children[0];
+    while (child) {
+        if (child.children.length)
+            childrenToRemove = childrenToRemove.concat(child.children);
+        child = child.traverseNextTreeElement(false, this, true);
+    }
+
+    for (var i = 0; i < childrenToRemove.length; ++i) {
+        var child = childrenToRemove[i];
+        child.deselect();
+        if (child.treeOutline)
+            child.treeOutline._forgetTreeElement(child);
+        child._detach();
+        child.children = [];
+        child.treeOutline = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+    }
+
+    this.children = [];
+}
+
+TreeOutline.prototype._rememberTreeElement = function(element)
+{
+    if (!this._knownTreeElements[element.identifier])
+        this._knownTreeElements[element.identifier] = [];
+
+    // check if the element is already known
+    var elements = this._knownTreeElements[element.identifier];
+    if (elements.indexOf(element) !== -1)
+        return;
+
+    // add the element
+    elements.push(element);
+}
+
+TreeOutline.prototype._forgetTreeElement = function(element)
+{
+    if (this._knownTreeElements[element.identifier])
+        this._knownTreeElements[element.identifier].remove(element, true);
+}
+
+TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)
+{
+    var child = parentElement.children[0];
+    while (child) {
+        this._forgetTreeElement(child);
+        child = child.traverseNextTreeElement(false, this, true);
+    }
+}
+
+TreeOutline.prototype.getCachedTreeElement = function(representedObject)
+{
+    if (!representedObject)
+        return null;
+
+    if ("__treeElementIdentifier" in representedObject) {
+        // If this representedObject has a tree element identifier, and it is a known TreeElement
+        // in our tree we can just return that tree element.
+        var elements = this._knownTreeElements[representedObject.__treeElementIdentifier];
+        if (elements) {
+            for (var i = 0; i < elements.length; ++i)
+                if (elements[i].representedObject === representedObject)
+                    return elements[i];
+        }
+    }
+    return null;
+}
+
+TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)
+{
+    if (!representedObject)
+        return null;
+
+    var cachedElement = this.getCachedTreeElement(representedObject);
+    if (cachedElement)
+        return cachedElement;
+
+    // The representedObject isn't know, so we start at the top of the tree and work down to find the first
+    // tree element that represents representedObject or one of its ancestors.
+    var item;
+    var found = false;
+    for (var i = 0; i < this.children.length; ++i) {
+        item = this.children[i];
+        if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
+            found = true;
+            break;
+        }
+    }
+
+    if (!found)
+        return null;
+
+    // Make sure the item that we found is connected to the root of the tree.
+    // Build up a list of representedObject's ancestors that aren't already in our tree.
+    var ancestors = [];
+    var currentObject = representedObject;
+    while (currentObject) {
+        ancestors.unshift(currentObject);
+        if (currentObject === item.representedObject)
+            break;
+        currentObject = getParent(currentObject);
+    }
+
+    // For each of those ancestors we populate them to fill in the tree.
+    for (var i = 0; i < ancestors.length; ++i) {
+        // Make sure we don't call findTreeElement with the same representedObject
+        // again, to prevent infinite recursion.
+        if (ancestors[i] === representedObject)
+            continue;
+        // FIXME: we could do something faster than findTreeElement since we will know the next
+        // ancestor exists in the tree.
+        item = this.findTreeElement(ancestors[i], isAncestor, getParent);
+        if (item && item.onpopulate)
+            item.onpopulate(item);
+    }
+
+    return this.getCachedTreeElement(representedObject);
+}
+
+TreeOutline.prototype.treeElementFromPoint = function(x, y)
+{
+    var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);
+    var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);
+    if (listNode)
+        return listNode.parentTreeElement || listNode.treeElement;
+    return null;
+}
+
+TreeOutline.prototype._treeKeyDown = function(event)
+{
+    if (event.target !== this._childrenListNode)
+        return;
+
+    if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
+        return;
+
+    var handled = false;
+    var nextSelectedElement;
+    if (event.keyIdentifier === "Up" && !event.altKey) {
+        nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
+        while (nextSelectedElement && !nextSelectedElement.selectable)
+            nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
+        handled = nextSelectedElement ? true : false;
+    } else if (event.keyIdentifier === "Down" && !event.altKey) {
+        nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
+        while (nextSelectedElement && !nextSelectedElement.selectable)
+            nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
+        handled = nextSelectedElement ? true : false;
+    } else if (event.keyIdentifier === "Left") {
+        if (this.selectedTreeElement.expanded) {
+            if (event.altKey)
+                this.selectedTreeElement.collapseRecursively();
+            else
+                this.selectedTreeElement.collapse();
+            handled = true;
+        } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {
+            handled = true;
+            if (this.selectedTreeElement.parent.selectable) {
+                nextSelectedElement = this.selectedTreeElement.parent;
+                handled = nextSelectedElement ? true : false;
+            } else if (this.selectedTreeElement.parent)
+                this.selectedTreeElement.parent.collapse();
+        }
+    } else if (event.keyIdentifier === "Right") {
+        if (!this.selectedTreeElement.revealed()) {
+            this.selectedTreeElement.reveal();
+            handled = true;
+        } else if (this.selectedTreeElement.hasChildren) {
+            handled = true;
+            if (this.selectedTreeElement.expanded) {
+                nextSelectedElement = this.selectedTreeElement.children[0];
+                handled = nextSelectedElement ? true : false;
+            } else {
+                if (event.altKey)
+                    this.selectedTreeElement.expandRecursively();
+                else
+                    this.selectedTreeElement.expand();
+            }
+        }
+    }
+
+    if (nextSelectedElement) {
+        nextSelectedElement.reveal();
+        nextSelectedElement.select();
+    }
+
+    if (handled) {
+        event.preventDefault();
+        event.stopPropagation();
+    }
+}
+
+TreeOutline.prototype.expand = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.collapse = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.revealed = function()
+{
+    return true;
+}
+
+TreeOutline.prototype.reveal = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.appendChild = TreeOutline._appendChild;
+TreeOutline.prototype.insertChild = TreeOutline._insertChild;
+TreeOutline.prototype.removeChild = TreeOutline._removeChild;
+TreeOutline.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
+TreeOutline.prototype.removeChildren = TreeOutline._removeChildren;
+TreeOutline.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
+
+function TreeElement(title, representedObject, hasChildren)
+{
+    this._title = title;
+    this.representedObject = (representedObject || {});
+
+    if (this.representedObject.__treeElementIdentifier)
+        this.identifier = this.representedObject.__treeElementIdentifier;
+    else {
+        this.identifier = TreeOutline._knownTreeElementNextIdentifier++;
+        this.representedObject.__treeElementIdentifier = this.identifier;
+    }
+
+    this._hidden = false;
+    this.expanded = false;
+    this.selected = false;
+    this.hasChildren = hasChildren;
+    this.children = [];
+    this.treeOutline = null;
+    this.parent = null;
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this._listItemNode = null;
+}
+
+TreeElement.prototype = {
+    selectable: true,
+    arrowToggleWidth: 10,
+
+    get listItemElement() {
+        return this._listItemNode;
+    },
+
+    get childrenListElement() {
+        return this._childrenListNode;
+    },
+
+    get title() {
+        return this._title;
+    },
+
+    set title(x) {
+        this._title = x;
+        if (this._listItemNode)
+            this._listItemNode.innerHTML = x;
+    },
+
+    get tooltip() {
+        return this._tooltip;
+    },
+
+    set tooltip(x) {
+        this._tooltip = x;
+        if (this._listItemNode)
+            this._listItemNode.title = x ? x : "";
+    },
+
+    get hasChildren() {
+        return this._hasChildren;
+    },
+
+    set hasChildren(x) {
+        if (this._hasChildren === x)
+            return;
+
+        this._hasChildren = x;
+
+        if (!this._listItemNode)
+            return;
+
+        if (x)
+            this._listItemNode.addStyleClass("parent");
+        else {
+            this._listItemNode.removeStyleClass("parent");
+            this.collapse();
+        }
+    },
+
+    get hidden() {
+        return this._hidden;
+    },
+
+    set hidden(x) {
+        if (this._hidden === x)
+            return;
+
+        this._hidden = x;
+
+        if (x) {
+            if (this._listItemNode)
+                this._listItemNode.addStyleClass("hidden");
+            if (this._childrenListNode)
+                this._childrenListNode.addStyleClass("hidden");
+        } else {
+            if (this._listItemNode)
+                this._listItemNode.removeStyleClass("hidden");
+            if (this._childrenListNode)
+                this._childrenListNode.removeStyleClass("hidden");
+        }
+    },
+
+    get shouldRefreshChildren() {
+        return this._shouldRefreshChildren;
+    },
+
+    set shouldRefreshChildren(x) {
+        this._shouldRefreshChildren = x;
+        if (x && this.expanded)
+            this.expand();
+    }
+}
+
+TreeElement.prototype.appendChild = TreeOutline._appendChild;
+TreeElement.prototype.insertChild = TreeOutline._insertChild;
+TreeElement.prototype.removeChild = TreeOutline._removeChild;
+TreeElement.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
+TreeElement.prototype.removeChildren = TreeOutline._removeChildren;
+TreeElement.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
+
+TreeElement.prototype._attach = function()
+{
+    if (!this._listItemNode || this.parent._shouldRefreshChildren) {
+        if (this._listItemNode && this._listItemNode.parentNode)
+            this._listItemNode.parentNode.removeChild(this._listItemNode);
+
+        this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");
+        this._listItemNode.treeElement = this;
+        this._listItemNode.innerHTML = this._title;
+        this._listItemNode.title = this._tooltip ? this._tooltip : "";
+
+        if (this.hidden)
+            this._listItemNode.addStyleClass("hidden");
+        if (this.hasChildren)
+            this._listItemNode.addStyleClass("parent");
+        if (this.expanded)
+            this._listItemNode.addStyleClass("expanded");
+        if (this.selected)
+            this._listItemNode.addStyleClass("selected");
+
+        this._listItemNode.addEventListener("mousedown", TreeElement.treeElementSelected, false);
+        this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);
+        this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);
+
+        if (this.onattach)
+            this.onattach(this);
+    }
+
+    var nextSibling = null;
+    if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)
+        nextSibling = this.nextSibling._listItemNode;
+    this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);
+    if (this._childrenListNode)
+        this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
+    if (this.selected)
+        this.select();
+    if (this.expanded)
+        this.expand();
+}
+
+TreeElement.prototype._detach = function()
+{
+    if (this._listItemNode && this._listItemNode.parentNode)
+        this._listItemNode.parentNode.removeChild(this._listItemNode);
+    if (this._childrenListNode && this._childrenListNode.parentNode)
+        this._childrenListNode.parentNode.removeChild(this._childrenListNode);
+}
+
+TreeElement.treeElementSelected = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement || !element.treeElement.selectable)
+        return;
+
+    if (element.treeElement.isEventWithinDisclosureTriangle(event))
+        return;
+
+    element.treeElement.select();
+}
+
+TreeElement.treeElementToggled = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement)
+        return;
+
+    if (!element.treeElement.isEventWithinDisclosureTriangle(event))
+        return;
+
+    if (element.treeElement.expanded) {
+        if (event.altKey)
+            element.treeElement.collapseRecursively();
+        else
+            element.treeElement.collapse();
+    } else {
+        if (event.altKey)
+            element.treeElement.expandRecursively();
+        else
+            element.treeElement.expand();
+    }
+}
+
+TreeElement.treeElementDoubleClicked = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement)
+        return;
+
+    if (element.treeElement.ondblclick)
+        element.treeElement.ondblclick.call(element.treeElement, event);
+    else if (element.treeElement.hasChildren && !element.treeElement.expanded)
+        element.treeElement.expand();
+}
+
+TreeElement.prototype.collapse = function()
+{
+    if (this._listItemNode)
+        this._listItemNode.removeStyleClass("expanded");
+    if (this._childrenListNode)
+        this._childrenListNode.removeStyleClass("expanded");
+
+    this.expanded = false;
+    if (this.treeOutline)
+        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
+
+    if (this.oncollapse)
+        this.oncollapse(this);
+}
+
+TreeElement.prototype.collapseRecursively = function()
+{
+    var item = this;
+    while (item) {
+        if (item.expanded)
+            item.collapse();
+        item = item.traverseNextTreeElement(false, this, true);
+    }
+}
+
+TreeElement.prototype.expand = function()
+{
+    if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))
+        return;
+
+    if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {
+        if (this._childrenListNode && this._childrenListNode.parentNode)
+            this._childrenListNode.parentNode.removeChild(this._childrenListNode);
+
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+
+        if (this.onpopulate)
+            this.onpopulate(this);
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i]._attach();
+
+        delete this._shouldRefreshChildren;
+    }
+
+    if (this._listItemNode) {
+        this._listItemNode.addStyleClass("expanded");
+        if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)
+            this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
+    }
+
+    if (this._childrenListNode)
+        this._childrenListNode.addStyleClass("expanded");
+
+    this.expanded = true;
+    if (this.treeOutline)
+        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
+
+    if (this.onexpand)
+        this.onexpand(this);
+}
+
+TreeElement.prototype.expandRecursively = function(maxDepth)
+{
+    var item = this;
+    var info = {};
+    var depth = 0;
+
+    // The Inspector uses TreeOutlines to represents object properties, so recursive expansion
+    // in some case can be infinite, since JavaScript objects can hold circular references.
+    // So default to a recursion cap of 3 levels, since that gives fairly good results.
+    if (typeof maxDepth === "undefined" || typeof maxDepth === "null")
+        maxDepth = 3;
+
+    while (item) {
+        if (depth < maxDepth)
+            item.expand();
+        item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);
+        depth += info.depthChange;
+    }
+}
+
+TreeElement.prototype.hasAncestor = function(ancestor) {
+    if (!ancestor)
+        return false;
+
+    var currentNode = this.parent;
+    while (currentNode) {
+        if (ancestor === currentNode)
+            return true;
+        currentNode = currentNode.parent;
+    }
+
+    return false;
+}
+
+TreeElement.prototype.reveal = function()
+{
+    var currentAncestor = this.parent;
+    while (currentAncestor && !currentAncestor.root) {
+        if (!currentAncestor.expanded)
+            currentAncestor.expand();
+        currentAncestor = currentAncestor.parent;
+    }
+
+    if (this.onreveal)
+        this.onreveal(this);
+}
+
+TreeElement.prototype.revealed = function()
+{
+    var currentAncestor = this.parent;
+    while (currentAncestor && !currentAncestor.root) {
+        if (!currentAncestor.expanded)
+            return false;
+        currentAncestor = currentAncestor.parent;
+    }
+
+    return true;
+}
+
+TreeElement.prototype.select = function(supressOnSelect)
+{
+    if (!this.treeOutline || !this.selectable || this.selected)
+        return;
+
+    if (this.treeOutline.selectedTreeElement)
+        this.treeOutline.selectedTreeElement.deselect();
+
+    this.selected = true;
+    this.treeOutline._childrenListNode.focus();
+    this.treeOutline.selectedTreeElement = this;
+    if (this._listItemNode)
+        this._listItemNode.addStyleClass("selected");
+
+    if (this.onselect && !supressOnSelect)
+        this.onselect(this);
+}
+
+TreeElement.prototype.deselect = function(supressOnDeselect)
+{
+    if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
+        return false;
+
+    this.selected = false;
+    this.treeOutline.selectedTreeElement = null;
+    if (this._listItemNode)
+        this._listItemNode.removeStyleClass("selected");
+
+    if (this.ondeselect && !supressOnDeselect)
+        this.ondeselect(this);
+    return true;
+}
+
+TreeElement.prototype.traverseNextTreeElement = function(skipHidden, stayWithin, dontPopulate, info)
+{
+    if (!dontPopulate && this.hasChildren && this.onpopulate)
+        this.onpopulate(this);
+
+    if (info)
+        info.depthChange = 0;
+
+    var element = skipHidden ? (this.revealed() ? this.children[0] : null) : this.children[0];
+    if (element && (!skipHidden || (skipHidden && this.expanded))) {
+        if (info)
+            info.depthChange = 1;
+        return element;
+    }
+
+    if (this === stayWithin)
+        return null;
+
+    element = skipHidden ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;
+    if (element)
+        return element;
+
+    element = this;
+    while (element && !element.root && !(skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {
+        if (info)
+            info.depthChange -= 1;
+        element = element.parent;
+    }
+
+    if (!element)
+        return null;
+
+    return (skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);
+}
+
+TreeElement.prototype.traversePreviousTreeElement = function(skipHidden, dontPopulate)
+{
+    var element = skipHidden ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;
+    if (!dontPopulate && element && element.hasChildren && element.onpopulate)
+        element.onpopulate(element);
+
+    while (element && (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {
+        if (!dontPopulate && element.hasChildren && element.onpopulate)
+            element.onpopulate(element);
+        element = (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);
+    }
+
+    if (element)
+        return element;
+
+    if (!this.parent || this.parent.root)
+        return null;
+
+    return this.parent;
+}
+
+TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
+{
+    var left = this._listItemNode.totalOffsetLeft;
+    return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
+}
+
+/* inspector.js */
+
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2007 Matt Lilek ([email protected]).
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function preloadImages()
+{
+    (new Image()).src = "Images/clearConsoleButtonGlyph.png";
+    (new Image()).src = "Images/consoleButtonGlyph.png";
+    (new Image()).src = "Images/dockButtonGlyph.png";
+    (new Image()).src = "Images/enableOutlineButtonGlyph.png";
+    (new Image()).src = "Images/enableSolidButtonGlyph.png";
+    (new Image()).src = "Images/excludeButtonGlyph.png";
+    (new Image()).src = "Images/focusButtonGlyph.png";
+    (new Image()).src = "Images/largerResourcesButtonGlyph.png";
+    (new Image()).src = "Images/nodeSearchButtonGlyph.png";
+    (new Image()).src = "Images/pauseOnExceptionButtonGlyph.png";
+    (new Image()).src = "Images/percentButtonGlyph.png";
+    (new Image()).src = "Images/recordButtonGlyph.png";
+    (new Image()).src = "Images/recordToggledButtonGlyph.png";
+    (new Image()).src = "Images/reloadButtonGlyph.png";
+    (new Image()).src = "Images/undockButtonGlyph.png";
+}
+
+preloadImages();
+
+var WebInspector = {
+    resources: {},
+    resourceURLMap: {},
+    cookieDomains: {},
+    missingLocalizedStrings: {},
+    pendingDispatches: 0,
+
+    // RegExp groups:
+    // 1 - scheme
+    // 2 - hostname
+    // 3 - ?port
+    // 4 - ?path
+    // 5 - ?fragment
+    URLRegExp: /^(http[s]?|file):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
+    GenericURLRegExp: /^([^:]+):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
+
+    get platform()
+    {
+        if (!("_platform" in this))
+            this._platform = InspectorFrontendHost.platform();
+
+        return this._platform;
+    },
+
+    get platformFlavor()
+    {
+        if (!("_platformFlavor" in this))
+            this._platformFlavor = this._detectPlatformFlavor();
+
+        return this._platformFlavor;
+    },
+
+    _detectPlatformFlavor: function()
+    {
+        const userAgent = navigator.userAgent;
+
+        if (this.platform === "windows") {
+            var match = userAgent.match(/Windows NT (\d+)\.(?:\d+)/);
+            if (match && match[1] >= 6)
+                return WebInspector.PlatformFlavor.WindowsVista;
+            return null;
+        } else if (this.platform === "mac") {
+            var match = userAgent.match(/Mac OS X\s*(?:(\d+)_(\d+))?/);
+            if (!match || match[1] != 10)
+                return WebInspector.PlatformFlavor.MacSnowLeopard;
+            switch (Number(match[2])) {
+                case 4:
+                    return WebInspector.PlatformFlavor.MacTiger;
+                case 5:
+                    return WebInspector.PlatformFlavor.MacLeopard;
+                case 6:
+                default:
+                    return WebInspector.PlatformFlavor.MacSnowLeopard;
+            }
+        }
+
+        return null;
+    },
+
+    get port()
+    {
+        if (!("_port" in this))
+            this._port = InspectorFrontendHost.port();
+
+        return this._port;
+    },
+
+    get previousFocusElement()
+    {
+        return this._previousFocusElement;
+    },
+
+    get currentFocusElement()
+    {
+        return this._currentFocusElement;
+    },
+
+    set currentFocusElement(x)
+    {
+        if (this._currentFocusElement !== x)
+            this._previousFocusElement = this._currentFocusElement;
+        this._currentFocusElement = x;
+
+        if (this._currentFocusElement) {
+            this._currentFocusElement.focus();
+
+            // Make a caret selection inside the new element if there isn't a range selection and
+            // there isn't already a caret selection inside.
+            var selection = window.getSelection();
+            if (selection.isCollapsed && !this._currentFocusElement.isInsertionCaretInside()) {
+                var selectionRange = this._currentFocusElement.ownerDocument.createRange();
+                selectionRange.setStart(this._currentFocusElement, 0);
+                selectionRange.setEnd(this._currentFocusElement, 0);
+
+                selection.removeAllRanges();
+                selection.addRange(selectionRange);
+            }
+        } else if (this._previousFocusElement)
+            this._previousFocusElement.blur();
+    },
+
+    get currentPanel()
+    {
+        return this._currentPanel;
+    },
+
+    set currentPanel(x)
+    {
+        if (this._currentPanel === x)
+            return;
+
+        if (this._currentPanel)
+            this._currentPanel.hide();
+
+        this._currentPanel = x;
+
+        this.updateSearchLabel();
+
+        if (x) {
+            x.show();
+
+            if (this.currentQuery) {
+                if (x.performSearch) {
+                    function performPanelSearch()
+                    {
+                        this.updateSearchMatchesCount();
+
+                        x.currentQuery = this.currentQuery;
+                        x.performSearch(this.currentQuery);
+                    }
+
+                    // Perform the search on a timeout so the panel switches fast.
+                    setTimeout(performPanelSearch.bind(this), 0);
+                } else {
+                    // Update to show Not found for panels that can't be searched.
+                    this.updateSearchMatchesCount();
+                }
+            }
+        }
+
+        for (var panelName in WebInspector.panels) {
+            if (WebInspector.panels[panelName] == x)
+                InspectorBackend.storeLastActivePanel(panelName);
+        }
+    },
+
+    _createPanels: function()
+    {
+        var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');
+        if (hiddenPanels.indexOf("elements") === -1)
+            this.panels.elements = new WebInspector.ElementsPanel();
+        if (hiddenPanels.indexOf("resources") === -1)
+            this.panels.resources = new WebInspector.ResourcesPanel();
+        if (hiddenPanels.indexOf("scripts") === -1)
+            this.panels.scripts = new WebInspector.ScriptsPanel();
+        if (hiddenPanels.indexOf("timeline") === -1)
+            this.panels.timeline = new WebInspector.TimelinePanel();
+        if (hiddenPanels.indexOf("profiles") === -1) {
+            this.panels.profiles = new WebInspector.ProfilesPanel();
+            this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());
+        }
+        if (hiddenPanels.indexOf("storage") === -1 && hiddenPanels.indexOf("databases") === -1)
+            this.panels.storage = new WebInspector.StoragePanel();
+        if (Preferences.auditsPanelEnabled && hiddenPanels.indexOf("audits") === -1)
+            this.panels.audits = new WebInspector.AuditsPanel();
+        if (hiddenPanels.indexOf("console") === -1)
+            this.panels.console = new WebInspector.ConsolePanel();
+    },
+
+    get attached()
+    {
+        return this._attached;
+    },
+
+    set attached(x)
+    {
+        if (this._attached === x)
+            return;
+
+        this._attached = x;
+
+        this.updateSearchLabel();
+
+        var dockToggleButton = document.getElementById("dock-status-bar-item");
+        var body = document.body;
+
+        if (x) {
+            InspectorFrontendHost.attach();
+            body.removeStyleClass("detached");
+            body.addStyleClass("attached");
+            dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
+        } else {
+            InspectorFrontendHost.detach();
+            body.removeStyleClass("attached");
+            body.addStyleClass("detached");
+            dockToggleButton.title = WebInspector.UIString("Dock to main window.");
+        }
+    },
+
+    get errors()
+    {
+        return this._errors || 0;
+    },
+
+    set errors(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._errors === x)
+            return;
+        this._errors = x;
+        this._updateErrorAndWarningCounts();
+    },
+
+    get warnings()
+    {
+        return this._warnings || 0;
+    },
+
+    set warnings(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._warnings === x)
+            return;
+        this._warnings = x;
+        this._updateErrorAndWarningCounts();
+    },
+
+    _updateErrorAndWarningCounts: function()
+    {
+        var errorWarningElement = document.getElementById("error-warning-count");
+        if (!errorWarningElement)
+            return;
+
+        if (!this.errors && !this.warnings) {
+            errorWarningElement.addStyleClass("hidden");
+            return;
+        }
+
+        errorWarningElement.removeStyleClass("hidden");
+
+        errorWarningElement.removeChildren();
+
+        if (this.errors) {
+            var errorElement = document.createElement("span");
+            errorElement.id = "error-count";
+            errorElement.textContent = this.errors;
+            errorWarningElement.appendChild(errorElement);
+        }
+
+        if (this.warnings) {
+            var warningsElement = document.createElement("span");
+            warningsElement.id = "warning-count";
+            warningsElement.textContent = this.warnings;
+            errorWarningElement.appendChild(warningsElement);
+        }
+
+        if (this.errors) {
+            if (this.warnings) {
+                if (this.errors == 1) {
+                    if (this.warnings == 1)
+                        errorWarningElement.title = WebInspector.UIString("%d error, %d warning", this.errors, this.warnings);
+                    else
+                        errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", this.errors, this.warnings);
+                } else if (this.warnings == 1)
+                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", this.errors, this.warnings);
+                else
+                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", this.errors, this.warnings);
+            } else if (this.errors == 1)
+                errorWarningElement.title = WebInspector.UIString("%d error", this.errors);
+            else
+                errorWarningElement.title = WebInspector.UIString("%d errors", this.errors);
+        } else if (this.warnings == 1)
+            errorWarningElement.title = WebInspector.UIString("%d warning", this.warnings);
+        else if (this.warnings)
+            errorWarningElement.title = WebInspector.UIString("%d warnings", this.warnings);
+        else
+            errorWarningElement.title = null;
+    },
+
+    get styleChanges()
+    {
+        return this._styleChanges;
+    },
+
+    set styleChanges(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._styleChanges === x)
+            return;
+        this._styleChanges = x;
+        this._updateChangesCount();
+    },
+
+    _updateChangesCount: function()
+    {
+        // TODO: Remove immediate return when enabling the Changes Panel
+        return;
+
+        var changesElement = document.getElementById("changes-count");
+        if (!changesElement)
+            return;
+
+        if (!this.styleChanges) {
+            changesElement.addStyleClass("hidden");
+            return;
+        }
+
+        changesElement.removeStyleClass("hidden");
+        changesElement.removeChildren();
+
+        if (this.styleChanges) {
+            var styleChangesElement = document.createElement("span");
+            styleChangesElement.id = "style-changes-count";
+            styleChangesElement.textContent = this.styleChanges;
+            changesElement.appendChild(styleChangesElement);
+        }
+
+        if (this.styleChanges) {
+            if (this.styleChanges === 1)
+                changesElement.title = WebInspector.UIString("%d style change", this.styleChanges);
+            else
+                changesElement.title = WebInspector.UIString("%d style changes", this.styleChanges);
+        }
+    },
+
+    get hoveredDOMNode()
+    {
+        return this._hoveredDOMNode;
+    },
+
+    set hoveredDOMNode(x)
+    {
+        if (this._hoveredDOMNode === x)
+            return;
+
+        this._hoveredDOMNode = x;
+
+        if (this._hoveredDOMNode)
+            this._updateHoverHighlightSoon(this.showingDOMNodeHighlight ? 50 : 500);
+        else
+            this._updateHoverHighlight();
+    },
+
+    _updateHoverHighlightSoon: function(delay)
+    {
+        if ("_updateHoverHighlightTimeout" in this)
+            clearTimeout(this._updateHoverHighlightTimeout);
+        this._updateHoverHighlightTimeout = setTimeout(this._updateHoverHighlight.bind(this), delay);
+    },
+
+    _updateHoverHighlight: function()
+    {
+        if ("_updateHoverHighlightTimeout" in this) {
+            clearTimeout(this._updateHoverHighlightTimeout);
+            delete this._updateHoverHighlightTimeout;
+        }
+
+        if (this._hoveredDOMNode) {
+            InspectorBackend.highlightDOMNode(this._hoveredDOMNode.id);
+            this.showingDOMNodeHighlight = true;
+        } else {
+            InspectorBackend.hideDOMNodeHighlight();
+            this.showingDOMNodeHighlight = false;
+        }
+    }
+}
+
+WebInspector.PlatformFlavor = {
+    WindowsVista: "windows-vista",
+    MacTiger: "mac-tiger",
+    MacLeopard: "mac-leopard",
+    MacSnowLeopard: "mac-snowleopard"
+}
+
+WebInspector.loaded = function()
+{
+    InspectorBackend.setInjectedScriptSource("(" + injectedScriptConstructor + ");");
+
+    var platform = WebInspector.platform;
+    document.body.addStyleClass("platform-" + platform);
+    var flavor = WebInspector.platformFlavor;
+    if (flavor)
+        document.body.addStyleClass("platform-" + flavor);
+    var port = WebInspector.port;
+    document.body.addStyleClass("port-" + port);
+
+    this.settings = new WebInspector.Settings();
+
+    this.drawer = new WebInspector.Drawer();
+    this.console = new WebInspector.ConsoleView(this.drawer);
+    // TODO: Uncomment when enabling the Changes Panel
+    // this.changes = new WebInspector.ChangesView(this.drawer);
+    // TODO: Remove class="hidden" from inspector.html on button#changes-status-bar-item
+    this.drawer.visibleView = this.console;
+    this.domAgent = new WebInspector.DOMAgent();
+
+    this.resourceCategories = {
+        documents: new WebInspector.ResourceCategory("documents", WebInspector.UIString("Documents"), "rgb(47,102,236)"),
+        stylesheets: new WebInspector.ResourceCategory("stylesheets", WebInspector.UIString("Stylesheets"), "rgb(157,231,119)"),
+        images: new WebInspector.ResourceCategory("images", WebInspector.UIString("Images"), "rgb(164,60,255)"),
+        scripts: new WebInspector.ResourceCategory("scripts", WebInspector.UIString("Scripts"), "rgb(255,121,0)"),
+        xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),
+        fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),
+        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
+    };
+
+    this.panels = {};
+    this._createPanels();
+
+    var toolbarElement = document.getElementById("toolbar");
+    var previousToolbarItem = toolbarElement.children[0];
+
+    this.panelOrder = [];
+    for (var panelName in this.panels)
+        previousToolbarItem = WebInspector.addPanelToolbarIcon(toolbarElement, this.panels[panelName], previousToolbarItem);
+
+    this.Tips = {
+        ResourceNotCompressed: {id: 0, message: WebInspector.UIString("You could save bandwidth by having your web server compress this transfer with gzip or zlib.")}
+    };
+
+    this.Warnings = {
+        IncorrectMIMEType: {id: 0, message: WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s.")}
+    };
+
+    this.addMainEventListeners(document);
+
+    window.addEventListener("unload", this.windowUnload.bind(this), true);
+    window.addEventListener("resize", this.windowResize.bind(this), true);
+
+    document.addEventListener("focus", this.focusChanged.bind(this), true);
+    document.addEventListener("keydown", this.documentKeyDown.bind(this), false);
+    document.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);
+    document.addEventListener("copy", this.documentCopy.bind(this), true);
+    document.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);
+
+    var dockToggleButton = document.getElementById("dock-status-bar-item");
+    dockToggleButton.addEventListener("click", this.toggleAttach.bind(this), false);
+
+    if (this.attached)
+        dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
+    else
+        dockToggleButton.title = WebInspector.UIString("Dock to main window.");
+
+    var errorWarningCount = document.getElementById("error-warning-count");
+    errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);
+    this._updateErrorAndWarningCounts();
+
+    this.styleChanges = 0;
+    // TODO: Uncomment when enabling the Changes Panel
+    // var changesElement = document.getElementById("changes-count");
+    // changesElement.addEventListener("click", this.showChanges.bind(this), false);
+    // this._updateErrorAndWarningCounts();
+
+    var searchField = document.getElementById("search");
+    searchField.addEventListener("search", this.performSearch.bind(this), false); // when the search is emptied
+    searchField.addEventListener("mousedown", this._searchFieldManualFocus.bind(this), false); // when the search field is manually selected
+    searchField.addEventListener("keydown", this._searchKeyDown.bind(this), true);
+
+    toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);
+    document.getElementById("close-button-left").addEventListener("click", this.close, true);
+    document.getElementById("close-button-right").addEventListener("click", this.close, true);
+
+    InspectorFrontendHost.loaded();
+}
+
+WebInspector.addPanelToolbarIcon = function(toolbarElement, panel, previousToolbarItem)
+{
+    var panelToolbarItem = panel.toolbarItem;
+    this.panelOrder.push(panel);
+    panelToolbarItem.addEventListener("click", this._toolbarItemClicked.bind(this));
+    if (previousToolbarItem)
+        toolbarElement.insertBefore(panelToolbarItem, previousToolbarItem.nextSibling);
+    else
+        toolbarElement.insertBefore(panelToolbarItem, toolbarElement.firstChild);
+    return panelToolbarItem;
+}
+
+var windowLoaded = function()
+{
+    var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();
+    if (localizedStringsURL) {
+        var localizedStringsScriptElement = document.createElement("script");
+        localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);
+        localizedStringsScriptElement.type = "text/javascript";
+        localizedStringsScriptElement.src = localizedStringsURL;
+        document.head.appendChild(localizedStringsScriptElement);
+    } else
+        WebInspector.loaded();
+
+    window.removeEventListener("load", windowLoaded, false);
+    delete windowLoaded;
+};
+
+window.addEventListener("load", windowLoaded, false);
+
+WebInspector.dispatch = function() {
+    var methodName = arguments[0];
+    var parameters = Array.prototype.slice.call(arguments, 1);
+
+    // We'd like to enforce asynchronous interaction between the inspector controller and the frontend.
+    // This is important to LayoutTests.
+    function delayDispatch()
+    {
+        WebInspector[methodName].apply(WebInspector, parameters);
+        WebInspector.pendingDispatches--;
+    }
+    WebInspector.pendingDispatches++;
+    setTimeout(delayDispatch, 0);
+}
+
+WebInspector.windowUnload = function(event)
+{
+    InspectorFrontendHost.windowUnloading();
+}
+
+WebInspector.windowResize = function(event)
+{
+    if (this.currentPanel)
+        this.currentPanel.resize();
+    this.drawer.resize();
+}
+
+WebInspector.windowFocused = function(event)
+{
+    // Fires after blur, so when focusing on either the main inspector
+    // or an <iframe> within the inspector we should always remove the
+    // "inactive" class.
+    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
+        document.body.removeStyleClass("inactive");
+}
+
+WebInspector.windowBlurred = function(event)
+{
+    // Leaving the main inspector or an <iframe> within the inspector.
+    // We can add "inactive" now, and if we are moving the focus to another
+    // part of the inspector then windowFocused will correct this.
+    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
+        document.body.addStyleClass("inactive");
+}
+
+WebInspector.focusChanged = function(event)
+{
+    this.currentFocusElement = event.target;
+}
+
+WebInspector.setAttachedWindow = function(attached)
+{
+    this.attached = attached;
+}
+
+WebInspector.close = function(event)
+{
+    InspectorFrontendHost.closeWindow();
+}
+
+WebInspector.documentMouseOver = function(event)
+{
+    if (event.target.tagName !== "A")
+        return;
+
+    const anchor = event.target;
+    if (!anchor.hasStyleClass("webkit-html-resource-link"))
+        return;
+    if (WebInspector.canShowSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel) || WebInspector.ProfileType.URLRegExp.exec(anchor.href)) {
+        if (event.target.originalTitle)
+            event.target.title = event.target.originalTitle;
+        return;
+    }
+
+    if (!event.target.originalTitle)
+        event.target.originalTitle = event.target.title;
+    event.target.title = WebInspector.UIString("Cannot open this link. Make sure that resource tracking is enabled in the Resources panel.");
+}
+
+WebInspector.documentClick = function(event)
+{
+    var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");
+    if (!anchor)
+        return;
+
+    // Prevent the link from navigating, since we don't do any navigation by following links normally.
+    event.preventDefault();
+
+    function followLink()
+    {
+        // FIXME: support webkit-html-external-link links here.
+        if (WebInspector.canShowSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel)) {
+            if (anchor.hasStyleClass("webkit-html-external-link")) {
+                anchor.removeStyleClass("webkit-html-external-link");
+                anchor.addStyleClass("webkit-html-resource-link");
+            }
+
+            WebInspector.showSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel);
+            return;
+        }
+
+        const profileMatch = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
+        if (profileMatch) {
+            WebInspector.showProfileForURL(anchor.href);
+            return;
+        }
+
+        const urlMatch = WebInspector.GenericURLRegExp.exec(anchor.href);
+        if (urlMatch && urlMatch[1] === "webkit-link-action") {
+            if (urlMatch[2] === "show-panel") {
+                const panel = urlMatch[4].substring(1);
+                if (WebInspector.panels[panel])
+                    WebInspector.currentPanel = WebInspector.panels[panel];
+            }
+            return;
+        }
+    }
+
+    if (WebInspector.followLinkTimeout)
+        clearTimeout(WebInspector.followLinkTimeout);
+
+    if (anchor.preventFollowOnDoubleClick) {
+        // Start a timeout if this is the first click, if the timeout is canceled
+        // before it fires, then a double clicked happened or another link was clicked.
+        if (event.detail === 1)
+            WebInspector.followLinkTimeout = setTimeout(followLink, 333);
+        return;
+    }
+
+    followLink();
+}
+
+WebInspector.documentKeyDown = function(event)
+{
+    if (this.currentFocusElement && this.currentFocusElement.handleKeyEvent) {
+        this.currentFocusElement.handleKeyEvent(event);
+        if (event.handled) {
+            event.preventDefault();
+            return;
+        }
+    }
+
+    if (this.currentPanel && this.currentPanel.handleShortcut) {
+        this.currentPanel.handleShortcut(event);
+        if (event.handled) {
+            event.preventDefault();
+            return;
+        }
+    }
+
+    var isMac = WebInspector.isMac();
+
+    switch (event.keyIdentifier) {
+        case "U+001B": // Escape key
+            event.preventDefault();
+            if (this.drawer.fullPanel)
+                return;
+
+            this.drawer.visible = !this.drawer.visible;
+            break;
+
+        case "U+0046": // F key
+            if (isMac)
+                var isFindKey = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
+            else
+                var isFindKey = event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;
+
+            if (isFindKey) {
+                WebInspector.focusSearchField();
+                event.preventDefault();
+            }
+            break;
+
+        case "F3":
+            if (!isMac) {
+                WebInspector.focusSearchField();
+                event.preventDefault();
+            }
+            break;
+
+        case "U+0047": // G key
+            if (isMac)
+                var isFindAgainKey = event.metaKey && !event.ctrlKey && !event.altKey;
+            else
+                var isFindAgainKey = event.ctrlKey && !event.metaKey && !event.altKey;
+
+            if (isFindAgainKey) {
+                if (event.shiftKey) {
+                    if (this.currentPanel.jumpToPreviousSearchResult)
+                        this.currentPanel.jumpToPreviousSearchResult();
+                } else if (this.currentPanel.jumpToNextSearchResult)
+                    this.currentPanel.jumpToNextSearchResult();
+                event.preventDefault();
+            }
+
+            break;
+
+        // Windows and Mac have two different definitions of [, so accept both.
+        case "U+005B":
+        case "U+00DB": // [ key
+            if (isMac)
+                var isRotateLeft = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
+            else
+                var isRotateLeft = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+
+            if (isRotateLeft) {
+                var index = this.panelOrder.indexOf(this.currentPanel);
+                index = (index === 0) ? this.panelOrder.length - 1 : index - 1;
+                this.panelOrder[index].toolbarItem.click();
+                event.preventDefault();
+            }
+
+            break;
+
+        // Windows and Mac have two different definitions of ], so accept both.
+        case "U+005D":
+        case "U+00DD":  // ] key
+            if (isMac)
+                var isRotateRight = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
+            else
+                var isRotateRight = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+
+            if (isRotateRight) {
+                var index = this.panelOrder.indexOf(this.currentPanel);
+                index = (index + 1) % this.panelOrder.length;
+                this.panelOrder[index].toolbarItem.click();
+                event.preventDefault();
+            }
+
+            break;
+
+        case "U+0052": // R key
+            if ((event.metaKey && isMac) || (event.ctrlKey && !isMac))
+                InspectorBackend.reloadPage();
+            break;
+        case "F5":
+            if (!isMac)
+                InspectorBackend.reloadPage();
+            break;
+    }
+}
+
+WebInspector.documentCanCopy = function(event)
+{
+    if (this.currentPanel && this.currentPanel.handleCopyEvent)
+        event.preventDefault();
+}
+
+WebInspector.documentCopy = function(event)
+{
+    if (this.currentPanel && this.currentPanel.handleCopyEvent)
+        this.currentPanel.handleCopyEvent(event);
+}
+
+WebInspector.contextMenuEventFired = function(event)
+{
+    if (event.handled || event.target.hasStyleClass("popup-glasspane"))
+        event.preventDefault();
+}
+
+WebInspector.animateStyle = function(animations, duration, callback)
+{
+    var interval;
+    var complete = 0;
+
+    const intervalDuration = (1000 / 30); // 30 frames per second.
+    const animationsLength = animations.length;
+    const propertyUnit = {opacity: ""};
+    const defaultUnit = "px";
+
+    function cubicInOut(t, b, c, d)
+    {
+        if ((t/=d/2) < 1) return c/2*t*t*t + b;
+        return c/2*((t-=2)*t*t + 2) + b;
+    }
+
+    // Pre-process animations.
+    for (var i = 0; i < animationsLength; ++i) {
+        var animation = animations[i];
+        var element = null, start = null, end = null, key = null;
+        for (key in animation) {
+            if (key === "element")
+                element = animation[key];
+            else if (key === "start")
+                start = animation[key];
+            else if (key === "end")
+                end = animation[key];
+        }
+
+        if (!element || !end)
+            continue;
+
+        if (!start) {
+            var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);
+            start = {};
+            for (key in end)
+                start[key] = parseInt(computedStyle.getPropertyValue(key));
+            animation.start = start;
+        } else
+            for (key in start)
+                element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+    }
+
+    function animateLoop()
+    {
+        // Advance forward.
+        complete += intervalDuration;
+        var next = complete + intervalDuration;
+
+        // Make style changes.
+        for (var i = 0; i < animationsLength; ++i) {
+            var animation = animations[i];
+            var element = animation.element;
+            var start = animation.start;
+            var end = animation.end;
+            if (!element || !end)
+                continue;
+
+            var style = element.style;
+            for (key in end) {
+                var endValue = end[key];
+                if (next < duration) {
+                    var startValue = start[key];
+                    var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);
+                    style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+                } else
+                    style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+            }
+        }
+
+        // End condition.
+        if (complete >= duration) {
+            clearInterval(interval);
+            if (callback)
+                callback();
+        }
+    }
+
+    interval = setInterval(animateLoop, intervalDuration);
+    return interval;
+}
+
+WebInspector.updateSearchLabel = function()
+{
+    if (!this.currentPanel)
+        return;
+
+    var newLabel = WebInspector.UIString("Search %s", this.currentPanel.toolbarItemLabel);
+    if (this.attached)
+        document.getElementById("search").setAttribute("placeholder", newLabel);
+    else {
+        document.getElementById("search").removeAttribute("placeholder");
+        document.getElementById("search-toolbar-label").textContent = newLabel;
+    }
+}
+
+WebInspector.focusSearchField = function()
+{
+    var searchField = document.getElementById("search");
+    searchField.focus();
+    searchField.select();
+}
+
+WebInspector.toggleAttach = function()
+{
+    if (!this.attached && !InspectorFrontendHost.canAttachWindow())
+        return;
+
+    this.attached = !this.attached;
+    this.drawer.resize();
+}
+
+WebInspector.toolbarDragStart = function(event)
+{
+    if ((!WebInspector.attached && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacLeopard && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacSnowLeopard) || WebInspector.port == "qt")
+        return;
+
+    var target = event.target;
+    if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))
+        return;
+
+    var toolbar = document.getElementById("toolbar");
+    if (target !== toolbar && !target.hasStyleClass("toolbar-item"))
+        return;
+
+    toolbar.lastScreenX = event.screenX;
+    toolbar.lastScreenY = event.screenY;
+
+    WebInspector.elementDragStart(toolbar, WebInspector.toolbarDrag, WebInspector.toolbarDragEnd, event, (WebInspector.attached ? "row-resize" : "default"));
+}
+
+WebInspector.toolbarDragEnd = function(event)
+{
+    var toolbar = document.getElementById("toolbar");
+
+    WebInspector.elementDragEnd(event);
+
+    delete toolbar.lastScreenX;
+    delete toolbar.lastScreenY;
+}
+
+WebInspector.toolbarDrag = function(event)
+{
+    var toolbar = document.getElementById("toolbar");
+
+    if (WebInspector.attached) {
+        var height = window.innerHeight - (event.screenY - toolbar.lastScreenY);
+
+        InspectorFrontendHost.setAttachedWindowHeight(height);
+    } else {
+        var x = event.screenX - toolbar.lastScreenX;
+        var y = event.screenY - toolbar.lastScreenY;
+
+        // We cannot call window.moveBy here because it restricts the movement
+        // of the window at the edges.
+        InspectorFrontendHost.moveWindowBy(x, y);
+    }
+
+    toolbar.lastScreenX = event.screenX;
+    toolbar.lastScreenY = event.screenY;
+
+    event.preventDefault();
+}
+
+WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)
+{
+    if (this._elementDraggingEventListener || this._elementEndDraggingEventListener)
+        this.elementDragEnd(event);
+
+    this._elementDraggingEventListener = dividerDrag;
+    this._elementEndDraggingEventListener = elementDragEnd;
+
+    document.addEventListener("mousemove", dividerDrag, true);
+    document.addEventListener("mouseup", elementDragEnd, true);
+
+    document.body.style.cursor = cursor;
+
+    event.preventDefault();
+}
+
+WebInspector.elementDragEnd = function(event)
+{
+    document.removeEventListener("mousemove", this._elementDraggingEventListener, true);
+    document.removeEventListener("mouseup", this._elementEndDraggingEventListener, true);
+
+    document.body.style.removeProperty("cursor");
+
+    delete this._elementDraggingEventListener;
+    delete this._elementEndDraggingEventListener;
+
+    event.preventDefault();
+}
+
+WebInspector.showConsole = function()
+{
+    this.drawer.showView(this.console);
+}
+
+WebInspector.showChanges = function()
+{
+    this.drawer.showView(this.changes);
+}
+
+WebInspector.showElementsPanel = function()
+{
+    this.currentPanel = this.panels.elements;
+}
+
+WebInspector.showResourcesPanel = function()
+{
+    this.currentPanel = this.panels.resources;
+}
+
+WebInspector.showScriptsPanel = function()
+{
+    this.currentPanel = this.panels.scripts;
+}
+
+WebInspector.showTimelinePanel = function()
+{
+    this.currentPanel = this.panels.timeline;
+}
+
+WebInspector.showProfilesPanel = function()
+{
+    this.currentPanel = this.panels.profiles;
+}
+
+WebInspector.showStoragePanel = function()
+{
+    this.currentPanel = this.panels.storage;
+}
+
+WebInspector.showConsolePanel = function()
+{
+    this.currentPanel = this.panels.console;
+}
+
+WebInspector.clearConsoleMessages = function()
+{
+    WebInspector.console.clearMessages();
+}
+
+WebInspector.selectDatabase = function(o)
+{
+    WebInspector.showStoragePanel();
+    WebInspector.panels.storage.selectDatabase(o);
+}
+
+WebInspector.selectDOMStorage = function(o)
+{
+    WebInspector.showStoragePanel();
+    WebInspector.panels.storage.selectDOMStorage(o);
+}
+
+WebInspector.updateResource = function(identifier, payload)
+{
+    var resource = this.resources[identifier];
+    if (!resource) {
+        resource = new WebInspector.Resource(identifier, payload.url);
+        this.resources[identifier] = resource;
+        this.resourceURLMap[resource.url] = resource;
+        if (this.panels.resources)
+            this.panels.resources.addResource(resource);
+    }
+
+    if (payload.didRequestChange) {
+        resource.domain = payload.host;
+        resource.path = payload.path;
+        resource.lastPathComponent = payload.lastPathComponent;
+        resource.requestHeaders = payload.requestHeaders;
+        resource.mainResource = payload.mainResource;
+        resource.requestMethod = payload.requestMethod;
+        resource.requestFormData = payload.requestFormData;
+        resource.cached = payload.cached;
+        resource.documentURL = payload.documentURL;
+
+        if (resource.mainResource)
+            this.mainResource = resource;
+
+        var match = payload.documentURL.match(WebInspector.URLRegExp);
+        if (match) {
+            var protocol = match[1].toLowerCase();
+            if (protocol.indexOf("http") === 0 || protocol === "file")
+                this._addCookieDomain(protocol === "file" ? "" : match[2]);
+        }
+    }
+
+    if (payload.didResponseChange) {
+        resource.mimeType = payload.mimeType;
+        resource.suggestedFilename = payload.suggestedFilename;
+        resource.expectedContentLength = payload.expectedContentLength;
+        resource.statusCode = payload.statusCode;
+        resource.suggestedFilename = payload.suggestedFilename;
+        resource.responseHeaders = payload.responseHeaders;
+    }
+
+    if (payload.didTypeChange) {
+        resource.type = payload.type;
+    }
+
+    if (payload.didLengthChange) {
+        resource.resourceSize = payload.resourceSize;
+    }
+
+    if (payload.didCompletionChange) {
+        resource.failed = payload.failed;
+        resource.finished = payload.finished;
+    }
+
+    if (payload.didTimingChange) {
+        if (payload.startTime)
+            resource.startTime = payload.startTime;
+        if (payload.responseReceivedTime)
+            resource.responseReceivedTime = payload.responseReceivedTime;
+        if (payload.endTime)
+            resource.endTime = payload.endTime;
+
+        if (payload.loadEventTime) {
+            // This loadEventTime is for the main resource, and we want to show it
+            // for all resources on this page. This means we want to set it as a member
+            // of the resources panel instead of the individual resource.
+            if (this.panels.resources)
+                this.panels.resources.mainResourceLoadTime = payload.loadEventTime;
+            if (this.panels.audits)
+                this.panels.audits.mainResourceLoadTime = payload.loadEventTime;
+        }
+
+        if (payload.domContentEventTime) {
+            // This domContentEventTime is for the main resource, so it should go in
+            // the resources panel for the same reasons as above.
+            if (this.panels.resources)
+                this.panels.resources.mainResourceDOMContentTime = payload.domContentEventTime;
+            if (this.panels.audits)
+                this.panels.audits.mainResourceDOMContentTime = payload.domContentEventTime;
+        }
+    }
+}
+
+WebInspector.removeResource = function(identifier)
+{
+    var resource = this.resources[identifier];
+    if (!resource)
+        return;
+
+    resource.category.removeResource(resource);
+    delete this.resourceURLMap[resource.url];
+    delete this.resources[identifier];
+
+    if (this.panels.resources)
+        this.panels.resources.removeResource(resource);
+}
+
+WebInspector.addDatabase = function(payload)
+{
+    if (!this.panels.storage)
+        return;
+    var database = new WebInspector.Database(
+        payload.id,
+        payload.domain,
+        payload.name,
+        payload.version);
+    this.panels.storage.addDatabase(database);
+}
+
+WebInspector._addCookieDomain = function(domain)
+{
+    // Eliminate duplicate domains from the list.
+    if (domain in this.cookieDomains)
+        return;
+    this.cookieDomains[domain] = true;
+
+    if (!this.panels.storage)
+        return;
+    this.panels.storage.addCookieDomain(domain);
+}
+
+WebInspector.addDOMStorage = function(payload)
+{
+    if (!this.panels.storage)
+        return;
+    var domStorage = new WebInspector.DOMStorage(
+        payload.id,
+        payload.host,
+        payload.isLocalStorage);
+    this.panels.storage.addDOMStorage(domStorage);
+}
+
+WebInspector.updateDOMStorage = function(storageId)
+{
+    if (!this.panels.storage)
+        return;
+    this.panels.storage.updateDOMStorage(storageId);
+}
+
+WebInspector.resourceTrackingWasEnabled = function()
+{
+    this.panels.resources.resourceTrackingWasEnabled();
+}
+
+WebInspector.resourceTrackingWasDisabled = function()
+{
+    this.panels.resources.resourceTrackingWasDisabled();
+}
+
+
+WebInspector.searchingForNodeWasEnabled = function()
+{
+    this.panels.elements.searchingForNodeWasEnabled();
+}
+
+WebInspector.searchingForNodeWasDisabled = function()
+{
+    this.panels.elements.searchingForNodeWasDisabled();
+}
+
+WebInspector.attachDebuggerWhenShown = function()
+{
+    this.panels.scripts.attachDebuggerWhenShown();
+}
+
+WebInspector.debuggerWasEnabled = function()
+{
+    this.panels.scripts.debuggerWasEnabled();
+}
+
+WebInspector.updatePauseOnExceptionsState = function(pauseOnExceptionsState)
+{
+    this.panels.scripts.updatePauseOnExceptionsState(pauseOnExceptionsState);
+}
+
+WebInspector.debuggerWasDisabled = function()
+{
+    this.panels.scripts.debuggerWasDisabled();
+}
+
+WebInspector.profilerWasEnabled = function()
+{
+    this.panels.profiles.profilerWasEnabled();
+}
+
+WebInspector.profilerWasDisabled = function()
+{
+    this.panels.profiles.profilerWasDisabled();
+}
+
+WebInspector.parsedScriptSource = function(sourceID, sourceURL, source, startingLine)
+{
+    this.panels.scripts.addScript(sourceID, sourceURL, source, startingLine);
+}
+
+WebInspector.restoredBreakpoint = function(sourceID, sourceURL, line, enabled, condition)
+{
+    var breakpoint = new WebInspector.Breakpoint(sourceURL, line, sourceID, condition);
+    breakpoint.enabled = enabled;
+    this.panels.scripts.addBreakpoint(breakpoint);
+}
+
+WebInspector.failedToParseScriptSource = function(sourceURL, source, startingLine, errorLine, errorMessage)
+{
+    this.panels.scripts.addScript(null, sourceURL, source, startingLine, errorLine, errorMessage);
+}
+
+WebInspector.pausedScript = function(callFrames)
+{
+    this.panels.scripts.debuggerPaused(callFrames);
+}
+
+WebInspector.resumedScript = function()
+{
+    this.panels.scripts.debuggerResumed();
+}
+
+WebInspector.populateInterface = function()
+{
+    for (var panelName in this.panels) {
+        var panel = this.panels[panelName];
+        if ("populateInterface" in panel)
+            panel.populateInterface();
+    }
+}
+
+WebInspector.reset = function()
+{
+    for (var panelName in this.panels) {
+        var panel = this.panels[panelName];
+        if ("reset" in panel)
+            panel.reset();
+    }
+
+    for (var category in this.resourceCategories)
+        this.resourceCategories[category].removeAllResources();
+
+    this.resources = {};
+    this.resourceURLMap = {};
+    this.cookieDomains = {};
+    this.hoveredDOMNode = null;
+
+    delete this.mainResource;
+
+    this.console.clearMessages();
+}
+
+WebInspector.resourceURLChanged = function(resource, oldURL)
+{
+    delete this.resourceURLMap[oldURL];
+    this.resourceURLMap[resource.url] = resource;
+}
+
+WebInspector.didCommitLoad = function()
+{
+    // Cleanup elements panel early on inspected page refresh.
+    WebInspector.setDocument(null);
+}
+
+WebInspector.updateConsoleMessageExpiredCount = function(count)
+{
+    var message = String.sprintf(WebInspector.UIString("%d console messages are not shown."), count);
+    WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(message, WebInspector.ConsoleMessage.MessageLevel.Warning));
+}
+
+WebInspector.addConsoleMessage = function(payload, opt_args)
+{
+    var consoleMessage = new WebInspector.ConsoleMessage(
+        payload.source,
+        payload.type,
+        payload.level,
+        payload.line,
+        payload.url,
+        payload.groupLevel,
+        payload.repeatCount);
+    consoleMessage.setMessageBody(Array.prototype.slice.call(arguments, 1));
+    this.console.addMessage(consoleMessage);
+}
+
+WebInspector.updateConsoleMessageRepeatCount = function(count)
+{
+    this.console.updateMessageRepeatCount(count);
+}
+
+WebInspector.log = function(message)
+{
+    // remember 'this' for setInterval() callback
+    var self = this;
+
+    // return indication if we can actually log a message
+    function isLogAvailable()
+    {
+        return WebInspector.ConsoleMessage && WebInspector.ObjectProxy && self.console;
+    }
+
+    // flush the queue of pending messages
+    function flushQueue()
+    {
+        var queued = WebInspector.log.queued;
+        if (!queued)
+            return;
+
+        for (var i = 0; i < queued.length; ++i)
+            logMessage(queued[i]);
+
+        delete WebInspector.log.queued;
+    }
+
+    // flush the queue if it console is available
+    // - this function is run on an interval
+    function flushQueueIfAvailable()
+    {
+        if (!isLogAvailable())
+            return;
+
+        clearInterval(WebInspector.log.interval);
+        delete WebInspector.log.interval;
+
+        flushQueue();
+    }
+
+    // actually log the message
+    function logMessage(message)
+    {
+        var repeatCount = 1;
+        if (message == WebInspector.log.lastMessage)
+            repeatCount = WebInspector.log.repeatCount + 1;
+
+        WebInspector.log.lastMessage = message;
+        WebInspector.log.repeatCount = repeatCount;
+
+        // ConsoleMessage expects a proxy object
+        message = new WebInspector.ObjectProxy(null, null, [], message, false);
+
+        // post the message
+        var msg = new WebInspector.ConsoleMessage(
+            WebInspector.ConsoleMessage.MessageSource.Other,
+            WebInspector.ConsoleMessage.MessageType.Log,
+            WebInspector.ConsoleMessage.MessageLevel.Debug,
+            -1,
+            null,
+            null,
+            repeatCount,
+            message);
+
+        self.console.addMessage(msg);
+    }
+
+    // if we can't log the message, queue it
+    if (!isLogAvailable()) {
+        if (!WebInspector.log.queued)
+            WebInspector.log.queued = [];
+
+        WebInspector.log.queued.push(message);
+
+        if (!WebInspector.log.interval)
+            WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);
+
+        return;
+    }
+
+    // flush the pending queue if any
+    flushQueue();
+
+    // log the message
+    logMessage(message);
+}
+
+WebInspector.addProfileHeader = function(profile)
+{
+    this.panels.profiles.addProfileHeader(profile);
+}
+
+WebInspector.setRecordingProfile = function(isProfiling)
+{
+    this.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);
+    this.panels.profiles.updateProfileTypeButtons();
+}
+
+WebInspector.drawLoadingPieChart = function(canvas, percent) {
+    var g = canvas.getContext("2d");
+    var darkColor = "rgb(122, 168, 218)";
+    var lightColor = "rgb(228, 241, 251)";
+    var cx = 8;
+    var cy = 8;
+    var r = 7;
+
+    g.beginPath();
+    g.arc(cx, cy, r, 0, Math.PI * 2, false);
+    g.closePath();
+
+    g.lineWidth = 1;
+    g.strokeStyle = darkColor;
+    g.fillStyle = lightColor;
+    g.fill();
+    g.stroke();
+
+    var startangle = -Math.PI / 2;
+    var endangle = startangle + (percent * Math.PI * 2);
+
+    g.beginPath();
+    g.moveTo(cx, cy);
+    g.arc(cx, cy, r, startangle, endangle, false);
+    g.closePath();
+
+    g.fillStyle = darkColor;
+    g.fill();
+}
+
+WebInspector.updateFocusedNode = function(nodeId)
+{
+    var node = WebInspector.domAgent.nodeForId(nodeId);
+    if (!node)
+        // FIXME: Should we deselect if null is passed in?
+        return;
+
+    this.currentPanel = this.panels.elements;
+    this.panels.elements.focusedDOMNode = node;
+}
+
+WebInspector.displayNameForURL = function(url)
+{
+    if (!url)
+        return "";
+    var resource = this.resourceURLMap[url];
+    if (resource)
+        return resource.displayName;
+    return url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
+}
+
+WebInspector.resourceForURL = function(url)
+{
+    if (url in this.resourceURLMap)
+        return this.resourceURLMap[url];
+
+    // No direct match found. Search for resources that contain
+    // a substring of the URL.
+    for (var resourceURL in this.resourceURLMap) {
+        if (resourceURL.hasSubstring(url))
+            return this.resourceURLMap[resourceURL];
+    }
+
+    return null;
+}
+
+WebInspector._choosePanelToShowSourceLine = function(url, line, preferredPanel)
+{
+    preferredPanel = preferredPanel || "resources";
+    var panel = this.panels[preferredPanel];
+    if (panel && panel.canShowSourceLine(url, line))
+        return panel;
+    panel = this.panels.resources;
+    return panel.canShowSourceLine(url, line) ? panel : null;
+}
+
+WebInspector.canShowSourceLine = function(url, line, preferredPanel)
+{
+    return !!this._choosePanelToShowSourceLine(url, line, preferredPanel);
+}
+
+WebInspector.showSourceLine = function(url, line, preferredPanel)
+{
+    this.currentPanel = this._choosePanelToShowSourceLine(url, line, preferredPanel);
+    if (!this.currentPanel)
+        return false;
+    this.currentPanel.showSourceLine(url, line);
+    return true;
+}
+
+WebInspector.linkifyStringAsFragment = function(string)
+{
+    var container = document.createDocumentFragment();
+    var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;
+
+    while (string) {
+        var linkString = linkStringRegEx.exec(string);
+        if (!linkString)
+            break;
+
+        linkString = linkString[0];
+        var title = linkString;
+        var linkIndex = string.indexOf(linkString);
+        var nonLink = string.substring(0, linkIndex);
+        container.appendChild(document.createTextNode(nonLink));
+
+        var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);
+        if (profileStringMatches)
+            title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);
+
+        var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);
+        container.appendChild(WebInspector.linkifyURLAsNode(realURL, title, null, (realURL in WebInspector.resourceURLMap)));
+        string = string.substring(linkIndex + linkString.length, string.length);
+    }
+
+    if (string)
+        container.appendChild(document.createTextNode(string));
+
+    return container;
+}
+
+WebInspector.showProfileForURL = function(url)
+{
+    WebInspector.showProfilesPanel();
+    WebInspector.panels.profiles.showProfileForURL(url);
+}
+
+WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
+{
+    if (!linkText)
+        linkText = url;
+    classes = (classes ? classes + " " : "");
+    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";
+
+    var a = document.createElement("a");
+    a.href = url;
+    a.className = classes;
+    a.title = tooltipText || url;
+    a.target = "_blank";
+    a.textContent = linkText;
+
+    return a;
+}
+
+WebInspector.linkifyURL = function(url, linkText, classes, isExternal, tooltipText)
+{
+    // Use the DOM version of this function so as to avoid needing to escape attributes.
+    // FIXME:  Get rid of linkifyURL entirely.
+    return WebInspector.linkifyURLAsNode(url, linkText, classes, isExternal, tooltipText).outerHTML;
+}
+
+WebInspector.linkifyResourceAsNode = function(url, preferredPanel, lineNumber, classes, tooltipText)
+{
+    var linkText = WebInspector.displayNameForURL(url);
+    if (lineNumber)
+        linkText += ":" + lineNumber;
+    var node = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);
+    node.lineNumber = lineNumber;
+    node.preferredPanel = preferredPanel;
+    return node;
+}
+
+WebInspector.completeURL = function(baseURL, href)
+{
+    var match = baseURL.match(WebInspector.URLRegExp);
+    if (match) {
+        var path = href;
+        if (path.charAt(0) !== "/") {
+            var basePath = match[4] || "/";
+            path = basePath.substring(0, basePath.lastIndexOf("/")) + "/" + path;
+        }
+        return match[1] + "://" + match[2] + (match[3] ? (":" + match[3]) : "") + path;
+    }
+    return null;
+}
+
+WebInspector.addMainEventListeners = function(doc)
+{
+    doc.defaultView.addEventListener("focus", this.windowFocused.bind(this), false);
+    doc.defaultView.addEventListener("blur", this.windowBlurred.bind(this), false);
+    doc.addEventListener("click", this.documentClick.bind(this), true);
+    doc.addEventListener("mouseover", this.documentMouseOver.bind(this), true);
+}
+
+WebInspector._searchFieldManualFocus = function(event)
+{
+    this.currentFocusElement = event.target;
+    this._previousFocusElement = event.target;
+}
+
+WebInspector._searchKeyDown = function(event)
+{
+    // Escape Key will clear the field and clear the search results
+    if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
+        // If focus belongs here and text is empty - nothing to do, return unhandled.
+        if (event.target.value === "" && this.currentFocusElement === this.previousFocusElement)
+            return;
+        event.preventDefault();
+        event.stopPropagation();
+        // When search was selected manually and is currently blank, we'd like Esc stay unhandled
+        // and hit console drawer handler.
+        event.target.value = "";
+
+        this.performSearch(event);
+        this.currentFocusElement = this.previousFocusElement;
+        if (this.currentFocusElement === event.target)
+            this.currentFocusElement.select();
+        return false;
+    }
+
+    if (!isEnterKey(event))
+        return false;
+
+    // Select all of the text so the user can easily type an entirely new query.
+    event.target.select();
+
+    // Only call performSearch if the Enter key was pressed. Otherwise the search
+    // performance is poor because of searching on every key. The search field has
+    // the incremental attribute set, so we still get incremental searches.
+    this.performSearch(event);
+
+    // Call preventDefault since this was the Enter key. This prevents a "search" event
+    // from firing for key down. This stops performSearch from being called twice in a row.
+    event.preventDefault();
+}
+
+WebInspector.performSearch = function(event)
+{
+    var query = event.target.value;
+    var forceSearch = event.keyIdentifier === "Enter";
+    var isShortSearch = (query.length < 3);
+
+    // Clear a leftover short search flag due to a non-conflicting forced search.
+    if (isShortSearch && this.shortSearchWasForcedByKeyEvent && this.currentQuery !== query)
+        delete this.shortSearchWasForcedByKeyEvent;
+
+    // Indicate this was a forced search on a short query.
+    if (isShortSearch && forceSearch)
+        this.shortSearchWasForcedByKeyEvent = true;
+
+    if (!query || !query.length || (!forceSearch && isShortSearch)) {
+        // Prevent clobbering a short search forced by the user.
+        if (this.shortSearchWasForcedByKeyEvent) {
+            delete this.shortSearchWasForcedByKeyEvent;
+            return;
+        }
+
+        delete this.currentQuery;
+
+        for (var panelName in this.panels) {
+            var panel = this.panels[panelName];
+            if (panel.currentQuery && panel.searchCanceled)
+                panel.searchCanceled();
+            delete panel.currentQuery;
+        }
+
+        this.updateSearchMatchesCount();
+
+        return;
+    }
+
+    if (query === this.currentPanel.currentQuery && this.currentPanel.currentQuery === this.currentQuery) {
+        // When this is the same query and a forced search, jump to the next
+        // search result for a good user experience.
+        if (forceSearch && this.currentPanel.jumpToNextSearchResult)
+            this.currentPanel.jumpToNextSearchResult();
+        return;
+    }
+
+    this.currentQuery = query;
+
+    this.updateSearchMatchesCount();
+
+    if (!this.currentPanel.performSearch)
+        return;
+
+    this.currentPanel.currentQuery = query;
+    this.currentPanel.performSearch(query);
+}
+
+WebInspector.addNodesToSearchResult = function(nodeIds)
+{
+    WebInspector.panels.elements.addNodesToSearchResult(nodeIds);
+}
+
+WebInspector.updateSearchMatchesCount = function(matches, panel)
+{
+    if (!panel)
+        panel = this.currentPanel;
+
+    panel.currentSearchMatches = matches;
+
+    if (panel !== this.currentPanel)
+        return;
+
+    if (!this.currentPanel.currentQuery) {
+        document.getElementById("search-results-matches").addStyleClass("hidden");
+        return;
+    }
+
+    if (matches) {
+        if (matches === 1)
+            var matchesString = WebInspector.UIString("1 match");
+        else
+            var matchesString = WebInspector.UIString("%d matches", matches);
+    } else
+        var matchesString = WebInspector.UIString("Not Found");
+
+    var matchesToolbarElement = document.getElementById("search-results-matches");
+    matchesToolbarElement.removeStyleClass("hidden");
+    matchesToolbarElement.textContent = matchesString;
+}
+
+WebInspector.UIString = function(string)
+{
+    if (window.localizedStrings && string in window.localizedStrings)
+        string = window.localizedStrings[string];
+    else {
+        if (!(string in this.missingLocalizedStrings)) {
+            if (!WebInspector.InspectorBackendStub)
+                console.error("Localized string \"" + string + "\" not found.");
+            this.missingLocalizedStrings[string] = true;
+        }
+
+        if (Preferences.showMissingLocalizedStrings)
+            string += " (not localized)";
+    }
+
+    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
+}
+
+WebInspector.isMac = function()
+{
+    if (!("_isMac" in this))
+        this._isMac = WebInspector.platform === "mac";
+
+    return this._isMac;
+}
+
+WebInspector.isBeingEdited = function(element)
+{
+    return element.__editing;
+}
+
+WebInspector.startEditing = function(element, committedCallback, cancelledCallback, context, multiline)
+{
+    if (element.__editing)
+        return;
+    element.__editing = true;
+
+    var oldText = getContent(element);
+    var moveDirection = "";
+
+    element.addStyleClass("editing");
+
+    var oldTabIndex = element.tabIndex;
+    if (element.tabIndex < 0)
+        element.tabIndex = 0;
+
+    function blurEventListener() {
+        editingCommitted.call(element);
+    }
+
+    function getContent(element) {
+        if (element.tagName === "INPUT" && element.type === "text")
+            return element.value;
+        else
+            return element.textContent;
+    }
+
+    function cleanUpAfterEditing() {
+        delete this.__editing;
+
+        this.removeStyleClass("editing");
+        this.tabIndex = oldTabIndex;
+        this.scrollTop = 0;
+        this.scrollLeft = 0;
+
+        element.removeEventListener("blur", blurEventListener, false);
+        element.removeEventListener("keydown", keyDownEventListener, true);
+
+        if (element === WebInspector.currentFocusElement || element.isAncestor(WebInspector.currentFocusElement))
+            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
+    }
+
+    function editingCancelled() {
+        if (this.tagName === "INPUT" && this.type === "text")
+            this.value = oldText;
+        else
+            this.textContent = oldText;
+
+        cleanUpAfterEditing.call(this);
+
+        if (cancelledCallback)
+            cancelledCallback(this, context);
+    }
+
+    function editingCommitted() {
+        cleanUpAfterEditing.call(this);
+
+        if (committedCallback)
+            committedCallback(this, getContent(this), oldText, context, moveDirection);
+    }
+
+    function keyDownEventListener(event) {
+        var isMetaOrCtrl = WebInspector.isMac() ?
+            event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
+            event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+        if (isEnterKey(event) && (!multiline || isMetaOrCtrl)) {
+            editingCommitted.call(element);
+            event.preventDefault();
+            event.stopPropagation();
+        } else if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
+            editingCancelled.call(element);
+            event.preventDefault();
+            event.stopPropagation();
+        } else if (event.keyIdentifier === "U+0009") // Tab key
+            moveDirection = (event.shiftKey ? "backward" : "forward");
+    }
+
+    element.addEventListener("blur", blurEventListener, false);
+    element.addEventListener("keydown", keyDownEventListener, true);
+
+    WebInspector.currentFocusElement = element;
+}
+
+WebInspector._toolbarItemClicked = function(event)
+{
+    var toolbarItem = event.currentTarget;
+    this.currentPanel = toolbarItem.panel;
+}
+
+// This table maps MIME types to the Resource.Types which are valid for them.
+// The following line:
+//    "text/html":                {0: 1},
+// means that text/html is a valid MIME type for resources that have type
+// WebInspector.Resource.Type.Document (which has a value of 0).
+WebInspector.MIMETypes = {
+    "text/html":                   {0: true},
+    "text/xml":                    {0: true},
+    "text/plain":                  {0: true},
+    "application/xhtml+xml":       {0: true},
+    "text/css":                    {1: true},
+    "text/xsl":                    {1: true},
+    "image/jpeg":                  {2: true},
+    "image/png":                   {2: true},
+    "image/gif":                   {2: true},
+    "image/bmp":                   {2: true},
+    "image/vnd.microsoft.icon":    {2: true},
+    "image/x-icon":                {2: true},
+    "image/x-xbitmap":             {2: true},
+    "font/ttf":                    {3: true},
+    "font/opentype":               {3: true},
+    "application/x-font-type1":    {3: true},
+    "application/x-font-ttf":      {3: true},
+    "application/x-truetype-font": {3: true},
+    "text/javascript":             {4: true},
+    "text/ecmascript":             {4: true},
+    "application/javascript":      {4: true},
+    "application/ecmascript":      {4: true},
+    "application/x-javascript":    {4: true},
+    "text/javascript1.1":          {4: true},
+    "text/javascript1.2":          {4: true},
+    "text/javascript1.3":          {4: true},
+    "text/jscript":                {4: true},
+    "text/livescript":             {4: true},
+}
+
+/* InspectorBackendStub.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+if (!window.InspectorBackend) {
+
+WebInspector.InspectorBackendStub = function()
+{
+    this._searchingForNode = false;
+    this._attachedWindowHeight = 0;
+    this._timelineEnabled = false;
+}
+
+WebInspector.InspectorBackendStub.prototype = {
+    wrapCallback: function(func)
+    {
+        return func;
+    },
+
+    closeWindow: function()
+    {
+        this._windowVisible = false;
+    },
+
+    attach: function()
+    {
+    },
+
+    detach: function()
+    {
+    },
+
+    storeLastActivePanel: function(panel)
+    {
+    },
+
+    clearMessages: function()
+    {
+    },
+
+    searchingForNode: function()
+    {
+        return this._searchingForNode;
+    },
+
+    search: function(sourceRow, query)
+    {
+    },
+
+    toggleNodeSearch: function()
+    {
+        this._searchingForNode = !this._searchingForNode;
+    },
+
+    setAttachedWindowHeight: function(height)
+    {
+    },
+
+    moveByUnrestricted: function(x, y)
+    {
+    },
+
+    getResourceContent: function(callId, identifier)
+    {
+        WebInspector.didGetResourceContent(callId, "");
+    },
+
+    highlightDOMNode: function(node)
+    {
+    },
+
+    hideDOMNodeHighlight: function()
+    {
+    },
+
+    inspectedWindow: function()
+    {
+        return window;
+    },
+
+    loaded: function()
+    {
+    },
+
+    localizedStringsURL: function()
+    {
+        return undefined;
+    },
+
+    windowUnloading: function()
+    {
+        return false;
+    },
+
+    hiddenPanels: function()
+    {
+        return "";
+    },
+
+    enableResourceTracking: function()
+    {
+        WebInspector.resourceTrackingWasEnabled();
+    },
+
+    disableResourceTracking: function()
+    {
+        WebInspector.resourceTrackingWasDisabled();
+    },
+
+
+    enableSearchingForNode: function()
+    {
+        WebInspector.searchingForNodeWasEnabled();
+    },
+
+    disableSearchingForNode: function()
+    {
+        WebInspector.searchingForNodeWasDisabled();
+    },
+
+    reloadPage: function()
+    {
+    },
+
+    enableDebugger: function()
+    {
+        WebInspector.debuggerWasEnabled();
+    },
+
+    disableDebugger: function()
+    {
+        WebInspector.debuggerWasDisabled();
+    },
+
+    setBreakpoint: function(sourceID, line, enabled, condition)
+    {
+    },
+
+    removeBreakpoint: function(sourceID, line)
+    {
+    },
+
+    activateBreakpoints: function()
+    {
+        this._breakpointsActivated = true;
+    },
+
+    deactivateBreakpoints: function()
+    {
+        this._breakpointsActivated = false;
+    },
+
+    pauseInDebugger: function()
+    {
+    },
+
+    setPauseOnExceptionsState: function(value)
+    {
+        WebInspector.updatePauseOnExceptionsState(value);
+    },
+
+    resumeDebugger: function()
+    {
+    },
+
+    enableProfiler: function()
+    {
+        WebInspector.profilerWasEnabled();
+    },
+
+    disableProfiler: function()
+    {
+        WebInspector.profilerWasDisabled();
+    },
+
+    startProfiling: function()
+    {
+    },
+
+    stopProfiling: function()
+    {
+    },
+
+    getProfileHeaders: function(callId)
+    {
+        WebInspector.didGetProfileHeaders(callId, []);
+    },
+
+    getProfile: function(callId, uid)
+    {
+        if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
+        {
+            WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
+        }
+    },
+
+    takeHeapSnapshot: function()
+    {
+    },
+
+    databaseTableNames: function(database)
+    {
+        return [];
+    },
+
+    stepIntoStatementInDebugger: function()
+    {
+    },
+
+    stepOutOfFunctionInDebugger: function()
+    {
+    },
+
+    stepOverStatementInDebugger: function()
+    {
+    },
+
+    saveFrontendSettings: function()
+    {
+    },
+
+    dispatchOnInjectedScript: function()
+    {
+    },
+
+    releaseWrapperObjectGroup: function()
+    {
+    },
+
+    setInjectedScriptSource: function()
+    {
+    },
+    
+    addScriptToEvaluateOnLoad: function()
+    {
+    },
+
+    removeAllScriptsToEvaluateOnLoad: function()
+    {
+    }
+}
+
+InspectorBackend = new WebInspector.InspectorBackendStub();
+
+}
+
+/* InspectorFrontendHostStub.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+if (!window.InspectorFrontendHost) {
+
+WebInspector.InspectorFrontendHostStub = function()
+{
+    this._attachedWindowHeight = 0;
+}
+
+WebInspector._platformFlavor = WebInspector.PlatformFlavor.MacLeopard;
+
+WebInspector.InspectorFrontendHostStub.prototype = {
+    platform: function()
+    {
+        return "mac";
+    },
+
+    port: function()
+    {
+        return "unknown";
+    },
+
+    closeWindow: function()
+    {
+        this._windowVisible = false;
+    },
+
+    attach: function()
+    {
+    },
+
+    detach: function()
+    {
+    },
+
+    search: function(sourceRow, query)
+    {
+    },
+
+    setAttachedWindowHeight: function(height)
+    {
+    },
+
+    moveWindowBy: function(x, y)
+    {
+    },
+
+    loaded: function()
+    {
+    },
+
+    localizedStringsURL: function()
+    {
+        return undefined;
+    },
+
+    hiddenPanels: function()
+    {
+        return "";
+    },
+
+    windowUnloading: function()
+    {
+    },
+
+    copyText: function()
+    {
+    },
+
+    canAttachWindow: function()
+    {
+        return false;
+    }
+}
+
+InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
+
+}
+
+/* Object.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Object = function() {
+}
+
+WebInspector.Object.prototype = {
+    addEventListener: function(eventType, listener, thisObject) {
+        if (!("_listeners" in this))
+            this._listeners = {};
+        if (!(eventType in this._listeners))
+            this._listeners[eventType] = [];
+        this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
+    },
+
+    removeEventListener: function(eventType, listener, thisObject) {
+        if (!("_listeners" in this) || !(eventType in this._listeners))
+            return;
+        var listeners = this._listeners[eventType];
+        for (var i = 0; i < listeners.length; ++i) {
+            if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
+                listeners.splice(i, 1);
+            else if (!listener && thisObject && listeners[i].thisObject === thisObject)
+                listeners.splice(i, 1);
+        }
+
+        if (!listeners.length)
+            delete this._listeners[eventType];
+    },
+
+    dispatchEventToListeners: function(eventType) {
+        if (!("_listeners" in this) || !(eventType in this._listeners))
+            return;
+
+        var stoppedPropagation = false;
+
+        function stopPropagation()
+        {
+            stoppedPropagation = true;
+        }
+
+        function preventDefault()
+        {
+            this.defaultPrevented = true;
+        }
+
+        var event = {target: this, type: eventType, defaultPrevented: false};
+        event.stopPropagation = stopPropagation;
+        event.preventDefault = preventDefault;
+
+        var listeners = this._listeners[eventType].slice(0);
+        for (var i = 0; i < listeners.length; ++i) {
+            listeners[i].listener.call(listeners[i].thisObject, event);
+            if (stoppedPropagation)
+                break;
+        }
+
+        return event.defaultPrevented;
+    }
+}
+
+/* Settings.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+var Preferences = {
+    maxInlineTextChildLength: 80,
+    minConsoleHeight: 75,
+    minSidebarWidth: 100,
+    minElementsSidebarWidth: 200,
+    minScriptsSidebarWidth: 200,
+    styleRulesExpandedState: {},
+    showMissingLocalizedStrings: false,
+    samplingCPUProfiler: false,
+    showColorNicknames: true,
+    debuggerAlwaysEnabled: false,
+    profilerAlwaysEnabled: false,
+    auditsPanelEnabled: false
+}
+
+WebInspector.populateFrontendSettings = function(settingsString)
+{
+    WebInspector.settings._load(settingsString);
+}
+
+WebInspector.Settings = function()
+{
+}
+
+WebInspector.Settings.prototype = {
+    _load: function(settingsString)
+    {
+        try {
+            this._store = JSON.parse(settingsString);
+        } catch (e) {
+            // May fail;
+            this._store = {};
+        }
+
+        this._installSetting("eventListenersFilter", "event-listeners-filter", "all");
+        this._installSetting("colorFormat", "color-format", "hex");
+        this._installSetting("resourcesLargeRows", "resources-large-rows", true);
+        this._installSetting("watchExpressions", "watch-expressions", []);
+        this._installSetting("lastViewedScriptFile", "last-viewed-script-file");
+        this._installSetting("showInheritedComputedStyleProperties", "show-inherited-computed-style-properties", false);
+        this._installSetting("showUserAgentStyles", "show-user-agent-styles", true);
+        this._installSetting("resourceViewTab", "resource-view-tab", "content");
+        this.dispatchEventToListeners("loaded");
+    },
+
+    _installSetting: function(name, propertyName, defaultValue)
+    {
+        this.__defineGetter__(name, this._get.bind(this, propertyName));
+        this.__defineSetter__(name, this._set.bind(this, propertyName));
+        if (!(propertyName in this._store)) {
+            this._store[propertyName] = defaultValue;
+        }
+    },
+
+    _get: function(propertyName)
+    {
+        return this._store[propertyName];
+    },
+
+    _set: function(propertyName, newValue)
+    {
+        this._store[propertyName] = newValue;
+        try {
+            InspectorBackend.saveFrontendSettings(JSON.stringify(this._store));
+        } catch (e) {
+            // May fail;
+        }
+    }
+}
+
+WebInspector.Settings.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ContextMenu.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ContextMenu = function() {
+    this._items = [];
+    this._handlers = {};
+}
+
+WebInspector.ContextMenu.prototype = {
+    show: function(event)
+    {
+        // Remove trailing separator.
+        while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))
+            this._items.splice(this._items.length - 1, 1);
+
+        if (this._items.length) {
+            WebInspector._contextMenu = this;
+            InspectorFrontendHost.showContextMenu(event, this._items);
+        }
+    },
+
+    appendItem: function(label, handler)
+    {
+        var id = this._items.length;
+        this._items.push({id: id, label: label});
+        this._handlers[id] = handler;
+    },
+
+    appendSeparator: function()
+    {
+        // No separator dupes allowed.
+        if (this._items.length === 0)
+            return;
+        if (!("id" in this._items[this._items.length - 1]))
+            return;
+        this._items.push({});
+    },
+
+    _itemSelected: function(id)
+    {
+        if (this._handlers[id])
+            this._handlers[id].call(this);
+    }
+}
+
+WebInspector.contextMenuItemSelected = function(id)
+{
+    if (WebInspector._contextMenu)
+        WebInspector._contextMenu._itemSelected(id);
+}
+
+WebInspector.contextMenuCleared = function()
+{
+    // FIXME: Unfortunately, contextMenuCleared is invoked between show and item selected
+    // so we can't delete last menu object from WebInspector. Fix the contract.
+}
+
+/* KeyboardShortcut.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.KeyboardShortcut = function()
+{
+};
+
+/**
+ * Constants for encoding modifier key set as a bit mask.
+ * @see #_makeKeyFromCodeAndModifiers
+ */
+WebInspector.KeyboardShortcut.Modifiers = {
+    None: 0,   // Constant for empty modifiers set.
+    Shift: 1,
+    Ctrl: 2,
+    Alt: 4,
+    Meta: 8    // Command key on Mac, Win key on other platforms.
+};
+
+WebInspector.KeyboardShortcut.KeyCodes = {
+    Backspace: 8,
+    Tab: 9,
+    Esc: 27,
+    Space: 32,
+    PageUp: 33,      // also NUM_NORTH_EAST
+    PageDown: 34,    // also NUM_SOUTH_EAST
+    End: 35,         // also NUM_SOUTH_WEST
+    Home: 36,        // also NUM_NORTH_WEST
+    Left: 37,        // also NUM_WEST
+    Up: 38,          // also NUM_NORTH
+    Right: 39,       // also NUM_EAST
+    Down: 40,        // also NUM_SOUTH
+    Delete: 46,
+    Zero: 48,
+    F1: 112,
+    F2: 113,
+    F3: 114,
+    F4: 115,
+    F5: 116,
+    F6: 117,
+    F7: 118,
+    F8: 119,
+    F9: 120,
+    F10: 121,
+    F11: 122,
+    F12: 123,
+    Semicolon: 186,    // ;
+    Plus: 187,         // +
+    Comma: 188,        // ,
+    Minus: 189,        // -
+    Period: 190,       // .
+    Slash: 191,        // /
+    Apostrophe: 192,   // `
+    SingleQuote: 222   // '
+};
+
+/**
+ * Creates a number encoding keyCode in the lower 8 bits and modifiers mask in the higher 8 bits.
+ * It is useful for matching pressed keys.
+ * keyCode is the Code of the key, or a character "a-z" which is converted to a keyCode value.
+ * optModifiers is an Optional list of modifiers passed as additional paramerters.
+ */
+WebInspector.KeyboardShortcut.makeKey = function(keyCode, optModifiers)
+{
+    if (typeof keyCode === "string")
+        keyCode = keyCode.charCodeAt(0) - 32;
+    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
+    for (var i = 1; i < arguments.length; i++)
+        modifiers |= arguments[i];
+    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);
+};
+
+WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)
+{
+    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
+    if (keyboardEvent.shiftKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;
+    if (keyboardEvent.ctrlKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;
+    if (keyboardEvent.altKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;
+    if (keyboardEvent.metaKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;
+    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);
+};
+
+WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)
+{
+    return (keyCode & 255) | (modifiers << 8);
+};
+
+/* TextPrompt.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextPrompt = function(element, completions, stopCharacters)
+{
+    this.element = element;
+    this.completions = completions;
+    this.completionStopCharacters = stopCharacters;
+    this.history = [];
+    this.historyOffset = 0;
+    this.element.addEventListener("keydown", this._onKeyDown.bind(this), true);
+}
+
+WebInspector.TextPrompt.prototype = {
+    get text()
+    {
+        return this.element.textContent;
+    },
+
+    set text(x)
+    {
+        if (!x) {
+            // Append a break element instead of setting textContent to make sure the selection is inside the prompt.
+            this.element.removeChildren();
+            this.element.appendChild(document.createElement("br"));
+        } else
+            this.element.textContent = x;
+
+        this.moveCaretToEndOfPrompt();
+    },
+
+    _onKeyDown: function(event)
+    {
+        function defaultAction()
+        {
+            this.clearAutoComplete();
+            this.autoCompleteSoon();
+        }
+
+        var handled = false;
+        switch (event.keyIdentifier) {
+            case "Up":
+                this._upKeyPressed(event);
+                break;
+            case "Down":
+                this._downKeyPressed(event);
+                break;
+            case "U+0009": // Tab
+                this._tabKeyPressed(event);
+                break;
+            case "Right":
+            case "End":
+                if (!this.acceptAutoComplete())
+                    this.autoCompleteSoon();
+                break;
+            case "Alt":
+            case "Meta":
+            case "Shift":
+            case "Control":
+                break;
+            case "U+0050": // Ctrl+P = Previous
+                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
+                    handled = true;
+                    this._moveBackInHistory();
+                    break;
+                }
+                defaultAction.call(this);
+                break;
+            case "U+004E": // Ctrl+N = Next
+                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
+                    handled = true;
+                    this._moveForwardInHistory();
+                    break;
+                }
+                defaultAction.call(this);
+                break;
+            default:
+                defaultAction.call(this);
+                break;
+        }
+
+        if (handled) {
+            event.preventDefault();
+            event.stopPropagation();
+        }
+    },
+
+    acceptAutoComplete: function()
+    {
+        if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)
+            return false;
+
+        var text = this.autoCompleteElement.textContent;
+        var textNode = document.createTextNode(text);
+        this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);
+        delete this.autoCompleteElement;
+
+        var finalSelectionRange = document.createRange();
+        finalSelectionRange.setStart(textNode, text.length);
+        finalSelectionRange.setEnd(textNode, text.length);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+
+        return true;
+    },
+
+    clearAutoComplete: function(includeTimeout)
+    {
+        if (includeTimeout && "_completeTimeout" in this) {
+            clearTimeout(this._completeTimeout);
+            delete this._completeTimeout;
+        }
+
+        if (!this.autoCompleteElement)
+            return;
+
+        if (this.autoCompleteElement.parentNode)
+            this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
+        delete this.autoCompleteElement;
+
+        if (!this._userEnteredRange || !this._userEnteredText)
+            return;
+
+        this._userEnteredRange.deleteContents();
+
+        var userTextNode = document.createTextNode(this._userEnteredText);
+        this._userEnteredRange.insertNode(userTextNode);
+
+        var selectionRange = document.createRange();
+        selectionRange.setStart(userTextNode, this._userEnteredText.length);
+        selectionRange.setEnd(userTextNode, this._userEnteredText.length);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+
+        delete this._userEnteredRange;
+        delete this._userEnteredText;
+    },
+
+    autoCompleteSoon: function()
+    {
+        if (!("_completeTimeout" in this))
+            this._completeTimeout = setTimeout(this.complete.bind(this, true), 250);
+    },
+
+    complete: function(auto)
+    {
+        this.clearAutoComplete(true);
+        var selection = window.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+        if (!selectionRange.commonAncestorContainer.isDescendant(this.element))
+            return;
+        if (auto && !this.isCaretAtEndOfPrompt())
+            return;
+        var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this.completionStopCharacters, this.element, "backward");
+        this.completions(wordPrefixRange, auto, this._completionsReady.bind(this, selection, auto, wordPrefixRange));
+    },
+
+    _completionsReady: function(selection, auto, originalWordPrefixRange, completions)
+    {
+        if (!completions || !completions.length)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+
+        var fullWordRange = document.createRange();
+        fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);
+        fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);
+
+        if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())
+            return;
+
+        if (completions.length === 1 || selection.isCollapsed || auto) {
+            var completionText = completions[0];
+        } else {
+            var currentText = fullWordRange.toString();
+
+            var foundIndex = null;
+            for (var i = 0; i < completions.length; ++i)
+                if (completions[i] === currentText)
+                    foundIndex = i;
+
+            if (foundIndex === null || (foundIndex + 1) >= completions.length)
+                var completionText = completions[0];
+            else
+                var completionText = completions[foundIndex + 1];
+        }
+
+        var wordPrefixLength = originalWordPrefixRange.toString().length;
+
+        this._userEnteredRange = fullWordRange;
+        this._userEnteredText = fullWordRange.toString();
+
+        fullWordRange.deleteContents();
+
+        var finalSelectionRange = document.createRange();
+
+        if (auto) {
+            var prefixText = completionText.substring(0, wordPrefixLength);
+            var suffixText = completionText.substring(wordPrefixLength);
+
+            var prefixTextNode = document.createTextNode(prefixText);
+            fullWordRange.insertNode(prefixTextNode);
+
+            this.autoCompleteElement = document.createElement("span");
+            this.autoCompleteElement.className = "auto-complete-text";
+            this.autoCompleteElement.textContent = suffixText;
+
+            prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);
+
+            finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);
+            finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);
+        } else {
+            var completionTextNode = document.createTextNode(completionText);
+            fullWordRange.insertNode(completionTextNode);
+
+            if (completions.length > 1)
+                finalSelectionRange.setStart(completionTextNode, wordPrefixLength);
+            else
+                finalSelectionRange.setStart(completionTextNode, completionText.length);
+
+            finalSelectionRange.setEnd(completionTextNode, completionText.length);
+        }
+
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+    },
+
+    isCaretInsidePrompt: function()
+    {
+        return this.element.isInsertionCaretInside();
+    },
+
+    isCaretAtEndOfPrompt: function()
+    {
+        var selection = window.getSelection();
+        if (!selection.rangeCount || !selection.isCollapsed)
+            return false;
+
+        var selectionRange = selection.getRangeAt(0);
+        var node = selectionRange.startContainer;
+        if (node !== this.element && !node.isDescendant(this.element))
+            return false;
+
+        if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)
+            return false;
+
+        var foundNextText = false;
+        while (node) {
+            if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {
+                if (foundNextText)
+                    return false;
+                foundNextText = true;
+            }
+
+            node = node.traverseNextNode(this.element);
+        }
+
+        return true;
+    },
+
+    isCaretOnFirstLine: function()
+    {
+        var selection = window.getSelection();
+        var focusNode = selection.focusNode;
+        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
+            return true;
+
+        if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)
+            return false;
+        focusNode = focusNode.previousSibling;
+
+        while (focusNode) {
+            if (focusNode.nodeType !== Node.TEXT_NODE)
+                return true;
+            if (focusNode.textContent.indexOf("\n") !== -1)
+                return false;
+            focusNode = focusNode.previousSibling;
+        }
+
+        return true;
+    },
+
+    isCaretOnLastLine: function()
+    {
+        var selection = window.getSelection();
+        var focusNode = selection.focusNode;
+        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
+            return true;
+
+        if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)
+            return false;
+        focusNode = focusNode.nextSibling;
+
+        while (focusNode) {
+            if (focusNode.nodeType !== Node.TEXT_NODE)
+                return true;
+            if (focusNode.textContent.indexOf("\n") !== -1)
+                return false;
+            focusNode = focusNode.nextSibling;
+        }
+
+        return true;
+    },
+
+    moveCaretToEndOfPrompt: function()
+    {
+        var selection = window.getSelection();
+        var selectionRange = document.createRange();
+
+        var offset = this.element.childNodes.length;
+        selectionRange.setStart(this.element, offset);
+        selectionRange.setEnd(this.element, offset);
+
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+    },
+
+    _tabKeyPressed: function(event)
+    {
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.complete();
+    },
+
+    _upKeyPressed: function(event)
+    {
+        if (!this.isCaretOnFirstLine())
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this._moveBackInHistory();
+    },
+
+    _downKeyPressed: function(event)
+    {
+        if (!this.isCaretOnLastLine())
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this._moveForwardInHistory();
+    },
+
+    _moveBackInHistory: function()
+    {
+        if (this.historyOffset == this.history.length)
+            return;
+
+        this.clearAutoComplete(true);
+
+        if (this.historyOffset === 0)
+            this.tempSavedCommand = this.text;
+
+        ++this.historyOffset;
+        this.text = this.history[this.history.length - this.historyOffset];
+
+        this.element.scrollIntoViewIfNeeded();
+        var firstNewlineIndex = this.text.indexOf("\n");
+        if (firstNewlineIndex === -1)
+            this.moveCaretToEndOfPrompt();
+        else {
+            var selection = window.getSelection();
+            var selectionRange = document.createRange();
+
+            selectionRange.setStart(this.element.firstChild, firstNewlineIndex);
+            selectionRange.setEnd(this.element.firstChild, firstNewlineIndex);
+
+            selection.removeAllRanges();
+            selection.addRange(selectionRange);
+        }
+    },
+
+    _moveForwardInHistory: function()
+    {
+        if (this.historyOffset === 0)
+            return;
+
+        this.clearAutoComplete(true);
+
+        --this.historyOffset;
+
+        if (this.historyOffset === 0) {
+            this.text = this.tempSavedCommand;
+            delete this.tempSavedCommand;
+            return;
+        }
+
+        this.text = this.history[this.history.length - this.historyOffset];
+        this.element.scrollIntoViewIfNeeded();
+    }
+}
+
+/* Popover.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Popover = function(contentElement)
+{
+    this.element = document.createElement("div");
+    this.element.className = "popover";
+
+    this._popupArrowElement = document.createElement("div");
+    this._popupArrowElement.className = "arrow";
+    this.element.appendChild(this._popupArrowElement);
+
+    this.contentElement = contentElement;
+    this._contentDiv = document.createElement("div");
+    this._contentDiv.className = "content";
+}
+
+WebInspector.Popover.prototype = {
+    show: function(anchor, preferredWidth, preferredHeight)
+    {
+        // This should not happen, but we hide previous popup to be on the safe side.
+        if (WebInspector.Popover._popoverElement)
+            document.body.removeChild(WebInspector.Popover._popoverElement);
+        WebInspector.Popover._popoverElement = this.element;
+
+        // Temporarily attach in order to measure preferred dimensions.
+        this.contentElement.positionAt(0, 0);
+        document.body.appendChild(this.contentElement);
+        var preferredWidth = preferredWidth || this.contentElement.offsetWidth;
+        var preferredHeight = preferredHeight || this.contentElement.offsetHeight;
+
+        this._contentDiv.appendChild(this.contentElement);
+        this.element.appendChild(this._contentDiv);
+        document.body.appendChild(this.element);
+        this._positionElement(anchor, preferredWidth, preferredHeight);
+    },
+
+    hide: function()
+    {
+        if (WebInspector.Popover._popoverElement) {
+            delete WebInspector.Popover._popoverElement;
+            document.body.removeChild(this.element);
+        }
+    },
+
+    _positionElement: function(anchorElement, preferredWidth, preferredHeight)
+    {
+        const borderWidth = 25;
+        const scrollerWidth = 11;
+        const arrowHeight = 15;
+        const arrowOffset = 10;
+        const borderRadius = 10;
+
+        // Skinny tooltips are not pretty, their arrow location is not nice.
+        preferredWidth = Math.max(preferredWidth, 50);
+        const totalWidth = window.innerWidth;
+        const totalHeight = window.innerHeight;
+
+        var anchorBox = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};
+        while (anchorElement !== document.body) {
+            if (anchorElement.scrollLeft)
+                anchorBox.x -= anchorElement.scrollLeft;
+            if (anchorElement.scrollTop)
+                anchorBox.y -= anchorElement.scrollTop;
+            anchorElement = anchorElement.parentElement;
+        }
+
+        var newElementPosition = { x: 0, y: 0, width: preferredWidth + scrollerWidth, height: preferredHeight };
+
+        var verticalAlignment;
+        var roomAbove = anchorBox.y;
+        var roomBelow = totalHeight - anchorBox.y - anchorBox.height;
+
+        if (roomAbove > roomBelow) {
+            // Positioning above the anchor.
+            if (anchorBox.y > newElementPosition.height + arrowHeight + borderRadius)
+                newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;
+            else {
+                newElementPosition.y = borderRadius * 2;
+                newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;
+            }
+            verticalAlignment = "bottom";
+        } else {
+            // Positioning below the anchor.
+            newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;
+            if (newElementPosition.y + newElementPosition.height + arrowHeight - borderWidth >= totalHeight)
+                newElementPosition.height = totalHeight - anchorBox.y - anchorBox.height - borderRadius * 2 - arrowHeight;
+            // Align arrow.
+            verticalAlignment = "top";
+        }
+
+        var horizontalAlignment;
+        if (anchorBox.x + newElementPosition.width < totalWidth) {
+            newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);
+            horizontalAlignment = "left";
+        } else if (newElementPosition.width + borderRadius * 2 < totalWidth) {
+            newElementPosition.x = totalWidth - newElementPosition.width - borderRadius;
+            horizontalAlignment = "right";
+            // Position arrow accurately.
+            var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);
+            arrowRightPosition += anchorBox.width / 2;
+            this._popupArrowElement.style.right = arrowRightPosition + "px";
+        } else {
+            newElementPosition.x = borderRadius;
+            newElementPosition.width = totalWidth - borderRadius * 2;
+            newElementPosition.height += scrollerWidth;
+            horizontalAlignment = "left";
+            if (verticalAlignment === "bottom")
+                newElementPosition.y -= scrollerWidth;
+            // Position arrow accurately.
+            this._popupArrowElement.style.left = Math.max(0, anchorBox.x - borderRadius * 2 - arrowOffset) + "px";
+            this._popupArrowElement.style.left += anchorBox.width / 2;
+        }
+
+        this.element.className = "popover " + verticalAlignment + "-" + horizontalAlignment + "-arrow";
+        this.element.positionAt(newElementPosition.x - borderWidth, newElementPosition.y - borderWidth);
+        this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";
+        this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";
+    }
+}
+
+WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopup, showOnClick, onHide)
+{
+    this._panelElement = panelElement;
+    this._getAnchor = getAnchor;
+    this._showPopup = showPopup;
+    this._showOnClick = showOnClick;
+    this._onHide = onHide;
+    panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);
+    panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);
+}
+
+WebInspector.PopoverHelper.prototype = {
+    _mouseDown: function(event)
+    {
+        this._killHidePopupTimer();
+        this._handleMouseAction(event, true);
+    },
+
+    _mouseMove: function(event)
+    {
+        // Pretend that nothing has happened.
+        if (this._hoverElement === event.target || (this._hoverElement && this._hoverElement.isAncestor(event.target)))
+            return;
+
+        // User has 500ms to reach the popup.
+        if (this._popup && !this._hidePopupTimer) {
+            var self = this;
+            function doHide()
+            {
+                self.hidePopup();
+                delete self._hidePopupTimer;
+            }
+            this._hidePopupTimer = setTimeout(doHide, 500);
+        }
+
+        this._handleMouseAction(event);
+    },
+
+    _handleMouseAction: function(event, isMouseDown)
+    {
+        this._resetHoverTimer();
+
+        this._hoverElement = this._getAnchor(event.target);
+        if (!this._hoverElement)
+            return;
+
+        const toolTipDelay = isMouseDown ? 0 : (this._popup ? 600 : 1000);
+        this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
+    },
+
+    _resetHoverTimer: function()
+    {
+        if (this._hoverTimer) {
+            clearTimeout(this._hoverTimer);
+            delete this._hoverTimer;
+        }
+    },
+
+    hidePopup: function()
+    {
+        if (!this._popup)
+            return;
+
+        if (this._onHide)
+            this._onHide();
+
+        this._popup.hide();
+        delete this._popup;
+    },
+
+    _mouseHover: function(element)
+    {
+        delete this._hoverTimer;
+
+        this._popup = this._showPopup(element);
+        this._popup.contentElement.addEventListener("mousemove", this._killHidePopupTimer.bind(this), true);
+    },
+
+    _killHidePopupTimer: function()
+    {
+        if (this._hidePopupTimer) {
+            clearTimeout(this._hidePopupTimer);
+            delete this._hidePopupTimer;
+
+            // We know that we reached the popup, but we might have moved over other elements.
+            // Discard pending command.
+            this._resetHoverTimer();
+        }
+    }
+}
+
+/* Placard.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Placard = function(title, subtitle)
+{
+    this.element = document.createElement("div");
+    this.element.className = "placard";
+    this.element.placard = this;
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+
+    this.subtitleElement = document.createElement("div");
+    this.subtitleElement.className = "subtitle";
+
+    this.element.appendChild(this.subtitleElement);
+    this.element.appendChild(this.titleElement);
+
+    this.title = title;
+    this.subtitle = subtitle;
+    this.selected = false;
+}
+
+WebInspector.Placard.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.titleElement.textContent = x;
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        if (this._subtitle === x)
+            return;
+        this._subtitle = x;
+        this.subtitleElement.innerHTML = x;
+    },
+
+    get selected()
+    {
+        return this._selected;
+    },
+
+    set selected(x)
+    {
+        if (x)
+            this.select();
+        else
+            this.deselect();
+    },
+
+    select: function()
+    {
+        if (this._selected)
+            return;
+        this._selected = true;
+        this.element.addStyleClass("selected");
+    },
+
+    deselect: function()
+    {
+        if (!this._selected)
+            return;
+        this._selected = false;
+        this.element.removeStyleClass("selected");
+    },
+
+    toggleSelected: function()
+    {
+        this.selected = !this.selected;
+    }
+}
+
+/* View.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.View = function(element)
+{
+    this.element = element || document.createElement("div");
+    this._visible = false;
+}
+
+WebInspector.View.prototype = {
+    get visible()
+    {
+        return this._visible;
+    },
+
+    set visible(x)
+    {
+        if (this._visible === x)
+            return;
+
+        if (x)
+            this.show();
+        else
+            this.hide();
+    },
+
+    show: function(parentElement)
+    {
+        this._visible = true;
+        if (parentElement && parentElement !== this.element.parentNode) {
+            this.detach();
+            parentElement.appendChild(this.element);
+        }
+        if (!this.element.parentNode && this.attach)
+            this.attach();
+        this.element.addStyleClass("visible");
+    },
+
+    hide: function()
+    {
+        this.element.removeStyleClass("visible");
+        this._visible = false;
+    },
+
+    detach: function()
+    {
+        if (this.element.parentNode)
+            this.element.parentNode.removeChild(this.element);
+    }
+}
+
+WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* Callback.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Callback = function()
+{
+    this._lastCallbackId = 1;
+    this._callbacks = {};
+}
+
+WebInspector.Callback.prototype = {
+    wrap: function(callback)
+    {
+        var callbackId = this._lastCallbackId++;
+        this._callbacks[callbackId] = callback || function() {};
+        return callbackId;
+    },
+
+    processCallback: function(callbackId, opt_vararg)
+    {
+        var args = Array.prototype.slice.call(arguments, 1);
+        var callback = this._callbacks[callbackId];
+        callback.apply(null, args);
+        delete this._callbacks[callbackId];
+    }
+}
+
+WebInspector.Callback._INSTANCE = new WebInspector.Callback();
+WebInspector.Callback.wrap = WebInspector.Callback._INSTANCE.wrap.bind(WebInspector.Callback._INSTANCE);
+WebInspector.Callback.processCallback = WebInspector.Callback._INSTANCE.processCallback.bind(WebInspector.Callback._INSTANCE);
+
+/* Drawer.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Drawer = function()
+{
+    WebInspector.View.call(this, document.getElementById("drawer"));
+
+    this._savedHeight = 200; // Default.
+    this.state = WebInspector.Drawer.State.Hidden;
+    this.fullPanel = false;
+
+    this.mainElement = document.getElementById("main");
+    this.toolbarElement = document.getElementById("toolbar");
+    this.mainStatusBar = document.getElementById("main-status-bar");
+    this.mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
+    this.viewStatusBar = document.getElementById("other-drawer-status-bar-items");
+}
+
+WebInspector.Drawer.prototype = {
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x) {
+            if (this.visible && this.fullPanel)
+                return;
+            this.visible = !this.visible;
+            return;
+        }
+
+        var firstTime = !this._visibleView;
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x && !firstTime) {
+            this._safelyRemoveChildren();
+            this.viewStatusBar.removeChildren(); // optimize this? call old.detach()
+            x.attach(this.element, this.viewStatusBar);
+            x.show();
+            this.visible = true;
+        }
+    },
+
+    get savedHeight()
+    {
+        var height = this._savedHeight || this.element.offsetHeight;
+        return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this.mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+    },
+
+    showView: function(view)
+    {
+        if (!this.visible || this.visibleView !== view)
+            this.visibleView = view;
+    },
+
+    show: function()
+    {
+        if (this._animating || this.visible)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.show();
+
+        WebInspector.View.prototype.show.call(this);
+
+        this._animating = true;
+
+        document.body.addStyleClass("drawer-visible");
+
+        var anchoredItems = document.getElementById("anchored-status-bar-items");
+        var height = (this.fullPanel ? window.innerHeight - this.toolbarElement.offsetHeight : this.savedHeight);
+        var animations = [
+            {element: this.element, end: {height: height}},
+            {element: document.getElementById("main"), end: {bottom: height}},
+            {element: document.getElementById("main-status-bar"), start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
+            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 0}, end: {opacity: 1}}
+        ];
+
+        var drawerStatusBar = document.getElementById("drawer-status-bar");
+        drawerStatusBar.insertBefore(anchoredItems, drawerStatusBar.firstChild);
+
+        function animationFinished()
+        {
+            if ("updateStatusBarItems" in WebInspector.currentPanel)
+                WebInspector.currentPanel.updateStatusBarItems();
+            if (this.visibleView.afterShow)
+                this.visibleView.afterShow();
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    hide: function()
+    {
+        if (this._animating || !this.visible)
+            return;
+
+        WebInspector.View.prototype.hide.call(this);
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        this._animating = true;
+
+        if (!this.fullPanel)
+            this._savedHeight = this.element.offsetHeight;
+
+        if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))
+            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
+
+        var anchoredItems = document.getElementById("anchored-status-bar-items");
+
+        // Temporarily set properties and classes to mimic the post-animation values so panels
+        // like Elements in their updateStatusBarItems call will size things to fit the final location.
+        this.mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
+        document.body.removeStyleClass("drawer-visible");
+        if ("updateStatusBarItems" in WebInspector.currentPanel)
+            WebInspector.currentPanel.updateStatusBarItems();
+        document.body.addStyleClass("drawer-visible");
+
+        var animations = [
+            {element: document.getElementById("main"), end: {bottom: 0}},
+            {element: document.getElementById("main-status-bar"), start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
+            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 1}, end: {opacity: 0}}
+        ];
+
+        function animationFinished()
+        {
+            WebInspector.currentPanel.resize();
+            var mainStatusBar = document.getElementById("main-status-bar");
+            mainStatusBar.insertBefore(anchoredItems, mainStatusBar.firstChild);
+            mainStatusBar.style.removeProperty("padding-left");
+            document.body.removeStyleClass("drawer-visible");
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = WebInspector.Drawer.State.Hidden;
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    resize: function()
+    {
+        if (this.state === WebInspector.Drawer.State.Hidden)
+            return;
+
+        var height;
+        var mainElement = document.getElementById("main");
+        if (this.state === WebInspector.Drawer.State.Variable) {
+            height = parseInt(this.element.style.height);
+            height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+        } else
+            height = window.innerHeight - this.toolbarElement.offsetHeight;
+
+        mainElement.style.bottom = height + "px";
+        this.element.style.height = height + "px";
+    },
+
+    enterPanelMode: function()
+    {
+        this._cancelAnimationIfNeeded();
+        this.fullPanel = true;
+        
+        if (this.visible) {
+            this._savedHeight = this.element.offsetHeight;
+            var height = window.innerHeight - this.toolbarElement.offsetHeight;
+            this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);
+        }
+    },
+
+    exitPanelMode: function()
+    {
+        this._cancelAnimationIfNeeded();
+        this.fullPanel = false;
+
+        if (this.visible) {
+            // If this animation gets cancelled, we want the state of the drawer to be Variable,
+            // so that the new animation can't do an immediate transition between Hidden/Full states.
+            this.state = WebInspector.Drawer.State.Variable;
+            var height = this.savedHeight;
+            this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);
+        }
+    },
+
+    immediatelyExitPanelMode: function()
+    {
+        this.visible = false;
+        this.fullPanel = false;
+    },
+
+    _cancelAnimationIfNeeded: function()
+    {
+        if (this._animating) {
+            clearInterval(this._currentAnimationInterval);
+            delete this._animating;
+            delete this._currentAnimationInterval;
+        }
+    },
+
+    _animateDrawerHeight: function(height, finalState)
+    {
+        this._animating = true;
+        var animations = [
+            {element: this.element, end: {height: height}},
+            {element: document.getElementById("main"), end: {bottom: height}}
+        ];
+
+        function animationFinished()
+        {
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = finalState;
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    _animationDuration: function()
+    {
+        // Immediate if going between Hidden and Full in full panel mode
+        if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))
+            return 0;
+
+        return (window.event && window.event.shiftKey ? 2000 : 250);
+    },
+
+    _safelyRemoveChildren: function()
+    {
+        var child = this.element.firstChild;
+        while (child) {
+            if (child.id !== "drawer-status-bar") {
+                var moveTo = child.nextSibling;
+                this.element.removeChild(child);
+                child = moveTo;
+            } else
+                child = child.nextSibling;
+        }
+    },
+
+    _startStatusBarDragging: function(event)
+    {
+        if (!this.visible || event.target !== this.mainStatusBar)
+            return;
+
+        WebInspector.elementDragStart(this.mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
+
+        this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;
+
+        event.stopPropagation();
+    },
+
+    _statusBarDragging: function(event)
+    {
+        var mainElement = document.getElementById("main");
+        var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
+        height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+
+        mainElement.style.bottom = height + "px";
+        this.element.style.height = height + "px";
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    _endStatusBarDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+
+        this._savedHeight = this.element.offsetHeight;
+        delete this._statusBarDragOffset;
+
+        event.stopPropagation();
+    }
+}
+
+WebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.Drawer.State = {
+    Hidden: 0,
+    Variable: 1,
+    Full: 2
+};
+
+/* ChangesView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ChangesView = function(drawer)
+{
+    WebInspector.View.call(this);
+    this.element.innerHTML = "<div style=\"bottom:25%;color:rgb(192,192,192);font-size:12px;height:65px;left:0px;margin:auto;position:absolute;right:0px;text-align:center;top:0px;\"><h1>Not Implemented Yet</h1></div>";
+
+    this.drawer = drawer;
+
+    this.clearButton = document.createElement("button");
+    this.clearButton.id = "clear-changes-status-bar-item";
+    this.clearButton.title = WebInspector.UIString("Clear changes log.");
+    this.clearButton.className = "status-bar-item";
+    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.toggleChangesButton = document.getElementById("changes-status-bar-item");
+    this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
+    this.toggleChangesButton.addEventListener("click", this._toggleChangesButtonClicked.bind(this), false);
+    var anchoredStatusBar = document.getElementById("anchored-status-bar-items");
+    anchoredStatusBar.appendChild(this.toggleChangesButton);
+}
+
+WebInspector.ChangesView.prototype = {
+    _clearButtonClicked: function()
+    {
+        // Not Implemented Yet
+    },
+
+    _toggleChangesButtonClicked: function()
+    {
+        this.drawer.visibleView = this;
+    },
+
+    attach: function(mainElement, statusBarElement)
+    {
+        mainElement.appendChild(this.element);
+        statusBarElement.appendChild(this.clearButton);
+    },
+
+    show: function()
+    {
+        this.toggleChangesButton.addStyleClass("toggled-on");
+        this.toggleChangesButton.title = WebInspector.UIString("Hide changes view.");
+    },
+
+    hide: function()
+    {
+        this.toggleChangesButton.removeStyleClass("toggled-on");
+        this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
+    }
+}
+
+WebInspector.ChangesView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ConsoleView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
+
+WebInspector.ConsoleView = function(drawer)
+{
+    WebInspector.View.call(this, document.getElementById("console-view"));
+
+    this.messages = [];
+    this.drawer = drawer;
+
+    this.clearButton = document.getElementById("clear-console-status-bar-item");
+    this.clearButton.title = WebInspector.UIString("Clear console log.");
+    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.messagesElement = document.getElementById("console-messages");
+    this.messagesElement.addEventListener("selectstart", this._messagesSelectStart.bind(this), false);
+    this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);
+
+    this.promptElement = document.getElementById("console-prompt");
+    this.promptElement.className = "source-code";
+    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
+    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");
+
+    this.topGroup = new WebInspector.ConsoleGroup(null, 0);
+    this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
+    this.groupLevel = 0;
+    this.currentGroup = this.topGroup;
+
+    this.toggleConsoleButton = document.getElementById("console-status-bar-item");
+    this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
+    this.toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);
+
+    // Will hold the list of filter elements
+    this.filterBarElement = document.getElementById("console-filter");
+
+    function createDividerElement() {
+        var dividerElement = document.createElement("div");
+        dividerElement.addStyleClass("divider");
+        this.filterBarElement.appendChild(dividerElement);
+    }
+
+    var updateFilterHandler = this._updateFilter.bind(this);
+    function createFilterElement(category) {
+        var categoryElement = document.createElement("li");
+        categoryElement.category = category;
+        categoryElement.addStyleClass(categoryElement.category);            
+        categoryElement.addEventListener("click", updateFilterHandler, false);
+
+        var label = category.toString();
+        categoryElement.appendChild(document.createTextNode(label));
+
+        this.filterBarElement.appendChild(categoryElement);
+        return categoryElement;
+    }
+    
+    this.allElement = createFilterElement.call(this, "All");
+    createDividerElement.call(this);
+    this.errorElement = createFilterElement.call(this, "Errors");
+    this.warningElement = createFilterElement.call(this, "Warnings");
+    this.logElement = createFilterElement.call(this, "Logs");
+
+    this.filter(this.allElement, false);
+
+    this._shortcuts = {};
+
+    var shortcut;
+    var clearConsoleHandler = this.requestClearMessages.bind(this);
+
+    shortcut = WebInspector.KeyboardShortcut.makeKey("k", WebInspector.KeyboardShortcut.Modifiers.Meta);
+    this._shortcuts[shortcut] = clearConsoleHandler;
+    this._shortcuts[shortcut].isMacOnly = true;
+    shortcut = WebInspector.KeyboardShortcut.makeKey("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = clearConsoleHandler;
+
+    // Since the Context Menu for the Console View will always be the same, we can create it in
+    // the constructor.
+    this._contextMenu = new WebInspector.ContextMenu();
+    this._contextMenu.appendItem(WebInspector.UIString("Clear Console"), clearConsoleHandler);
+    this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);
+    
+    this._customFormatters = {
+        "object": this._formatobject,
+        "array":  this._formatarray,
+        "node":   this._formatnode,
+        "string": this._formatstring
+    };
+}
+
+WebInspector.ConsoleView.prototype = {
+    
+    _updateFilter: function(e)
+    {
+        var isMac = WebInspector.isMac();
+        var selectMultiple = false;
+        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+
+        this.filter(e.target, selectMultiple);
+    },
+    
+    filter: function(target, selectMultiple)
+    {
+        function unselectAll()
+        {
+            this.allElement.removeStyleClass("selected");
+            this.errorElement.removeStyleClass("selected");
+            this.warningElement.removeStyleClass("selected");
+            this.logElement.removeStyleClass("selected");
+            
+            this.messagesElement.removeStyleClass("filter-all");
+            this.messagesElement.removeStyleClass("filter-errors");
+            this.messagesElement.removeStyleClass("filter-warnings");
+            this.messagesElement.removeStyleClass("filter-logs");
+        }
+        
+        var targetFilterClass = "filter-" + target.category.toLowerCase();
+
+        if (target.category == "All") {
+            if (target.hasStyleClass("selected")) {
+                // We can't unselect all, so we break early here
+                return;
+            }
+
+            unselectAll.call(this);
+        } else {
+            // Something other than all is being selected, so we want to unselect all
+            if (this.allElement.hasStyleClass("selected")) {
+                this.allElement.removeStyleClass("selected");
+                this.messagesElement.removeStyleClass("filter-all");
+            }
+        }
+        
+        if (!selectMultiple) {
+            // If multiple selection is off, we want to unselect everything else
+            // and just select ourselves.
+            unselectAll.call(this);
+            
+            target.addStyleClass("selected");
+            this.messagesElement.addStyleClass(targetFilterClass);
+            
+            return;
+        }
+        
+        if (target.hasStyleClass("selected")) {
+            // If selectMultiple is turned on, and we were selected, we just
+            // want to unselect ourselves.
+            target.removeStyleClass("selected");
+            this.messagesElement.removeStyleClass(targetFilterClass);
+        } else {
+            // If selectMultiple is turned on, and we weren't selected, we just
+            // want to select ourselves.
+            target.addStyleClass("selected");
+            this.messagesElement.addStyleClass(targetFilterClass);
+        }
+    },
+    
+    _toggleConsoleButtonClicked: function()
+    {
+        this.drawer.visibleView = this;
+    },
+
+    attach: function(mainElement, statusBarElement)
+    {
+        mainElement.appendChild(this.element);
+        statusBarElement.appendChild(this.clearButton);
+        statusBarElement.appendChild(this.filterBarElement);
+    },
+
+    show: function()
+    {
+        this.toggleConsoleButton.addStyleClass("toggled-on");
+        this.toggleConsoleButton.title = WebInspector.UIString("Hide console.");
+        if (!this.prompt.isCaretInsidePrompt())
+            this.prompt.moveCaretToEndOfPrompt();
+    },
+
+    afterShow: function()
+    {
+        WebInspector.currentFocusElement = this.promptElement;  
+    },
+
+    hide: function()
+    {
+        this.toggleConsoleButton.removeStyleClass("toggled-on");
+        this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
+    },
+
+    _scheduleScrollIntoView: function()
+    {
+        if (this._scrollIntoViewTimer)
+            return;
+
+        function scrollIntoView()
+        {
+            this.promptElement.scrollIntoView(false);
+            delete this._scrollIntoViewTimer;
+        }
+        this._scrollIntoViewTimer = setTimeout(scrollIntoView.bind(this), 20);
+    },
+
+    addMessage: function(msg)
+    {
+        if (msg instanceof WebInspector.ConsoleMessage && !(msg instanceof WebInspector.ConsoleCommandResult)) {
+            this._incrementErrorWarningCount(msg);
+
+            // Add message to the resource panel
+            if (msg.url in WebInspector.resourceURLMap) {
+                msg.resource = WebInspector.resourceURLMap[msg.url];
+                if (WebInspector.panels.resources)
+                    WebInspector.panels.resources.addMessageToResource(msg.resource, msg);
+            }
+
+            this.commandSincePreviousMessage = false;
+            this.previousMessage = msg;
+        } else if (msg instanceof WebInspector.ConsoleCommand) {
+            if (this.previousMessage) {
+                this.commandSincePreviousMessage = true;
+            }
+        }
+
+        this.messages.push(msg);
+
+        if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
+            if (this.groupLevel < 1)
+                return;
+
+            this.groupLevel--;
+
+            this.currentGroup = this.currentGroup.parentGroup;
+        } else {
+            if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
+                this.groupLevel++;
+
+                var group = new WebInspector.ConsoleGroup(this.currentGroup, this.groupLevel);
+                this.currentGroup.messagesElement.appendChild(group.element);
+                this.currentGroup = group;
+            }
+
+            this.currentGroup.addMessage(msg);
+        }
+
+        this._scheduleScrollIntoView();
+    },
+
+    updateMessageRepeatCount: function(count)
+    {
+        var msg = this.previousMessage;
+        var prevRepeatCount = msg.totalRepeatCount;
+        
+        if (!this.commandSincePreviousMessage) {
+            msg.repeatDelta = count - prevRepeatCount;
+            msg.repeatCount = msg.repeatCount + msg.repeatDelta;
+            msg.totalRepeatCount = count;
+            msg._updateRepeatCount();
+            this._incrementErrorWarningCount(msg);
+        } else {
+            msgCopy = new WebInspector.ConsoleMessage(msg.source, msg.type, msg.level, msg.line, msg.url, msg.groupLevel, count - prevRepeatCount);
+            msgCopy.totalRepeatCount = count;
+            msgCopy.setMessageBody(msg.args);
+            this.addMessage(msgCopy);
+        }
+    },
+
+    _incrementErrorWarningCount: function(msg)
+    {
+        switch (msg.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                WebInspector.warnings += msg.repeatDelta;
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                WebInspector.errors += msg.repeatDelta;
+                break;
+        }
+    },
+
+    requestClearMessages: function()
+    {
+        InjectedScriptAccess.getDefault().clearConsoleMessages(function() {});
+    },
+
+    clearMessages: function()
+    {
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.clearMessages();
+
+        this.messages = [];
+
+        this.groupLevel = 0;
+        this.currentGroup = this.topGroup;
+        this.topGroup.messagesElement.removeChildren();
+
+        WebInspector.errors = 0;
+        WebInspector.warnings = 0;
+
+        delete this.commandSincePreviousMessage;
+        delete this.previousMessage;
+    },
+
+    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
+    {
+        // Pass less stop characters to rangeOfWord so the range will be a more complete expression.
+        var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");
+        var expressionString = expressionRange.toString();
+        var lastIndex = expressionString.length - 1;
+
+        var dotNotation = (expressionString[lastIndex] === ".");
+        var bracketNotation = (expressionString[lastIndex] === "[");
+
+        if (dotNotation || bracketNotation)
+            expressionString = expressionString.substr(0, lastIndex);
+
+        var prefix = wordRange.toString();
+        if (!expressionString && !prefix)
+            return;
+
+        var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);
+        // Collect comma separated object properties for the completion.
+
+        var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);
+        var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();
+        var injectedScriptAccess;
+        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
+            var selectedCallFrame = WebInspector.panels.scripts.sidebarPanes.callstack.selectedCallFrame;
+            injectedScriptAccess = InjectedScriptAccess.get(selectedCallFrame.injectedScriptId);
+        } else
+            injectedScriptAccess = InjectedScriptAccess.getDefault();
+        injectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);
+    },
+
+    _reportCompletions: function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
+        if (isException)
+            return;
+
+        if (bracketNotation) {
+            if (prefix.length && prefix[0] === "'")
+                var quoteUsed = "'";
+            else
+                var quoteUsed = "\"";
+        }
+
+        var results = [];
+        var properties = Object.sortedProperties(result);
+
+        for (var i = 0; i < properties.length; ++i) {
+            var property = properties[i];
+
+            if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
+                continue;
+
+            if (bracketNotation) {
+                if (!/^[0-9]+$/.test(property))
+                    property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;
+                property += "]";
+            }
+
+            if (property.length < prefix.length)
+                continue;
+            if (property.indexOf(prefix) !== 0)
+                continue;
+
+            results.push(property);
+            if (bestMatchOnly)
+                break;
+        }
+        completionsReadyCallback(results);
+    },
+
+    _clearButtonClicked: function()
+    {
+        this.requestClearMessages();
+    },
+
+    _handleContextMenuEvent: function(event)
+    {
+        if (!window.getSelection().isCollapsed) {
+            // If there is a selection, we want to show our normal context menu
+            // (with Copy, etc.), and not Clear Console.
+            return;
+        }
+
+        this._contextMenu.show(event);
+    },
+
+    _messagesSelectStart: function(event)
+    {
+        if (this._selectionTimeout)
+            clearTimeout(this._selectionTimeout);
+
+        this.prompt.clearAutoComplete();
+
+        function moveBackIfOutside()
+        {
+            delete this._selectionTimeout;
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+            this.prompt.autoCompleteSoon();
+        }
+
+        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
+    },
+
+    _messagesClicked: function(event)
+    {
+        var link = event.target.enclosingNodeOrSelfWithNodeName("a");
+        if (!link || !link.representedNode)
+            return;
+
+        WebInspector.updateFocusedNode(link.representedNode.id);
+        event.stopPropagation();
+        event.preventDefault();
+    },
+
+    _promptKeyDown: function(event)
+    {
+        if (isEnterKey(event)) {
+            this._enterKeyPressed(event);
+            return;
+        }
+
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            if (!this._shortcuts[shortcut].isMacOnly || WebInspector.isMac()) {
+                handler();
+                event.preventDefault();
+                return;
+            }
+        }
+    },
+
+    evalInInspectedWindow: function(expression, objectGroup, callback)
+    {
+        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
+            WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);
+            return;
+        }
+        this.doEvalInWindow(expression, objectGroup, callback);
+    },
+
+    doEvalInWindow: function(expression, objectGroup, callback)
+    {
+        if (!expression) {
+            // There is no expression, so the completion should happen against global properties.
+            expression = "this";
+        }
+
+        function evalCallback(result)
+        {
+            callback(result.value, result.isException);
+        };
+        InjectedScriptAccess.getDefault().evaluate(expression, objectGroup, evalCallback);
+    },
+
+    _enterKeyPressed: function(event)
+    {
+        if (event.altKey)
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.prompt.clearAutoComplete(true);
+
+        var str = this.prompt.text;
+        if (!str.length)
+            return;
+
+        var commandMessage = new WebInspector.ConsoleCommand(str);
+        this.addMessage(commandMessage);
+
+        var self = this;
+        function printResult(result, exception)
+        {
+            self.prompt.history.push(str);
+            self.prompt.historyOffset = 0;
+            self.prompt.text = "";
+            self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+        }
+        this.evalInInspectedWindow(str, "console", printResult);
+    },
+
+    _format: function(output, forceObjectFormat)
+    {
+        var isProxy = (output != null && typeof output === "object");
+        var type = (forceObjectFormat ? "object" : Object.proxyType(output));
+
+        var formatter = this._customFormatters[type];
+        if (!formatter || !isProxy) {
+            formatter = this._formatvalue;
+            output = output.description;
+        }
+
+        var span = document.createElement("span");
+        span.className = "console-formatted-" + type + " source-code";
+        formatter.call(this, output, span);
+        return span;
+    },
+
+    _formatvalue: function(val, elem)
+    {
+        elem.appendChild(document.createTextNode(val));
+    },
+
+    _formatobject: function(obj, elem)
+    {
+        elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description, null, true).element);
+    },
+
+    _formatnode: function(object, elem)
+    {
+        function printNode(nodeId)
+        {
+            if (!nodeId)
+                return;
+            var treeOutline = new WebInspector.ElementsTreeOutline();
+            treeOutline.showInElementsPanelEnabled = true;
+            treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);
+            treeOutline.element.addStyleClass("outline-disclosure");
+            if (!treeOutline.children[0].hasChildren)
+                treeOutline.element.addStyleClass("single-node");
+            elem.appendChild(treeOutline.element);
+        }
+
+        InjectedScriptAccess.get(object.injectedScriptId).pushNodeToFrontend(object, printNode);
+    },
+
+    _formatarray: function(arr, elem)
+    {
+        InjectedScriptAccess.get(arr.injectedScriptId).getProperties(arr, false, false, this._printArray.bind(this, elem));
+    },
+
+    _formatstring: function(output, elem)
+    {
+        var span = document.createElement("span");
+        span.className = "console-formatted-string source-code";
+        span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
+
+        // Make black quotes.
+        elem.removeStyleClass("console-formatted-string");
+        elem.appendChild(document.createTextNode("\""));
+        elem.appendChild(span);
+        elem.appendChild(document.createTextNode("\""));
+    },
+
+    _printArray: function(elem, properties)
+    {
+        if (!properties)
+            return;
+
+        var elements = [];
+        for (var i = 0; i < properties.length; ++i) {
+            var name = properties[i].name;
+            if (name == parseInt(name))
+                elements[name] = this._format(properties[i].value);
+        }
+
+        elem.appendChild(document.createTextNode("["));
+        for (var i = 0; i < elements.length; ++i) {
+            var element = elements[i];
+            if (element)
+                elem.appendChild(element);
+            else
+                elem.appendChild(document.createTextNode("undefined"))
+            if (i < elements.length - 1)
+                elem.appendChild(document.createTextNode(", "));
+        }
+        elem.appendChild(document.createTextNode("]"));
+    }
+}
+
+WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.ConsoleMessage = function(source, type, level, line, url, groupLevel, repeatCount)
+{
+    this.source = source;
+    this.type = type;
+    this.level = level;
+    this.line = line;
+    this.url = url;
+    this.groupLevel = groupLevel;
+    this.repeatCount = repeatCount;
+    this.repeatDelta = repeatCount;
+    this.totalRepeatCount = repeatCount;
+    if (arguments.length > 7)
+        this.setMessageBody(Array.prototype.slice.call(arguments, 7));
+}
+
+WebInspector.ConsoleMessage.prototype = {
+    setMessageBody: function(args)
+    {
+        this.args = args;
+        switch (this.type) {
+            case WebInspector.ConsoleMessage.MessageType.Trace:
+                var span = document.createElement("span");
+                span.className = "console-formatted-trace source-code";
+                var stack = Array.prototype.slice.call(args);
+                var funcNames = stack.map(function(f) {
+                    return f || WebInspector.UIString("(anonymous function)");
+                });
+                span.appendChild(document.createTextNode(funcNames.join("\n")));
+                this.formattedMessage = span;
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Object:
+                this.formattedMessage = this._format(["%O", args[0]]);
+                break;
+            default:
+                this.formattedMessage = this._format(args);
+                break;
+        }
+
+        // This is used for inline message bubbles in SourceFrames, or other plain-text representations.
+        this.message = this.formattedMessage.textContent;
+    },
+
+    isErrorOrWarning: function()
+    {
+        return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
+    },
+
+    _format: function(parameters)
+    {
+        // This node is used like a Builder. Values are continually appended onto it.
+        var formattedResult = document.createElement("span");
+        if (!parameters.length)
+            return formattedResult;
+
+        // Formatting code below assumes that parameters are all wrappers whereas frontend console
+        // API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here.
+        for (var i = 0; i < parameters.length; ++i)
+            if (typeof parameters[i] !== "object" && typeof parameters[i] !== "function")
+                parameters[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(parameters[i]);
+
+        // There can be string log and string eval result. We distinguish between them based on message type.
+        var shouldFormatMessage = Object.proxyType(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
+
+        // Multiple parameters with the first being a format string. Save unused substitutions.
+        if (shouldFormatMessage) {
+            // Multiple parameters with the first being a format string. Save unused substitutions.
+            var result = this._formatWithSubstitutionString(parameters, formattedResult);
+            parameters = result.unusedSubstitutions;
+            if (parameters.length)
+                formattedResult.appendChild(document.createTextNode(" "));
+        }
+
+        // Single parameter, or unused substitutions from above.
+        for (var i = 0; i < parameters.length; ++i) {
+            // Inline strings when formatting.
+            if (shouldFormatMessage && parameters[i].type === "string")
+                formattedResult.appendChild(document.createTextNode(parameters[i].description));
+            else
+                formattedResult.appendChild(WebInspector.console._format(parameters[i]));
+            if (i < parameters.length - 1)
+                formattedResult.appendChild(document.createTextNode(" "));
+        }
+        return formattedResult;
+    },
+
+    _formatWithSubstitutionString: function(parameters, formattedResult)
+    {
+        var formatters = {}
+        for (var i in String.standardFormatters)
+            formatters[i] = String.standardFormatters[i];
+
+        function consoleFormatWrapper(force)
+        {
+            return function(obj) {
+                return WebInspector.console._format(obj, force);
+            };
+        }
+
+        // Firebug uses %o for formatting objects.
+        formatters.o = consoleFormatWrapper();
+        // Firebug allows both %i and %d for formatting integers.
+        formatters.i = formatters.d;
+        // Support %O to force object formatting, instead of the type-based %o formatting.
+        formatters.O = consoleFormatWrapper(true);
+
+        function append(a, b)
+        {
+            if (!(b instanceof Node))
+                a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));
+            else
+                a.appendChild(b);
+            return a;
+        }
+
+        // String.format does treat formattedResult like a Builder, result is an object.
+        return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);
+    },
+
+    toMessageElement: function()
+    {
+        if (this._element)
+            return this._element;
+
+        var element = document.createElement("div");
+        element.message = this;
+        element.className = "console-message";
+
+        this._element = element;
+
+        switch (this.source) {
+            case WebInspector.ConsoleMessage.MessageSource.HTML:
+                element.addStyleClass("console-html-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.WML:
+                element.addStyleClass("console-wml-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.XML:
+                element.addStyleClass("console-xml-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.JS:
+                element.addStyleClass("console-js-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.CSS:
+                element.addStyleClass("console-css-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.Other:
+                element.addStyleClass("console-other-source");
+                break;
+        }
+
+        switch (this.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Tip:
+                element.addStyleClass("console-tip-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Log:
+                element.addStyleClass("console-log-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Debug:
+                element.addStyleClass("console-debug-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                element.addStyleClass("console-warning-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                element.addStyleClass("console-error-level");
+                break;
+        }
+        
+        if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup)
+            element.addStyleClass("console-group-title");
+
+        if (this.elementsTreeOutline) {
+            element.addStyleClass("outline-disclosure");
+            element.appendChild(this.elementsTreeOutline.element);
+            return element;
+        }
+
+        if (this.url && this.url !== "undefined") {
+            var urlElement = document.createElement("a");
+            urlElement.className = "console-message-url webkit-html-resource-link";
+            urlElement.href = this.url;
+            urlElement.lineNumber = this.line;
+
+            if (this.source === WebInspector.ConsoleMessage.MessageSource.JS)
+                urlElement.preferredPanel = "scripts";
+
+            if (this.line > 0)
+                urlElement.textContent = WebInspector.displayNameForURL(this.url) + ":" + this.line;
+            else
+                urlElement.textContent = WebInspector.displayNameForURL(this.url);
+
+            element.appendChild(urlElement);
+        }
+
+        var messageTextElement = document.createElement("span");
+        messageTextElement.className = "console-message-text source-code";
+        if (this.type === WebInspector.ConsoleMessage.MessageType.Assert)
+            messageTextElement.appendChild(document.createTextNode(WebInspector.UIString("Assertion failed: ")));
+        messageTextElement.appendChild(this.formattedMessage);
+        element.appendChild(messageTextElement);
+
+        if (this.repeatCount > 1)
+            this._updateRepeatCount();
+
+        return element;
+    },
+
+    _updateRepeatCount: function() {
+        if (!this.repeatCountElement) {
+            this.repeatCountElement = document.createElement("span");
+            this.repeatCountElement.className = "bubble";
+    
+            this._element.insertBefore(this.repeatCountElement, this._element.firstChild);
+            this._element.addStyleClass("repeated-message");
+        }
+        this.repeatCountElement.textContent = this.repeatCount;
+    },
+
+    toString: function()
+    {
+        var sourceString;
+        switch (this.source) {
+            case WebInspector.ConsoleMessage.MessageSource.HTML:
+                sourceString = "HTML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.WML:
+                sourceString = "WML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.XML:
+                sourceString = "XML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.JS:
+                sourceString = "JS";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.CSS:
+                sourceString = "CSS";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.Other:
+                sourceString = "Other";
+                break;
+        }
+
+        var typeString;
+        switch (this.type) {
+            case WebInspector.ConsoleMessage.MessageType.Log:
+                typeString = "Log";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Object:
+                typeString = "Object";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Trace:
+                typeString = "Trace";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.StartGroup:
+                typeString = "Start Group";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.EndGroup:
+                typeString = "End Group";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Assert:
+                typeString = "Assert";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Result:
+                typeString = "Result";
+                break;
+        }
+        
+        var levelString;
+        switch (this.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Tip:
+                levelString = "Tip";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Log:
+                levelString = "Log";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                levelString = "Warning";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Debug:
+                levelString = "Debug";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                levelString = "Error";
+                break;
+        }
+
+        return sourceString + " " + typeString + " " + levelString + ": " + this.formattedMessage.textContent + "\n" + this.url + " line " + this.line;
+    },
+
+    isEqual: function(msg, disreguardGroup)
+    {
+        if (!msg)
+            return false;
+
+        var ret = (this.source == msg.source)
+            && (this.type == msg.type)
+            && (this.level == msg.level)
+            && (this.line == msg.line)
+            && (this.url == msg.url)
+            && (this.message == msg.message);
+
+        return (disreguardGroup ? ret : (ret && (this.groupLevel == msg.groupLevel)));
+    }
+}
+
+// Note: Keep these constants in sync with the ones in Console.h
+WebInspector.ConsoleMessage.MessageSource = {
+    HTML: 0,
+    WML: 1,
+    XML: 2,
+    JS: 3,
+    CSS: 4,
+    Other: 5
+}
+
+WebInspector.ConsoleMessage.MessageType = {
+    Log: 0,
+    Object: 1,
+    Trace: 2,
+    StartGroup: 3,
+    EndGroup: 4,
+    Assert: 5,
+    Result: 6
+}
+
+WebInspector.ConsoleMessage.MessageLevel = {
+    Tip: 0,
+    Log: 1,
+    Warning: 2,
+    Error: 3,
+    Debug: 4
+}
+
+WebInspector.ConsoleCommand = function(command)
+{
+    this.command = command;
+}
+
+WebInspector.ConsoleCommand.prototype = {
+    toMessageElement: function()
+    {
+        var element = document.createElement("div");
+        element.command = this;
+        element.className = "console-user-command";
+
+        var commandTextElement = document.createElement("span");
+        commandTextElement.className = "console-message-text source-code";
+        commandTextElement.textContent = this.command;
+        element.appendChild(commandTextElement);
+
+        return element;
+    }
+}
+
+WebInspector.ConsoleTextMessage = function(text, level)
+{
+    level = level || WebInspector.ConsoleMessage.MessageLevel.Log;
+    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Log, level, 0, null, null, 1, text);
+}
+
+WebInspector.ConsoleTextMessage.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
+
+WebInspector.ConsoleCommandResult = function(result, exception, originatingCommand)
+{
+    var level = (exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
+    var message = result;
+    if (exception) {
+        // Distinguish between strings and errors (no need to quote latter).
+        message = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
+        message.type = "error";
+    }
+    var line = (exception ? result.line : -1);
+    var url = (exception ? result.sourceURL : null);
+
+    this.originatingCommand = originatingCommand;
+
+    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, line, url, null, 1, message);
+}
+
+WebInspector.ConsoleCommandResult.prototype = {
+    toMessageElement: function()
+    {
+        var element = WebInspector.ConsoleMessage.prototype.toMessageElement.call(this);
+        element.addStyleClass("console-user-command-result");
+        return element;
+    }
+}
+
+WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
+
+WebInspector.ConsoleGroup = function(parentGroup, level)
+{
+    this.parentGroup = parentGroup;
+    this.level = level;
+
+    var element = document.createElement("div");
+    element.className = "console-group";
+    element.group = this;
+    this.element = element;
+
+    var messagesElement = document.createElement("div");
+    messagesElement.className = "console-group-messages";
+    element.appendChild(messagesElement);
+    this.messagesElement = messagesElement;
+}
+
+WebInspector.ConsoleGroup.prototype = {
+    addMessage: function(msg)
+    {
+        var element = msg.toMessageElement();
+        
+        if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
+            this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
+            element.addEventListener("click", this._titleClicked.bind(this), true);
+        } else
+            this.messagesElement.appendChild(element);
+
+        if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
+            element.previousSibling.addStyleClass("console-adjacent-user-command-result");
+    },
+
+    _titleClicked: function(event)
+    {
+        var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");
+        if (groupTitleElement) {
+            var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");
+            if (groupElement)
+                if (groupElement.hasStyleClass("collapsed"))
+                    groupElement.removeStyleClass("collapsed");
+                else
+                    groupElement.addStyleClass("collapsed");
+            groupTitleElement.scrollIntoViewIfNeeded(true);
+        }
+
+        event.stopPropagation();
+        event.preventDefault();
+    }
+}
+
+/* Panel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Panel = function()
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel");
+}
+
+WebInspector.Panel.prototype = {
+    get toolbarItem()
+    {
+        if (this._toolbarItem)
+            return this._toolbarItem;
+
+        // Sample toolbar item as markup:
+        // <button class="toolbar-item resources toggleable">
+        // <div class="toolbar-icon"></div>
+        // <div class="toolbar-label">Resources</div>
+        // </button>
+
+        this._toolbarItem = document.createElement("button");
+        this._toolbarItem.className = "toolbar-item toggleable";
+        this._toolbarItem.panel = this;
+
+        if ("toolbarItemClass" in this)
+            this._toolbarItem.addStyleClass(this.toolbarItemClass);
+
+        var iconElement = document.createElement("div");
+        iconElement.className = "toolbar-icon";
+        this._toolbarItem.appendChild(iconElement);
+
+        if ("toolbarItemLabel" in this) {
+            var labelElement = document.createElement("div");
+            labelElement.className = "toolbar-label";
+            labelElement.textContent = this.toolbarItemLabel;
+            this._toolbarItem.appendChild(labelElement);
+        }
+
+        return this._toolbarItem;
+    },
+
+    show: function()
+    {
+        WebInspector.View.prototype.show.call(this);
+
+        var statusBarItems = this.statusBarItems;
+        if (statusBarItems) {
+            this._statusBarItemContainer = document.createElement("div");
+            for (var i = 0; i < statusBarItems.length; ++i)
+                this._statusBarItemContainer.appendChild(statusBarItems[i]);
+            document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
+        }
+
+        if ("_toolbarItem" in this)
+            this._toolbarItem.addStyleClass("toggled-on");
+
+        WebInspector.currentFocusElement = this.defaultFocusedElement;
+
+        this.updateSidebarWidth();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+
+        if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)
+            this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);
+        delete this._statusBarItemContainer;
+        if ("_toolbarItem" in this)
+            this._toolbarItem.removeStyleClass("toggled-on");
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.sidebarTreeElement || this.element;
+    },
+
+    attach: function()
+    {
+        if (!this.element.parentNode)
+            document.getElementById("main-panels").appendChild(this.element);
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var view = this._searchResults[i];
+                if (view.searchCanceled)
+                    view.searchCanceled();
+                delete view.currentQuery;
+            }
+        }
+
+        WebInspector.updateSearchMatchesCount(0, this);
+
+        if (this._currentSearchChunkIntervalIdentifier) {
+            clearInterval(this._currentSearchChunkIntervalIdentifier);
+            delete this._currentSearchChunkIntervalIdentifier;
+        }
+
+        this._totalSearchMatches = 0;
+        this._currentSearchResultIndex = 0;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled(true);
+
+        var searchableViews = this.searchableViews;
+        if (!searchableViews || !searchableViews.length)
+            return;
+
+        var parentElement = this.viewsContainerElement;
+        var visibleView = this.visibleView;
+        var sortFuction = this.searchResultsSortFunction;
+
+        var matchesCountUpdateTimeout = null;
+
+        function updateMatchesCount()
+        {
+            WebInspector.updateSearchMatchesCount(this._totalSearchMatches, this);
+            matchesCountUpdateTimeout = null;
+        }
+
+        function updateMatchesCountSoon()
+        {
+            if (matchesCountUpdateTimeout)
+                return;
+            // Update the matches count every half-second so it doesn't feel twitchy.
+            matchesCountUpdateTimeout = setTimeout(updateMatchesCount.bind(this), 500);
+        }
+
+        function finishedCallback(view, searchMatches)
+        {
+            if (!searchMatches)
+                return;
+
+            this._totalSearchMatches += searchMatches;
+            this._searchResults.push(view);
+
+            if (sortFuction)
+                this._searchResults.sort(sortFuction);
+
+            if (this.searchMatchFound)
+                this.searchMatchFound(view, searchMatches);
+
+            updateMatchesCountSoon.call(this);
+
+            if (view === visibleView)
+                view.jumpToFirstSearchResult();
+        }
+
+        var i = 0;
+        var panel = this;
+        var boundFinishedCallback = finishedCallback.bind(this);
+        var chunkIntervalIdentifier = null;
+
+        // Split up the work into chunks so we don't block the
+        // UI thread while processing.
+
+        function processChunk()
+        {
+            var view = searchableViews[i];
+
+            if (++i >= searchableViews.length) {
+                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
+                    delete panel._currentSearchChunkIntervalIdentifier;
+                clearInterval(chunkIntervalIdentifier);
+            }
+
+            if (!view)
+                return;
+
+            if (view.element.parentNode !== parentElement && view.element.parentNode && parentElement)
+                view.detach();
+
+            view.currentQuery = query;
+            view.performSearch(query, boundFinishedCallback);
+        }
+
+        processChunk();
+
+        chunkIntervalIdentifier = setInterval(processChunk, 25);
+        this._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this.showView || !this._searchResults || !this._searchResults.length)
+            return;
+
+        var showFirstResult = false;
+
+        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
+        if (this._currentSearchResultIndex === -1) {
+            this._currentSearchResultIndex = 0;
+            showFirstResult = true;
+        }
+
+        var currentView = this._searchResults[this._currentSearchResultIndex];
+
+        if (currentView.showingLastSearchResult()) {
+            if (this.searchIteratesOverViews()) {
+                if (++this._currentSearchResultIndex >= this._searchResults.length)
+                    this._currentSearchResultIndex = 0;
+                currentView = this._searchResults[this._currentSearchResultIndex];
+            }
+            showFirstResult = true;
+        }
+
+        if (currentView !== this.visibleView) {
+            this.showView(currentView);
+            WebInspector.focusSearchField();
+        }
+
+        if (showFirstResult)
+            currentView.jumpToFirstSearchResult();
+        else
+            currentView.jumpToNextSearchResult();
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this.showView || !this._searchResults || !this._searchResults.length)
+            return;
+
+        var showLastResult = false;
+
+        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
+        if (this._currentSearchResultIndex === -1) {
+            this._currentSearchResultIndex = 0;
+            showLastResult = true;
+        }
+
+        var currentView = this._searchResults[this._currentSearchResultIndex];
+
+        if (currentView.showingFirstSearchResult()) {
+            if (this.searchIteratesOverViews()) {
+                if (--this._currentSearchResultIndex < 0)
+                    this._currentSearchResultIndex = (this._searchResults.length - 1);
+                currentView = this._searchResults[this._currentSearchResultIndex];
+            }
+            showLastResult = true;
+        }
+
+        if (currentView !== this.visibleView) {
+            this.showView(currentView);
+            WebInspector.focusSearchField();
+        }
+
+        if (showLastResult)
+            currentView.jumpToLastSearchResult();
+        else
+            currentView.jumpToPreviousSearchResult();
+    },
+
+    createSidebar: function(parentElement, resizerParentElement)
+    {
+        if (this.hasSidebar)
+            return;
+
+        if (!parentElement)
+            parentElement = this.element;
+
+        if (!resizerParentElement)
+            resizerParentElement = parentElement;
+
+        this.hasSidebar = true;
+
+        this.sidebarElement = document.createElement("div");
+        this.sidebarElement.className = "sidebar";
+        parentElement.appendChild(this.sidebarElement);
+
+        this.sidebarResizeElement = document.createElement("div");
+        this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+        this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
+        resizerParentElement.appendChild(this.sidebarResizeElement);
+
+        this.sidebarTreeElement = document.createElement("ol");
+        this.sidebarTreeElement.className = "sidebar-tree";
+        this.sidebarElement.appendChild(this.sidebarTreeElement);
+
+        this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
+    },
+
+    _startSidebarDragging: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
+    },
+
+    _sidebarDragging: function(event)
+    {
+        this.updateSidebarWidth(event.pageX);
+
+        event.preventDefault();
+    },
+
+    _endSidebarDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    },
+
+    updateSidebarWidth: function(width)
+    {
+        if (!this.hasSidebar)
+            return;
+
+        if (this.sidebarElement.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        if (!("_currentSidebarWidth" in this))
+            this._currentSidebarWidth = this.sidebarElement.offsetWidth;
+
+        if (typeof width === "undefined")
+            width = this._currentSidebarWidth;
+
+        width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
+
+        this._currentSidebarWidth = width;
+        this.setSidebarWidth(width);
+
+        this.updateMainViewWidth(width);
+    },
+
+    setSidebarWidth: function(width)
+    {
+        this.sidebarElement.style.width = width + "px";
+        this.sidebarResizeElement.style.left = (width - 3) + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        // Should be implemented by ancestors.
+    },
+
+    resize: function()
+    {
+        var visibleView = this.visibleView;
+        if (visibleView && "resize" in visibleView)
+            visibleView.resize();
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        return false;
+    },
+
+    showSourceLine: function(url, line)
+    {
+        return false;
+    },
+
+    searchIteratesOverViews: function()
+    {
+        return false;
+    }
+}
+
+WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;
+
+/* TimelineGrid.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineGrid = function()
+{
+    this.element = document.createElement("div");
+
+    this._itemsGraphsElement = document.createElement("div");
+    this._itemsGraphsElement.id = "resources-graphs";
+    this.element.appendChild(this._itemsGraphsElement);
+
+    this._dividersElement = document.createElement("div");
+    this._dividersElement.id = "resources-dividers";
+    this.element.appendChild(this._dividersElement);
+
+    this._eventDividersElement = document.createElement("div");
+    this._eventDividersElement.id = "resources-event-dividers";
+    this.element.appendChild(this._eventDividersElement);
+
+    this._dividersLabelBarElement = document.createElement("div");
+    this._dividersLabelBarElement.id = "resources-dividers-label-bar";
+    this.element.appendChild(this._dividersLabelBarElement);
+}
+
+WebInspector.TimelineGrid.prototype = {
+    get itemsGraphsElement()
+    {
+        return this._itemsGraphsElement;
+    },
+
+    updateDividers: function(force, calculator, paddingLeft)
+    {
+        var dividerCount = Math.round(this._dividersElement.offsetWidth / 64);
+        var slice = calculator.boundarySpan / dividerCount;
+        if (!force && this._currentDividerSlice === slice)
+            return false;
+
+        if (typeof paddingLeft !== "number")
+            paddingLeft = 0;
+        this._currentDividerSlice = slice;
+
+        this._eventDividersElement.removeChildren();
+        // Reuse divider elements and labels.
+        var divider = this._dividersElement.firstChild;
+        var dividerLabelBar = this._dividersLabelBarElement.firstChild;
+
+        var dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;
+        var clientWidth = dividersLabelBarElementClientWidth - paddingLeft;
+        for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {
+            if (!divider) {
+                divider = document.createElement("div");
+                divider.className = "resources-divider";
+                this._dividersElement.appendChild(divider);
+
+                dividerLabelBar = document.createElement("div");
+                dividerLabelBar.className = "resources-divider";
+                var label = document.createElement("div");
+                label.className = "resources-divider-label";
+                dividerLabelBar._labelElement = label;
+                dividerLabelBar.appendChild(label);
+                this._dividersLabelBarElement.appendChild(dividerLabelBar);
+                dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;
+            }
+
+            if (i === dividerCount)
+                divider.addStyleClass("last");
+            else
+                divider.removeStyleClass("last");
+
+            var left = paddingLeft + clientWidth * (i / dividerCount);
+            var percentLeft = 100 * left / dividersLabelBarElementClientWidth;
+            this._setDividerAndBarLeft(divider, dividerLabelBar, percentLeft);
+
+            if (!isNaN(slice))
+                dividerLabelBar._labelElement.textContent = calculator.formatValue(slice * i);
+            else
+                dividerLabelBar._labelElement.textContent = "";
+
+            divider = divider.nextSibling;
+            dividerLabelBar = dividerLabelBar.nextSibling;
+        }
+
+        // Remove extras.
+        while (divider) {
+            var nextDivider = divider.nextSibling;
+            this._dividersElement.removeChild(divider);
+            divider = nextDivider;
+        }
+        while (dividerLabelBar) {
+            var nextDivider = dividerLabelBar.nextSibling;
+            this._dividersLabelBarElement.removeChild(dividerLabelBar);
+            dividerLabelBar = nextDivider;
+        }
+        return true;
+    },
+
+    _setDividerAndBarLeft: function(divider, dividerLabelBar, percentLeft)
+    {
+        var percentStyleLeft = parseFloat(divider.style.left);
+        if (!isNaN(percentStyleLeft) && Math.abs(percentStyleLeft - percentLeft) < 0.1)
+            return;
+        divider.style.left = percentLeft + "%";
+        dividerLabelBar.style.left = percentLeft + "%";
+    },
+
+    addEventDivider: function(divider)
+    {
+        this._eventDividersElement.appendChild(divider);
+    },
+
+    setScrollAndDividerTop: function(scrollTop, dividersTop)
+    {
+        this._dividersElement.style.top = scrollTop + "px";
+        this._eventDividersElement.style.top = scrollTop + "px";
+        this._dividersLabelBarElement.style.top = dividersTop + "px";
+    }
+}
+
+/* AbstractTimelinePanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AbstractTimelinePanel = function()
+{
+    WebInspector.Panel.call(this);
+    this._items = [];
+    this._staleItems = [];
+}
+
+WebInspector.AbstractTimelinePanel.prototype = {
+    get categories()
+    {
+        // Should be implemented by the concrete subclasses.
+        return {};
+    },
+
+    populateSidebar: function()
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    createItemTreeElement: function(item)
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    createItemGraph: function(item)
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    get items()
+    {
+        return this._items;
+    },
+
+    createInterface: function()
+    {
+        this.containerElement = document.createElement("div");
+        this.containerElement.id = "resources-container";
+        this.containerElement.addEventListener("scroll", this._updateDividersLabelBarPosition.bind(this), false);
+        this.element.appendChild(this.containerElement);
+
+        this.createSidebar(this.containerElement, this.element);
+        this.sidebarElement.id = "resources-sidebar";
+        this.populateSidebar();
+
+        this._containerContentElement = document.createElement("div");
+        this._containerContentElement.id = "resources-container-content";
+        this.containerElement.appendChild(this._containerContentElement);
+
+        this.summaryBar = new WebInspector.SummaryBar(this.categories);
+        this.summaryBar.element.id = "resources-summary";
+        this._containerContentElement.appendChild(this.summaryBar.element);
+
+        this._timelineGrid = new WebInspector.TimelineGrid();
+        this._containerContentElement.appendChild(this._timelineGrid.element);
+        this.itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
+    },
+
+    createFilterPanel: function()
+    {
+        this.filterBarElement = document.createElement("div");
+        this.filterBarElement.id = "resources-filter";
+        this.filterBarElement.className = "scope-bar";
+        this.element.appendChild(this.filterBarElement);
+
+        function createFilterElement(category)
+        {
+            if (category === "all")
+                var label = WebInspector.UIString("All");
+            else if (this.categories[category])
+                var label = this.categories[category].title;
+
+            var categoryElement = document.createElement("li");
+            categoryElement.category = category;
+            categoryElement.addStyleClass(category);
+            categoryElement.appendChild(document.createTextNode(label));
+            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
+            this.filterBarElement.appendChild(categoryElement);
+
+            return categoryElement;
+        }
+
+        this.filterAllElement = createFilterElement.call(this, "all");
+
+        // Add a divider
+        var dividerElement = document.createElement("div");
+        dividerElement.addStyleClass("divider");
+        this.filterBarElement.appendChild(dividerElement);
+
+        for (var category in this.categories)
+            createFilterElement.call(this, category);
+    },
+
+    showCategory: function(category)
+    {
+        var filterClass = "filter-" + category.toLowerCase();
+        this.itemsGraphsElement.addStyleClass(filterClass);
+        this.itemsTreeElement.childrenListElement.addStyleClass(filterClass);
+    },
+
+    hideCategory: function(category)
+    {
+        var filterClass = "filter-" + category.toLowerCase();
+        this.itemsGraphsElement.removeStyleClass(filterClass);
+        this.itemsTreeElement.childrenListElement.removeStyleClass(filterClass);
+    },
+
+    filter: function(target, selectMultiple)
+    {
+        function unselectAll()
+        {
+            for (var i = 0; i < this.filterBarElement.childNodes.length; ++i) {
+                var child = this.filterBarElement.childNodes[i];
+                if (!child.category)
+                    continue;
+
+                child.removeStyleClass("selected");
+                this.hideCategory(child.category);
+            }
+        }
+
+        if (target === this.filterAllElement) {
+            if (target.hasStyleClass("selected")) {
+                // We can't unselect All, so we break early here
+                return;
+            }
+
+            // If All wasn't selected, and now is, unselect everything else.
+            unselectAll.call(this);
+        } else {
+            // Something other than All is being selected, so we want to unselect All.
+            if (this.filterAllElement.hasStyleClass("selected")) {
+                this.filterAllElement.removeStyleClass("selected");
+                this.hideCategory("all");
+            }
+        }
+
+        if (!selectMultiple) {
+            // If multiple selection is off, we want to unselect everything else
+            // and just select ourselves.
+            unselectAll.call(this);
+
+            target.addStyleClass("selected");
+            this.showCategory(target.category);
+            return;
+        }
+
+        if (target.hasStyleClass("selected")) {
+            // If selectMultiple is turned on, and we were selected, we just
+            // want to unselect ourselves.
+            target.removeStyleClass("selected");
+            this.hideCategory(target.category);
+        } else {
+            // If selectMultiple is turned on, and we weren't selected, we just
+            // want to select ourselves.
+            target.addStyleClass("selected");
+            this.showCategory(target.category);
+        }
+    },
+
+    _updateFilter: function(e)
+    {
+        var isMac = WebInspector.isMac();
+        var selectMultiple = false;
+        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+
+        this.filter(e.target, selectMultiple);
+
+        // When we are updating our filtering, scroll to the top so we don't end up
+        // in blank graph under all the resources.
+        this.containerElement.scrollTop = 0;
+    },
+
+    updateGraphDividersIfNeeded: function(force)
+    {
+        if (!this.visible) {
+            this.needsRefresh = true;
+            return false;
+        }
+        return this._timelineGrid.updateDividers(force, this.calculator);
+    },
+
+    _updateDividersLabelBarPosition: function()
+    {
+        const scrollTop = this.containerElement.scrollTop;
+        const offsetHeight = this.summaryBar.element.offsetHeight;
+        const dividersTop = (scrollTop < offsetHeight ? offsetHeight : scrollTop);
+        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
+    },
+
+    get needsRefresh()
+    {
+        return this._needsRefresh;
+    },
+
+    set needsRefresh(x)
+    {
+        if (this._needsRefresh === x)
+            return;
+
+        this._needsRefresh = x;
+
+        if (x) {
+            if (this.visible && !("_refreshTimeout" in this))
+                this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
+        } else {
+            if ("_refreshTimeout" in this) {
+                clearTimeout(this._refreshTimeout);
+                delete this._refreshTimeout;
+            }
+        }
+    },
+
+    refreshIfNeeded: function()
+    {
+        if (this.needsRefresh)
+            this.refresh();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+
+        this._updateDividersLabelBarPosition();
+        this.refreshIfNeeded();
+    },
+
+    resize: function()
+    {
+        WebInspector.Panel.prototype.resize.call(this);
+
+        this.updateGraphDividersIfNeeded();
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._containerContentElement.style.left = width + "px";
+        this.resize();
+    },
+
+    invalidateAllItems: function()
+    {
+        this._staleItems = this._items.slice();
+    },
+
+    refresh: function()
+    {
+        this.needsRefresh = false;
+
+        var staleItemsLength = this._staleItems.length;
+
+        var boundariesChanged = false;
+
+        for (var i = 0; i < staleItemsLength; ++i) {
+            var item = this._staleItems[i];
+            if (!item._itemsTreeElement) {
+                // Create the timeline tree element and graph.
+                item._itemsTreeElement = this.createItemTreeElement(item);
+                item._itemsTreeElement._itemGraph = this.createItemGraph(item);
+
+                this.itemsTreeElement.appendChild(item._itemsTreeElement);
+                this.itemsGraphsElement.appendChild(item._itemsTreeElement._itemGraph.graphElement);
+            }
+
+            if (item._itemsTreeElement.refresh)
+                item._itemsTreeElement.refresh();
+
+            if (this.calculator.updateBoundaries(item))
+                boundariesChanged = true;
+        }
+
+        if (boundariesChanged) {
+            // The boundaries changed, so all item graphs are stale.
+            this._staleItems = this._items.slice();
+            staleItemsLength = this._staleItems.length;
+        }
+
+
+        const isBarOpaqueAtLeft = this.sidebarTree.selectedTreeElement && this.sidebarTree.selectedTreeElement.isBarOpaqueAtLeft;
+        for (var i = 0; i < staleItemsLength; ++i)
+            this._staleItems[i]._itemsTreeElement._itemGraph.refresh(this.calculator, isBarOpaqueAtLeft);
+
+        this._staleItems = [];
+
+        this.updateGraphDividersIfNeeded();
+    },
+
+    reset: function()
+    {
+        this.containerElement.scrollTop = 0;
+
+        if (this._calculator)
+            this._calculator.reset();
+
+        if (this._items) {
+            var itemsLength = this._items.length;
+            for (var i = 0; i < itemsLength; ++i) {
+                var item = this._items[i];
+                delete item._itemsTreeElement;
+            }
+        }
+
+        this._items = [];
+        this._staleItems = [];
+
+        this.itemsTreeElement.removeChildren();
+        this.itemsGraphsElement.removeChildren();
+
+        this.updateGraphDividersIfNeeded(true);
+    },
+
+    get calculator()
+    {
+        return this._calculator;
+    },
+
+    set calculator(x)
+    {
+        if (!x || this._calculator === x)
+            return;
+
+        this._calculator = x;
+        this._calculator.reset();
+
+        this._staleItems = this._items.slice();
+        this.refresh();
+    },
+
+    addItem: function(item)
+    {
+        this._items.push(item);
+        this.refreshItem(item);
+    },
+
+    removeItem: function(item)
+    {
+        this._items.remove(item, true);
+
+        if (item._itemsTreeElement) {
+            this.itemsTreeElement.removeChild(item._itemsTreeElement);
+            this.itemsGraphsElement.removeChild(item._itemsTreeElement._itemGraph.graphElement);
+        }
+
+        delete item._itemsTreeElement;
+        this.adjustScrollPosition();
+    },
+
+    refreshItem: function(item)
+    {
+        this._staleItems.push(item);
+        this.needsRefresh = true;
+    },
+
+    revealAndSelectItem: function(item)
+    {
+        if (item._itemsTreeElement) {
+            item._itemsTreeElement.reveal();
+            item._itemsTreeElement.select(true);
+        }
+    },
+
+    sortItems: function(sortingFunction)
+    {
+        var sortedElements = [].concat(this.itemsTreeElement.children);
+        sortedElements.sort(sortingFunction);
+
+        var sortedElementsLength = sortedElements.length;
+        for (var i = 0; i < sortedElementsLength; ++i) {
+            var treeElement = sortedElements[i];
+            if (treeElement === this.itemsTreeElement.children[i])
+                continue;
+
+            var wasSelected = treeElement.selected;
+            this.itemsTreeElement.removeChild(treeElement);
+            this.itemsTreeElement.insertChild(treeElement, i);
+            if (wasSelected)
+                treeElement.select(true);
+
+            var graphElement = treeElement._itemGraph.graphElement;
+            this.itemsGraphsElement.insertBefore(graphElement, this.itemsGraphsElement.children[i]);
+        }
+    },
+
+    adjustScrollPosition: function()
+    {
+        // Prevent the container from being scrolled off the end.
+        if ((this.containerElement.scrollTop + this.containerElement.offsetHeight) > this.sidebarElement.offsetHeight)
+            this.containerElement.scrollTop = (this.sidebarElement.offsetHeight - this.containerElement.offsetHeight);
+    },
+
+    addEventDivider: function(divider)
+    {
+        this._timelineGrid.addEventDivider(divider);
+    }
+}
+
+WebInspector.AbstractTimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.AbstractTimelineCalculator = function()
+{
+}
+
+WebInspector.AbstractTimelineCalculator.prototype = {
+    computeSummaryValues: function(items)
+    {
+        var total = 0;
+        var categoryValues = {};
+
+        var itemsLength = items.length;
+        for (var i = 0; i < itemsLength; ++i) {
+            var item = items[i];
+            var value = this._value(item);
+            if (typeof value === "undefined")
+                continue;
+            if (!(item.category.name in categoryValues))
+                categoryValues[item.category.name] = 0;
+            categoryValues[item.category.name] += value;
+            total += value;
+        }
+
+        return {categoryValues: categoryValues, total: total};
+    },
+
+    computeBarGraphPercentages: function(item)
+    {
+        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
+    },
+
+    computeBarGraphLabels: function(item)
+    {
+        const label = this.formatValue(this._value(item));
+        return {left: label, right: label, tooltip: label};
+    },
+
+    get boundarySpan()
+    {
+        return this.maximumBoundary - this.minimumBoundary;
+    },
+
+    updateBoundaries: function(item)
+    {
+        this.minimumBoundary = 0;
+
+        var value = this._value(item);
+        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
+            this.maximumBoundary = value;
+            return true;
+        }
+        return false;
+    },
+
+    reset: function()
+    {
+        delete this.minimumBoundary;
+        delete this.maximumBoundary;
+    },
+
+    _value: function(item)
+    {
+        return 0;
+    },
+
+    formatValue: function(value)
+    {
+        return value.toString();
+    }
+}
+
+WebInspector.AbstractTimelineCategory = function(name, title, color)
+{
+    this.name = name;
+    this.title = title;
+    this.color = color;
+}
+
+WebInspector.AbstractTimelineCategory.prototype = {
+    toString: function()
+    {
+        return this.title;
+    }
+}
+
+/* Resource.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Resource = function(identifier, url)
+{
+    this.identifier = identifier;
+    this._url = url;
+    this._startTime = -1;
+    this._endTime = -1;
+    this._requestMethod = "";
+    this._requestFormData = "";
+    this._category = WebInspector.resourceCategories.other;
+}
+
+WebInspector.Resource.StatusText = {
+    100: "Continue",
+    101: "Switching Protocols",
+    102: "Processing (WebDav)",
+    200: "OK",
+    201: "Created",
+    202: "Accepted",
+    203: "Non-Authoritative Information",
+    204: "No Content",
+    205: "Reset Content",
+    206: "Partial Content",
+    207: "Multi-Status (WebDav)",
+    300: "Multiple Choices",
+    301: "Moved Permanently",
+    302: "Found",
+    303: "See Other",
+    304: "Not Modified",
+    305: "Use Proxy",
+    306: "Switch Proxy",
+    307: "Temporary",
+    400: "Bad Request",
+    401: "Unauthorized",
+    402: "Payment Required",
+    403: "Forbidden",
+    404: "Not Found",
+    405: "Method Not Allowed",
+    406: "Not Acceptable",
+    407: "Proxy Authentication Required",
+    408: "Request Timeout",
+    409: "Conflict",
+    410: "Gone",
+    411: "Length Required",
+    412: "Precondition Failed",
+    413: "Request Entity Too Large",
+    414: "Request-URI Too Long",
+    415: "Unsupported Media Type",
+    416: "Requested Range Not Satisfiable",
+    417: "Expectation Failed",
+    418: "I'm a teapot",
+    422: "Unprocessable Entity (WebDav)",
+    423: "Locked (WebDav)",
+    424: "Failed Dependency (WebDav)",
+    425: "Unordered Collection",
+    426: "Upgrade Required",
+    449: "Retry With",
+    500: "Internal Server Error",
+    501: "Not Implemented",
+    502: "Bad Gateway",
+    503: "Service Unavailable",
+    504: "Gateway Timeout",
+    505: "HTTP Version Not Supported",
+    506: "Variant Also Negotiates",
+    507: "Insufficient Storage (WebDav)",
+    509: "Bandwidth Limit Exceeded",
+    510: "Not Extended"
+};
+
+// Keep these in sync with WebCore::InspectorResource::Type
+WebInspector.Resource.Type = {
+    Document:   0,
+    Stylesheet: 1,
+    Image:      2,
+    Font:       3,
+    Script:     4,
+    XHR:        5,
+    Media:      6,
+    Other:      7,
+
+    isTextType: function(type)
+    {
+        return (type === this.Document) || (type === this.Stylesheet) || (type === this.Script) || (type === this.XHR);
+    },
+
+    toString: function(type)
+    {
+        switch (type) {
+            case this.Document:
+                return WebInspector.UIString("document");
+            case this.Stylesheet:
+                return WebInspector.UIString("stylesheet");
+            case this.Image:
+                return WebInspector.UIString("image");
+            case this.Font:
+                return WebInspector.UIString("font");
+            case this.Script:
+                return WebInspector.UIString("script");
+            case this.XHR:
+                return WebInspector.UIString("XHR");
+            case this.Other:
+            default:
+                return WebInspector.UIString("other");
+        }
+    }
+}
+
+WebInspector.Resource.prototype = {
+    get url()
+    {
+        return this._url;
+    },
+
+    set url(x)
+    {
+        if (this._url === x)
+            return;
+
+        var oldURL = this._url;
+        this._url = x;
+
+        // FIXME: We should make the WebInspector object listen for the "url changed" event.
+        // Then resourceURLChanged can be removed.
+        WebInspector.resourceURLChanged(this, oldURL);
+
+        this.dispatchEventToListeners("url changed");
+    },
+
+    get documentURL()
+    {
+        return this._documentURL;
+    },
+
+    set documentURL(x)
+    {
+        if (this._documentURL === x)
+            return;
+        this._documentURL = x;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    set domain(x)
+    {
+        if (this._domain === x)
+            return;
+        this._domain = x;
+    },
+
+    get lastPathComponent()
+    {
+        return this._lastPathComponent;
+    },
+
+    set lastPathComponent(x)
+    {
+        if (this._lastPathComponent === x)
+            return;
+        this._lastPathComponent = x;
+        this._lastPathComponentLowerCase = x ? x.toLowerCase() : null;
+    },
+
+    get displayName()
+    {
+        var title = this.lastPathComponent;
+        if (!title)
+            title = this.displayDomain;
+        if (!title && this.url)
+            title = this.url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
+        if (title === "/")
+            title = this.url;
+        return title;
+    },
+
+    get displayDomain()
+    {
+        // WebInspector.Database calls this, so don't access more than this.domain.
+        if (this.domain && (!WebInspector.mainResource || (WebInspector.mainResource && this.domain !== WebInspector.mainResource.domain)))
+            return this.domain;
+        return "";
+    },
+
+    get startTime()
+    {
+        return this._startTime || -1;
+    },
+
+    set startTime(x)
+    {
+        if (this._startTime === x)
+            return;
+
+        this._startTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get responseReceivedTime()
+    {
+        return this._responseReceivedTime || -1;
+    },
+
+    set responseReceivedTime(x)
+    {
+        if (this._responseReceivedTime === x)
+            return;
+
+        this._responseReceivedTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get endTime()
+    {
+        return this._endTime || -1;
+    },
+
+    set endTime(x)
+    {
+        if (this._endTime === x)
+            return;
+
+        this._endTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get duration()
+    {
+        if (this._endTime === -1 || this._startTime === -1)
+            return -1;
+        return this._endTime - this._startTime;
+    },
+
+    get latency()
+    {
+        if (this._responseReceivedTime === -1 || this._startTime === -1)
+            return -1;
+        return this._responseReceivedTime - this._startTime;
+    },
+
+    get resourceSize()
+    {
+        return this._resourceSize || 0;
+    },
+
+    set resourceSize(x)
+    {
+        if (this._resourceSize === x)
+            return;
+
+        this._resourceSize = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get transferSize()
+    {
+        // FIXME: this is wrong for chunked-encoding resources.
+        return this.cached ? 0 : Number(this.responseHeaders["Content-Length"] || this.resourceSize || 0);
+    },
+
+    get expectedContentLength()
+    {
+        return this._expectedContentLength || 0;
+    },
+
+    set expectedContentLength(x)
+    {
+        if (this._expectedContentLength === x)
+            return;
+        this._expectedContentLength = x;
+    },
+
+    get finished()
+    {
+        return this._finished;
+    },
+
+    set finished(x)
+    {
+        if (this._finished === x)
+            return;
+
+        this._finished = x;
+
+        if (x) {
+            this._checkWarnings();
+            this.dispatchEventToListeners("finished");
+        }
+    },
+
+    get failed()
+    {
+        return this._failed;
+    },
+
+    set failed(x)
+    {
+        this._failed = x;
+    },
+
+    get category()
+    {
+        return this._category;
+    },
+
+    set category(x)
+    {
+        if (this._category === x)
+            return;
+
+        var oldCategory = this._category;
+        if (oldCategory)
+            oldCategory.removeResource(this);
+
+        this._category = x;
+
+        if (this._category)
+            this._category.addResource(this);
+
+        if (WebInspector.panels.resources) {
+            WebInspector.panels.resources.refreshResource(this);
+            WebInspector.panels.resources.recreateViewForResourceIfNeeded(this);
+        }
+    },
+
+    get mimeType()
+    {
+        return this._mimeType;
+    },
+
+    set mimeType(x)
+    {
+        if (this._mimeType === x)
+            return;
+
+        this._mimeType = x;
+    },
+
+    get type()
+    {
+        return this._type;
+    },
+
+    set type(x)
+    {
+        if (this._type === x)
+            return;
+
+        this._type = x;
+
+        switch (x) {
+            case WebInspector.Resource.Type.Document:
+                this.category = WebInspector.resourceCategories.documents;
+                break;
+            case WebInspector.Resource.Type.Stylesheet:
+                this.category = WebInspector.resourceCategories.stylesheets;
+                break;
+            case WebInspector.Resource.Type.Script:
+                this.category = WebInspector.resourceCategories.scripts;
+                break;
+            case WebInspector.Resource.Type.Image:
+                this.category = WebInspector.resourceCategories.images;
+                break;
+            case WebInspector.Resource.Type.Font:
+                this.category = WebInspector.resourceCategories.fonts;
+                break;
+            case WebInspector.Resource.Type.XHR:
+                this.category = WebInspector.resourceCategories.xhr;
+                break;
+            case WebInspector.Resource.Type.Other:
+            default:
+                this.category = WebInspector.resourceCategories.other;
+                break;
+        }
+    },
+
+    get requestHeaders()
+    {
+        if (this._requestHeaders === undefined)
+            this._requestHeaders = {};
+        return this._requestHeaders;
+    },
+
+    set requestHeaders(x)
+    {
+        if (this._requestHeaders === x)
+            return;
+
+        this._requestHeaders = x;
+        delete this._sortedRequestHeaders;
+
+        this.dispatchEventToListeners("requestHeaders changed");
+    },
+
+    get sortedRequestHeaders()
+    {
+        if (this._sortedRequestHeaders !== undefined)
+            return this._sortedRequestHeaders;
+
+        this._sortedRequestHeaders = [];
+        for (var key in this.requestHeaders)
+            this._sortedRequestHeaders.push({header: key, value: this.requestHeaders[key]});
+        this._sortedRequestHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
+
+        return this._sortedRequestHeaders;
+    },
+
+    get responseHeaders()
+    {
+        if (this._responseHeaders === undefined)
+            this._responseHeaders = {};
+        return this._responseHeaders;
+    },
+
+    set responseHeaders(x)
+    {
+        if (this._responseHeaders === x)
+            return;
+
+        this._responseHeaders = x;
+        delete this._sortedResponseHeaders;
+
+        this.dispatchEventToListeners("responseHeaders changed");
+    },
+
+    get sortedResponseHeaders()
+    {
+        if (this._sortedResponseHeaders !== undefined)
+            return this._sortedResponseHeaders;
+
+        this._sortedResponseHeaders = [];
+        for (var key in this.responseHeaders)
+            this._sortedResponseHeaders.push({header: key, value: this.responseHeaders[key]});
+        this._sortedResponseHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
+
+        return this._sortedResponseHeaders;
+    },
+
+    get scripts()
+    {
+        if (!("_scripts" in this))
+            this._scripts = [];
+        return this._scripts;
+    },
+
+    addScript: function(script)
+    {
+        if (!script)
+            return;
+        this.scripts.unshift(script);
+        script.resource = this;
+    },
+
+    removeAllScripts: function()
+    {
+        if (!this._scripts)
+            return;
+
+        for (var i = 0; i < this._scripts.length; ++i) {
+            if (this._scripts[i].resource === this)
+                delete this._scripts[i].resource;
+        }
+
+        delete this._scripts;
+    },
+
+    removeScript: function(script)
+    {
+        if (!script)
+            return;
+
+        if (script.resource === this)
+            delete script.resource;
+
+        if (!this._scripts)
+            return;
+
+        this._scripts.remove(script);
+    },
+
+    get errors()
+    {
+        return this._errors || 0;
+    },
+
+    set errors(x)
+    {
+        this._errors = x;
+    },
+
+    get warnings()
+    {
+        return this._warnings || 0;
+    },
+
+    set warnings(x)
+    {
+        this._warnings = x;
+    },
+
+    _mimeTypeIsConsistentWithType: function()
+    {
+        if (typeof this.type === "undefined"
+         || this.type === WebInspector.Resource.Type.Other
+         || this.type === WebInspector.Resource.Type.XHR)
+            return true;
+
+        if (this.mimeType in WebInspector.MIMETypes)
+            return this.type in WebInspector.MIMETypes[this.mimeType];
+
+        return false;
+    },
+
+    _checkWarnings: function()
+    {
+        for (var warning in WebInspector.Warnings)
+            this._checkWarning(WebInspector.Warnings[warning]);
+    },
+
+    _checkWarning: function(warning)
+    {
+        var msg;
+        switch (warning.id) {
+            case WebInspector.Warnings.IncorrectMIMEType.id:
+                if (!this._mimeTypeIsConsistentWithType())
+                    msg = new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,
+                        WebInspector.ConsoleMessage.MessageType.Log, 
+                        WebInspector.ConsoleMessage.MessageLevel.Warning, -1, this.url, null, 1,
+                        String.sprintf(WebInspector.Warnings.IncorrectMIMEType.message,
+                        WebInspector.Resource.Type.toString(this.type), this.mimeType));
+                break;
+        }
+
+        if (msg)
+            WebInspector.console.addMessage(msg);
+    }
+}
+
+WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.Resource.CompareByStartTime = function(a, b)
+{
+    return a.startTime - b.startTime;
+}
+
+WebInspector.Resource.CompareByResponseReceivedTime = function(a, b)
+{
+    var aVal = a.responseReceivedTime;
+    var bVal = b.responseReceivedTime;
+    if (aVal === -1 ^ bVal === -1)
+        return bVal - aVal;
+    return aVal - bVal;
+}
+
+WebInspector.Resource.CompareByEndTime = function(a, b)
+{
+    var aVal = a.endTime;
+    var bVal = b.endTime;
+    if (aVal === -1 ^ bVal === -1)
+        return bVal - aVal;
+    return aVal - bVal;
+}
+
+WebInspector.Resource.CompareByDuration = function(a, b)
+{
+    return a.duration - b.duration;
+}
+
+WebInspector.Resource.CompareByLatency = function(a, b)
+{
+    return a.latency - b.latency;
+}
+
+WebInspector.Resource.CompareBySize = function(a, b)
+{
+    return a.resourceSize - b.resourceSize;
+}
+
+WebInspector.Resource.CompareByTransferSize = function(a, b)
+{
+    return a.transferSize - b.transferSize;
+}
+
+
+WebInspector.Resource.StatusTextForCode = function(code)
+{
+    return code ? code + " " + WebInspector.Resource.StatusText[code] : "";
+}
+
+/* ResourceCategory.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourceCategory = function(name, title, color)
+{
+    WebInspector.AbstractTimelineCategory.call(this, name, title, color);
+    this.resources = [];
+}
+
+WebInspector.ResourceCategory.prototype = {
+
+    addResource: function(resource)
+    {
+        var a = resource;
+        var resourcesLength = this.resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var b = this.resources[i];
+            if (a._lastPathComponentLowerCase && b._lastPathComponentLowerCase)
+                if (a._lastPathComponentLowerCase < b._lastPathComponentLowerCase)
+                    break;
+            else if (a.name && b.name)
+                if (a.name < b.name)
+                    break;
+        }
+
+        this.resources.splice(i, 0, resource);
+    },
+
+    removeResource: function(resource)
+    {
+        this.resources.remove(resource, true);
+    },
+
+    removeAllResources: function(resource)
+    {
+        this.resources = [];
+    }
+}
+
+WebInspector.ResourceCategory.prototype.__proto__ = WebInspector.AbstractTimelineCategory.prototype;
+
+/* Database.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Database = function(id, domain, name, version)
+{
+    this._id = id;
+    this._domain = domain;
+    this._name = name;
+    this._version = version;
+}
+
+WebInspector.Database.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get name()
+    {
+        return this._name;
+    },
+
+    set name(x)
+    {
+        this._name = x;
+    },
+
+    get version()
+    {
+        return this._version;
+    },
+
+    set version(x)
+    {
+        this._version = x;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    set domain(x)
+    {
+        this._domain = x;
+    },
+
+    get displayDomain()
+    {
+        return WebInspector.Resource.prototype.__lookupGetter__("displayDomain").call(this);
+    },
+
+    getTableNames: function(callback)
+    {
+        function sortingCallback(names)
+        {
+            callback(names.sort());
+        }
+        var callId = WebInspector.Callback.wrap(sortingCallback);
+        InspectorBackend.getDatabaseTableNames(callId, this._id);
+    },
+    
+    executeSql: function(query, onSuccess, onError)
+    {
+        function callback(result)
+        {
+            if (!(result instanceof Array)) {
+                onError(result);
+                return;
+            }
+            onSuccess(result);
+        }
+        // FIXME: execute the query in the frame the DB comes from.
+        InjectedScriptAccess.getDefault().executeSql(this._id, query, callback);
+    }
+}
+
+WebInspector.didGetDatabaseTableNames = WebInspector.Callback.processCallback;
+
+/* DOMStorage.js */
+
+/*
+ * Copyright (C) 2008 Nokia Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMStorage = function(id, domain, isLocalStorage)
+{
+    this._id = id;
+    this._domain = domain;
+    this._isLocalStorage = isLocalStorage;
+}
+
+WebInspector.DOMStorage.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get domStorage()
+    {
+        return this._domStorage;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    get isLocalStorage()
+    {
+        return this._isLocalStorage;
+    },
+
+    getEntries: function(callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.getDOMStorageEntries(callId, this._id);
+    },
+    
+    setItem: function(key, value, callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.setDOMStorageItem(callId, this._id, key, value);
+    },
+    
+    removeItem: function(key, callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.removeDOMStorageItem(callId, this._id, key);
+    }
+}
+
+WebInspector.didGetDOMStorageEntries = WebInspector.Callback.processCallback;
+WebInspector.didSetDOMStorageItem = WebInspector.Callback.processCallback;
+WebInspector.didRemoveDOMStorageItem = WebInspector.Callback.processCallback;
+
+/* DOMStorageItemsView.js */
+
+/*
+ * Copyright (C) 2008 Nokia Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMStorageItemsView = function(domStorage)
+{
+    WebInspector.View.call(this);
+
+    this.domStorage = domStorage;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
+    this.deleteButton.visible = false;
+    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+}
+
+WebInspector.DOMStorageItemsView.prototype = {
+    get statusBarItems()
+    {
+        return [this.refreshButton.element, this.deleteButton.element];
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.update();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.deleteButton.visible = false;
+    },
+
+    update: function()
+    {
+        this.element.removeChildren();
+        var callback = this._showDOMStorageEntries.bind(this);
+        this.domStorage.getEntries(callback);
+    },
+
+    _showDOMStorageEntries: function(entries)
+    {
+        this._dataGrid = this._dataGridForDOMStorageEntries(entries);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.autoSizeColumns(10);
+        this.deleteButton.visible = true;
+    },
+
+    resize: function()
+    {
+        if (this._dataGrid)
+            this._dataGrid.updateWidths();
+    },
+
+    _dataGridForDOMStorageEntries: function(entries)
+    {
+        var columns = {};
+        columns[0] = {};
+        columns[1] = {};
+        columns[0].title = WebInspector.UIString("Key");
+        columns[1].title = WebInspector.UIString("Value");
+
+        var nodes = [];
+
+        var keys = [];
+        var length = entries.length;
+        for (var i = 0; i < entries.length; i++) {
+            var data = {};
+
+            var key = entries[i][0];
+            data[0] = key;
+            var value = entries[i][1];
+            data[1] = value;
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = true;
+            nodes.push(node);
+            keys.push(key);
+        }
+
+        var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
+        var length = nodes.length;
+        for (var i = 0; i < length; ++i)
+            dataGrid.appendChild(nodes[i]);
+        dataGrid.addCreationNode(false);
+        if (length > 0)
+            nodes[0].selected = true;
+        return dataGrid;
+    },
+
+    _deleteButtonClicked: function(event)
+    {
+        if (!this._dataGrid || !this._dataGrid.selectedNode)
+            return;
+
+        this._deleteCallback(this._dataGrid.selectedNode);
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this.update();
+    },
+    
+    _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
+    {
+        var domStorage = this.domStorage;
+        if (columnIdentifier === 0) {
+            if (oldText)
+                domStorage.removeItem(oldText);
+
+            domStorage.setItem(newText, editingNode.data[1]);
+        } else {
+            domStorage.setItem(editingNode.data[0], newText);
+        }
+        
+        this.update();
+    },
+    
+    _deleteCallback: function(node)
+    {
+        if (!node || node.isCreationNode)
+            return;
+
+        if (this.domStorage)
+            this.domStorage.removeItem(node.data[0]);
+            
+        this.update();
+    }
+}
+
+WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* DataGrid.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *        notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *        notice, this list of conditions and the following disclaimer in the
+ *        documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.         IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DataGrid = function(columns, editCallback, deleteCallback)
+{
+    this.element = document.createElement("div");
+    this.element.className = "data-grid";
+    this.element.tabIndex = 0;
+    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
+
+    this._headerTable = document.createElement("table");
+    this._headerTable.className = "header";
+
+    this._dataTable = document.createElement("table");
+    this._dataTable.className = "data";
+
+    this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
+    this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
+    
+    this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
+    
+    // FIXME: Add a createCallback which is different from editCallback and has different
+    // behavior when creating a new node.
+    if (editCallback) {
+        this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
+        this._editCallback = editCallback;
+    }
+    if (deleteCallback)
+        this._deleteCallback = deleteCallback;
+    
+    this.aligned = {};
+
+    var scrollContainer = document.createElement("div");
+    scrollContainer.className = "data-container";
+    scrollContainer.appendChild(this._dataTable);
+
+    this.element.appendChild(this._headerTable);
+    this.element.appendChild(scrollContainer);
+
+    var headerRow = document.createElement("tr");
+    var columnGroup = document.createElement("colgroup");
+    this._columnCount = 0;
+
+    for (var columnIdentifier in columns) {
+        var column = columns[columnIdentifier];
+        if (column.disclosure)
+            this.disclosureColumnIdentifier = columnIdentifier;
+
+        var col = document.createElement("col");
+        if (column.width)
+            col.style.width = column.width;
+        column.element = col;
+        columnGroup.appendChild(col);
+
+        var cell = document.createElement("th");
+        cell.className = columnIdentifier + "-column";
+        cell.columnIdentifier = columnIdentifier;
+
+        var div = document.createElement("div");
+        div.textContent = column.title;
+        cell.appendChild(div);
+
+        if (column.sort) {
+            cell.addStyleClass("sort-" + column.sort);
+            this._sortColumnCell = cell;
+        }
+
+        if (column.sortable) {
+            cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
+            cell.addStyleClass("sortable");
+        }
+
+        if (column.aligned) {
+            cell.addStyleClass(column.aligned);
+            this.aligned[columnIdentifier] = column.aligned;
+        }
+
+        headerRow.appendChild(cell);
+
+        ++this._columnCount;
+    }
+
+    columnGroup.span = this._columnCount;
+
+    var cell = document.createElement("th");
+    cell.className = "corner";
+    headerRow.appendChild(cell);
+
+    this._headerTableColumnGroup = columnGroup;
+    this._headerTable.appendChild(this._headerTableColumnGroup);
+    this.headerTableBody.appendChild(headerRow);
+
+    var fillerRow = document.createElement("tr");
+    fillerRow.className = "filler";
+
+    for (var i = 0; i < this._columnCount; ++i) {
+        var cell = document.createElement("td");
+        fillerRow.appendChild(cell);
+    }
+    
+    this._dataTableColumnGroup = columnGroup.cloneNode(true);
+    this._dataTable.appendChild(this._dataTableColumnGroup);
+    this.dataTableBody.appendChild(fillerRow);
+
+    this.columns = columns || {};
+    this.children = [];
+    this.selectedNode = null;
+    this.expandNodesWhenArrowing = false;
+    this.root = true;
+    this.hasChildren = false;
+    this.expanded = true;
+    this.revealed = true;
+    this.selected = false;
+    this.dataGrid = this;
+    this.indentWidth = 15;
+    this.resizers = [];
+    this.columnWidthsInitialized = false;
+}
+
+WebInspector.DataGrid.prototype = {
+    _ondblclick: function(event)
+    {
+        if (this._editing || this._editingNode)
+            return;
+
+        this._startEditing(event.target);
+    },
+
+    _startEditingColumnOfDataGridNode: function(node, column)
+    {
+        this._editing = true;
+        this._editingNode = node;
+        this._editingNode.select();
+
+        var element = this._editingNode._element.children[column];
+        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    _startEditing: function(target)
+    {
+        var element = target.enclosingNodeOrSelfWithNodeName("td");
+        if (!element)
+            return;
+
+        this._editingNode = this.dataGridNodeFromNode(target);
+        if (!this._editingNode) {
+            if (!this.creationNode)
+                return;
+            this._editingNode = this.creationNode;
+        }
+
+        // Force editing the 1st column when editing the creation node
+        if (this._editingNode.isCreationNode)
+            return this._startEditingColumnOfDataGridNode(this._editingNode, 0);
+
+        this._editing = true;
+        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    _editingCommitted: function(element, newText, oldText, context, moveDirection)
+    {
+        // FIXME: We need more column identifiers here throughout this function.
+        // Not needed yet since only editable DataGrid is DOM Storage, which is Key - Value.
+        
+        // FIXME: Better way to do this than regular expressions?
+        var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1]);
+
+        var textBeforeEditing = this._editingNode.data[columnIdentifier];
+        var currentEditingNode = this._editingNode;
+
+        function moveToNextIfNeeded(wasChange) {
+            if (!moveDirection)
+                return;
+
+            if (moveDirection === "forward") {
+                if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)
+                    return;
+
+                if (columnIdentifier === 0)
+                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);
+
+                var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
+                if (nextDataGridNode)
+                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);
+                if (currentEditingNode.isCreationNode && wasChange) {
+                    addCreationNode(false);
+                    return this._startEditingColumnOfDataGridNode(this.creationNode, 0);
+                }
+                return;
+            }
+
+            if (moveDirection === "backward") {
+                if (columnIdentifier === 1)
+                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);
+                    var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);
+
+                if (nextDataGridNode)
+                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);
+                return;
+            }
+        }
+
+        if (textBeforeEditing == newText) {
+            this._editingCancelled(element);
+            moveToNextIfNeeded.call(this, false);
+            return;
+        }
+
+        // Update the text in the datagrid that we typed
+        this._editingNode.data[columnIdentifier] = newText;
+        
+        // Make the callback - expects an editing node (table row), the column number that is being edited,
+        // the text that used to be there, and the new text.
+        this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
+
+        if (this._editingNode.isCreationNode)
+            this.addCreationNode(false);
+
+        this._editingCancelled(element);
+        moveToNextIfNeeded.call(this, true);
+    },
+
+    _editingCancelled: function(element, context)
+    {
+        delete this._editing;
+        this._editingNode = null;
+    },
+    
+    get sortColumnIdentifier()
+    {
+        if (!this._sortColumnCell)
+            return null;
+        return this._sortColumnCell.columnIdentifier;
+    },
+
+    get sortOrder()
+    {
+        if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))
+            return "ascending";
+        if (this._sortColumnCell.hasStyleClass("sort-descending"))
+            return "descending";
+        return null;
+    },
+
+    get headerTableBody()
+    {
+        if ("_headerTableBody" in this)
+            return this._headerTableBody;
+
+        this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
+        if (!this._headerTableBody) {
+            this._headerTableBody = this.element.ownerDocument.createElement("tbody");
+            this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
+        }
+
+        return this._headerTableBody;
+    },
+
+    get dataTableBody()
+    {
+        if ("_dataTableBody" in this)
+            return this._dataTableBody;
+
+        this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
+        if (!this._dataTableBody) {
+            this._dataTableBody = this.element.ownerDocument.createElement("tbody");
+            this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
+        }
+
+        return this._dataTableBody;
+    },
+
+    autoSizeColumns: function(minPercent, maxPercent)
+    {
+        if (minPercent)
+            minPercent = Math.min(minPercent, Math.floor(100 / this._columnCount));
+        var widths = {};
+        var columns = this.columns;
+        for (var columnIdentifier in columns)
+            widths[columnIdentifier] = (columns[columnIdentifier].title || "").length;
+
+        for (var i = 0; i < this.children.length; ++i) {
+            var node = this.children[i];
+            for (var columnIdentifier in columns) {
+                var text = node.data[columnIdentifier] || "";
+                if (text.length > widths[columnIdentifier])
+                    widths[columnIdentifier] = text.length;
+            }
+        }
+
+        var totalColumnWidths = 0;
+        for (var columnIdentifier in columns)
+            totalColumnWidths += widths[columnIdentifier];
+
+        var recoupPercent = 0;
+        for (var columnIdentifier in columns) {
+            var width = Math.round(100 * widths[columnIdentifier] / totalColumnWidths);
+            if (minPercent && width < minPercent) {
+                recoupPercent += (minPercent - width);
+                width = minPercent;
+            } else if (maxPercent && width > maxPercent) {
+                recoupPercent -= (width - maxPercent);
+                width = maxPercent;
+            }
+            widths[columnIdentifier] = width;
+        }
+
+        while (minPercent && recoupPercent > 0) {
+            for (var columnIdentifier in columns) {
+                if (widths[columnIdentifier] > minPercent) {
+                    --widths[columnIdentifier];
+                    --recoupPercent;
+                    if (!recoupPercent)
+                        break;
+                }
+            }
+        }
+
+        while (maxPercent && recoupPercent < 0) {
+            for (var columnIdentifier in columns) {
+                if (widths[columnIdentifier] < maxPercent) {
+                    ++widths[columnIdentifier];
+                    ++recoupPercent;
+                    if (!recoupPercent)
+                        break;
+                }
+            }
+        }
+
+        for (var columnIdentifier in columns)
+            columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%";
+        this.columnWidthsInitialized = false;
+        this.updateWidths();
+    },
+
+    // Updates the widths of the table, including the positions of the column
+    // resizers.
+    //
+    // IMPORTANT: This function MUST be called once after the element of the
+    // DataGrid is attached to its parent element and every subsequent time the
+    // width of the parent element is changed in order to make it possible to
+    // resize the columns.
+    //
+    // If this function is not called after the DataGrid is attached to its
+    // parent element, then the DataGrid's columns will not be resizable.
+    updateWidths: function()
+    {
+        var headerTableColumns = this._headerTableColumnGroup.children;
+        
+        var left = 0;
+        var tableWidth = this._dataTable.offsetWidth;
+        var numColumns = headerTableColumns.length;
+        
+        if (!this.columnWidthsInitialized) {
+            // Give all the columns initial widths now so that during a resize,
+            // when the two columns that get resized get a percent value for
+            // their widths, all the other columns already have percent values
+            // for their widths.
+            for (var i = 0; i < numColumns; i++) {
+                var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
+                var percentWidth = ((columnWidth / tableWidth) * 100) + "%";
+                this._headerTableColumnGroup.children[i].style.width = percentWidth;
+                this._dataTableColumnGroup.children[i].style.width = percentWidth;
+            }
+            this.columnWidthsInitialized = true;
+        }
+        
+        // Make n - 1 resizers for n columns. 
+        for (var i = 0; i < numColumns - 1; i++) {
+            var resizer = this.resizers[i];
+
+            if (!resizer) {
+                // This is the first call to updateWidth, so the resizers need
+                // to be created.
+                resizer = document.createElement("div");
+                resizer.addStyleClass("data-grid-resizer");
+                // This resizer is associated with the column to its right.
+                resizer.rightNeighboringColumnID = i + 1;
+                resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);
+                this.element.appendChild(resizer);
+                this.resizers[i] = resizer;
+            }
+
+            // Get the width of the cell in the first (and only) row of the
+            // header table in order to determine the width of the column, since
+            // it is not possible to query a column for its width.
+            left += this.headerTableBody.rows[0].cells[i].offsetWidth;
+            
+            resizer.style.left = left + "px";
+        }
+    },
+
+    addCreationNode: function(hasChildren)
+    {
+        if (this.creationNode)
+            this.creationNode.makeNormal();
+
+        var emptyData = {};
+        for (var column in this.columns)
+            emptyData[column] = '';
+        this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
+        this.appendChild(this.creationNode);
+    },
+
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        if (!child)
+            throw("insertChild: Node can't be undefined or null.");
+        if (child.parent === this)
+            throw("insertChild: Node is already a child of this node.");
+
+        if (child.parent)
+            child.parent.removeChild(child);
+
+        this.children.splice(index, 0, child);
+        this.hasChildren = true;
+
+        child.parent = this;
+        child.dataGrid = this.dataGrid;
+        child._recalculateSiblings(index);
+
+        delete child._depth;
+        delete child._revealed;
+        delete child._attached;
+        child._shouldRefreshChildren = true;
+
+        var current = child.children[0];
+        while (current) {
+            current.dataGrid = this.dataGrid;
+            delete current._depth;
+            delete current._revealed;
+            delete current._attached;
+            current._shouldRefreshChildren = true;
+            current = current.traverseNextNode(false, child, true);
+        }
+
+        if (this.expanded)
+            child._attach();
+    },
+
+    removeChild: function(child)
+    {
+        if (!child)
+            throw("removeChild: Node can't be undefined or null.");
+        if (child.parent !== this)
+            throw("removeChild: Node is not a child of this node.");
+
+        child.deselect();
+
+        this.children.remove(child, true);
+
+        if (child.previousSibling)
+            child.previousSibling.nextSibling = child.nextSibling;
+        if (child.nextSibling)
+            child.nextSibling.previousSibling = child.previousSibling;
+
+        child.dataGrid = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+
+        if (this.children.length <= 0)
+            this.hasChildren = false;
+    },
+
+    removeChildren: function()
+    {
+        for (var i = 0; i < this.children.length; ++i) {
+            var child = this.children[i];
+            child.deselect();
+            child._detach();
+
+            child.dataGrid = null;
+            child.parent = null;
+            child.nextSibling = null;
+            child.previousSibling = null;
+        }
+
+        this.children = [];
+        this.hasChildren = false;
+    },
+
+    removeChildrenRecursive: function()
+    {
+        var childrenToRemove = this.children;
+
+        var child = this.children[0];
+        while (child) {
+            if (child.children.length)
+                childrenToRemove = childrenToRemove.concat(child.children);
+            child = child.traverseNextNode(false, this, true);
+        }
+
+        for (var i = 0; i < childrenToRemove.length; ++i) {
+            var child = childrenToRemove[i];
+            child.deselect();
+            child._detach();
+
+            child.children = [];
+            child.dataGrid = null;
+            child.parent = null;
+            child.nextSibling = null;
+            child.previousSibling = null;
+        }
+
+        this.children = [];
+    },
+
+
+    _keyDown: function(event)
+    {
+        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
+            return;
+
+        var handled = false;
+        var nextSelectedNode;
+        if (event.keyIdentifier === "Up" && !event.altKey) {
+            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
+            while (nextSelectedNode && !nextSelectedNode.selectable)
+                nextSelectedNode = nextSelectedNode.traversePreviousNode(!this.expandTreeNodesWhenArrowing);
+            handled = nextSelectedNode ? true : false;
+        } else if (event.keyIdentifier === "Down" && !event.altKey) {
+            nextSelectedNode = this.selectedNode.traverseNextNode(true);
+            while (nextSelectedNode && !nextSelectedNode.selectable)
+                nextSelectedNode = nextSelectedNode.traverseNextNode(!this.expandTreeNodesWhenArrowing);
+            handled = nextSelectedNode ? true : false;
+        } else if (event.keyIdentifier === "Left") {
+            if (this.selectedNode.expanded) {
+                if (event.altKey)
+                    this.selectedNode.collapseRecursively();
+                else
+                    this.selectedNode.collapse();
+                handled = true;
+            } else if (this.selectedNode.parent && !this.selectedNode.parent.root) {
+                handled = true;
+                if (this.selectedNode.parent.selectable) {
+                    nextSelectedNode = this.selectedNode.parent;
+                    handled = nextSelectedNode ? true : false;
+                } else if (this.selectedNode.parent)
+                    this.selectedNode.parent.collapse();
+            }
+        } else if (event.keyIdentifier === "Right") {
+            if (!this.selectedNode.revealed) {
+                this.selectedNode.reveal();
+                handled = true;
+            } else if (this.selectedNode.hasChildren) {
+                handled = true;
+                if (this.selectedNode.expanded) {
+                    nextSelectedNode = this.selectedNode.children[0];
+                    handled = nextSelectedNode ? true : false;
+                } else {
+                    if (event.altKey)
+                        this.selectedNode.expandRecursively();
+                    else
+                        this.selectedNode.expand();
+                }
+            }
+        } else if (event.keyCode === 8 || event.keyCode === 46) {
+            if (this._deleteCallback) {
+                handled = true;
+                this._deleteCallback(this.selectedNode);
+            }
+        } else if (isEnterKey(event)) {
+            if (this._editCallback) {
+                handled = true;
+                // The first child of the selected element is the <td class="0-column">,
+                // and that's what we want to edit.
+                this._startEditing(this.selectedNode._element.children[0]);
+            }
+        }
+
+        if (nextSelectedNode) {
+            nextSelectedNode.reveal();
+            nextSelectedNode.select();
+        }
+
+        if (handled) {
+            event.preventDefault();
+            event.stopPropagation();
+        }
+    },
+
+    expand: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    collapse: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    reveal: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    dataGridNodeFromNode: function(target)
+    {
+        var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
+        return rowElement._dataGridNode;
+    },
+
+    dataGridNodeFromPoint: function(x, y)
+    {
+        var node = this._dataTable.ownerDocument.elementFromPoint(x, y);
+        var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");
+        return rowElement._dataGridNode;
+    },
+
+    _clickInHeaderCell: function(event)
+    {
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
+        if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))
+            return;
+
+        var sortOrder = this.sortOrder;
+
+        if (this._sortColumnCell) {
+            this._sortColumnCell.removeStyleClass("sort-ascending");
+            this._sortColumnCell.removeStyleClass("sort-descending");
+        }
+
+        if (cell == this._sortColumnCell) {
+            if (sortOrder == "ascending")
+                sortOrder = "descending";
+            else
+                sortOrder = "ascending";
+        }
+
+        this._sortColumnCell = cell;
+
+        cell.addStyleClass("sort-" + sortOrder);
+
+        this.dispatchEventToListeners("sorting changed");
+    },
+
+    _mouseDownInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.selectable)
+            return;
+
+        if (gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (event.metaKey) {
+            if (gridNode.selected)
+                gridNode.deselect();
+            else
+                gridNode.select();
+        } else
+            gridNode.select();
+    },
+    
+    _contextMenuInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.selectable)
+            return;
+        
+        if (gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+      
+        var contextMenu = new WebInspector.ContextMenu();
+        
+        // FIXME: Use the column names for Editing, instead of just "Edit".
+        if (this.dataGrid._editCallback) {
+            if (gridNode === this.creationNode)
+                contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));
+            else
+                contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));
+        }
+        if (this.dataGrid._deleteCallback && gridNode !== this.creationNode)
+            contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
+        
+        contextMenu.show(event);
+    },
+
+    _clickInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.hasChildren)
+            return;
+
+        if (!gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (gridNode.expanded) {
+            if (event.altKey)
+                gridNode.collapseRecursively();
+            else
+                gridNode.collapse();
+        } else {
+            if (event.altKey)
+                gridNode.expandRecursively();
+            else
+                gridNode.expand();
+        }
+    },
+    
+    _startResizerDragging: function(event)
+    {
+        this.currentResizer = event.target;
+        if (!this.currentResizer.rightNeighboringColumnID)
+            return;
+        WebInspector.elementDragStart(this.lastResizer, this._resizerDragging.bind(this),
+            this._endResizerDragging.bind(this), event, "col-resize");
+    },
+    
+    _resizerDragging: function(event)
+    {
+        var resizer = this.currentResizer;
+        if (!resizer)
+            return;
+        
+        // Constrain the dragpoint to be within the containing div of the
+        // datagrid.
+        var dragPoint = event.clientX - this.element.totalOffsetLeft;
+        // Constrain the dragpoint to be within the space made up by the
+        // column directly to the left and the column directly to the right.
+        var leftEdgeOfPreviousColumn = 0;
+        var firstRowCells = this.headerTableBody.rows[0].cells;
+        for (var i = 0; i < resizer.rightNeighboringColumnID - 1; i++)
+            leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
+            
+        var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.rightNeighboringColumnID - 1].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth;
+        
+        // Give each column some padding so that they don't disappear.               
+        var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
+        var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
+        
+        dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
+        
+        resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";
+        
+        var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";
+        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
+        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
+        
+        var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";
+        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width =  percentRightColumn;
+        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn;
+        
+        event.preventDefault();
+    },
+    
+    _endResizerDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+        this.currentResizer = null;
+    },
+    
+    ColumnResizePadding: 10,
+    
+    CenterResizerOverBorderAdjustment: 3,
+}
+
+WebInspector.DataGrid.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.DataGridNode = function(data, hasChildren)
+{
+    this._expanded = false;
+    this._selected = false;
+    this._shouldRefreshChildren = true;
+    this._data = data || {};
+    this.hasChildren = hasChildren || false;
+    this.children = [];
+    this.dataGrid = null;
+    this.parent = null;
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.disclosureToggleWidth = 10;
+}
+
+WebInspector.DataGridNode.prototype = {
+    selectable: true,
+
+    get element()
+    {
+        if (this._element)
+            return this._element;
+
+        if (!this.dataGrid)
+            return null;
+
+        this._element = document.createElement("tr");
+        this._element._dataGridNode = this;
+
+        if (this.hasChildren)
+            this._element.addStyleClass("parent");
+        if (this.expanded)
+            this._element.addStyleClass("expanded");
+        if (this.selected)
+            this._element.addStyleClass("selected");
+        if (this.revealed)
+            this._element.addStyleClass("revealed");
+
+        for (var columnIdentifier in this.dataGrid.columns) {
+            var cell = this.createCell(columnIdentifier);
+            this._element.appendChild(cell);
+        }
+
+        return this._element;
+    },
+
+    get data()
+    {
+        return this._data;
+    },
+
+    set data(x)
+    {
+        this._data = x || {};
+        this.refresh();
+    },
+
+    get revealed()
+    {
+        if ("_revealed" in this)
+            return this._revealed;
+
+        var currentAncestor = this.parent;
+        while (currentAncestor && !currentAncestor.root) {
+            if (!currentAncestor.expanded) {
+                this._revealed = false;
+                return false;
+            }
+
+            currentAncestor = currentAncestor.parent;
+        }
+
+        this._revealed = true;
+        return true;
+    },
+
+    set hasChildren(x)
+    {
+        if (this._hasChildren === x)
+            return;
+
+        this._hasChildren = x;
+
+        if (!this._element)
+            return;
+
+        if (this._hasChildren)
+        {
+            this._element.addStyleClass("parent");
+            if (this.expanded)
+                this._element.addStyleClass("expanded");
+        }
+        else
+        {
+            this._element.removeStyleClass("parent");
+            this._element.removeStyleClass("expanded");
+        }
+    },
+
+    get hasChildren()
+    {
+        return this._hasChildren;
+    },
+
+    set revealed(x)
+    {
+        if (this._revealed === x)
+            return;
+
+        this._revealed = x;
+
+        if (this._element) {
+            if (this._revealed)
+                this._element.addStyleClass("revealed");
+            else
+                this._element.removeStyleClass("revealed");
+        }
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i].revealed = x && this.expanded;
+    },
+
+    get depth()
+    {
+        if ("_depth" in this)
+            return this._depth;
+        if (this.parent && !this.parent.root)
+            this._depth = this.parent.depth + 1;
+        else
+            this._depth = 0;
+        return this._depth;
+    },
+
+    get shouldRefreshChildren()
+    {
+        return this._shouldRefreshChildren;
+    },
+
+    set shouldRefreshChildren(x)
+    {
+        this._shouldRefreshChildren = x;
+        if (x && this.expanded)
+            this.expand();
+    },
+
+    get selected()
+    {
+        return this._selected;
+    },
+
+    set selected(x)
+    {
+        if (x)
+            this.select();
+        else
+            this.deselect();
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    refresh: function()
+    {
+        if (!this._element || !this.dataGrid)
+            return;
+
+        this._element.removeChildren();
+
+        for (var columnIdentifier in this.dataGrid.columns) {
+            var cell = this.createCell(columnIdentifier);
+            this._element.appendChild(cell);
+        }
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = document.createElement("td");
+        cell.className = columnIdentifier + "-column";
+
+        var alignment = this.dataGrid.aligned[columnIdentifier];
+        if (alignment)
+            cell.addStyleClass(alignment);
+
+        var div = document.createElement("div");
+        div.textContent = this.data[columnIdentifier];
+        cell.appendChild(div);
+
+        if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
+            cell.addStyleClass("disclosure");
+            if (this.depth)
+                cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
+        }
+
+        return cell;
+    },
+
+    // Share these functions with DataGrid. They are written to work with a DataGridNode this object.
+    appendChild: WebInspector.DataGrid.prototype.appendChild,
+    insertChild: WebInspector.DataGrid.prototype.insertChild,
+    removeChild: WebInspector.DataGrid.prototype.removeChild,
+    removeChildren: WebInspector.DataGrid.prototype.removeChildren,
+    removeChildrenRecursive: WebInspector.DataGrid.prototype.removeChildrenRecursive,
+
+    _recalculateSiblings: function(myIndex)
+    {
+        if (!this.parent)
+            return;
+
+        var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);
+
+        if (previousChild) {
+            previousChild.nextSibling = this;
+            this.previousSibling = previousChild;
+        } else
+            this.previousSibling = null;
+
+        var nextChild = this.parent.children[myIndex + 1];
+
+        if (nextChild) {
+            nextChild.previousSibling = this;
+            this.nextSibling = nextChild;
+        } else
+            this.nextSibling = null;
+    },
+
+    collapse: function()
+    {
+        if (this._element)
+            this._element.removeStyleClass("expanded");
+
+        this._expanded = false;
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i].revealed = false;
+
+        this.dispatchEventToListeners("collapsed");
+    },
+
+    collapseRecursively: function()
+    {
+        var item = this;
+        while (item) {
+            if (item.expanded)
+                item.collapse();
+            item = item.traverseNextNode(false, this, true);
+        }
+    },
+
+    expand: function()
+    {
+        if (!this.hasChildren || this.expanded)
+            return;
+
+        if (this.revealed && !this._shouldRefreshChildren)
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i].revealed = true;
+
+        if (this._shouldRefreshChildren) {
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i]._detach();
+
+            this.dispatchEventToListeners("populate");
+
+            if (this._attached) {
+                for (var i = 0; i < this.children.length; ++i) {
+                    var child = this.children[i];
+                    if (this.revealed)
+                        child.revealed = true;
+                    child._attach();
+                }
+            }
+
+            delete this._shouldRefreshChildren;
+        }
+
+        if (this._element)
+            this._element.addStyleClass("expanded");
+
+        this._expanded = true;
+
+        this.dispatchEventToListeners("expanded");
+    },
+
+    expandRecursively: function()
+    {
+        var item = this;
+        while (item) {
+            item.expand();
+            item = item.traverseNextNode(false, this);
+        }
+    },
+
+    reveal: function()
+    {
+        var currentAncestor = this.parent;
+        while (currentAncestor && !currentAncestor.root) {
+            if (!currentAncestor.expanded)
+                currentAncestor.expand();
+            currentAncestor = currentAncestor.parent;
+        }
+
+        this.element.scrollIntoViewIfNeeded(false);
+
+        this.dispatchEventToListeners("revealed");
+    },
+
+    select: function(supressSelectedEvent)
+    {
+        if (!this.dataGrid || !this.selectable || this.selected)
+            return;
+
+        if (this.dataGrid.selectedNode)
+            this.dataGrid.selectedNode.deselect();
+
+        this._selected = true;
+        this.dataGrid.selectedNode = this;
+
+        if (this._element)
+            this._element.addStyleClass("selected");
+
+        if (!supressSelectedEvent)
+            this.dispatchEventToListeners("selected");
+    },
+
+    deselect: function(supressDeselectedEvent)
+    {
+        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
+            return;
+
+        this._selected = false;
+        this.dataGrid.selectedNode = null;
+
+        if (this._element)
+            this._element.removeStyleClass("selected");
+
+        if (!supressDeselectedEvent)
+            this.dispatchEventToListeners("deselected");
+    },
+
+    traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
+    {
+        if (!dontPopulate && this.hasChildren)
+            this.dispatchEventToListeners("populate");
+
+        if (info)
+            info.depthChange = 0;
+
+        var node = (!skipHidden || this.revealed) ? this.children[0] : null;
+        if (node && (!skipHidden || this.expanded)) {
+            if (info)
+                info.depthChange = 1;
+            return node;
+        }
+
+        if (this === stayWithin)
+            return null;
+
+        node = (!skipHidden || this.revealed) ? this.nextSibling : null;
+        if (node)
+            return node;
+
+        node = this;
+        while (node && !node.root && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
+            if (info)
+                info.depthChange -= 1;
+            node = node.parent;
+        }
+
+        if (!node)
+            return null;
+
+        return (!skipHidden || node.revealed) ? node.nextSibling : null;
+    },
+
+    traversePreviousNode: function(skipHidden, dontPopulate)
+    {
+        var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
+        if (!dontPopulate && node && node.hasChildren)
+            node.dispatchEventToListeners("populate");
+
+        while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
+            if (!dontPopulate && node.hasChildren)
+                node.dispatchEventToListeners("populate");
+            node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
+        }
+
+        if (node)
+            return node;
+
+        if (!this.parent || this.parent.root)
+            return null;
+
+        return this.parent;
+    },
+
+    isEventWithinDisclosureTriangle: function(event)
+    {
+        if (!this.hasChildren)
+            return false;
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell.hasStyleClass("disclosure"))
+            return false;
+        var computedLeftPadding = window.getComputedStyle(cell).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
+        var left = cell.totalOffsetLeft + computedLeftPadding;
+        return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
+    },
+
+    _attach: function()
+    {
+        if (!this.dataGrid || this._attached)
+            return;
+
+        this._attached = true;
+
+        var nextNode = null;
+        var previousNode = this.traversePreviousNode(true, true);
+        if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)
+            var nextNode = previousNode.element.nextSibling;
+        if (!nextNode)
+            nextNode = this.dataGrid.dataTableBody.lastChild;
+        this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);
+
+        if (this.expanded)
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i]._attach();
+    },
+
+    _detach: function()
+    {
+        if (!this._attached)
+            return;
+
+        this._attached = false;
+
+        if (this._element && this._element.parentNode)
+            this._element.parentNode.removeChild(this._element);
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i]._detach();
+    },
+
+    savePosition: function()
+    {
+        if (this._savedPosition)
+            return;
+
+        if (!this.parent)
+            throw("savePosition: Node must have a parent.");
+        this._savedPosition = {
+            parent: this.parent,
+            index: this.parent.children.indexOf(this)
+        };
+    },
+
+    restorePosition: function()
+    {
+        if (!this._savedPosition)
+            return;
+
+        if (this.parent !== this._savedPosition.parent)
+            this._savedPosition.parent.insertChild(this, this._savedPosition.index);
+
+        delete this._savedPosition;
+    }
+}
+
+WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.CreationDataGridNode = function(data, hasChildren)
+{
+    WebInspector.DataGridNode.call(this, data, hasChildren);
+    this.isCreationNode = true;
+}
+
+WebInspector.CreationDataGridNode.prototype = {
+    makeNormal: function()
+    {
+        delete this.isCreationNode;
+        delete this.makeNormal;
+    }
+}
+
+WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+/* CookieItemsView.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.CookieItemsView = function(treeElement, cookieDomain)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
+    this.deleteButton.visible = false;
+    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+    
+    this._treeElement = treeElement;
+    this._cookieDomain = cookieDomain;
+
+    this._emptyMsgElement = document.createElement("div");
+    this._emptyMsgElement.className = "storage-table-empty";
+    this._emptyMsgElement.textContent = WebInspector.UIString("This site has no cookies.");
+    this.element.appendChild(this._emptyMsgElement);
+}
+
+WebInspector.CookieItemsView.prototype = {
+    get statusBarItems()
+    {
+        return [this.refreshButton.element, this.deleteButton.element];
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this._update();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.deleteButton.visible = false;
+    },
+
+    _update: function()
+    {
+        WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));
+    },
+
+    _updateWithCookies: function(allCookies, isAdvanced)
+    {
+        if (isAdvanced)
+            this._filterCookiesForDomain(allCookies);
+        else
+            this._cookies = allCookies;
+
+        if (!this._cookies.length) {
+            // Nothing to show.
+            this._emptyMsgElement.removeStyleClass("hidden");
+            this.deleteButton.visible = false;
+            if (this._dataGrid)
+                this._dataGrid.element.addStyleClass("hidden");
+            return;
+        }
+
+        if (!this._dataGrid) {
+            if (isAdvanced) {
+                this._createDataGrid();
+                this._populateDataGrid();
+                this._dataGrid.autoSizeColumns(6, 33);
+                this._treeElement.subtitle = String.sprintf(WebInspector.UIString("%d cookies (%s)"), this._cookies.length,
+                    Number.bytesToString(this._totalSize, WebInspector.UIString));
+            } else {
+                this._createSimpleDataGrid();
+                this._populateSimpleDataGrid();
+                this._dataGrid.autoSizeColumns(20, 80);
+            }
+        } else {
+            if (isAdvanced)
+                this._populateDataGrid();
+            else
+                this._populateSimpleDataGrid();
+        }
+
+        this._dataGrid.element.removeStyleClass("hidden");
+        this._emptyMsgElement.addStyleClass("hidden");
+        if (isAdvanced)
+            this.deleteButton.visible = true;
+    },
+
+    _filterCookiesForDomain: function(allCookies)
+    {
+        this._cookies = [];
+        var resourceURLsForDocumentURL = [];
+        this._totalSize = 0;
+
+        for (var id in WebInspector.resources) {
+            var resource = WebInspector.resources[id];
+            var match = resource.documentURL.match(WebInspector.URLRegExp);
+            if (match && match[2] === this._cookieDomain)
+                resourceURLsForDocumentURL.push(resource.url);
+        }
+
+        for (var i = 0; i < allCookies.length; ++i) {
+            var pushed = false;
+            var size = allCookies[i].size;
+            for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {
+                var resourceURL = resourceURLsForDocumentURL[j];
+                if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {
+                    this._totalSize += size;
+                    if (!pushed) {
+                        pushed = true;
+                        this._cookies.push(allCookies[i]);
+                    }
+                }
+            }
+        }
+    },
+
+    _createDataGrid: function()
+    {
+        var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };
+        columns[0].title = WebInspector.UIString("Name");
+        columns[0].sortable = true;
+        columns[1].title = WebInspector.UIString("Value");
+        columns[1].sortable = true;
+        columns[2].title = WebInspector.UIString("Domain");
+        columns[2].sortable = true;
+        columns[3].title = WebInspector.UIString("Path");
+        columns[3].sortable = true;
+        columns[4].title = WebInspector.UIString("Expires");
+        columns[4].sortable = true;
+        columns[5].title = WebInspector.UIString("Size");
+        columns[5].aligned = "right";
+        columns[5].sortable = true;
+        columns[6].title = WebInspector.UIString("HTTP");
+        columns[6].aligned = "centered";
+        columns[6].sortable = true;
+        columns[7].title = WebInspector.UIString("Secure");
+        columns[7].aligned = "centered";
+        columns[7].sortable = true;
+
+        this._dataGrid = new WebInspector.DataGrid(columns, null, this._deleteCookieCallback.bind(this));
+        this._dataGrid.addEventListener("sorting changed", this._populateDataGrid, this);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.updateWidths();
+    },
+
+    _populateDataGrid: function()
+    {
+        var selectedCookie = this._dataGrid.selectedNode ? this._dataGrid.selectedNode.cookie : null;
+        var sortDirection = this._dataGrid.sortOrder === "ascending" ? 1 : -1;
+
+        function localeCompare(field, cookie1, cookie2)
+        {
+            return sortDirection * (cookie1[field] + "").localeCompare(cookie2[field] + "")
+        }
+
+        function numberCompare(field, cookie1, cookie2)
+        {
+            return sortDirection * (cookie1[field] - cookie2[field]);
+        }
+
+        function expiresCompare(cookie1, cookie2)
+        {
+            if (cookie1.session !== cookie2.session)
+                return sortDirection * (cookie1.session ? 1 : -1);
+
+            if (cookie1.session)
+                return 0;
+
+            return sortDirection * (cookie1.expires - cookie2.expires);
+        }
+
+        var comparator;
+        switch (parseInt(this._dataGrid.sortColumnIdentifier)) {
+            case 0: comparator = localeCompare.bind(this, "name"); break;
+            case 1: comparator = localeCompare.bind(this, "value"); break;
+            case 2: comparator = localeCompare.bind(this, "domain"); break;
+            case 3: comparator = localeCompare.bind(this, "path"); break;
+            case 4: comparator = expiresCompare; break;
+            case 5: comparator = numberCompare.bind(this, "size"); break;
+            case 6: comparator = localeCompare.bind(this, "httpOnly"); break;
+            case 7: comparator = localeCompare.bind(this, "secure"); break;
+            default: localeCompare.bind(this, "name");
+        }
+
+        this._cookies.sort(comparator);
+
+        this._dataGrid.removeChildren();
+        var nodeToSelect;
+        for (var i = 0; i < this._cookies.length; ++i) {
+            var data = {};
+            var cookie = this._cookies[i];
+            data[0] = cookie.name;
+            data[1] = cookie.value;
+            data[2] = cookie.domain;
+            data[3] = cookie.path;
+            data[4] = (cookie.session ? WebInspector.UIString("Session") : new Date(cookie.expires).toGMTString());
+            data[5] = Number.bytesToString(cookie.size, WebInspector.UIString);
+            data[6] = (cookie.httpOnly ? "\u2713" : ""); // Checkmark
+            data[7] = (cookie.secure ? "\u2713" : ""); // Checkmark
+
+            var node = new WebInspector.DataGridNode(data);
+            node.cookie = cookie;
+            node.selectable = true;
+            this._dataGrid.appendChild(node);
+            if (cookie === selectedCookie)
+                nodeToSelect = node;
+        }
+        if (nodeToSelect)
+            nodeToSelect.selected = true;
+        else
+            this._dataGrid.children[0].selected = true;
+    },
+
+    _createSimpleDataGrid: function()
+    {
+        var columns = {};
+        columns[0] = {};
+        columns[1] = {};
+        columns[0].title = WebInspector.UIString("Name");
+        columns[1].title = WebInspector.UIString("Value");
+
+        this._dataGrid = new WebInspector.DataGrid(columns);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.updateWidths();
+    },
+
+    _populateSimpleDataGrid: function()
+    {
+        var cookies = this._cookies;
+        this._dataGrid.removeChildren();
+        var addedCookies = {};
+        for (var i = 0; i < cookies.length; ++i) {
+            if (addedCookies[cookies[i].name])
+                continue;
+            addedCookies[cookies[i].name] = true;
+            var data = {};
+            data[0] = cookies[i].name;
+            data[1] = cookies[i].value;
+
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = true;
+            this._dataGrid.appendChild(node);
+        }
+        this._dataGrid.children[0].selected = true;
+    },
+
+    resize: function()
+    {
+        if (this._dataGrid)
+            this._dataGrid.updateWidths();
+    },
+
+    _deleteButtonClicked: function(event)
+    {
+        if (!this._dataGrid || !this._dataGrid.selectedNode)
+            return;
+
+        this._deleteCookieCallback(this._dataGrid.selectedNode);
+    },
+
+    _deleteCookieCallback: function(node)
+    {
+        var cookie = node.cookie;
+        InspectorBackend.deleteCookie(cookie.name, this._cookieDomain);
+        this._update();
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this._update();
+    }
+}
+
+WebInspector.CookieItemsView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* Script.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
+{
+    this.sourceID = sourceID;
+    this.sourceURL = sourceURL;
+    this.source = source;
+    this.startingLine = startingLine;
+    this.errorLine = errorLine;
+    this.errorMessage = errorMessage;
+
+    // if no URL, look for "//@ sourceURL=" decorator
+    // note that this sourceURL comment decorator is behavior that FireBug added
+    // in it's 1.1 release as noted in the release notes:
+    // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
+    if (!sourceURL) {
+        // use of [ \t] rather than \s is to prevent \n from matching
+        var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
+        var match = pattern.exec(source);
+
+        if (match)
+            this.sourceURL = match[1];
+    }
+}
+
+WebInspector.Script.prototype = {
+    get linesCount()
+    {
+        if (!this.source)
+            return 0;
+        this._linesCount = 0;
+        var lastIndex = this.source.indexOf("\n");
+        while (lastIndex !== -1) {
+            lastIndex = this.source.indexOf("\n", lastIndex + 1)
+            this._linesCount++;
+        }
+    }
+}
+
+/* Breakpoint.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Breakpoint = function(url, line, sourceID, condition)
+{
+    this.url = url;
+    this.line = line;
+    this.sourceID = sourceID;
+    this._enabled = true;
+    this._sourceText = "";
+    this._condition = condition || "";
+}
+
+WebInspector.Breakpoint.prototype = {
+    get enabled()
+    {
+        return this._enabled;
+    },
+
+    set enabled(x)
+    {
+        if (this._enabled === x)
+            return;
+
+        this._enabled = x;
+
+        if (this._enabled)
+            this.dispatchEventToListeners("enabled");
+        else
+            this.dispatchEventToListeners("disabled");
+    },
+
+    get sourceText()
+    {
+        return this._sourceText;
+    },
+
+    set sourceText(text)
+    {
+        this._sourceText = text;
+        this.dispatchEventToListeners("text-changed");
+    },
+
+    get label()
+    {
+        var displayName = (this.url ? WebInspector.displayNameForURL(this.url) : WebInspector.UIString("(program)"));
+        return displayName + ":" + this.line;
+    },
+
+    get id()
+    {
+        return this.sourceID + ":" + this.line;
+    },
+
+    get condition()
+    {
+        return this._condition;
+    },
+
+    set condition(c)
+    {
+        c = c || "";
+        if (this._condition === c)
+            return;
+
+        this._condition = c;
+        this.dispatchEventToListeners("condition-changed");
+
+        if (this.enabled)
+            InspectorBackend.setBreakpoint(this.sourceID, this.line, this.enabled, this.condition);
+    }
+}
+
+WebInspector.Breakpoint.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* SidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SidebarPane = function(title)
+{
+    this.element = document.createElement("div");
+    this.element.className = "pane";
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+    this.titleElement.tabIndex = 0;
+    this.titleElement.addEventListener("click", this.toggleExpanded.bind(this), false);
+    this.titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
+
+    this.bodyElement = document.createElement("div");
+    this.bodyElement.className = "body";
+
+    this.element.appendChild(this.titleElement);
+    this.element.appendChild(this.bodyElement);
+
+    this.title = title;
+    this.growbarVisible = false;
+    this.expanded = false;
+}
+
+WebInspector.SidebarPane.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.titleElement.textContent = x;
+    },
+
+    get growbarVisible()
+    {
+        return this._growbarVisible;
+    },
+
+    set growbarVisible(x)
+    {
+        if (this._growbarVisible === x)
+            return;
+
+        this._growbarVisible = x;
+
+        if (x && !this._growbarElement) {
+            this._growbarElement = document.createElement("div");
+            this._growbarElement.className = "growbar";
+            this.element.appendChild(this._growbarElement);
+        } else if (!x && this._growbarElement) {
+            if (this._growbarElement.parentNode)
+                this._growbarElement.parentNode(this._growbarElement);
+            delete this._growbarElement;
+        }
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    expand: function()
+    {
+        if (this._expanded)
+            return;
+        this._expanded = true;
+        this.element.addStyleClass("expanded");
+        if (this.onexpand)
+            this.onexpand(this);
+    },
+
+    collapse: function()
+    {
+        if (!this._expanded)
+            return;
+        this._expanded = false;
+        this.element.removeStyleClass("expanded");
+        if (this.oncollapse)
+            this.oncollapse(this);
+    },
+
+    toggleExpanded: function()
+    {
+        this.expanded = !this.expanded;
+    },
+
+    _onTitleKeyDown: function(event)
+    {
+        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Space)
+            this.toggleExpanded();
+    }
+}
+
+WebInspector.SidebarPane.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ElementsTreeOutline.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <[email protected]>
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ElementsTreeOutline = function() {
+    this.element = document.createElement("ol");
+    this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);
+    this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);
+    this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);
+
+    TreeOutline.call(this, this.element);
+
+    this.includeRootDOMNode = true;
+    this.selectEnabled = false;
+    this.showInElementsPanelEnabled = false;
+    this.rootDOMNode = null;
+    this.focusedDOMNode = null;
+
+    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);
+    this.element.addEventListener("keydown", this._keyDown.bind(this), true);
+}
+
+WebInspector.ElementsTreeOutline.prototype = {
+    get rootDOMNode()
+    {
+        return this._rootDOMNode;
+    },
+
+    set rootDOMNode(x)
+    {
+        if (this._rootDOMNode === x)
+            return;
+
+        this._rootDOMNode = x;
+
+        this._isXMLMimeType = !!(WebInspector.mainResource && WebInspector.mainResource.mimeType && WebInspector.mainResource.mimeType.match(/x(?:ht)?ml/i));
+
+        this.update();
+    },
+
+    get isXMLMimeType()
+    {
+        return this._isXMLMimeType;
+    },
+
+    get focusedDOMNode()
+    {
+        return this._focusedDOMNode;
+    },
+
+    set focusedDOMNode(x)
+    {
+        if (this._focusedDOMNode === x) {
+            this.revealAndSelectNode(x);
+            return;
+        }
+
+        this._focusedDOMNode = x;
+
+        this.revealAndSelectNode(x);
+
+        // The revealAndSelectNode() method might find a different element if there is inlined text,
+        // and the select() call would change the focusedDOMNode and reenter this setter. So to
+        // avoid calling focusedNodeChanged() twice, first check if _focusedDOMNode is the same
+        // node as the one passed in.
+        if (this._focusedDOMNode === x) {
+            this.focusedNodeChanged();
+
+            if (x && !this.suppressSelectHighlight) {
+                InspectorBackend.highlightDOMNode(x.id);
+
+                if ("_restorePreviousHighlightNodeTimeout" in this)
+                    clearTimeout(this._restorePreviousHighlightNodeTimeout);
+
+                function restoreHighlightToHoveredNode()
+                {
+                    var hoveredNode = WebInspector.hoveredDOMNode;
+                    if (hoveredNode)
+                        InspectorBackend.highlightDOMNode(hoveredNode.id);
+                    else
+                        InspectorBackend.hideDOMNodeHighlight();
+                }
+
+                this._restorePreviousHighlightNodeTimeout = setTimeout(restoreHighlightToHoveredNode, 2000);
+            }
+        }
+    },
+
+    update: function()
+    {
+        var selectedNode = this.selectedTreeElement ? this.selectedTreeElement.representedObject : null;
+
+        this.removeChildren();
+
+        if (!this.rootDOMNode)
+            return;
+
+        var treeElement;
+        if (this.includeRootDOMNode) {
+            treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);
+            treeElement.selectable = this.selectEnabled;
+            this.appendChild(treeElement);
+        } else {
+            // FIXME: this could use findTreeElement to reuse a tree element if it already exists
+            var node = this.rootDOMNode.firstChild;
+            while (node) {
+                treeElement = new WebInspector.ElementsTreeElement(node);
+                treeElement.selectable = this.selectEnabled;
+                this.appendChild(treeElement);
+                node = node.nextSibling;
+            }
+        }
+
+        if (selectedNode)
+            this.revealAndSelectNode(selectedNode);
+    },
+
+    updateSelection: function()
+    {
+        if (!this.selectedTreeElement)
+            return;
+        var element = this.treeOutline.selectedTreeElement;
+        element.updateSelection();
+    },
+
+    focusedNodeChanged: function(forceUpdate) {},
+
+    findTreeElement: function(node)
+    {
+        var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestorNode, parentNode);
+        if (!treeElement && node.nodeType === Node.TEXT_NODE) {
+            // The text node might have been inlined if it was short, so try to find the parent element.
+            treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestorNode, parentNode);
+        }
+
+        return treeElement;
+    },
+
+    createTreeElementFor: function(node)
+    {
+        var treeElement = this.findTreeElement(node);
+        if (treeElement)
+            return treeElement;
+        if (!node.parentNode)
+            return null;
+
+        var treeElement = this.createTreeElementFor(node.parentNode);
+        if (treeElement && treeElement.showChild(node.index))
+            return treeElement.children[node.index];
+
+        return null;
+    },
+
+    revealAndSelectNode: function(node)
+    {
+        if (!node)
+            return;
+
+        var treeElement = this.createTreeElementFor(node);
+        if (!treeElement)
+            return;
+
+        treeElement.reveal();
+        treeElement.select();
+    },
+
+    _treeElementFromEvent: function(event)
+    {
+        var root = this.element;
+
+        // We choose this X coordinate based on the knowledge that our list
+        // items extend nearly to the right edge of the outer <ol>.
+        var x = root.totalOffsetLeft + root.offsetWidth - 20;
+
+        var y = event.pageY;
+
+        // Our list items have 1-pixel cracks between them vertically. We avoid
+        // the cracks by checking slightly above and slightly below the mouse
+        // and seeing if we hit the same element each time.
+        var elementUnderMouse = this.treeElementFromPoint(x, y);
+        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);
+        var element;
+        if (elementUnderMouse === elementAboveMouse)
+            element = elementUnderMouse;
+        else
+            element = this.treeElementFromPoint(x, y + 2);
+
+        return element;
+    },
+    
+    _keyDown: function(event)
+    {
+        if (event.target !== this.treeOutline.element)
+            return;
+
+        var selectedElement = this.selectedTreeElement;
+        if (!selectedElement)
+            return;
+
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Backspace ||
+                event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Delete) {
+            selectedElement.remove();
+            event.preventDefault();
+            event.stopPropagation();
+            return;
+        }
+
+        // On Enter or Return start editing the first attribute
+        // or create a new attribute on the selected element.
+        if (isEnterKey(event)) {
+            if (this._editing)
+                return;
+
+            selectedElement._startEditing();
+
+            // prevent a newline from being immediately inserted
+            event.preventDefault();
+            event.stopPropagation();
+            return;
+        }
+    },
+
+    _onmousedown: function(event)
+    {
+        var element = this._treeElementFromEvent(event);
+
+        if (!element || element.isEventWithinDisclosureTriangle(event))
+            return;
+
+        element.select();
+    },
+
+    _onmousemove: function(event)
+    {
+        var element = this._treeElementFromEvent(event);
+        if (element && this._previousHoveredElement === element)
+            return;
+
+        if (this._previousHoveredElement) {
+            this._previousHoveredElement.hovered = false;
+            delete this._previousHoveredElement;
+        }
+
+        if (element && !element.elementCloseTag) {
+            element.hovered = true;
+            this._previousHoveredElement = element;
+        }
+
+        WebInspector.hoveredDOMNode = (element && !element.elementCloseTag ? element.representedObject : null);
+    },
+
+    _onmouseout: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.element))
+            return;
+
+        if (this._previousHoveredElement) {
+            this._previousHoveredElement.hovered = false;
+            delete this._previousHoveredElement;
+        }
+
+        WebInspector.hoveredDOMNode = null;
+    },
+
+    _contextMenuEventFired: function(event)
+    {
+        var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");
+        if (!listItem || !listItem.treeElement)
+            return;
+
+        var contextMenu = new WebInspector.ContextMenu();
+
+        var tag = event.target.enclosingNodeOrSelfWithClass("webkit-html-tag");
+        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
+        if (tag && listItem.treeElement._populateTagContextMenu)
+            listItem.treeElement._populateTagContextMenu(contextMenu, event);
+        else if (textNode && listItem.treeElement._populateTextContextMenu)
+            listItem.treeElement._populateTextContextMenu(contextMenu, textNode);
+        contextMenu.show(event);
+    }
+}
+
+WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;
+
+WebInspector.ElementsTreeElement = function(node)
+{
+    var hasChildrenOverride = node.hasChildNodes() && !this._showInlineText(node);
+
+    // The title will be updated in onattach.
+    TreeElement.call(this, "", node, hasChildrenOverride);
+
+    if (this.representedObject.nodeType == Node.ELEMENT_NODE)
+        this._canAddAttributes = true;
+    this._searchQuery = null;
+    this._expandedChildrenLimit = WebInspector.ElementsTreeElement.InitialChildrenLimit;
+}
+
+WebInspector.ElementsTreeElement.InitialChildrenLimit = 500;
+
+// A union of HTML4 and HTML5-Draft elements that explicitly
+// or implicitly (for HTML5) forbid the closing tag.
+// FIXME: Revise once HTML5 Final is published.
+WebInspector.ElementsTreeElement.ForbiddenClosingTagElements = [
+    "area", "base", "basefont", "br", "canvas", "col", "command", "embed", "frame",
+    "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source"
+].keySet();
+
+WebInspector.ElementsTreeElement.prototype = {
+    highlightSearchResults: function(searchQuery)
+    {
+        if (this._searchQuery === searchQuery)
+            return;
+
+        this._searchQuery = searchQuery;
+        this.updateTitle();
+    },
+
+    get hovered()
+    {
+        return this._hovered;
+    },
+
+    set hovered(x)
+    {
+        if (this._hovered === x)
+            return;
+
+        this._hovered = x;
+
+        if (this.listItemElement) {
+            if (x) {
+                this.updateSelection();
+                this.listItemElement.addStyleClass("hovered");
+            } else {
+                this.listItemElement.removeStyleClass("hovered");
+            }
+        }
+    },
+
+    get expandedChildrenLimit()
+    {
+        return this._expandedChildrenLimit;
+    },
+
+    set expandedChildrenLimit(x)
+    {
+        if (this._expandedChildrenLimit === x)
+            return;
+
+        this._expandedChildrenLimit = x;
+        if (this.treeOutline && !this._updateChildrenInProgress)
+            this._updateChildren(true);
+    },
+
+    get expandedChildCount()
+    {
+        var count = this.children.length;
+        if (count && this.children[count - 1].elementCloseTag)
+            count--;
+        if (count && this.children[count - 1].expandAllButton)
+            count--;
+        return count;
+    },
+
+    showChild: function(index)
+    {
+        if (index >= this.expandedChildrenLimit) {
+            this._expandedChildrenLimit = index + 1;
+            this._updateChildren(true);
+        }
+
+        // Whether index-th child is visible in the children tree
+        return this.expandedChildCount > index;
+    },
+
+    createTooltipForImageNode: function(node, callback)
+    {
+        function createTooltipThenCallback(properties)
+        {
+            if (!properties) {
+                callback();
+                return;
+            }
+
+            var tooltipText = null;
+            if (properties.offsetHeight === properties.naturalHeight && properties.offsetWidth === properties.naturalWidth)
+                tooltipText = WebInspector.UIString("%d × %d pixels", properties.offsetWidth, properties.offsetHeight);
+            else
+                tooltipText = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);
+            callback(tooltipText);
+        }
+        var objectProxy = new WebInspector.ObjectProxy(node.injectedScriptId, node.id);
+        WebInspector.ObjectProxy.getPropertiesAsync(objectProxy, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], createTooltipThenCallback);
+    },
+
+    updateSelection: function()
+    {
+        var listItemElement = this.listItemElement;
+        if (!listItemElement)
+            return;
+
+        if (document.body.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        if (!this.selectionElement) {
+            this.selectionElement = document.createElement("div");
+            this.selectionElement.className = "selection selected";
+            listItemElement.insertBefore(this.selectionElement, listItemElement.firstChild);
+        }
+
+        this.selectionElement.style.height = listItemElement.offsetHeight + "px";
+    },
+
+    onattach: function()
+    {
+        this.listItemElement.addEventListener("mousedown", this.onmousedown.bind(this), false);
+
+        if (this._hovered) {
+            this.updateSelection();
+            this.listItemElement.addStyleClass("hovered");
+        }
+
+        this.updateTitle();
+
+        this._preventFollowingLinksOnDoubleClick();
+    },
+
+    _preventFollowingLinksOnDoubleClick: function()
+    {
+        var links = this.listItemElement.querySelectorAll("li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");
+        if (!links)
+            return;
+
+        for (var i = 0; i < links.length; ++i)
+            links[i].preventFollowOnDoubleClick = true;
+    },
+
+    onpopulate: function()
+    {
+        if (this.children.length || this._showInlineText(this.representedObject))
+            return;
+
+        this.updateChildren();
+    },
+    
+    updateChildren: function(fullRefresh)
+    {
+        WebInspector.domAgent.getChildNodesAsync(this.representedObject, this._updateChildren.bind(this, fullRefresh));
+    },
+
+    insertChildElement: function(child, index)
+    {
+        var newElement = new WebInspector.ElementsTreeElement(child);
+        newElement.selectable = this.treeOutline.selectEnabled;
+        this.insertChild(newElement, index);
+        return newElement;
+    },
+
+    moveChild: function(child, targetIndex)
+    {
+        var wasSelected = child.selected;
+        treeElement.removeChild(child);
+        treeElement.insertChild(child, targetIndex);
+        if (wasSelected)
+            existingTreeElement.select();
+    },
+
+    _updateChildren: function(fullRefresh)
+    {
+        if (this._updateChildrenInProgress)
+            return;
+
+        this._updateChildrenInProgress = true;
+        var focusedNode = this.treeOutline.focusedDOMNode;
+        var originalScrollTop;
+        if (fullRefresh) {
+            var treeOutlineContainerElement = this.treeOutline.element.parentNode;
+            originalScrollTop = treeOutlineContainerElement.scrollTop;
+            var selectedTreeElement = this.treeOutline.selectedTreeElement;
+            if (selectedTreeElement && selectedTreeElement.hasAncestor(this))
+                this.select();
+            this.removeChildren();
+        }
+
+        var treeElement = this;
+        var treeChildIndex = 0;
+        var elementToSelect;
+
+        function updateChildrenOfNode(node)
+        {
+            var treeOutline = treeElement.treeOutline;
+            var child = node.firstChild;
+            while (child) {
+                var currentTreeElement = treeElement.children[treeChildIndex];
+                if (!currentTreeElement || currentTreeElement.representedObject !== child) {
+                    // Find any existing element that is later in the children list.
+                    var existingTreeElement = null;
+                    for (var i = (treeChildIndex + 1), size = treeElement.expandedChildCount; i < size; ++i) {
+                        if (treeElement.children[i].representedObject === child) {
+                            existingTreeElement = treeElement.children[i];
+                            break;
+                        }
+                    }
+
+                    if (existingTreeElement && existingTreeElement.parent === treeElement) {
+                        // If an existing element was found and it has the same parent, just move it.
+                        treeElement.moveChild(existingTreeElement, treeChildIndex);
+                    } else {
+                        // No existing element found, insert a new element.
+                        if (treeChildIndex < treeElement.expandedChildrenLimit) {
+                            var newElement = treeElement.insertChildElement(child, treeChildIndex);
+                            if (child === focusedNode)
+                                elementToSelect = newElement;
+                            if (treeElement.expandedChildCount > treeElement.expandedChildrenLimit)
+                                treeElement.expandedChildrenLimit++;
+                        }
+                    }
+                }
+
+                child = child.nextSibling;
+                ++treeChildIndex;
+            }
+        }
+
+        // Remove any tree elements that no longer have this node (or this node's contentDocument) as their parent.
+        for (var i = (this.children.length - 1); i >= 0; --i) {
+            if ("elementCloseTag" in this.children[i])
+                continue;
+
+            var currentChild = this.children[i];
+            var currentNode = currentChild.representedObject;
+            var currentParentNode = currentNode.parentNode;
+
+            if (currentParentNode === this.representedObject)
+                continue;
+
+            var selectedTreeElement = this.treeOutline.selectedTreeElement;
+            if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild)))
+                this.select();
+
+            this.removeChildAtIndex(i);
+        }
+
+        updateChildrenOfNode(this.representedObject);
+        this.adjustCollapsedRange(false);
+
+        var lastChild = this.children[this.children.length - 1];
+        if (this.representedObject.nodeType == Node.ELEMENT_NODE && (!lastChild || !lastChild.elementCloseTag)) {
+            var title = "<span class=\"webkit-html-tag close\">&lt;/" + this.representedObject.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
+            var item = new TreeElement(title, null, false);
+            item.selectable = false;
+            item.elementCloseTag = true;
+            this.appendChild(item);
+        }
+
+        // We want to restore the original selection and tree scroll position after a full refresh, if possible.
+        if (fullRefresh && elementToSelect) {
+            elementToSelect.select();
+            if (treeOutlineContainerElement && originalScrollTop <= treeOutlineContainerElement.scrollHeight)
+                treeOutlineContainerElement.scrollTop = originalScrollTop;
+        }
+
+        delete this._updateChildrenInProgress;
+    },
+
+    adjustCollapsedRange: function()
+    {
+        // Ensure precondition: only the tree elements for node children are found in the tree
+        // (not the Expand All button or the closing tag).
+        if (this.expandAllButtonElement && this.expandAllButtonElement.__treeElement.parent)
+            this.removeChild(this.expandAllButtonElement.__treeElement);
+
+        const node = this.representedObject;
+        if (!node.children)
+            return;
+        const childNodeCount = node.children.length;
+
+        // In case some nodes from the expanded range were removed, pull some nodes from the collapsed range into the expanded range at the bottom.
+        for (var i = this.expandedChildCount, limit = Math.min(this.expandedChildrenLimit, childNodeCount); i < limit; ++i)
+            this.insertChildElement(node.children[i], i);
+
+        const expandedChildCount = this.expandedChildCount;
+        if (childNodeCount > this.expandedChildCount) {
+            var targetButtonIndex = expandedChildCount;
+            if (!this.expandAllButtonElement) {
+                var title = "<button class=\"show-all-nodes\" value=\"\" />";
+                var item = new TreeElement(title, null, false);
+                item.selectable = false;
+                item.expandAllButton = true;
+                this.insertChild(item, targetButtonIndex);
+                this.expandAllButtonElement = item.listItemElement.firstChild;
+                this.expandAllButtonElement.__treeElement = item;
+                this.expandAllButtonElement.addEventListener("click", this.handleLoadAllChildren.bind(this), false);
+            } else if (!this.expandAllButtonElement.__treeElement.parent)
+                this.insertChild(this.expandAllButtonElement.__treeElement, targetButtonIndex);
+            this.expandAllButtonElement.textContent = WebInspector.UIString("Show All Nodes (%d More)", childNodeCount - expandedChildCount);
+        } else if (this.expandAllButtonElement)
+            delete this.expandAllButtonElement;
+    },
+
+    handleLoadAllChildren: function()
+    {
+        this.expandedChildrenLimit = Math.max(this.representedObject._childNodeCount, this.expandedChildrenLimit + WebInspector.ElementsTreeElement.InitialChildrenLimit);
+    },
+
+    onexpand: function()
+    {
+        this.updateTitle();
+        this.treeOutline.updateSelection();
+    },
+
+    oncollapse: function()
+    {
+        this.updateTitle();
+        this.treeOutline.updateSelection();
+    },
+
+    onreveal: function()
+    {
+        if (this.listItemElement)
+            this.listItemElement.scrollIntoViewIfNeeded(false);
+    },
+
+    onselect: function()
+    {
+        this.treeOutline.focusedDOMNode = this.representedObject;
+        this.updateSelection();
+    },
+
+    onmousedown: function(event)
+    {
+        if (this._editing)
+            return;
+
+        if (this.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (this.treeOutline.showInElementsPanelEnabled) {    
+            WebInspector.showElementsPanel();
+            WebInspector.panels.elements.focusedDOMNode = this.representedObject;
+        }
+
+        // Prevent selecting the nearest word on double click.
+        if (event.detail >= 2)
+            event.preventDefault();
+    },
+
+    ondblclick: function(event)
+    {
+        if (this._editing)
+            return;
+
+        if (this._startEditingFromEvent(event))
+            return;
+
+        if (this.hasChildren && !this.expanded)
+            this.expand();
+    },
+
+    _insertInLastAttributePosition: function(tag, node)
+    {
+        if (tag.getElementsByClassName("webkit-html-attribute").length > 0)
+            tag.insertBefore(node, tag.lastChild);
+        else {
+            var nodeName = tag.textContent.match(/^<(.*?)>$/)[1];
+            tag.textContent = '';
+            tag.appendChild(document.createTextNode('<'+nodeName));
+            tag.appendChild(node);
+            tag.appendChild(document.createTextNode('>'));
+        }
+
+        this.updateSelection();
+    },
+
+    _startEditingFromEvent: function(event)
+    {
+        if (this.treeOutline.focusedDOMNode != this.representedObject)
+            return;
+
+        if (this.representedObject.nodeType != Node.ELEMENT_NODE && this.representedObject.nodeType != Node.TEXT_NODE)
+            return false;
+
+        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
+        if (textNode)
+            return this._startEditingTextNode(textNode);
+
+        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
+        if (attribute)
+            return this._startEditingAttribute(attribute, event.target);
+
+        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
+        if (newAttribute)
+            return this._addNewAttribute();
+
+        return false;
+    },
+
+    _populateTagContextMenu: function(contextMenu, event)
+    {
+        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
+        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
+
+        // Add attribute-related actions.
+        contextMenu.appendItem(WebInspector.UIString("Add Attribute"), this._addNewAttribute.bind(this));
+        if (attribute && !newAttribute)
+            contextMenu.appendItem(WebInspector.UIString("Edit Attribute"), this._startEditingAttribute.bind(this, attribute, event.target));
+        contextMenu.appendSeparator();
+
+        // Add node-related actions.
+        contextMenu.appendItem(WebInspector.UIString("Edit as HTML"), this._editAsHTML.bind(this));
+        contextMenu.appendItem(WebInspector.UIString("Copy as HTML"), this._copyHTML.bind(this));
+        contextMenu.appendItem(WebInspector.UIString("Delete Node"), this.remove.bind(this));
+    },
+
+    _populateTextContextMenu: function(contextMenu, textNode)
+    {
+        contextMenu.appendItem(WebInspector.UIString("Edit Text"), this._startEditingTextNode.bind(this, textNode));
+    },
+
+    _startEditing: function()
+    {
+        if (this.treeOutline.focusedDOMNode !== this.representedObject)
+            return;
+
+        var listItem = this._listItemNode;
+
+        if (this._canAddAttributes) {
+            var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];
+            if (attribute)
+                return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-value")[0]);
+
+            return this._addNewAttribute();
+        }
+
+        if (this.representedObject.nodeType === Node.TEXT_NODE) {
+            var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];
+            if (textNode)
+                return this._startEditingTextNode(textNode);
+            return;
+        }
+    },
+
+    _addNewAttribute: function()
+    {
+        var attr = document.createElement("span");
+        attr.className = "webkit-html-attribute";
+        attr.style.marginLeft = "2px"; // overrides the .editing margin rule
+        attr.style.marginRight = "2px"; // overrides the .editing margin rule
+        var name = document.createElement("span");
+        name.className = "webkit-html-attribute-name new-attribute";
+        name.textContent = " ";
+        var value = document.createElement("span");
+        value.className = "webkit-html-attribute-value";
+        attr.appendChild(name);
+        attr.appendChild(value);
+
+        var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];
+        this._insertInLastAttributePosition(tag, attr);
+        return this._startEditingAttribute(attr, attr);
+    },
+
+    _triggerEditAttribute: function(attributeName)
+    {
+        var attributeElements = this.listItemElement.getElementsByClassName("webkit-html-attribute-name");
+        for (var i = 0, len = attributeElements.length; i < len; ++i) {
+            if (attributeElements[i].textContent === attributeName) {
+                for (var elem = attributeElements[i].nextSibling; elem; elem = elem.nextSibling) {
+                    if (elem.nodeType !== Node.ELEMENT_NODE)
+                        continue;
+
+                    if (elem.hasStyleClass("webkit-html-attribute-value"))
+                        return this._startEditingAttribute(attributeElements[i].parentNode, elem);
+                }
+            }
+        }
+    },
+
+    _startEditingAttribute: function(attribute, elementForSelection)
+    {
+        if (WebInspector.isBeingEdited(attribute))
+            return true;
+
+        var attributeNameElement = attribute.getElementsByClassName("webkit-html-attribute-name")[0];
+        if (!attributeNameElement)
+            return false;
+
+        var attributeName = attributeNameElement.innerText;
+
+        function removeZeroWidthSpaceRecursive(node)
+        {
+            if (node.nodeType === Node.TEXT_NODE) {
+                node.nodeValue = node.nodeValue.replace(/\u200B/g, "");
+                return;
+            }
+
+            if (node.nodeType !== Node.ELEMENT_NODE)
+                return;
+
+            for (var child = node.firstChild; child; child = child.nextSibling)
+                removeZeroWidthSpaceRecursive(child);
+        }
+
+        // Remove zero-width spaces that were added by nodeTitleInfo.
+        removeZeroWidthSpaceRecursive(attribute);
+
+        this._editing = true;
+
+        WebInspector.startEditing(attribute, this._attributeEditingCommitted.bind(this), this._editingCancelled.bind(this), attributeName);
+        window.getSelection().setBaseAndExtent(elementForSelection, 0, elementForSelection, 1);
+
+        return true;
+    },
+
+    _startEditingTextNode: function(textNode)
+    {
+        if (WebInspector.isBeingEdited(textNode))
+            return true;
+
+        this._editing = true;
+
+        WebInspector.startEditing(textNode, this._textNodeEditingCommitted.bind(this), this._editingCancelled.bind(this));
+        window.getSelection().setBaseAndExtent(textNode, 0, textNode, 1);
+
+        return true;
+    },
+
+    _startEditingAsHTML: function(commitCallback, initialValue)
+    {
+        if (this._htmlEditElement && WebInspector.isBeingEdited(this._htmlEditElement))
+            return true;
+
+        this._editing = true;
+
+        this._htmlEditElement = document.createElement("div");
+        this._htmlEditElement.className = "source-code elements-tree-editor";
+        this._htmlEditElement.textContent = initialValue;
+
+        // Hide header items.
+        var child = this.listItemElement.firstChild;
+        while (child) {
+            child.style.display = "none";
+            child = child.nextSibling;
+        }
+        // Hide children item.
+        if (this._childrenListNode)
+            this._childrenListNode.style.display = "none";
+        // Append editor.
+        this.listItemElement.appendChild(this._htmlEditElement);
+
+        this.updateSelection();
+
+        function commit()
+        {
+            commitCallback(this._htmlEditElement.textContent);
+            dispose.call(this);
+        }
+
+        function dispose()
+        {
+            delete this._editing;
+
+            // Remove editor.
+            this.listItemElement.removeChild(this._htmlEditElement);
+            delete this._htmlEditElement;
+            // Unhide children item.
+            if (this._childrenListNode)
+                this._childrenListNode.style.removeProperty("display");
+            // Unhide header items.
+            var child = this.listItemElement.firstChild;
+            while (child) {
+                child.style.removeProperty("display");
+                child = child.nextSibling;
+            }
+
+            this.updateSelection();
+        }
+
+        WebInspector.startEditing(this._htmlEditElement, commit.bind(this), dispose.bind(this), null, true);
+    },
+
+    _attributeEditingCommitted: function(element, newText, oldText, attributeName, moveDirection)
+    {
+        delete this._editing;
+
+        // Before we do anything, determine where we should move
+        // next based on the current element's settings
+        var moveToAttribute;
+        var newAttribute;
+        if (moveDirection) {
+            var found = false;
+            var attributes = this.representedObject.attributes;
+            for (var i = 0, len = attributes.length; i < len; ++i) {
+                if (attributes[i].name === attributeName) {
+                    found = true;
+                    if (moveDirection === "backward" && i > 0)
+                        moveToAttribute = attributes[i - 1].name;
+                    else if (moveDirection === "forward" && i < attributes.length - 1)
+                        moveToAttribute = attributes[i + 1].name;
+                    else if (moveDirection === "forward" && i === attributes.length - 1)
+                        newAttribute = true;
+                }
+            }
+
+            if (!found && moveDirection === "backward" && attributes.length > 0)
+                moveToAttribute = attributes[attributes.length - 1].name;
+            else if (!found && moveDirection === "forward" && !/^\s*$/.test(newText))
+                newAttribute = true;
+        }
+
+        function moveToNextAttributeIfNeeded() {
+            if (moveToAttribute)
+                this._triggerEditAttribute(moveToAttribute);
+            else if (newAttribute)
+                this._addNewAttribute(this.listItemElement);
+        }
+
+        var parseContainerElement = document.createElement("span");
+        parseContainerElement.innerHTML = "<span " + newText + "></span>";
+        var parseElement = parseContainerElement.firstChild;
+
+        if (!parseElement) {
+            this._editingCancelled(element, attributeName);
+            moveToNextAttributeIfNeeded.call(this);
+            return;
+        }
+
+        if (!parseElement.hasAttributes()) {
+            this.representedObject.removeAttribute(attributeName);
+            moveToNextAttributeIfNeeded.call(this);
+            return;
+        }
+
+        var foundOriginalAttribute = false;
+        for (var i = 0; i < parseElement.attributes.length; ++i) {
+            var attr = parseElement.attributes[i];
+            foundOriginalAttribute = foundOriginalAttribute || attr.name === attributeName;
+            try {
+                this.representedObject.setAttribute(attr.name, attr.value);
+            } catch(e) {} // ignore invalid attribute (innerHTML doesn't throw errors, but this can)
+        }
+
+        if (!foundOriginalAttribute)
+            this.representedObject.removeAttribute(attributeName);
+
+        this.treeOutline.focusedNodeChanged(true);
+
+        moveToNextAttributeIfNeeded.call(this);
+    },
+
+    _textNodeEditingCommitted: function(element, newText)
+    {
+        delete this._editing;
+
+        var textNode;
+        if (this.representedObject.nodeType == Node.ELEMENT_NODE) {
+            // We only show text nodes inline in elements if the element only
+            // has a single child, and that child is a text node.
+            textNode = this.representedObject.firstChild;
+        } else if (this.representedObject.nodeType == Node.TEXT_NODE)
+            textNode = this.representedObject;
+
+        textNode.nodeValue = newText;
+
+        // Need to restore attributes / node structure.
+        this.updateTitle();
+    },
+
+    _editingCancelled: function(element, context)
+    {
+        delete this._editing;
+
+        // Need to restore attributes structure.
+        this.updateTitle();
+    },
+
+    updateTitle: function()
+    {
+        // If we are editing, return early to prevent canceling the edit.
+        // After editing is committed updateTitle will be called.
+        if (this._editing)
+            return;
+
+        var self = this;
+        function callback(tooltipText)
+        {
+            var title = self._nodeTitleInfo(WebInspector.linkifyURL, tooltipText).title;
+            self.title = "<span class=\"highlight\">" + title + "</span>";
+            delete self.selectionElement;
+            self.updateSelection();
+            self._preventFollowingLinksOnDoubleClick();
+            self._highlightSearchResults();
+        };
+
+        // TODO: Replace with InjectedScriptAccess.getBasicProperties(obj, [names]).
+        if (this.representedObject.nodeName.toLowerCase() !== "img")
+            callback();
+        else
+            this.createTooltipForImageNode(this.representedObject, callback);
+    },
+
+    _rewriteAttrHref: function(node, hrefValue)
+    {
+        if (!hrefValue || hrefValue.indexOf("://") > 0)
+            return hrefValue;
+
+        for (var frameOwnerCandidate = node; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {
+            if (frameOwnerCandidate.documentURL) {
+                var result = WebInspector.completeURL(frameOwnerCandidate.documentURL, hrefValue);
+                if (result)
+                    return result;
+                break;
+            }
+        }
+
+        // documentURL not found or has bad value
+        for (var url in WebInspector.resourceURLMap) {
+            var match = url.match(WebInspector.URLRegExp);
+            if (match && match[4] === hrefValue)
+                return url;
+        }
+        return hrefValue;
+    },
+
+    _nodeTitleInfo: function(linkify, tooltipText)
+    {
+        var node = this.representedObject;
+        var info = {title: "", hasChildren: this.hasChildren};
+        
+        switch (node.nodeType) {
+            case Node.DOCUMENT_NODE:
+                info.title = "Document";
+                break;
+                
+            case Node.DOCUMENT_FRAGMENT_NODE:
+                info.title = "Document Fragment";
+                break;
+
+            case Node.ELEMENT_NODE:
+                var tagName = node.nodeName.toLowerCase().escapeHTML();
+                info.title = "<span class=\"webkit-html-tag\">&lt;" + tagName;
+                
+                if (node.hasAttributes()) {
+                    for (var i = 0; i < node.attributes.length; ++i) {
+                        var attr = node.attributes[i];
+                        info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
+                        
+                        var value = attr.value;
+                        if (linkify && (attr.name === "src" || attr.name === "href")) {
+                            var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
+                            info.title += linkify(this._rewriteAttrHref(node, attr.value), value, "webkit-html-attribute-value", node.nodeName.toLowerCase() == "a", tooltipText);
+                        } else {
+                            var value = value.escapeHTML();
+                            value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
+                            info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
+                        }
+                        info.title += "\"</span>";
+                    }
+                }
+                info.title += "&gt;</span>&#8203;";
+                
+                const closingTagHTML = "<span class=\"webkit-html-tag\">&lt;/" + tagName + "&gt;</span>&#8203;";
+                var textChild = onlyTextChild.call(node);
+                var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
+
+                if (!this.expanded && (!showInlineText && (this.treeOutline.isXMLMimeType || !WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName]))) {
+                    if (this.hasChildren)
+                        info.title += "<span class=\"webkit-html-text-node\">&#8230;</span>&#8203;";
+                    info.title += closingTagHTML;
+                }
+
+                // If this element only has a single child that is a text node,
+                // just show that text and the closing tag inline rather than
+                // create a subtree for them
+                if (showInlineText) {
+                    info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;" + closingTagHTML;
+                    info.hasChildren = false;
+                }
+                break;
+                
+            case Node.TEXT_NODE:
+                if (isNodeWhitespace.call(node))
+                    info.title = "(whitespace)";
+                else {
+                    if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "script") {
+                        var newNode = document.createElement("span");
+                        newNode.textContent = node.textContent;
+
+                        var javascriptSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/javascript");
+                        javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);
+                        
+                        info.title = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+                    } else if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "style") {
+                        var newNode = document.createElement("span");
+                        newNode.textContent = node.textContent;
+                        
+                        var cssSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/css");
+                        cssSyntaxHighlighter.syntaxHighlightNode(newNode);
+                        
+                        info.title = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+                    } else {
+                        info.title = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\""; 
+                    }
+                } 
+                break;
+                
+            case Node.COMMENT_NODE:
+                info.title = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";
+                break;
+                
+            case Node.DOCUMENT_TYPE_NODE:
+                info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;
+                if (node.publicId) {
+                    info.title += " PUBLIC \"" + node.publicId + "\"";
+                    if (node.systemId)
+                        info.title += " \"" + node.systemId + "\"";
+                } else if (node.systemId)
+                    info.title += " SYSTEM \"" + node.systemId + "\"";
+                if (node.internalSubset)
+                    info.title += " [" + node.internalSubset + "]";
+                info.title += "&gt;</span>";
+                break;
+            default:
+                info.title = node.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
+        }
+        
+        return info;
+    },
+
+    _showInlineText: function(node)
+    {
+        if (node.nodeType === Node.ELEMENT_NODE) {
+            var textChild = onlyTextChild.call(node);
+            if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)
+                return true;
+        }
+        return false;
+    },
+    
+    remove: function()
+    {
+        var parentElement = this.parent;
+        if (!parentElement)
+            return;
+
+        var self = this;
+        function removeNodeCallback(removedNodeId)
+        {
+            // -1 is an error code, which means removing the node from the DOM failed,
+            // so we shouldn't remove it from the tree.
+            if (removedNodeId === -1)
+                return;
+
+            parentElement.removeChild(self);
+            parentElement.adjustCollapsedRange(true);
+        }
+
+        var callId = WebInspector.Callback.wrap(removeNodeCallback);
+        InspectorBackend.removeNode(callId, this.representedObject.id);
+    },
+
+    _editAsHTML: function()
+    {
+        var treeOutline = this.treeOutline;
+        var node = this.representedObject;
+        var wasExpanded = this.expanded;
+
+        function selectNode(nodeId)
+        {
+            if (!nodeId)
+                return;
+
+            // Select it and expand if necessary. We force tree update so that it processes dom events and is up to date.
+            WebInspector.panels.elements.updateModifiedNodes();
+
+            WebInspector.updateFocusedNode(nodeId);
+            if (wasExpanded) {
+                var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));
+                if (newTreeItem)
+                    newTreeItem.expand();
+            }
+        }
+
+        function commitChange(value)
+        {
+            InjectedScriptAccess.get(node.injectedScriptId).setOuterHTML(node.id, value, wasExpanded, selectNode.bind(this));
+        }
+
+        InjectedScriptAccess.get(node.injectedScriptId).getNodePropertyValue(node.id, "outerHTML", this._startEditingAsHTML.bind(this, commitChange));
+    },
+
+    _copyHTML: function()
+    {
+        InspectorBackend.copyNode(this.representedObject.id);
+    },
+
+    _highlightSearchResults: function()
+    {
+        if (!this._searchQuery)
+            return;
+        var text = this.listItemElement.textContent;
+        var regexObject = createSearchRegex(this._searchQuery);
+
+        var offset = 0;
+        var match = regexObject.exec(text);
+        while (match) {
+            highlightSearchResult(this.listItemElement, offset + match.index, match[0].length);
+            offset += match.index + 1;
+            text = text.substring(match.index + 1);
+            match = regexObject.exec(text);
+        }
+    }
+}
+
+WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.didRemoveNode = WebInspector.Callback.processCallback;
+
+/* SidebarTreeElement.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)
+{
+    TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);
+}
+
+WebInspector.SidebarSectionTreeElement.prototype = {
+    selectable: false,
+
+    get smallChildren()
+    {
+        return this._smallChildren;
+    },
+
+    set smallChildren(x)
+    {
+        if (this._smallChildren === x)
+            return;
+
+        this._smallChildren = x;
+
+        if (this._smallChildren)
+            this._childrenListNode.addStyleClass("small");
+        else
+            this._childrenListNode.removeStyleClass("small");
+    },
+
+    onattach: function()
+    {
+        this._listItemNode.addStyleClass("sidebar-tree-section");
+    },
+
+    onreveal: function()
+    {
+        if (this.listItemElement)
+            this.listItemElement.scrollIntoViewIfNeeded(false);
+    }
+}
+
+WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)
+{
+    TreeElement.call(this, "", representedObject || {}, hasChildren);
+
+    if (hasChildren) {
+        this.disclosureButton = document.createElement("button");
+        this.disclosureButton.className = "disclosure-button";
+    }
+
+    if (!this.iconElement) {
+        this.iconElement = document.createElement("img");
+        this.iconElement.className = "icon";
+    }
+
+    this.statusElement = document.createElement("div");
+    this.statusElement.className = "status";
+
+    this.titlesElement = document.createElement("div");
+    this.titlesElement.className = "titles";
+
+    this.titleElement = document.createElement("span");
+    this.titleElement.className = "title";
+    this.titlesElement.appendChild(this.titleElement);
+
+    this.subtitleElement = document.createElement("span");
+    this.subtitleElement.className = "subtitle";
+    this.titlesElement.appendChild(this.subtitleElement);
+
+    this.className = className;
+    this.mainTitle = title;
+    this.subtitle = subtitle;
+}
+
+WebInspector.SidebarTreeElement.prototype = {
+    get small()
+    {
+        return this._small;
+    },
+
+    set small(x)
+    {
+        this._small = x;
+
+        if (this._listItemNode) {
+            if (this._small)
+                this._listItemNode.addStyleClass("small");
+            else
+                this._listItemNode.removeStyleClass("small");
+        }
+    },
+
+    get mainTitle()
+    {
+        return this._mainTitle;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        this._subtitle = x;
+        this.refreshTitles();
+    },
+
+    get bubbleText()
+    {
+        return this._bubbleText;
+    },
+
+    set bubbleText(x)
+    {
+        if (!this.bubbleElement) {
+            this.bubbleElement = document.createElement("div");
+            this.bubbleElement.className = "bubble";
+            this.statusElement.appendChild(this.bubbleElement);
+        }
+
+        this._bubbleText = x;
+        this.bubbleElement.textContent = x;
+    },
+
+    refreshTitles: function()
+    {
+        var mainTitle = this.mainTitle;
+        if (this.titleElement.textContent !== mainTitle)
+            this.titleElement.textContent = mainTitle;
+
+        var subtitle = this.subtitle;
+        if (subtitle) {
+            if (this.subtitleElement.textContent !== subtitle)
+                this.subtitleElement.textContent = subtitle;
+            this.titlesElement.removeStyleClass("no-subtitle");
+        } else
+            this.titlesElement.addStyleClass("no-subtitle");
+    },
+
+    isEventWithinDisclosureTriangle: function(event)
+    {
+        return event.target === this.disclosureButton;
+    },
+
+    onattach: function()
+    {
+        this._listItemNode.addStyleClass("sidebar-tree-item");
+
+        if (this.className)
+            this._listItemNode.addStyleClass(this.className);
+
+        if (this.small)
+            this._listItemNode.addStyleClass("small");
+
+        if (this.hasChildren && this.disclosureButton)
+            this._listItemNode.appendChild(this.disclosureButton);
+
+        this._listItemNode.appendChild(this.iconElement);
+        this._listItemNode.appendChild(this.statusElement);
+        this._listItemNode.appendChild(this.titlesElement);
+    },
+
+    onreveal: function()
+    {
+        if (this._listItemNode)
+            this._listItemNode.scrollIntoViewIfNeeded(false);
+    }
+}
+
+WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* Section.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Section = function(title, subtitle)
+{
+    this.element = document.createElement("div");
+    this.element.className = "section";
+    this.element.sectionForTest = this;
+
+    this.headerElement = document.createElement("div");
+    this.headerElement.className = "header";
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+
+    this.subtitleElement = document.createElement("div");
+    this.subtitleElement.className = "subtitle";
+
+    this.headerElement.appendChild(this.subtitleElement);
+    this.headerElement.appendChild(this.titleElement);
+
+    this.headerElement.addEventListener("click", this.toggleExpanded.bind(this), false);
+    this.element.appendChild(this.headerElement);
+
+    this.title = title;
+    this.subtitle = subtitle;
+    this._expanded = false;
+}
+
+WebInspector.Section.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+
+        if (x instanceof Node) {
+            this.titleElement.removeChildren();
+            this.titleElement.appendChild(x);
+        } else
+          this.titleElement.textContent = x;
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        if (this._subtitle === x)
+            return;
+        this._subtitle = x;
+        this.subtitleElement.innerHTML = x;
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    get populated()
+    {
+        return this._populated;
+    },
+
+    set populated(x)
+    {
+        this._populated = x;
+        if (!x && this.onpopulate && this._expanded) {
+            this.onpopulate(this);
+            this._populated = true;
+        }
+    },
+
+    expand: function()
+    {
+        if (this._expanded)
+            return;
+        this._expanded = true;
+        this.element.addStyleClass("expanded");
+
+        if (!this._populated && this.onpopulate) {
+            this.onpopulate(this);
+            this._populated = true;
+        }
+    },
+
+    collapse: function()
+    {
+        if (!this._expanded)
+            return;
+        this._expanded = false;
+        this.element.removeStyleClass("expanded");
+    },
+
+    toggleExpanded: function()
+    {
+        this.expanded = !this.expanded;
+    }
+}
+
+/* PropertiesSection.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PropertiesSection = function(title, subtitle)
+{
+    WebInspector.Section.call(this, title, subtitle);
+
+    this.propertiesElement = document.createElement("ol");
+    this.propertiesElement.className = "properties source-code";
+    this.propertiesElement.tabIndex = 0;
+    this.propertiesTreeOutline = new TreeOutline(this.propertiesElement);
+    this.propertiesTreeOutline.section = this;
+
+    this.element.appendChild(this.propertiesElement);
+}
+
+WebInspector.PropertiesSection.prototype.__proto__ = WebInspector.Section.prototype;
+
+/* ObjectProxy.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ObjectProxy = function(injectedScriptId, objectId, path, description, hasChildren)
+{
+    this.objectId = objectId;
+    this.injectedScriptId = injectedScriptId;
+    this.path = path || [];
+    this.description = description;
+    this.hasChildren = hasChildren;
+}
+
+WebInspector.ObjectProxy.wrapPrimitiveValue = function(value)
+{
+    var proxy = new WebInspector.ObjectProxy();
+    proxy.type = typeof value;
+    proxy.description = value;
+    return proxy;
+}
+
+WebInspector.ObjectProxy.getPropertiesAsync = function(objectProxy, propertiesToQueryFor, callback)
+{
+    function createPropertiesMapThenCallback(propertiesPayload)
+    {
+        if (!propertiesPayload) {
+            callback();
+            return;
+        }
+
+        var result = [];
+        for (var i = 0; i < propertiesPayload.length; ++i)
+            if (propertiesToQueryFor.indexOf(propertiesPayload[i].name) !== -1)
+                result[propertiesPayload[i].name] = propertiesPayload[i].value.description;
+        callback(result);
+    };
+    InjectedScriptAccess.get(objectProxy.injectedScriptId).getProperties(objectProxy, true, false, createPropertiesMapThenCallback);
+}
+
+WebInspector.ObjectPropertyProxy = function(name, value)
+{
+    this.name = name;
+    this.value = value;
+}
+
+/* ObjectPropertiesSection.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ObjectPropertiesSection = function(object, title, subtitle, emptyPlaceholder, ignoreHasOwnProperty, extraProperties, treeElementConstructor)
+{
+    this.emptyPlaceholder = (emptyPlaceholder || WebInspector.UIString("No Properties"));
+    this.object = object;
+    this.ignoreHasOwnProperty = ignoreHasOwnProperty;
+    this.extraProperties = extraProperties;
+    this.treeElementConstructor = treeElementConstructor || WebInspector.ObjectPropertyTreeElement;
+    this.editable = true;
+
+    WebInspector.PropertiesSection.call(this, title, subtitle);
+}
+
+WebInspector.ObjectPropertiesSection.prototype = {
+    onpopulate: function()
+    {
+        this.update();
+    },
+
+    update: function()
+    {
+        var self = this;
+        var callback = function(properties) {
+            if (!properties)
+                return;
+            self.updateProperties(properties);
+        };
+        InjectedScriptAccess.get(this.object.injectedScriptId).getProperties(this.object, this.ignoreHasOwnProperty, true, callback);
+    },
+
+    updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)
+    {
+        if (!rootTreeElementConstructor)
+            rootTreeElementConstructor = this.treeElementConstructor;
+            
+        if (!rootPropertyComparer)
+            rootPropertyComparer = WebInspector.ObjectPropertiesSection.CompareProperties;
+            
+        if (this.extraProperties)
+            for (var i = 0; i < this.extraProperties.length; ++i)
+                properties.push(this.extraProperties[i]);
+                
+        properties.sort(rootPropertyComparer);
+
+        this.propertiesTreeOutline.removeChildren();
+
+        for (var i = 0; i < properties.length; ++i)
+            this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));
+
+        if (!this.propertiesTreeOutline.children.length) {
+            var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";
+            var infoElement = new TreeElement(title, null, false);
+            this.propertiesTreeOutline.appendChild(infoElement);
+        }
+        this.propertiesForTest = properties;
+    }
+}
+
+WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) 
+{
+    var a = propertyA.name;
+    var b = propertyB.name;
+    if (a === "__proto__")
+        return 1;
+    if (b === "__proto__")
+        return -1;
+
+    // if used elsewhere make sure to
+    //  - convert a and b to strings (not needed here, properties are all strings)
+    //  - check if a == b (not needed here, no two properties can be the same)
+
+    var diff = 0;
+    var chunk = /^\d+|^\D+/;
+    var chunka, chunkb, anum, bnum;
+    while (diff === 0) {
+        if (!a && b)
+            return -1;
+        if (!b && a)
+            return 1;
+        chunka = a.match(chunk)[0];
+        chunkb = b.match(chunk)[0];
+        anum = !isNaN(chunka);
+        bnum = !isNaN(chunkb);
+        if (anum && !bnum)
+            return -1;
+        if (bnum && !anum)
+            return 1;
+        if (anum && bnum) {
+            diff = chunka - chunkb;
+            if (diff === 0 && chunka.length !== chunkb.length) {
+                if (!+chunka && !+chunkb) // chunks are strings of all 0s (special case)
+                    return chunka.length - chunkb.length;
+                else
+                    return chunkb.length - chunka.length;
+            }
+        } else if (chunka !== chunkb)
+            return (chunka < chunkb) ? -1 : 1;
+        a = a.substring(chunka.length);
+        b = b.substring(chunkb.length);
+    }
+    return diff;
+}
+
+WebInspector.ObjectPropertyTreeElement = function(property)
+{
+    this.property = property;
+
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, false);
+}
+
+WebInspector.ObjectPropertyTreeElement.prototype = {
+    onpopulate: function()
+    {
+        if (this.children.length && !this.shouldRefreshChildren)
+            return;
+
+        var callback = function(properties) {
+            this.removeChildren();
+            if (!properties)
+                return;
+
+            properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);
+            for (var i = 0; i < properties.length; ++i) {
+                this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));
+            }
+        };
+        InjectedScriptAccess.get(this.property.value.injectedScriptId).getProperties(this.property.value, false, true, callback.bind(this));
+    },
+
+    ondblclick: function(event)
+    {
+        this.startEditing();
+    },
+
+    onattach: function()
+    {
+        this.update();
+    },
+
+    update: function()
+    {
+        this.nameElement = document.createElement("span");
+        this.nameElement.className = "name";
+        this.nameElement.textContent = this.property.name;
+
+        var separatorElement = document.createElement("span");
+        separatorElement.className = "separator";
+        separatorElement.textContent = ": ";
+        
+        this.valueElement = document.createElement("span");
+        this.valueElement.className = "value";
+        this.valueElement.textContent = this.property.value.description;
+        if (typeof this.property.value.propertyLength !== "undefined")
+            this.valueElement.textContent += " (" + this.property.value.propertyLength + ")";
+        if (this.property.isGetter)
+            this.valueElement.addStyleClass("dimmed");
+        if (this.property.isError)
+            this.valueElement.addStyleClass("error");
+
+        this.listItemElement.removeChildren();
+
+        this.listItemElement.appendChild(this.nameElement);
+        this.listItemElement.appendChild(separatorElement);
+        this.listItemElement.appendChild(this.valueElement);
+        this.hasChildren = this.property.value.hasChildren;
+    },
+
+    updateSiblings: function()
+    {
+        if (this.parent.root)
+            this.treeOutline.section.update();
+        else
+            this.parent.shouldRefreshChildren = true;
+    },
+
+    startEditing: function()
+    {
+        if (WebInspector.isBeingEdited(this.valueElement) || !this.treeOutline.section.editable)
+            return;
+
+        var context = { expanded: this.expanded };
+
+        // Lie about our children to prevent expanding on double click and to collapse subproperties.
+        this.hasChildren = false;
+
+        this.listItemElement.addStyleClass("editing-sub-part");
+
+        WebInspector.startEditing(this.valueElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingEnded: function(context)
+    {
+        this.listItemElement.scrollLeft = 0;
+        this.listItemElement.removeStyleClass("editing-sub-part");
+        if (context.expanded)
+            this.expand();
+    },
+
+    editingCancelled: function(element, context)
+    {
+        this.update();
+        this.editingEnded(context);
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context)
+    {
+        if (userInput === previousContent)
+            return this.editingCancelled(element, context); // nothing changed, so cancel
+
+        this.applyExpression(userInput, true);
+
+        this.editingEnded(context);
+    },
+
+    applyExpression: function(expression, updateInterface)
+    {
+        expression = expression.trim();
+        var expressionLength = expression.length;
+        var self = this;
+        var callback = function(success) {
+            if (!updateInterface)
+                return;
+
+            if (!success)
+                self.update();
+
+            if (!expressionLength) {
+                // The property was deleted, so remove this tree element.
+                self.parent.removeChild(this);
+            } else {
+                // Call updateSiblings since their value might be based on the value that just changed.
+                self.updateSiblings();
+            }
+        };
+        InjectedScriptAccess.get(this.property.parentObjectProxy.injectedScriptId).setPropertyValue(this.property.parentObjectProxy, this.property.name, expression.trim(), callback);
+    }
+}
+
+WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* BreakpointsSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.BreakpointsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
+
+    this.breakpoints = {};
+
+    this.listElement = document.createElement("ol");
+    this.listElement.className = "breakpoint-list";
+
+    this.emptyElement = document.createElement("div");
+    this.emptyElement.className = "info";
+    this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
+
+    this.bodyElement.appendChild(this.emptyElement);
+}
+
+WebInspector.BreakpointsSidebarPane.prototype = {
+    reset: function()
+    {
+        this.breakpoints = {};
+        this.listElement.removeChildren();
+        if (this.listElement.parentElement) {
+            this.bodyElement.removeChild(this.listElement);
+            this.bodyElement.appendChild(this.emptyElement);
+        }
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        if (this.breakpoints[breakpoint.id])
+            return;
+
+        this.breakpoints[breakpoint.id] = breakpoint;
+
+        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
+        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
+        breakpoint.addEventListener("text-changed", this._breakpointTextChanged, this);
+
+        this._appendBreakpointElement(breakpoint);
+
+        if (this.emptyElement.parentElement) {
+            this.bodyElement.removeChild(this.emptyElement);
+            this.bodyElement.appendChild(this.listElement);
+        }
+
+        InspectorBackend.setBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.enabled, breakpoint.condition);
+    },
+
+    _appendBreakpointElement: function(breakpoint)
+    {
+        function checkboxClicked(event)
+        {
+            breakpoint.enabled = !breakpoint.enabled;
+
+            // without this, we'd switch to the source of the clicked breakpoint
+            event.stopPropagation();
+        }
+
+        function breakpointClicked()
+        {
+            var script = WebInspector.panels.scripts.scriptOrResourceForID(breakpoint.sourceID);
+            if (script)
+                WebInspector.panels.scripts.showScript(script, breakpoint.line);
+        }
+
+        var breakpointElement = document.createElement("li");
+        breakpoint._breakpointListElement = breakpointElement;
+        breakpointElement._breakpointObject = breakpoint;
+        breakpointElement.addEventListener("click", breakpointClicked, false);
+
+        var checkboxElement = document.createElement("input");
+        checkboxElement.className = "checkbox-elem";
+        checkboxElement.type = "checkbox";
+        checkboxElement.checked = breakpoint.enabled;
+        checkboxElement.addEventListener("click", checkboxClicked, false);
+        breakpointElement.appendChild(checkboxElement);
+
+        var labelElement = document.createTextNode(breakpoint.label);
+        breakpointElement.appendChild(labelElement);
+
+        var sourceTextElement = document.createElement("div");
+        sourceTextElement.textContent = breakpoint.sourceText;
+        sourceTextElement.className = "source-text monospace";
+        breakpointElement.appendChild(sourceTextElement);
+
+        var currentElement = this.listElement.firstChild;
+        while (currentElement) {
+            var currentBreak = currentElement._breakpointObject;
+            if (currentBreak.url > breakpoint.url) {
+                this.listElement.insertBefore(breakpointElement, currentElement);
+                return;
+            } else if (currentBreak.url == breakpoint.url && currentBreak.line > breakpoint.line) {
+                this.listElement.insertBefore(breakpointElement, currentElement);
+                return;
+            }
+            currentElement = currentElement.nextSibling;
+        }
+        this.listElement.appendChild(breakpointElement);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        if (!this.breakpoints[breakpoint.id])
+            return;
+        delete this.breakpoints[breakpoint.id];
+
+        breakpoint.removeEventListener("enabled", null, this);
+        breakpoint.removeEventListener("disabled", null, this);
+        breakpoint.removeEventListener("text-changed", null, this);
+
+        var element = breakpoint._breakpointListElement;
+        element.parentElement.removeChild(element);
+
+        if (!this.listElement.firstChild) {
+            this.bodyElement.removeChild(this.listElement);
+            this.bodyElement.appendChild(this.emptyElement);
+        }
+
+        InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
+    },
+
+    _breakpointEnableChanged: function(event)
+    {
+        var breakpoint = event.target;
+
+        var checkbox = breakpoint._breakpointListElement.firstChild;
+        checkbox.checked = breakpoint.enabled;
+        InspectorBackend.setBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.enabled, breakpoint.condition);
+    },
+
+    _breakpointTextChanged: function(event)
+    {
+        var breakpoint = event.target;
+
+        var sourceTextElement = breakpoint._breakpointListElement.firstChild.nextSibling.nextSibling;
+        sourceTextElement.textContent = breakpoint.sourceText;
+    }
+}
+
+WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* CallStackSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.CallStackSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
+    
+    this._shortcuts = {};
+
+    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Period,
+                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = this._selectNextCallFrameOnStack.bind(this);
+
+    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Comma,
+                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = this._selectPreviousCallFrameOnStack.bind(this);
+}
+
+WebInspector.CallStackSidebarPane.prototype = {
+    update: function(callFrames, sourceIDMap)
+    {
+        this.bodyElement.removeChildren();
+
+        this.placards = [];
+        delete this._selectedCallFrame;
+
+        if (!callFrames) {
+            var infoElement = document.createElement("div");
+            infoElement.className = "info";
+            infoElement.textContent = WebInspector.UIString("Not Paused");
+            this.bodyElement.appendChild(infoElement);
+            return;
+        }
+
+        var title;
+        var subtitle;
+        var scriptOrResource;
+
+        for (var i = 0; i < callFrames.length; ++i) {
+            var callFrame = callFrames[i];
+            switch (callFrame.type) {
+            case "function":
+                title = callFrame.functionName || WebInspector.UIString("(anonymous function)");
+                break;
+            case "program":
+                title = WebInspector.UIString("(program)");
+                break;
+            }
+
+            scriptOrResource = sourceIDMap[callFrame.sourceID];
+            subtitle = WebInspector.displayNameForURL(scriptOrResource.sourceURL || scriptOrResource.url);
+
+            if (callFrame.line > 0) {
+                if (subtitle)
+                    subtitle += ":" + callFrame.line;
+                else
+                    subtitle = WebInspector.UIString("line %d", callFrame.line);
+            }
+
+            var placard = new WebInspector.Placard(title, subtitle);
+            placard.callFrame = callFrame;
+
+            placard.element.addEventListener("click", this._placardSelected.bind(this), false);
+
+            this.placards.push(placard);
+            this.bodyElement.appendChild(placard.element);
+        }
+    },
+
+    get selectedCallFrame()
+    {
+        return this._selectedCallFrame;
+    },
+
+    set selectedCallFrame(x)
+    {
+        if (this._selectedCallFrame === x)
+            return;
+
+        this._selectedCallFrame = x;
+
+        for (var i = 0; i < this.placards.length; ++i) {
+            var placard = this.placards[i];
+            placard.selected = (placard.callFrame === this._selectedCallFrame);
+        }
+
+        this.dispatchEventToListeners("call frame selected");
+    },
+
+    handleShortcut: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.handled = true;
+        }
+    },
+
+    _selectNextCallFrameOnStack: function()
+    {
+        var index = this._selectedCallFrameIndex();
+        if (index == -1)
+            return;
+        this._selectedPlacardByIndex(index + 1);
+    },
+
+    _selectPreviousCallFrameOnStack: function()
+    {
+        var index = this._selectedCallFrameIndex();
+        if (index == -1)
+            return;
+        this._selectedPlacardByIndex(index - 1);
+    },
+
+    _selectedPlacardByIndex: function(index)
+    {
+        if (index < 0 || index >= this.placards.length)
+            return;
+        var placard = this.placards[index];
+        this.selectedCallFrame = placard.callFrame
+    },
+
+    _selectedCallFrameIndex: function()
+    {
+        if (!this._selectedCallFrame)
+            return -1;
+        for (var i = 0; i < this.placards.length; ++i) {
+            var placard = this.placards[i];
+            if (placard.callFrame === this._selectedCallFrame)
+                return i;
+        }
+        return -1;
+    },
+
+    _placardSelected: function(event)
+    {
+        var placardElement = event.target.enclosingNodeOrSelfWithClass("placard");
+        this.selectedCallFrame = placardElement.placard.callFrame;
+    }
+}
+
+WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* ScopeChainSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScopeChainSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Scope Variables"));
+    this._expandedProperties = [];
+}
+
+WebInspector.ScopeChainSidebarPane.prototype = {
+    update: function(callFrame)
+    {
+        this.bodyElement.removeChildren();
+
+        this.sections = [];
+        this.callFrame = callFrame;
+
+        if (!callFrame) {
+            var infoElement = document.createElement("div");
+            infoElement.className = "info";
+            infoElement.textContent = WebInspector.UIString("Not Paused");
+            this.bodyElement.appendChild(infoElement);
+            return;
+        }
+
+        var foundLocalScope = false;
+        var scopeChain = callFrame.scopeChain;
+        for (var i = 0; i < scopeChain.length; ++i) {
+            var scopeObjectProxy = scopeChain[i];
+            var title = null;
+            var subtitle = scopeObjectProxy.description;
+            var emptyPlaceholder = null;
+            var extraProperties = null;
+
+            if (scopeObjectProxy.isLocal) {
+                foundLocalScope = true;
+                title = WebInspector.UIString("Local");
+                emptyPlaceholder = WebInspector.UIString("No Variables");
+                subtitle = null;
+                if (scopeObjectProxy.thisObject)
+                    extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
+            } else if (scopeObjectProxy.isClosure) {
+                title = WebInspector.UIString("Closure");
+                emptyPlaceholder = WebInspector.UIString("No Variables");
+                subtitle = null;
+            } else if (i === (scopeChain.length - 1))
+                title = WebInspector.UIString("Global");
+            else if (scopeObjectProxy.isElement)
+                title = WebInspector.UIString("Event Target");
+            else if (scopeObjectProxy.isDocument)
+                title = WebInspector.UIString("Event Document");
+            else if (scopeObjectProxy.isWithBlock)
+                title = WebInspector.UIString("With Block");
+
+            if (!title || title === subtitle)
+                subtitle = null;
+
+            var section = new WebInspector.ObjectPropertiesSection(scopeObjectProxy, title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
+            section.editInSelectedCallFrameWhenPaused = true;
+            section.pane = this;
+
+            if (!foundLocalScope || scopeObjectProxy.isLocal)
+                section.expanded = true;
+
+            this.sections.push(section);
+            this.bodyElement.appendChild(section.element);
+        }
+    }
+}
+
+WebInspector.ScopeChainSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.ScopeVariableTreeElement = function(property)
+{
+    WebInspector.ObjectPropertyTreeElement.call(this, property);
+}
+
+WebInspector.ScopeVariableTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);
+        if (this.hasChildren && this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)
+            this.expand();
+    },
+
+    onexpand: function()
+    {
+        this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier] = true;
+    },
+
+    oncollapse: function()
+    {
+        delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];
+    },
+
+    get propertyIdentifier()
+    {
+        if ("_propertyIdentifier" in this)
+            return this._propertyIdentifier;
+        var section = this.treeOutline.section;
+        this._propertyIdentifier = section.title + ":" + (section.subtitle ? section.subtitle + ":" : "") + this.propertyPath;
+        return this._propertyIdentifier;
+    },
+
+    get propertyPath()
+    {
+        if ("_propertyPath" in this)
+            return this._propertyPath;
+
+        var current = this;
+        var result;
+
+        do {
+            if (result)
+                result = current.property.name + "." + result;
+            else
+                result = current.property.name;
+            current = current.parent;
+        } while (current && !current.root);
+
+        this._propertyPath = result;
+        return result;
+    }
+}
+
+WebInspector.ScopeVariableTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
+
+/* WatchExpressionsSidebarPane.js */
+
+/*
+ * Copyright (C) IBM Corp. 2009  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of IBM Corp. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WatchExpressionsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+}
+
+WebInspector.WatchExpressionsSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        this.bodyElement.removeChildren();
+
+        this.expanded = WebInspector.settings.watchExpressions.length > 0;
+        this.section = new WebInspector.WatchExpressionsSection();
+        this.bodyElement.appendChild(this.section.element);
+
+        var addElement = document.createElement("button");
+        addElement.setAttribute("type", "button");
+        addElement.textContent = WebInspector.UIString("Add");
+        addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);
+
+        var refreshElement = document.createElement("button");
+        refreshElement.setAttribute("type", "button");
+        refreshElement.textContent = WebInspector.UIString("Refresh");
+        refreshElement.addEventListener("click", this.section.update.bind(this.section), false);
+
+        var centerElement = document.createElement("div");
+        centerElement.addStyleClass("watch-expressions-buttons-container");
+        centerElement.appendChild(addElement);
+        centerElement.appendChild(refreshElement);
+        this.bodyElement.appendChild(centerElement);
+
+        this.onexpand = this.refreshExpressions.bind(this);
+    },
+
+    refreshExpressions: function()
+    {
+        if (this.section)
+            this.section.update();
+    }
+}
+
+WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.WatchExpressionsSection = function()
+{
+    this._watchObjectGroupId = "watch-group";
+
+    WebInspector.ObjectPropertiesSection.call(this);
+
+    this.watchExpressions = WebInspector.settings.watchExpressions;
+
+    this.headerElement.className = "hidden";
+    this.editable = true;
+    this.expanded = true;
+    this.propertiesElement.addStyleClass("watch-expressions");
+}
+
+WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
+
+WebInspector.WatchExpressionsSection.prototype = {
+    update: function()
+    {
+        function appendResult(expression, watchIndex, result, exception)
+        {
+            if (exception) {
+                // Exception results are not wrappers, but text messages.
+                result = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
+            } else if (result.type === "string") {
+                // Evaluation result is intentionally not abbreviated. However, we'd like to distinguish between null and "null"
+                result.description = "\"" + result.description + "\"";
+            }
+
+            var property = new WebInspector.ObjectPropertyProxy(expression, result);
+            property.watchIndex = watchIndex;
+            property.isException = exception;
+
+            // For newly added, empty expressions, set description to "",
+            // since otherwise you get DOMWindow
+            if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) 
+                property.value.description = "";
+
+            // To clarify what's going on here: 
+            // In the outer function, we calculate the number of properties
+            // that we're going to be updating, and set that in the
+            // propertyCount variable.  
+            // In this function, we test to see when we are processing the 
+            // last property, and then call the superclass's updateProperties() 
+            // method to get all the properties refreshed at once.
+            properties.push(property);
+            
+            if (properties.length == propertyCount) {
+                this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
+
+                // check to see if we just added a new watch expression,
+                // which will always be the last property
+                if (this._newExpressionAdded) {
+                    delete this._newExpressionAdded;
+
+                    treeElement = this.findAddedTreeElement();
+                    if (treeElement)
+                        treeElement.startEditing();
+                }
+            }
+        }
+
+        // TODO: pass exact injected script id.
+        InspectorBackend.releaseWrapperObjectGroup(0, this._watchObjectGroupId)
+        var properties = [];
+
+        // Count the properties, so we known when to call this.updateProperties()
+        // in appendResult()
+        var propertyCount = 0;
+        for (var i = 0; i < this.watchExpressions.length; ++i) {
+            if (!this.watchExpressions[i]) 
+                continue;
+            ++propertyCount;
+        }
+
+        // Now process all the expressions, since we have the actual count,
+        // which is checked in the appendResult inner function.
+        for (var i = 0; i < this.watchExpressions.length; ++i) {
+            var expression = this.watchExpressions[i];
+            if (!expression)
+                continue;
+
+            WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));
+        }
+
+        // note this is setting the expansion of the tree, not the section;
+        // with no expressions, and expanded tree, we get some extra vertical
+        // white space
+        // FIXME: should change to use header buttons instead of the buttons
+        // at the bottom of the section, then we can add a "No Watch Expressions
+        // element when there are no watch expressions, and this issue should
+        // go away.
+        this.expanded = (propertyCount != 0);
+    },
+
+    addExpression: function()
+    {
+        this._newExpressionAdded = true;
+        this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);
+        this.update();
+    },
+
+    updateExpression: function(element, value)
+    {
+        this.watchExpressions[element.property.watchIndex] = value;
+        this.saveExpressions();
+        this.update();
+    },
+
+    findAddedTreeElement: function()
+    {
+        var children = this.propertiesTreeOutline.children;
+        for (var i = 0; i < children.length; ++i)
+            if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
+                return children[i];
+    },
+
+    saveExpressions: function()
+    {
+        var toSave = [];
+        for (var i = 0; i < this.watchExpressions.length; i++)
+            if (this.watchExpressions[i])
+                toSave.push(this.watchExpressions[i]);
+
+        WebInspector.settings.watchExpressions = toSave;
+        return toSave.length;
+    }
+}
+
+WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
+
+WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) 
+{
+    if (propertyA.watchIndex == propertyB.watchIndex)
+        return 0;
+    else if (propertyA.watchIndex < propertyB.watchIndex)
+        return -1;
+    else
+        return 1;
+}
+
+WebInspector.WatchExpressionTreeElement = function(property)
+{
+    WebInspector.ObjectPropertyTreeElement.call(this, property);
+}
+
+WebInspector.WatchExpressionTreeElement.prototype = {
+    update: function()
+    {
+        WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
+
+        if (this.property.isException)
+            this.valueElement.addStyleClass("watch-expressions-error-level");
+
+        var deleteButton = document.createElement("input");
+        deleteButton.type = "button";
+        deleteButton.title = WebInspector.UIString("Delete watch expression.");
+        deleteButton.addStyleClass("enabled-button");
+        deleteButton.addStyleClass("delete-button");
+        deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+        this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);
+    },
+
+    _deleteButtonClicked: function()
+    {
+        this.treeOutline.section.updateExpression(this, null);
+    },
+
+    startEditing: function()
+    {
+        if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)
+            return;
+
+        this.nameElement.textContent = this.property.name.trim();
+
+        var context = { expanded: this.expanded };
+
+        // collapse temporarily, if required
+        this.hasChildren = false;
+
+        this.listItemElement.addStyleClass("editing-sub-part");
+
+        WebInspector.startEditing(this.nameElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingCancelled: function(element, context)
+    {
+        if (!this.nameElement.textContent)
+            this.treeOutline.section.updateExpression(this, null);
+            
+        this.update();
+        this.editingEnded(context);
+    },
+
+    applyExpression: function(expression, updateInterface)
+    {
+        expression = expression.trim();
+
+        if (!expression)
+            expression = null;
+
+        this.property.name = expression;
+        this.treeOutline.section.updateExpression(this, expression);
+    }
+}
+
+WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
+
+/* MetricsSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.MetricsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));
+    this._inlineStyleId = null;
+    this._inlineStyleInjectedScriptId = null;
+}
+
+WebInspector.MetricsSidebarPane.prototype = {
+    update: function(node)
+    {
+        if (node)
+            this.node = node;
+        else
+            node = this.node;
+
+        if (!node || !node.ownerDocument.defaultView || node.nodeType !== Node.ELEMENT_NODE) {
+            this.bodyElement.removeChildren();
+            return;
+        }
+
+        var self = this;
+        var callback = function(stylePayload) {
+            if (!stylePayload)
+                return;
+            var style = WebInspector.CSSStyleDeclaration.parseStyle(stylePayload);
+            self._update(style);
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getComputedStyle(node.id, callback);
+
+        var inlineStyleCallback = function(stylePayload) {
+            if (!stylePayload)
+                return;
+            self._inlineStyleId = stylePayload.id;
+            self._inlineStyleInjectedScriptId = stylePayload.injectedScriptId;
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getInlineStyle(node.id, inlineStyleCallback);
+    },
+
+    _update: function(style)
+    {
+        var metricsElement = document.createElement("div");
+        metricsElement.className = "metrics";
+
+        function createBoxPartElement(style, name, side, suffix)
+        {
+            var propertyName = (name !== "position" ? name + "-" : "") + side + suffix;
+            var value = style.getPropertyValue(propertyName);
+            if (value === "" || (name !== "position" && value === "0px"))
+                value = "\u2012";
+            else if (name === "position" && value === "auto")
+                value = "\u2012";
+            value = value.replace(/px$/, "");
+
+            var element = document.createElement("div");
+            element.className = side;
+            element.textContent = value;
+            element.addEventListener("dblclick", this.startEditing.bind(this, element, name, propertyName), false);
+            return element;
+        }
+
+        // Display types for which margin is ignored.
+        var noMarginDisplayType = {
+            "table-cell": true,
+            "table-column": true,
+            "table-column-group": true,
+            "table-footer-group": true,
+            "table-header-group": true,
+            "table-row": true,
+            "table-row-group": true
+        };
+
+        // Display types for which padding is ignored.
+        var noPaddingDisplayType = {
+            "table-column": true,
+            "table-column-group": true,
+            "table-footer-group": true,
+            "table-header-group": true,
+            "table-row": true,
+            "table-row-group": true
+        };
+
+        // Position types for which top, left, bottom and right are ignored.
+        var noPositionType = {
+            "static": true
+        };
+
+        var boxes = ["content", "padding", "border", "margin", "position"];
+        var boxLabels = [WebInspector.UIString("content"), WebInspector.UIString("padding"), WebInspector.UIString("border"), WebInspector.UIString("margin"), WebInspector.UIString("position")];
+        var previousBox;
+        for (var i = 0; i < boxes.length; ++i) {
+            var name = boxes[i];
+
+            if (name === "margin" && noMarginDisplayType[style.display])
+                continue;
+            if (name === "padding" && noPaddingDisplayType[style.display])
+                continue;
+            if (name === "position" && noPositionType[style.position])
+                continue;
+
+            var boxElement = document.createElement("div");
+            boxElement.className = name;
+
+            if (name === "content") {
+                var width = style.width.replace(/px$/, "");
+                var widthElement = document.createElement("span");
+                widthElement.textContent = width;
+                widthElement.addEventListener("dblclick", this.startEditing.bind(this, widthElement, "width", "width"), false);
+
+                var height = style.height.replace(/px$/, "");
+                var heightElement = document.createElement("span");
+                heightElement.textContent = height;
+                heightElement.addEventListener("dblclick", this.startEditing.bind(this, heightElement, "height", "height"), false);
+
+                boxElement.appendChild(widthElement);
+                boxElement.appendChild(document.createTextNode(" \u00D7 "));
+                boxElement.appendChild(heightElement);
+            } else {
+                var suffix = (name === "border" ? "-width" : "");
+
+                var labelElement = document.createElement("div");
+                labelElement.className = "label";
+                labelElement.textContent = boxLabels[i];
+                boxElement.appendChild(labelElement);
+
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "top", suffix));
+                boxElement.appendChild(document.createElement("br"));
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "left", suffix));
+
+                if (previousBox)
+                    boxElement.appendChild(previousBox);
+
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "right", suffix));
+                boxElement.appendChild(document.createElement("br"));
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "bottom", suffix));
+            }
+
+            previousBox = boxElement;
+        }
+
+        metricsElement.appendChild(previousBox);
+        this.bodyElement.removeChildren();
+        this.bodyElement.appendChild(metricsElement);
+    },
+
+    startEditing: function(targetElement, box, styleProperty)
+    {
+        if (WebInspector.isBeingEdited(targetElement))
+            return;
+
+        var context = { box: box, styleProperty: styleProperty };
+
+        WebInspector.startEditing(targetElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingCancelled: function(element, context)
+    {
+        this.update();
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context)
+    {
+        if (userInput === previousContent)
+            return this.editingCancelled(element, context); // nothing changed, so cancel
+
+        if (context.box !== "position" && (!userInput || userInput === "\u2012"))
+            userInput = "0px";
+        else if (context.box === "position" && (!userInput || userInput === "\u2012"))
+            userInput = "auto";
+
+        // Append a "px" unit if the user input was just a number.
+        if (/^\d+$/.test(userInput))
+            userInput += "px";
+
+        var self = this;
+        var callback = function(success) {
+            if (!success)
+                return;
+            self.dispatchEventToListeners("metrics edited");
+            self.update();
+        };
+        InjectedScriptAccess.get(this._inlineStyleInjectedScriptId).setStyleProperty(this._inlineStyleId, context.styleProperty, userInput, callback);
+    }
+}
+
+WebInspector.MetricsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* PropertiesSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PropertiesSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Properties"));
+}
+
+WebInspector.PropertiesSidebarPane.prototype = {
+    update: function(node)
+    {
+        var body = this.bodyElement;
+
+        if (!node) {
+            body.removeChildren();
+            this.sections = [];
+            return;
+        }
+
+        var self = this;
+        var callback = function(prototypes) {
+            var body = self.bodyElement;
+            body.removeChildren();
+            self.sections = [];
+
+            var path = [];
+            // Get array of prototype user-friendly names.
+            for (var i = 0; i < prototypes.length; ++i) {
+                var prototype = new WebInspector.ObjectProxy(node.injectedScriptId, node.id, path.slice());
+                var section = new WebInspector.ObjectPropertiesSection(prototype, prototypes[i], WebInspector.UIString("Prototype"));
+                self.sections.push(section);
+                body.appendChild(section.element);
+                path.push("__proto__");
+            }
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getPrototypes(node.id, callback);
+    }
+}
+
+WebInspector.PropertiesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* EventListenersSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.EventListenersSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners"));
+    this.bodyElement.addStyleClass("events-pane");
+
+    this.sections = [];
+
+    this.settingsSelectElement = document.createElement("select");
+
+    var option = document.createElement("option");
+    option.value = "all";
+    option.label = WebInspector.UIString("All Nodes");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "selected";
+    option.label = WebInspector.UIString("Selected Node Only");
+    this.settingsSelectElement.appendChild(option);
+
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
+    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
+
+    this.titleElement.appendChild(this.settingsSelectElement);
+}
+
+WebInspector.EventListenersSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        var filter = WebInspector.settings.eventListenersFilter;
+        if (filter === "all")
+            this.settingsSelectElement[0].selected = true;
+        if (filter === "selected")
+            this.settingsSelectElement[1].selected = true;
+    },
+
+    update: function(node)
+    {
+        var body = this.bodyElement;
+        body.removeChildren();
+        this.sections = [];
+
+        var self = this;
+        function callback(nodeId, eventListeners) {
+            var sectionNames = [];
+            var sectionMap = {};
+            for (var i = 0; i < eventListeners.length; ++i) {
+                var eventListener = eventListeners[i];
+                eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);
+                delete eventListener.nodeId; // no longer needed
+                if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString()))
+                    continue; // ignore event listeners generated by monitorEvent
+                var type = eventListener.type;
+                var section = sectionMap[type];
+                if (!section) {
+                    section = new WebInspector.EventListenersSection(type, nodeId);
+                    sectionMap[type] = section;
+                    sectionNames.push(type);
+                    self.sections.push(section);
+                }
+                section.addListener(eventListener);
+            }
+            
+            if (sectionNames.length === 0) {
+                var div = document.createElement("div");
+                div.className = "info";
+                div.textContent = WebInspector.UIString("No Event Listeners");
+                body.appendChild(div);
+                return;
+            }
+
+            sectionNames.sort();
+            for (var i = 0; i < sectionNames.length; ++i) {
+                var section = sectionMap[sectionNames[i]];
+                section.update();
+                body.appendChild(section.element);
+            }
+        }
+
+        WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback);
+    },
+
+    _changeSetting: function(event)
+    {
+        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
+        WebInspector.settings.eventListenersFilter = selectedOption.value;
+
+        for (var i = 0; i < this.sections.length; ++i)
+            this.sections[i].update();
+    }
+}
+
+WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.EventListenersSection = function(title, nodeId)
+{
+    this.eventListeners = [];
+    this._nodeId = nodeId;
+    WebInspector.PropertiesSection.call(this, title);
+
+    // Changed from a Properties List
+    this.propertiesElement.parentNode.removeChild(this.propertiesElement);
+    delete this.propertiesElement;
+    delete this.propertiesTreeOutline;
+
+    this.eventBars = document.createElement("div");
+    this.eventBars.className = "event-bars";
+    this.element.appendChild(this.eventBars);
+}
+
+WebInspector.EventListenersSection.prototype = {
+    update: function()
+    {
+        // A Filtered Array simplifies when to create connectors
+        var filteredEventListeners = this.eventListeners;
+        if (WebInspector.settings.eventListenersFilter === "selected") {
+            filteredEventListeners = [];
+            for (var i = 0; i < this.eventListeners.length; ++i) {
+                var eventListener = this.eventListeners[i];
+                if (eventListener.node.id === this._nodeId)
+                    filteredEventListeners.push(eventListener);
+            }
+        }
+
+        this.eventBars.removeChildren();
+        var length = filteredEventListeners.length;
+        for (var i = 0; i < length; ++i) {
+            var eventListener = filteredEventListeners[i];
+            var eventListenerBar = new WebInspector.EventListenerBar(eventListener);
+            if (i < length - 1) {
+                var connector = document.createElement("div");
+                connector.className = "event-bar-connector";
+                eventListenerBar.element.appendChild(connector);
+            }
+
+            this.eventBars.appendChild(eventListenerBar.element);
+        }
+    },
+
+    addListener: function(eventListener)
+    {
+        this.eventListeners.push(eventListener);
+    }
+}
+
+WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.EventListenerBar = function(eventListener)
+{
+    this.eventListener = eventListener;
+    WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName());
+    this.editable = false;
+    this.element.className = "event-bar"; /* Changed from "section" */
+    this.propertiesElement.className = "event-properties"; /* Changed from "properties" */
+}
+
+WebInspector.EventListenerBar.prototype = {
+    update: function()
+    {
+        var properties = [];
+        for (var propertyName in this.eventListener) {
+            // Just build properties in place - no need to reach out for injected script.
+            var value = this.eventListener[propertyName];
+            if (value instanceof WebInspector.DOMNode)
+                value = new WebInspector.ObjectProxy(value.injectedScriptId, value.id, [], appropriateSelectorForNode(value), true);
+            else
+                value = WebInspector.ObjectProxy.wrapPrimitiveValue(value);
+            properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value));
+        }
+        this.updateProperties(properties);
+    },
+
+    _getNodeDisplayName: function()
+    {
+        var node = this.eventListener.node;
+        if (!node)
+            return "";
+
+        if (node.nodeType === Node.DOCUMENT_NODE)
+            return "document";
+
+        return appropriateSelectorForNode(node);
+    },
+
+    _getFunctionDisplayName: function()
+    {
+        // Requires that Function.toString() return at least the function's signature.
+        var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/);
+        return (match ? match[1] : WebInspector.UIString("(anonymous function)"));
+    }
+}
+
+WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
+
+/* Color.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Color = function(str)
+{
+    this.value = str;
+    this._parse();
+}
+
+WebInspector.Color.prototype = {
+    get shorthex()
+    {
+        if ("_short" in this)
+            return this._short;
+
+        if (!this.simple)
+            return null;
+
+        var hex = this.hex;
+        if (hex.charAt(0) === hex.charAt(1) && hex.charAt(2) === hex.charAt(3) && hex.charAt(4) === hex.charAt(5))
+            this._short = hex.charAt(0) + hex.charAt(2) + hex.charAt(4);
+        else
+            this._short = hex;
+
+        return this._short;
+    },
+
+    get hex()
+    {
+        if (!this.simple)
+            return null;
+
+        return this._hex;
+    },
+
+    set hex(x)
+    {
+        this._hex = x;
+    },
+
+    get rgb()
+    {
+        if ("_rgb" in this)
+            return this._rgb;
+
+        if (this.simple)
+            this._rgb = this._hexToRGB(this.hex);
+        else {
+            var rgba = this.rgba;
+            this._rgb = [rgba[0], rgba[1], rgba[2]];
+        }
+
+        return this._rgb;
+    },
+
+    set rgb(x)
+    {
+        this._rgb = x;
+    },
+
+    get hsl()
+    {
+        if ("_hsl" in this)
+            return this._hsl;
+
+        this._hsl = this._rgbToHSL(this.rgb);
+        return this._hsl;
+    },
+
+    set hsl(x)
+    {
+        this._hsl = x;
+    },
+
+    get nickname()
+    {
+        if (typeof this._nickname !== "undefined") // would be set on parse if there was a nickname
+            return this._nickname;
+        else
+            return null;
+    },
+
+    set nickname(x)
+    {
+        this._nickname = x;
+    },
+
+    get rgba()
+    {
+        return this._rgba;
+    },
+
+    set rgba(x)
+    {
+        this._rgba = x;
+    },
+
+    get hsla()
+    {
+        return this._hsla;
+    },
+
+    set hsla(x)
+    {
+        this._hsla = x;
+    },
+
+    hasShortHex: function()
+    {
+        var shorthex = this.shorthex;
+        return (shorthex && shorthex.length === 3);
+    },
+
+    toString: function(format)
+    {
+        if (!format)
+            format = this.format;
+
+        switch (format) {
+            case "rgb":
+                return "rgb(" + this.rgb.join(", ") + ")";
+            case "rgba":
+                return "rgba(" + this.rgba.join(", ") + ")";
+            case "hsl":
+                var hsl = this.hsl;
+                return "hsl(" + hsl[0] + ", " + hsl[1] + "%, " + hsl[2] + "%)";
+            case "hsla":
+                var hsla = this.hsla;
+                return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
+            case "hex":
+                return "#" + this.hex;
+            case "shorthex":
+                return "#" + this.shorthex;
+            case "nickname":
+                return this.nickname;
+        }
+
+        throw "invalid color format";
+    },
+
+    _rgbToHex: function(rgb)
+    {
+        var r = parseInt(rgb[0]).toString(16);
+        var g = parseInt(rgb[1]).toString(16);
+        var b = parseInt(rgb[2]).toString(16);
+        if (r.length === 1)
+            r = "0" + r;
+        if (g.length === 1)
+            g = "0" + g;
+        if (b.length === 1)
+            b = "0" + b;
+
+        return (r + g + b).toUpperCase();
+    },
+
+    _hexToRGB: function(hex)
+    {
+        var r = parseInt(hex.substring(0,2), 16);
+        var g = parseInt(hex.substring(2,4), 16);
+        var b = parseInt(hex.substring(4,6), 16);
+
+        return [r, g, b];
+    },
+
+    _rgbToHSL: function(rgb)
+    {
+        var r = parseInt(rgb[0]) / 255;
+        var g = parseInt(rgb[1]) / 255;
+        var b = parseInt(rgb[2]) / 255;
+        var max = Math.max(r, g, b);
+        var min = Math.min(r, g, b);
+        var diff = max - min;
+        var add = max + min;
+
+        if (min === max)
+            var h = 0;
+        else if (r === max)
+            var h = ((60 * (g - b) / diff) + 360) % 360;
+        else if (g === max)
+            var h = (60 * (b - r) / diff) + 120;
+        else
+            var h = (60 * (r - g) / diff) + 240;
+
+        var l = 0.5 * add;
+
+        if (l === 0)
+            var s = 0;
+        else if (l === 1)
+            var s = 1;
+        else if (l <= 0.5)
+            var s = diff / add;
+        else
+            var s = diff / (2 - add);
+
+        h = Math.round(h);
+        s = Math.round(s*100);
+        l = Math.round(l*100);
+
+        return [h, s, l];
+    },
+
+    _hslToRGB: function(hsl)
+    {
+        var h = parseFloat(hsl[0]) / 360;
+        var s = parseFloat(hsl[1]) / 100;
+        var l = parseFloat(hsl[2]) / 100;
+
+        if (l <= 0.5)
+            var q = l * (1 + s);
+        else
+            var q = l + s - (l * s);
+
+        var p = 2 * l - q;
+
+        var tr = h + (1 / 3);
+        var tg = h;
+        var tb = h - (1 / 3);
+
+        var r = Math.round(hueToRGB(p, q, tr) * 255);
+        var g = Math.round(hueToRGB(p, q, tg) * 255);
+        var b = Math.round(hueToRGB(p, q, tb) * 255);
+        return [r, g, b];
+
+        function hueToRGB(p, q, h) {
+            if (h < 0)
+                h += 1;
+            else if (h > 1)
+                h -= 1;
+
+            if ((h * 6) < 1)
+                return p + (q - p) * h * 6;
+            else if ((h * 2) < 1)
+                return q;
+            else if ((h * 3) < 2)
+                return p + (q - p) * ((2 / 3) - h) * 6;
+            else
+                return p;
+        }
+    },
+
+    _rgbaToHSLA: function(rgba)
+    {
+        var alpha = rgba[3];
+        var hsl = this._rgbToHSL(rgba)
+        hsl.push(alpha);
+        return hsl;
+    },
+
+    _hslaToRGBA: function(hsla)
+    {
+        var alpha = hsla[3];
+        var rgb = this._hslToRGB(hsla);
+        rgb.push(alpha);
+        return rgb;
+    },
+
+    _parse: function()
+    {
+        // Special Values - Advanced but Must Be Parsed First - transparent
+        var value = this.value.toLowerCase().replace(/%|\s+/g, "");
+        if (value in WebInspector.Color.AdvancedNickNames) {
+            this.format = "nickname";
+            var set = WebInspector.Color.AdvancedNickNames[value];
+            this.simple = false;
+            this.rgba = set[0];
+            this.hsla = set[1];
+            this.nickname = set[2];
+            this.alpha = set[0][3];
+            return;
+        }
+
+        // Simple - #hex, rgb(), nickname, hsl()
+        var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;
+        var match = this.value.match(simple);
+        if (match) {
+            this.simple = true;
+
+            if (match[1]) { // hex
+                var hex = match[1].toUpperCase();
+                if (hex.length === 3) {
+                    this.format = "shorthex";
+                    this.hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
+                } else {
+                    this.format = "hex";
+                    this.hex = hex;
+                }
+            } else if (match[2]) { // rgb
+                this.format = "rgb";
+                var rgb = match[2].split(/\s*,\s*/);
+                this.rgb = rgb;
+                this.hex = this._rgbToHex(rgb);
+            } else if (match[3]) { // nickname
+                var nickname = match[3].toLowerCase();
+                if (nickname in WebInspector.Color.Nicknames) {
+                    this.format = "nickname";
+                    this.hex = WebInspector.Color.Nicknames[nickname];
+                } else // unknown name
+                    throw "unknown color name";
+            } else if (match[4]) { // hsl
+                this.format = "hsl";
+                var hsl = match[4].replace(/%g/, "").split(/\s*,\s*/);
+                this.hsl = hsl;
+                this.rgb = this._hslToRGB(hsl);
+                this.hex = this._rgbToHex(this.rgb);
+            }
+
+            // Fill in the values if this is a known hex color
+            var hex = this.hex;
+            if (hex && hex in WebInspector.Color.HexTable) {
+                var set = WebInspector.Color.HexTable[hex];
+                this.rgb = set[0];
+                this.hsl = set[1];
+                this.nickname = set[2];
+            }
+
+            return;
+        }
+
+        // Advanced - rgba(), hsla()
+        var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;
+        match = this.value.match(advanced);
+        if (match) {
+            this.simple = false;
+            if (match[1]) { // rgba
+                this.format = "rgba";
+                this.rgba = match[1].split(/\s*,\s*/);
+                this.hsla = this._rgbaToHSLA(this.rgba);
+                this.alpha = this.rgba[3];
+            } else if (match[2]) { // hsla
+                this.format = "hsla";
+                this.hsla = match[2].replace(/%/g, "").split(/\s*,\s*/);
+                this.rgba = this._hslaToRGBA(this.hsla);
+                this.alpha = this.hsla[3];
+            }
+
+            return;
+        }
+
+        // Could not parse as a valid color
+        throw "could not parse color";
+    }
+}
+
+// Simple Values: [rgb, hsl, nickname]
+WebInspector.Color.HexTable = {
+    "000000": [[0, 0, 0], [0, 0, 0], "black"],
+    "000080": [[0, 0, 128], [240, 100, 25], "navy"],
+    "00008B": [[0, 0, 139], [240, 100, 27], "darkBlue"],
+    "0000CD": [[0, 0, 205], [240, 100, 40], "mediumBlue"],
+    "0000FF": [[0, 0, 255], [240, 100, 50], "blue"],
+    "006400": [[0, 100, 0], [120, 100, 20], "darkGreen"],
+    "008000": [[0, 128, 0], [120, 100, 25], "green"],
+    "008080": [[0, 128, 128], [180, 100, 25], "teal"],
+    "008B8B": [[0, 139, 139], [180, 100, 27], "darkCyan"],
+    "00BFFF": [[0, 191, 255], [195, 100, 50], "deepSkyBlue"],
+    "00CED1": [[0, 206, 209], [181, 100, 41], "darkTurquoise"],
+    "00FA9A": [[0, 250, 154], [157, 100, 49], "mediumSpringGreen"],
+    "00FF00": [[0, 255, 0], [120, 100, 50], "lime"],
+    "00FF7F": [[0, 255, 127], [150, 100, 50], "springGreen"],
+    "00FFFF": [[0, 255, 255], [180, 100, 50], "cyan"],
+    "191970": [[25, 25, 112], [240, 64, 27], "midnightBlue"],
+    "1E90FF": [[30, 144, 255], [210, 100, 56], "dodgerBlue"],
+    "20B2AA": [[32, 178, 170], [177, 70, 41], "lightSeaGreen"],
+    "228B22": [[34, 139, 34], [120, 61, 34], "forestGreen"],
+    "2E8B57": [[46, 139, 87], [146, 50, 36], "seaGreen"],
+    "2F4F4F": [[47, 79, 79], [180, 25, 25], "darkSlateGray"],
+    "32CD32": [[50, 205, 50], [120, 61, 50], "limeGreen"],
+    "3CB371": [[60, 179, 113], [147, 50, 47], "mediumSeaGreen"],
+    "40E0D0": [[64, 224, 208], [174, 72, 56], "turquoise"],
+    "4169E1": [[65, 105, 225], [225, 73, 57], "royalBlue"],
+    "4682B4": [[70, 130, 180], [207, 44, 49], "steelBlue"],
+    "483D8B": [[72, 61, 139], [248, 39, 39], "darkSlateBlue"],
+    "48D1CC": [[72, 209, 204], [178, 60, 55], "mediumTurquoise"],
+    "4B0082": [[75, 0, 130], [275, 100, 25], "indigo"],
+    "556B2F": [[85, 107, 47], [82, 39, 30], "darkOliveGreen"],
+    "5F9EA0": [[95, 158, 160], [182, 25, 50], "cadetBlue"],
+    "6495ED": [[100, 149, 237], [219, 79, 66], "cornflowerBlue"],
+    "66CDAA": [[102, 205, 170], [160, 51, 60], "mediumAquaMarine"],
+    "696969": [[105, 105, 105], [0, 0, 41], "dimGray"],
+    "6A5ACD": [[106, 90, 205], [248, 53, 58], "slateBlue"],
+    "6B8E23": [[107, 142, 35], [80, 60, 35], "oliveDrab"],
+    "708090": [[112, 128, 144], [210, 13, 50], "slateGray"],
+    "778899": [[119, 136, 153], [210, 14, 53], "lightSlateGray"],
+    "7B68EE": [[123, 104, 238], [249, 80, 67], "mediumSlateBlue"],
+    "7CFC00": [[124, 252, 0], [90, 100, 49], "lawnGreen"],
+    "7FFF00": [[127, 255, 0], [90, 100, 50], "chartreuse"],
+    "7FFFD4": [[127, 255, 212], [160, 100, 75], "aquamarine"],
+    "800000": [[128, 0, 0], [0, 100, 25], "maroon"],
+    "800080": [[128, 0, 128], [300, 100, 25], "purple"],
+    "808000": [[128, 128, 0], [60, 100, 25], "olive"],
+    "808080": [[128, 128, 128], [0, 0, 50], "gray"],
+    "87CEEB": [[135, 206, 235], [197, 71, 73], "skyBlue"],
+    "87CEFA": [[135, 206, 250], [203, 92, 75], "lightSkyBlue"],
+    "8A2BE2": [[138, 43, 226], [271, 76, 53], "blueViolet"],
+    "8B0000": [[139, 0, 0], [0, 100, 27], "darkRed"],
+    "8B008B": [[139, 0, 139], [300, 100, 27], "darkMagenta"],
+    "8B4513": [[139, 69, 19], [25, 76, 31], "saddleBrown"],
+    "8FBC8F": [[143, 188, 143], [120, 25, 65], "darkSeaGreen"],
+    "90EE90": [[144, 238, 144], [120, 73, 75], "lightGreen"],
+    "9370D8": [[147, 112, 219], [260, 60, 65], "mediumPurple"],
+    "9400D3": [[148, 0, 211], [282, 100, 41], "darkViolet"],
+    "98FB98": [[152, 251, 152], [120, 93, 79], "paleGreen"],
+    "9932CC": [[153, 50, 204], [280, 61, 50], "darkOrchid"],
+    "9ACD32": [[154, 205, 50], [80, 61, 50], "yellowGreen"],
+    "A0522D": [[160, 82, 45], [19, 56, 40], "sienna"],
+    "A52A2A": [[165, 42, 42], [0, 59, 41], "brown"],
+    "A9A9A9": [[169, 169, 169], [0, 0, 66], "darkGray"],
+    "ADD8E6": [[173, 216, 230], [195, 53, 79], "lightBlue"],
+    "ADFF2F": [[173, 255, 47], [84, 100, 59], "greenYellow"],
+    "AFEEEE": [[175, 238, 238], [180, 65, 81], "paleTurquoise"],
+    "B0C4DE": [[176, 196, 222], [214, 41, 78], "lightSteelBlue"],
+    "B0E0E6": [[176, 224, 230], [187, 52, 80], "powderBlue"],
+    "B22222": [[178, 34, 34], [0, 68, 42], "fireBrick"],
+    "B8860B": [[184, 134, 11], [43, 89, 38], "darkGoldenrod"],
+    "BA55D3": [[186, 85, 211], [288, 59, 58], "mediumOrchid"],
+    "BC8F8F": [[188, 143, 143], [0, 25, 65], "rosyBrown"],
+    "BDB76B": [[189, 183, 107], [56, 38, 58], "darkKhaki"],
+    "C0C0C0": [[192, 192, 192], [0, 0, 75], "silver"],
+    "C71585": [[199, 21, 133], [322, 81, 43], "mediumVioletRed"],
+    "CD5C5C": [[205, 92, 92], [0, 53, 58], "indianRed"],
+    "CD853F": [[205, 133, 63], [30, 59, 53], "peru"],
+    "D2691E": [[210, 105, 30], [25, 75, 47], "chocolate"],
+    "D2B48C": [[210, 180, 140], [34, 44, 69], "tan"],
+    "D3D3D3": [[211, 211, 211], [0, 0, 83], "lightGrey"],
+    "D87093": [[219, 112, 147], [340, 60, 65], "paleVioletRed"],
+    "D8BFD8": [[216, 191, 216], [300, 24, 80], "thistle"],
+    "DA70D6": [[218, 112, 214], [302, 59, 65], "orchid"],
+    "DAA520": [[218, 165, 32], [43, 74, 49], "goldenrod"],
+    "DC143C": [[237, 164, 61], [35, 83, 58], "crimson"],
+    "DCDCDC": [[220, 220, 220], [0, 0, 86], "gainsboro"],
+    "DDA0DD": [[221, 160, 221], [300, 47, 75], "plum"],
+    "DEB887": [[222, 184, 135], [34, 57, 70], "burlyWood"],
+    "E0FFFF": [[224, 255, 255], [180, 100, 94], "lightCyan"],
+    "E6E6FA": [[230, 230, 250], [240, 67, 94], "lavender"],
+    "E9967A": [[233, 150, 122], [15, 72, 70], "darkSalmon"],
+    "EE82EE": [[238, 130, 238], [300, 76, 72], "violet"],
+    "EEE8AA": [[238, 232, 170], [55, 67, 80], "paleGoldenrod"],
+    "F08080": [[240, 128, 128], [0, 79, 72], "lightCoral"],
+    "F0E68C": [[240, 230, 140], [54, 77, 75], "khaki"],
+    "F0F8FF": [[240, 248, 255], [208, 100, 97], "aliceBlue"],
+    "F0FFF0": [[240, 255, 240], [120, 100, 97], "honeyDew"],
+    "F0FFFF": [[240, 255, 255], [180, 100, 97], "azure"],
+    "F4A460": [[244, 164, 96], [28, 87, 67], "sandyBrown"],
+    "F5DEB3": [[245, 222, 179], [39, 77, 83], "wheat"],
+    "F5F5DC": [[245, 245, 220], [60, 56, 91], "beige"],
+    "F5F5F5": [[245, 245, 245], [0, 0, 96], "whiteSmoke"],
+    "F5FFFA": [[245, 255, 250], [150, 100, 98], "mintCream"],
+    "F8F8FF": [[248, 248, 255], [240, 100, 99], "ghostWhite"],
+    "FA8072": [[250, 128, 114], [6, 93, 71], "salmon"],
+    "FAEBD7": [[250, 235, 215], [34, 78, 91], "antiqueWhite"],
+    "FAF0E6": [[250, 240, 230], [30, 67, 94], "linen"],
+    "FAFAD2": [[250, 250, 210], [60, 80, 90], "lightGoldenrodYellow"],
+    "FDF5E6": [[253, 245, 230], [39, 85, 95], "oldLace"],
+    "FF0000": [[255, 0, 0], [0, 100, 50], "red"],
+    "FF00FF": [[255, 0, 255], [300, 100, 50], "magenta"],
+    "FF1493": [[255, 20, 147], [328, 100, 54], "deepPink"],
+    "FF4500": [[255, 69, 0], [16, 100, 50], "orangeRed"],
+    "FF6347": [[255, 99, 71], [9, 100, 64], "tomato"],
+    "FF69B4": [[255, 105, 180], [330, 100, 71], "hotPink"],
+    "FF7F50": [[255, 127, 80], [16, 100, 66], "coral"],
+    "FF8C00": [[255, 140, 0], [33, 100, 50], "darkOrange"],
+    "FFA07A": [[255, 160, 122], [17, 100, 74], "lightSalmon"],
+    "FFA500": [[255, 165, 0], [39, 100, 50], "orange"],
+    "FFB6C1": [[255, 182, 193], [351, 100, 86], "lightPink"],
+    "FFC0CB": [[255, 192, 203], [350, 100, 88], "pink"],
+    "FFD700": [[255, 215, 0], [51, 100, 50], "gold"],
+    "FFDAB9": [[255, 218, 185], [28, 100, 86], "peachPuff"],
+    "FFDEAD": [[255, 222, 173], [36, 100, 84], "navajoWhite"],
+    "FFE4B5": [[255, 228, 181], [38, 100, 85], "moccasin"],
+    "FFE4C4": [[255, 228, 196], [33, 100, 88], "bisque"],
+    "FFE4E1": [[255, 228, 225], [6, 100, 94], "mistyRose"],
+    "FFEBCD": [[255, 235, 205], [36, 100, 90], "blanchedAlmond"],
+    "FFEFD5": [[255, 239, 213], [37, 100, 92], "papayaWhip"],
+    "FFF0F5": [[255, 240, 245], [340, 100, 97], "lavenderBlush"],
+    "FFF5EE": [[255, 245, 238], [25, 100, 97], "seaShell"],
+    "FFF8DC": [[255, 248, 220], [48, 100, 93], "cornsilk"],
+    "FFFACD": [[255, 250, 205], [54, 100, 90], "lemonChiffon"],
+    "FFFAF0": [[255, 250, 240], [40, 100, 97], "floralWhite"],
+    "FFFAFA": [[255, 250, 250], [0, 100, 99], "snow"],
+    "FFFF00": [[255, 255, 0], [60, 100, 50], "yellow"],
+    "FFFFE0": [[255, 255, 224], [60, 100, 94], "lightYellow"],
+    "FFFFF0": [[255, 255, 240], [60, 100, 97], "ivory"],
+    "FFFFFF": [[255, 255, 255], [0, 100, 100], "white"]
+};
+
+// Simple Values
+WebInspector.Color.Nicknames = {
+    "aliceblue": "F0F8FF",
+    "antiquewhite": "FAEBD7",
+    "aqua": "00FFFF",
+    "aquamarine": "7FFFD4",
+    "azure": "F0FFFF",
+    "beige": "F5F5DC",
+    "bisque": "FFE4C4",
+    "black": "000000",
+    "blanchedalmond": "FFEBCD",
+    "blue": "0000FF",
+    "blueviolet": "8A2BE2",
+    "brown": "A52A2A",
+    "burlywood": "DEB887",
+    "cadetblue": "5F9EA0",
+    "chartreuse": "7FFF00",
+    "chocolate": "D2691E",
+    "coral": "FF7F50",
+    "cornflowerblue": "6495ED",
+    "cornsilk": "FFF8DC",
+    "crimson": "DC143C",
+    "cyan": "00FFFF",
+    "darkblue": "00008B",
+    "darkcyan": "008B8B",
+    "darkgoldenrod": "B8860B",
+    "darkgray": "A9A9A9",
+    "darkgreen": "006400",
+    "darkkhaki": "BDB76B",
+    "darkmagenta": "8B008B",
+    "darkolivegreen": "556B2F",
+    "darkorange": "FF8C00",
+    "darkorchid": "9932CC",
+    "darkred": "8B0000",
+    "darksalmon": "E9967A",
+    "darkseagreen": "8FBC8F",
+    "darkslateblue": "483D8B",
+    "darkslategray": "2F4F4F",
+    "darkturquoise": "00CED1",
+    "darkviolet": "9400D3",
+    "deeppink": "FF1493",
+    "deepskyblue": "00BFFF",
+    "dimgray": "696969",
+    "dodgerblue": "1E90FF",
+    "firebrick": "B22222",
+    "floralwhite": "FFFAF0",
+    "forestgreen": "228B22",
+    "fuchsia": "FF00FF",
+    "gainsboro": "DCDCDC",
+    "ghostwhite": "F8F8FF",
+    "gold": "FFD700",
+    "goldenrod": "DAA520",
+    "gray": "808080",
+    "green": "008000",
+    "greenyellow": "ADFF2F",
+    "honeydew": "F0FFF0",
+    "hotpink": "FF69B4",
+    "indianred": "CD5C5C",
+    "indigo": "4B0082",
+    "ivory": "FFFFF0",
+    "khaki": "F0E68C",
+    "lavender": "E6E6FA",
+    "lavenderblush": "FFF0F5",
+    "lawngreen": "7CFC00",
+    "lemonchiffon": "FFFACD",
+    "lightblue": "ADD8E6",
+    "lightcoral": "F08080",
+    "lightcyan": "E0FFFF",
+    "lightgoldenrodyellow": "FAFAD2",
+    "lightgreen": "90EE90",
+    "lightgrey": "D3D3D3",
+    "lightpink": "FFB6C1",
+    "lightsalmon": "FFA07A",
+    "lightseagreen": "20B2AA",
+    "lightskyblue": "87CEFA",
+    "lightslategray": "778899",
+    "lightsteelblue": "B0C4DE",
+    "lightyellow": "FFFFE0",
+    "lime": "00FF00",
+    "limegreen": "32CD32",
+    "linen": "FAF0E6",
+    "magenta": "FF00FF",
+    "maroon": "800000",
+    "mediumaquamarine": "66CDAA",
+    "mediumblue": "0000CD",
+    "mediumorchid": "BA55D3",
+    "mediumpurple": "9370D8",
+    "mediumseagreen": "3CB371",
+    "mediumslateblue": "7B68EE",
+    "mediumspringgreen": "00FA9A",
+    "mediumturquoise": "48D1CC",
+    "mediumvioletred": "C71585",
+    "midnightblue": "191970",
+    "mintcream": "F5FFFA",
+    "mistyrose": "FFE4E1",
+    "moccasin": "FFE4B5",
+    "navajowhite": "FFDEAD",
+    "navy": "000080",
+    "oldlace": "FDF5E6",
+    "olive": "808000",
+    "olivedrab": "6B8E23",
+    "orange": "FFA500",
+    "orangered": "FF4500",
+    "orchid": "DA70D6",
+    "palegoldenrod": "EEE8AA",
+    "palegreen": "98FB98",
+    "paleturquoise": "AFEEEE",
+    "palevioletred": "D87093",
+    "papayawhip": "FFEFD5",
+    "peachpuff": "FFDAB9",
+    "peru": "CD853F",
+    "pink": "FFC0CB",
+    "plum": "DDA0DD",
+    "powderblue": "B0E0E6",
+    "purple": "800080",
+    "red": "FF0000",
+    "rosybrown": "BC8F8F",
+    "royalblue": "4169E1",
+    "saddlebrown": "8B4513",
+    "salmon": "FA8072",
+    "sandybrown": "F4A460",
+    "seagreen": "2E8B57",
+    "seashell": "FFF5EE",
+    "sienna": "A0522D",
+    "silver": "C0C0C0",
+    "skyblue": "87CEEB",
+    "slateblue": "6A5ACD",
+    "slategray": "708090",
+    "snow": "FFFAFA",
+    "springgreen": "00FF7F",
+    "steelblue": "4682B4",
+    "tan": "D2B48C",
+    "teal": "008080",
+    "thistle": "D8BFD8",
+    "tomato": "FF6347",
+    "turquoise": "40E0D0",
+    "violet": "EE82EE",
+    "wheat": "F5DEB3",
+    "white": "FFFFFF",
+    "whitesmoke": "F5F5F5",
+    "yellow": "FFFF00",
+    "yellowgreen": "9ACD32"
+};
+
+// Advanced Values [rgba, hsla, nickname]
+WebInspector.Color.AdvancedNickNames = {
+    "transparent": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+    "rgba(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+    "hsla(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+};
+
+/* StylesSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StylesSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Styles"));
+
+    this.settingsSelectElement = document.createElement("select");
+
+    var option = document.createElement("option");
+    option.value = "hex";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("Hex Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "rgb";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("RGB Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "hsl";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("HSL Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    this.settingsSelectElement.appendChild(document.createElement("hr"));
+
+    option = document.createElement("option");
+    option.action = this._createNewRule.bind(this);
+    option.label = WebInspector.UIString("New Style Rule");
+    this.settingsSelectElement.appendChild(option);
+
+    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
+    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+
+    this.titleElement.appendChild(this.settingsSelectElement);
+}
+
+WebInspector.StylesSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        var format = WebInspector.settings.colorFormat;
+        if (format === "hex")
+            this.settingsSelectElement[0].selected = true;
+        if (format === "rgb")
+            this.settingsSelectElement[1].selected = true;
+        if (format === "hsl")
+            this.settingsSelectElement[2].selected = true;
+    },
+
+    update: function(node, editedSection, forceUpdate)
+    {
+        var refresh = false;
+
+        if (forceUpdate)
+            delete this.node;
+
+        if (!forceUpdate && (!node || node === this.node))
+            refresh = true;
+
+        if (node && node.nodeType === Node.TEXT_NODE && node.parentNode)
+            node = node.parentNode;
+
+        if (node && node.nodeType !== Node.ELEMENT_NODE)
+            node = null;
+
+        if (node)
+            this.node = node;
+        else
+            node = this.node;
+
+        var body = this.bodyElement;
+
+        if (!node) {
+            body.removeChildren();
+            this.sections = [];
+            return;
+        }
+
+        var self = this;
+        function callback(styles)
+        {
+            if (!styles)
+                return;
+            node._setStyles(styles.computedStyle, styles.inlineStyle, styles.styleAttributes, styles.matchedCSSRules);
+            self._update(refresh, body, node, editedSection, forceUpdate);
+        }
+
+        InjectedScriptAccess.get(node.injectedScriptId).getStyles(node.id, !WebInspector.settings.showUserAgentStyles, callback);
+    },
+
+    _update: function(refresh, body, node, editedSection, forceUpdate)
+    {
+        if (!refresh) {
+            body.removeChildren();
+            this.sections = [];
+        }
+
+        var styleRules = [];
+
+        if (refresh) {
+            for (var i = 0; i < this.sections.length; ++i) {
+                var section = this.sections[i];
+                if (section instanceof WebInspector.BlankStylePropertiesSection)
+                    continue;
+                if (section.computedStyle)
+                    section.styleRule.style = node.ownerDocument.defaultView.getComputedStyle(node);
+                var styleRule = { section: section, style: section.styleRule.style, computedStyle: section.computedStyle, rule: section.rule };
+                styleRules.push(styleRule);
+            }
+        } else {
+            var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);
+            styleRules.push({ computedStyle: true, selectorText: WebInspector.UIString("Computed Style"), style: computedStyle, editable: false });
+
+            var nodeName = node.nodeName.toLowerCase();
+            for (var i = 0; i < node.attributes.length; ++i) {
+                var attr = node.attributes[i];
+                if (attr.style) {
+                    var attrStyle = { style: attr.style, editable: false };
+                    attrStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", attr.name);
+                    attrStyle.selectorText = nodeName + "[" + attr.name;
+                    if (attr.value.length)
+                        attrStyle.selectorText += "=" + attr.value;
+                    attrStyle.selectorText += "]";
+                    styleRules.push(attrStyle);
+                }
+            }
+
+            // Always Show element's Style Attributes
+            if (node.nodeType === Node.ELEMENT_NODE) {
+                var inlineStyle = { selectorText: WebInspector.UIString("Style Attribute"), style: node.style, isAttribute: true };
+                inlineStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", "style");
+                styleRules.push(inlineStyle);
+            }
+
+            var matchedStyleRules = node.ownerDocument.defaultView.getMatchedCSSRules(node, "", !WebInspector.settings.showUserAgentStyles);
+            if (matchedStyleRules) {
+                // Add rules in reverse order to match the cascade order.
+                for (var i = (matchedStyleRules.length - 1); i >= 0; --i) {
+                    var rule = matchedStyleRules[i];
+                    styleRules.push({ style: rule.style, selectorText: rule.selectorText, parentStyleSheet: rule.parentStyleSheet, rule: rule });
+                }
+            }
+        }
+
+        function deleteDisabledProperty(style, name)
+        {
+            if (!style || !name)
+                return;
+            if (style.__disabledPropertyValues)
+                delete style.__disabledPropertyValues[name];
+            if (style.__disabledPropertyPriorities)
+                delete style.__disabledPropertyPriorities[name];
+            if (style.__disabledProperties)
+                delete style.__disabledProperties[name];
+        }
+
+        var usedProperties = {};
+        var disabledComputedProperties = {};
+        var priorityUsed = false;
+
+        // Walk the style rules and make a list of all used and overloaded properties.
+        for (var i = 0; i < styleRules.length; ++i) {
+            var styleRule = styleRules[i];
+            if (styleRule.computedStyle)
+                continue;
+            if (styleRule.section && styleRule.section.noAffect)
+                continue;
+
+            styleRule.usedProperties = {};
+
+            var style = styleRule.style;
+            for (var j = 0; j < style.length; ++j) {
+                var name = style[j];
+
+                if (!priorityUsed && style.getPropertyPriority(name).length)
+                    priorityUsed = true;
+
+                // If the property name is already used by another rule then this rule's
+                // property is overloaded, so don't add it to the rule's usedProperties.
+                if (!(name in usedProperties))
+                    styleRule.usedProperties[name] = true;
+
+                if (name === "font") {
+                    // The font property is not reported as a shorthand. Report finding the individual
+                    // properties so they are visible in computed style.
+                    // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15598 is fixed.
+                    styleRule.usedProperties["font-family"] = true;
+                    styleRule.usedProperties["font-size"] = true;
+                    styleRule.usedProperties["font-style"] = true;
+                    styleRule.usedProperties["font-variant"] = true;
+                    styleRule.usedProperties["font-weight"] = true;
+                    styleRule.usedProperties["line-height"] = true;
+                }
+
+                // Delete any disabled properties, since the property does exist.
+                // This prevents it from showing twice.
+                deleteDisabledProperty(style, name);
+                deleteDisabledProperty(style, style.getPropertyShorthand(name));
+            }
+
+            // Add all the properties found in this style to the used properties list.
+            // Do this here so only future rules are affect by properties used in this rule.
+            for (var name in styleRules[i].usedProperties)
+                usedProperties[name] = true;
+
+            // Remember all disabled properties so they show up in computed style.
+            if (style.__disabledProperties)
+                for (var name in style.__disabledProperties)
+                    disabledComputedProperties[name] = true;
+        }
+
+        if (priorityUsed) {
+            // Walk the properties again and account for !important.
+            var foundPriorityProperties = [];
+
+            // Walk in reverse to match the order !important overrides.
+            for (var i = (styleRules.length - 1); i >= 0; --i) {
+                if (styleRules[i].computedStyle)
+                    continue;
+
+                var style = styleRules[i].style;
+                var uniqueProperties = style.uniqueStyleProperties;
+                for (var j = 0; j < uniqueProperties.length; ++j) {
+                    var name = uniqueProperties[j];
+                    if (style.getPropertyPriority(name).length) {
+                        if (!(name in foundPriorityProperties))
+                            styleRules[i].usedProperties[name] = true;
+                        else
+                            delete styleRules[i].usedProperties[name];
+                        foundPriorityProperties[name] = true;
+                    } else if (name in foundPriorityProperties)
+                        delete styleRules[i].usedProperties[name];
+                }
+            }
+        }
+
+        if (refresh) {
+            // Walk the style rules and update the sections with new overloaded and used properties.
+            for (var i = 0; i < styleRules.length; ++i) {
+                var styleRule = styleRules[i];
+                var section = styleRule.section;
+                if (styleRule.computedStyle)
+                    section.disabledComputedProperties = disabledComputedProperties;
+                section._usedProperties = (styleRule.usedProperties || usedProperties);
+                section.update((section === editedSection) || styleRule.computedStyle);
+            }
+        } else {
+            // Make a property section for each style rule.
+            for (var i = 0; i < styleRules.length; ++i) {
+                var styleRule = styleRules[i];
+                var subtitle = styleRule.subtitle;
+                delete styleRule.subtitle;
+
+                var computedStyle = styleRule.computedStyle;
+                delete styleRule.computedStyle;
+
+                var ruleUsedProperties = styleRule.usedProperties;
+                delete styleRule.usedProperties;
+
+                var editable = styleRule.editable;
+                delete styleRule.editable;
+
+                var isAttribute = styleRule.isAttribute;
+                delete styleRule.isAttribute;
+
+                // Default editable to true if it was omitted.
+                if (typeof editable === "undefined")
+                    editable = true;
+
+                var section = new WebInspector.StylePropertiesSection(styleRule, subtitle, computedStyle, (ruleUsedProperties || usedProperties), editable);
+                if (computedStyle)
+                    section.disabledComputedProperties = disabledComputedProperties;
+                section.pane = this;
+
+                if (Preferences.styleRulesExpandedState && section.identifier in Preferences.styleRulesExpandedState)
+                    section.expanded = Preferences.styleRulesExpandedState[section.identifier];
+                else if (computedStyle)
+                    section.collapse(true);
+                else if (isAttribute && styleRule.style.length === 0)
+                    section.collapse(true);
+                else
+                    section.expand(true);
+
+                body.appendChild(section.element);
+                this.sections.push(section);
+            }
+        }
+    },
+
+    _changeSetting: function(event)
+    {
+        var options = this.settingsSelectElement.options;
+        var selectedOption = options[this.settingsSelectElement.selectedIndex];
+        selectedOption.action(event);
+
+        // Select the correct color format setting again, since it needs to be selected.
+        var selectedIndex = 0;
+        for (var i = 0; i < options.length; ++i) {
+            if (options[i].value === WebInspector.settings.colorFormat) {
+                selectedIndex = i;
+                break;
+            }
+        }
+
+        this.settingsSelectElement.selectedIndex = selectedIndex;
+    },
+
+    _changeColorFormat: function(event)
+    {
+        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
+        WebInspector.settings.colorFormat = selectedOption.value;
+
+        for (var i = 0; i < this.sections.length; ++i)
+            this.sections[i].update(true);
+    },
+
+    _createNewRule: function(event)
+    {
+        this.addBlankSection().startEditingSelector();
+    },
+
+    addBlankSection: function()
+    {
+        var blankSection = new WebInspector.BlankStylePropertiesSection(appropriateSelectorForNode(this.node, true));
+        blankSection.pane = this;
+
+        var elementStyleSection = this.sections[1];
+        this.bodyElement.insertBefore(blankSection.element, elementStyleSection.element.nextSibling);
+
+        this.sections.splice(2, 0, blankSection);
+
+        return blankSection;
+    },
+
+    removeSection: function(section)
+    {
+        var index = this.sections.indexOf(section);
+        if (index === -1)
+            return;
+        this.sections.splice(index, 1);
+        if (section.element.parentNode)
+            section.element.parentNode.removeChild(section.element);
+    }
+}
+
+WebInspector.StylesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.StylePropertiesSection = function(styleRule, subtitle, computedStyle, usedProperties, editable)
+{
+    WebInspector.PropertiesSection.call(this, styleRule.selectorText);
+
+    this.titleElement.addEventListener("click", this._clickSelector.bind(this), false);
+    this.titleElement.addEventListener("dblclick", this._dblclickSelector.bind(this), false);
+    this.element.addEventListener("dblclick", this._dblclickEmptySpace.bind(this), false);
+
+    this.styleRule = styleRule;
+    this.rule = this.styleRule.rule;
+    this.computedStyle = computedStyle;
+    this.editable = (editable && !computedStyle);
+
+    // Prevent editing the user agent and user rules.
+    var isUserAgent = this.rule && this.rule.isUserAgent;
+    var isUser = this.rule && this.rule.isUser;
+    var isViaInspector = this.rule && this.rule.isViaInspector;
+
+    if (isUserAgent || isUser)
+        this.editable = false;
+
+    this._usedProperties = usedProperties;
+
+    if (computedStyle) {
+        this.element.addStyleClass("computed-style");
+
+        if (WebInspector.settings.showInheritedComputedStyleProperties)
+            this.element.addStyleClass("show-inherited");
+
+        var showInheritedLabel = document.createElement("label");
+        var showInheritedInput = document.createElement("input");
+        showInheritedInput.type = "checkbox";
+        showInheritedInput.checked = WebInspector.settings.showInheritedComputedStyleProperties;
+
+        var computedStyleSection = this;
+        var showInheritedToggleFunction = function(event) {
+            WebInspector.settings.showInheritedComputedStyleProperties = showInheritedInput.checked;
+            if (WebInspector.settings.showInheritedComputedStyleProperties)
+                computedStyleSection.element.addStyleClass("show-inherited");
+            else
+                computedStyleSection.element.removeStyleClass("show-inherited");
+            event.stopPropagation();
+        };
+
+        showInheritedLabel.addEventListener("click", showInheritedToggleFunction, false);
+
+        showInheritedLabel.appendChild(showInheritedInput);
+        showInheritedLabel.appendChild(document.createTextNode(WebInspector.UIString("Show inherited")));
+        this.subtitleElement.appendChild(showInheritedLabel);
+    } else {
+        if (!subtitle) {
+            if (this.styleRule.parentStyleSheet && this.styleRule.parentStyleSheet.href) {
+                var url = this.styleRule.parentStyleSheet.href;
+                subtitle = WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));
+                this.subtitleElement.addStyleClass("file");
+            } else if (isUserAgent)
+                subtitle = WebInspector.UIString("user agent stylesheet");
+            else if (isUser)
+                subtitle = WebInspector.UIString("user stylesheet");
+            else if (isViaInspector)
+                subtitle = WebInspector.UIString("via inspector");
+            else
+                subtitle = WebInspector.UIString("inline stylesheet");
+        }
+
+        this.subtitle = subtitle;
+    }
+
+    this.identifier = styleRule.selectorText;
+    if (this.subtitle)
+        this.identifier += ":" + this.subtitleElement.textContent;
+}
+
+WebInspector.StylePropertiesSection.prototype = {
+    get usedProperties()
+    {
+        return this._usedProperties || {};
+    },
+
+    set usedProperties(x)
+    {
+        this._usedProperties = x;
+        this.update();
+    },
+
+    expand: function(dontRememberState)
+    {
+        WebInspector.PropertiesSection.prototype.expand.call(this);
+        if (dontRememberState)
+            return;
+
+        if (!Preferences.styleRulesExpandedState)
+            Preferences.styleRulesExpandedState = {};
+        Preferences.styleRulesExpandedState[this.identifier] = true;
+    },
+
+    collapse: function(dontRememberState)
+    {
+        WebInspector.PropertiesSection.prototype.collapse.call(this);
+        if (dontRememberState)
+            return;
+
+        if (!Preferences.styleRulesExpandedState)
+            Preferences.styleRulesExpandedState = {};
+        Preferences.styleRulesExpandedState[this.identifier] = false;
+    },
+
+    isPropertyInherited: function(property)
+    {
+        if (!this.computedStyle || !this._usedProperties || this.noAffect)
+            return false;
+        // These properties should always show for Computed Style.
+        var alwaysShowComputedProperties = { "display": true, "height": true, "width": true };
+        return !(property in this.usedProperties) && !(property in alwaysShowComputedProperties) && !(property in this.disabledComputedProperties);
+    },
+
+    isPropertyOverloaded: function(property, shorthand)
+    {
+        if (this.computedStyle || !this._usedProperties || this.noAffect)
+            return false;
+
+        var used = (property in this.usedProperties);
+        if (used || !shorthand)
+            return !used;
+
+        // Find out if any of the individual longhand properties of the shorthand
+        // are used, if none are then the shorthand is overloaded too.
+        var longhandProperties = this.styleRule.style.getLonghandProperties(property);
+        for (var j = 0; j < longhandProperties.length; ++j) {
+            var individualProperty = longhandProperties[j];
+            if (individualProperty in this.usedProperties)
+                return false;
+        }
+
+        return true;
+    },
+
+    isInspectorStylesheet: function()
+    {
+        return (this.styleRule.parentStyleSheet === WebInspector.panels.elements.stylesheet);
+    },
+
+    update: function(full)
+    {
+        if (full || this.computedStyle) {
+            this.propertiesTreeOutline.removeChildren();
+            this.populated = false;
+        } else {
+            var child = this.propertiesTreeOutline.children[0];
+            while (child) {
+                child.overloaded = this.isPropertyOverloaded(child.name, child.shorthand);
+                child = child.traverseNextTreeElement(false, null, true);
+            }
+        }
+
+        this.afterUpdate();
+    },
+
+    afterUpdate: function()
+    {
+        if (this._afterUpdate) {
+            this._afterUpdate(this);
+            delete this._afterUpdate;
+        }
+    },
+
+    onpopulate: function()
+    {
+        var style = this.styleRule.style;
+
+        var foundShorthands = {};
+        var uniqueProperties = style.uniqueStyleProperties;
+        var disabledProperties = style.__disabledPropertyValues || {};
+
+        for (var name in disabledProperties)
+            uniqueProperties.push(name);
+
+        uniqueProperties.sort();
+
+        for (var i = 0; i < uniqueProperties.length; ++i) {
+            var name = uniqueProperties[i];
+            var disabled = name in disabledProperties;
+            if (!disabled && this.disabledComputedProperties && !(name in this.usedProperties) && name in this.disabledComputedProperties)
+                disabled = true;
+
+            var shorthand = !disabled ? style.getPropertyShorthand(name) : null;
+
+            if (shorthand && shorthand in foundShorthands)
+                continue;
+
+            if (shorthand) {
+                foundShorthands[shorthand] = true;
+                name = shorthand;
+            }
+
+            var isShorthand = (shorthand ? true : false);
+            var inherited = this.isPropertyInherited(name);
+            var overloaded = this.isPropertyOverloaded(name, isShorthand);
+
+            var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, name, isShorthand, inherited, overloaded, disabled);
+            this.propertiesTreeOutline.appendChild(item);
+        }
+    },
+
+    findTreeElementWithName: function(name)
+    {
+        var treeElement = this.propertiesTreeOutline.children[0];
+        while (treeElement) {
+            if (treeElement.name === name)
+                return treeElement;
+            treeElement = treeElement.traverseNextTreeElement(true, null, true);
+        }
+        return null;
+    },
+
+    addNewBlankProperty: function()
+    {
+        var item = new WebInspector.StylePropertyTreeElement(this.styleRule, this.styleRule.style, "", false, false, false, false);
+        this.propertiesTreeOutline.appendChild(item);
+        item.listItemElement.textContent = "";
+        item._newProperty = true;
+        return item;
+    },
+
+    _clickSelector: function(event)
+    {
+        event.stopPropagation();
+
+        // Don't search "Computed Styles", "Style Attribute", or Mapped Attributes.
+        if (this.computedStyle || !this.rule || this.rule.isUser)
+            return;
+
+        var searchElement = document.getElementById("search");
+        searchElement.value = this.styleRule.selectorText;
+        WebInspector.performSearch({ target: searchElement });
+    },
+
+    _dblclickEmptySpace: function(event)
+    {
+        this.expand();
+        this.addNewBlankProperty().startEditing();
+    },
+
+    _dblclickSelector: function(event)
+    {
+        if (!this.editable)
+            return;
+
+        if (!this.rule && this.propertiesTreeOutline.children.length === 0) {
+            this.expand();
+            this.addNewBlankProperty().startEditing();
+            return;
+        }
+
+        if (!this.rule)
+            return;
+
+        this.startEditingSelector();
+        event.stopPropagation();
+    },
+
+    startEditingSelector: function()
+    {
+        var element = this.titleElement;
+        if (WebInspector.isBeingEdited(element))
+            return;
+
+        WebInspector.startEditing(this.titleElement, this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this), null);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    editingSelectorCommitted: function(element, newContent, oldContent, context, moveDirection)
+    {
+        function moveToNextIfNeeded() {
+            if (!moveDirection || moveDirection !== "forward")
+                return;
+
+            this.expand();
+            if (this.propertiesTreeOutline.children.length === 0)
+                this.addNewBlankProperty().startEditing();
+            else {
+                var item = this.propertiesTreeOutline.children[0]
+                item.startEditing(item.valueElement);
+            }
+        }
+
+        if (newContent === oldContent)
+            return moveToNextIfNeeded.call(this);
+
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // Invalid Syntax for a Selector
+                moveToNextIfNeeded.call(self);
+                return;
+            }
+
+            var newRulePayload = result[0];
+            var doesAffectSelectedNode = result[1];
+            if (!doesAffectSelectedNode) {
+                self.noAffect = true;
+                self.element.addStyleClass("no-affect");
+            } else {
+                delete self.noAffect;
+                self.element.removeStyleClass("no-affect");
+            }
+
+            var newRule = WebInspector.CSSStyleDeclaration.parseRule(newRulePayload);
+            self.rule = newRule;
+            self.styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, parentStyleSheet: newRule.parentStyleSheet, rule: newRule };
+
+            var oldIdentifier = this.identifier;
+            self.identifier = newRule.selectorText + ":" + self.subtitleElement.textContent;
+
+            self.pane.update();
+
+            WebInspector.panels.elements.renameSelector(oldIdentifier, this.identifier, oldContent, newContent);
+
+            moveToNextIfNeeded.call(self);
+        }
+
+        InjectedScriptAccess.get(this.rule.injectedScriptId).applyStyleRuleText(this.rule.id, newContent, this.pane.node.id, callback);
+    },
+
+    editingSelectorCancelled: function()
+    {
+        // Do nothing, this is overridden by BlankStylePropertiesSection.
+    }
+}
+
+WebInspector.StylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.BlankStylePropertiesSection = function(defaultSelectorText)
+{
+    WebInspector.StylePropertiesSection.call(this, {selectorText: defaultSelectorText, rule: {isViaInspector: true}}, "", false, {}, false);
+
+    this.element.addStyleClass("blank-section");
+}
+
+WebInspector.BlankStylePropertiesSection.prototype = {
+    expand: function()
+    {
+        // Do nothing, blank sections are not expandable.
+    },
+
+    editingSelectorCommitted: function(element, newContent, oldContent, context)
+    {
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // Invalid Syntax for a Selector
+                self.editingSelectorCancelled();
+                return;
+            }
+
+            var rule = result[0];
+            var doesSelectorAffectSelectedNode = result[1];
+
+            var styleRule = WebInspector.CSSStyleDeclaration.parseRule(rule);
+            styleRule.rule = rule;
+
+            self.makeNormal(styleRule);
+
+            if (!doesSelectorAffectSelectedNode) {
+                self.noAffect = true;
+                self.element.addStyleClass("no-affect");
+            }
+
+            self.subtitleElement.textContent = WebInspector.UIString("via inspector");
+            self.expand();
+
+            self.addNewBlankProperty().startEditing();
+        }
+
+        InjectedScriptAccess.get(this.pane.node.injectedScriptId).addStyleSelector(newContent, this.pane.node.id, callback);
+    },
+
+    editingSelectorCancelled: function()
+    {
+        this.pane.removeSection(this);
+    },
+
+    makeNormal: function(styleRule)
+    {
+        this.element.removeStyleClass("blank-section");
+
+        this.styleRule = styleRule;
+        this.rule = styleRule.rule;
+        this.computedStyle = false;
+        this.editable = true;
+        this.identifier = styleRule.selectorText + ":via inspector";
+
+        this.__proto__ = WebInspector.StylePropertiesSection.prototype;
+    }
+}
+
+WebInspector.BlankStylePropertiesSection.prototype.__proto__ = WebInspector.StylePropertiesSection.prototype;
+
+WebInspector.StylePropertyTreeElement = function(styleRule, style, name, shorthand, inherited, overloaded, disabled)
+{
+    this._styleRule = styleRule;
+    this.style = style;
+    this.name = name;
+    this.shorthand = shorthand;
+    this._inherited = inherited;
+    this._overloaded = overloaded;
+    this._disabled = disabled;
+
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, shorthand);
+}
+
+WebInspector.StylePropertyTreeElement.prototype = {
+    get inherited()
+    {
+        return this._inherited;
+    },
+
+    set inherited(x)
+    {
+        if (x === this._inherited)
+            return;
+        this._inherited = x;
+        this.updateState();
+    },
+
+    get overloaded()
+    {
+        return this._overloaded;
+    },
+
+    set overloaded(x)
+    {
+        if (x === this._overloaded)
+            return;
+        this._overloaded = x;
+        this.updateState();
+    },
+
+    get disabled()
+    {
+        return this._disabled;
+    },
+
+    set disabled(x)
+    {
+        if (x === this._disabled)
+            return;
+        this._disabled = x;
+        this.updateState();
+    },
+
+    get priority()
+    {
+        if (this.disabled && this.style.__disabledPropertyPriorities && this.name in this.style.__disabledPropertyPriorities)
+            return this.style.__disabledPropertyPriorities[this.name];
+        return (this.shorthand ? this.style.getShorthandPriority(this.name) : this.style.getPropertyPriority(this.name));
+    },
+
+    get value()
+    {
+        if (this.disabled && this.style.__disabledPropertyValues && this.name in this.style.__disabledPropertyValues)
+            return this.style.__disabledPropertyValues[this.name];
+        return (this.shorthand ? this.style.getShorthandValue(this.name) : this.style.getPropertyValue(this.name));
+    },
+
+    onattach: function()
+    {
+        this.updateTitle();
+    },
+
+    updateTitle: function()
+    {
+        var priority = this.priority;
+        var value = this.value;
+
+        if (priority && !priority.length)
+            delete priority;
+        if (priority)
+            priority = "!" + priority;
+
+        this.updateState();
+
+        var enabledCheckboxElement = document.createElement("input");
+        enabledCheckboxElement.className = "enabled-button";
+        enabledCheckboxElement.type = "checkbox";
+        enabledCheckboxElement.checked = !this.disabled;
+        enabledCheckboxElement.addEventListener("change", this.toggleEnabled.bind(this), false);
+
+        var nameElement = document.createElement("span");
+        nameElement.className = "name";
+        nameElement.textContent = this.name;
+        this.nameElement = nameElement;
+
+        var valueElement = document.createElement("span");
+        valueElement.className = "value";
+        this.valueElement = valueElement;
+
+        if (value) {
+            function processValue(regex, processor, nextProcessor, valueText)
+            {
+                var container = document.createDocumentFragment();
+
+                var items = valueText.replace(regex, "\0$1\0").split("\0");
+                for (var i = 0; i < items.length; ++i) {
+                    if ((i % 2) === 0) {
+                        if (nextProcessor)
+                            container.appendChild(nextProcessor(items[i]));
+                        else
+                            container.appendChild(document.createTextNode(items[i]));
+                    } else {
+                        var processedNode = processor(items[i]);
+                        if (processedNode)
+                            container.appendChild(processedNode);
+                    }
+                }
+
+                return container;
+            }
+
+            function linkifyURL(url)
+            {
+                var container = document.createDocumentFragment();
+                container.appendChild(document.createTextNode("url("));
+                container.appendChild(WebInspector.linkifyURLAsNode(url, url, null, (url in WebInspector.resourceURLMap)));
+                container.appendChild(document.createTextNode(")"));
+                return container;
+            }
+
+            function processColor(text)
+            {
+                try {
+                    var color = new WebInspector.Color(text);
+                } catch (e) {
+                    return document.createTextNode(text);
+                }
+
+                var swatchElement = document.createElement("span");
+                swatchElement.title = WebInspector.UIString("Click to change color format");
+                swatchElement.className = "swatch";
+                swatchElement.style.setProperty("background-color", text);
+
+                swatchElement.addEventListener("click", changeColorDisplay, false);
+                swatchElement.addEventListener("dblclick", function(event) { event.stopPropagation() }, false);
+
+                var format;
+                if (Preferences.showColorNicknames && color.nickname)
+                    format = "nickname";
+                else if (WebInspector.settings.colorFormat === "rgb")
+                    format = (color.simple ? "rgb" : "rgba");
+                else if (WebInspector.settings.colorFormat === "hsl")
+                    format = (color.simple ? "hsl" : "hsla");
+                else if (color.simple)
+                    format = (color.hasShortHex() ? "shorthex" : "hex");
+                else
+                    format = "rgba";
+
+                var colorValueElement = document.createElement("span");
+                colorValueElement.textContent = color.toString(format);
+
+                function changeColorDisplay(event)
+                {
+                    switch (format) {
+                        case "rgb":
+                            format = "hsl";
+                            break;
+
+                        case "shorthex":
+                            format = "hex";
+                            break;
+
+                        case "hex":
+                            format = "rgb";
+                            break;
+
+                        case "nickname":
+                            if (color.simple) {
+                                if (color.hasShortHex())
+                                    format = "shorthex";
+                                else
+                                    format = "hex";
+                                break;
+                            }
+
+                            format = "rgba";
+                            break;
+
+                        case "hsl":
+                            if (color.nickname)
+                                format = "nickname";
+                            else if (color.hasShortHex())
+                                format = "shorthex";
+                            else
+                                format = "hex";
+                            break;
+
+                        case "rgba":
+                            format = "hsla";
+                            break;
+
+                        case "hsla":
+                            if (color.nickname)
+                                format = "nickname";
+                            else
+                                format = "rgba";
+                            break;
+                    }
+
+                    colorValueElement.textContent = color.toString(format);
+                }
+
+                var container = document.createDocumentFragment();
+                container.appendChild(swatchElement);
+                container.appendChild(colorValueElement);
+                return container;
+            }
+
+            var colorRegex = /((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b(?!-))/g;
+            var colorProcessor = processValue.bind(window, colorRegex, processColor, null);
+
+            valueElement.appendChild(processValue(/url\(([^)]+)\)/g, linkifyURL, colorProcessor, value));
+        }
+
+        if (priority) {
+            var priorityElement = document.createElement("span");
+            priorityElement.className = "priority";
+            priorityElement.textContent = priority;
+        }
+
+        this.listItemElement.removeChildren();
+
+        // Append the checkbox for root elements of an editable section.
+        if (this.treeOutline.section && this.treeOutline.section.editable && this.parent.root)
+            this.listItemElement.appendChild(enabledCheckboxElement);
+        this.listItemElement.appendChild(nameElement);
+        this.listItemElement.appendChild(document.createTextNode(": "));
+        this.listItemElement.appendChild(valueElement);
+
+        if (priorityElement) {
+            this.listItemElement.appendChild(document.createTextNode(" "));
+            this.listItemElement.appendChild(priorityElement);
+        }
+
+        this.listItemElement.appendChild(document.createTextNode(";"));
+
+        this.tooltip = this.name + ": " + valueElement.textContent + (priority ? " " + priority : "");
+    },
+
+    updateAll: function(updateAllRules)
+    {
+        if (updateAllRules && this.treeOutline.section && this.treeOutline.section.pane)
+            this.treeOutline.section.pane.update(null, this.treeOutline.section);
+        else if (this.treeOutline.section)
+            this.treeOutline.section.update(true);
+        else
+            this.updateTitle(); // FIXME: this will not show new properties. But we don't hit his case yet.
+    },
+
+    toggleEnabled: function(event)
+    {
+        var disabled = !event.target.checked;
+
+        var self = this;
+        function callback(newPayload)
+        {
+            if (!newPayload)
+                return;
+
+            self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
+            self._styleRule.style = self.style;
+
+            // Set the disabled property here, since the code above replies on it not changing
+            // until after the value and priority are retrieved.
+            self.disabled = disabled;
+
+            if (self.treeOutline.section && self.treeOutline.section.pane)
+                self.treeOutline.section.pane.dispatchEventToListeners("style property toggled");
+
+            self.updateAll(true);
+        }
+
+        InjectedScriptAccess.get(this.style.injectedScriptId).toggleStyleEnabled(this.style.id, this.name, disabled, callback);
+    },
+
+    updateState: function()
+    {
+        if (!this.listItemElement)
+            return;
+
+        if (this.style.isPropertyImplicit(this.name) || this.value === "initial")
+            this.listItemElement.addStyleClass("implicit");
+        else
+            this.listItemElement.removeStyleClass("implicit");
+
+        if (this.inherited)
+            this.listItemElement.addStyleClass("inherited");
+        else
+            this.listItemElement.removeStyleClass("inherited");
+
+        if (this.overloaded)
+            this.listItemElement.addStyleClass("overloaded");
+        else
+            this.listItemElement.removeStyleClass("overloaded");
+
+        if (this.disabled)
+            this.listItemElement.addStyleClass("disabled");
+        else
+            this.listItemElement.removeStyleClass("disabled");
+    },
+
+    onpopulate: function()
+    {
+        // Only populate once and if this property is a shorthand.
+        if (this.children.length || !this.shorthand)
+            return;
+
+        var longhandProperties = this.style.getLonghandProperties(this.name);
+        for (var i = 0; i < longhandProperties.length; ++i) {
+            var name = longhandProperties[i];
+
+            if (this.treeOutline.section) {
+                var inherited = this.treeOutline.section.isPropertyInherited(name);
+                var overloaded = this.treeOutline.section.isPropertyOverloaded(name);
+            }
+
+            var item = new WebInspector.StylePropertyTreeElement(this._styleRule, this.style, name, false, inherited, overloaded);
+            this.appendChild(item);
+        }
+    },
+
+    ondblclick: function(event)
+    {
+        this.startEditing(event.target);
+        event.stopPropagation();
+    },
+
+    startEditing: function(selectElement)
+    {
+        // FIXME: we don't allow editing of longhand properties under a shorthand right now.
+        if (this.parent.shorthand)
+            return;
+
+        if (WebInspector.isBeingEdited(this.listItemElement) || (this.treeOutline.section && !this.treeOutline.section.editable))
+            return;
+
+        var context = { expanded: this.expanded, hasChildren: this.hasChildren };
+
+        // Lie about our children to prevent expanding on double click and to collapse shorthands.
+        this.hasChildren = false;
+
+        if (!selectElement)
+            selectElement = this.listItemElement;
+
+        this.listItemElement.handleKeyEvent = this.editingKeyDown.bind(this);
+
+        WebInspector.startEditing(this.listItemElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+        window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1);
+    },
+
+    editingKeyDown: function(event)
+    {
+        var arrowKeyPressed = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down");
+        var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");
+        if (!arrowKeyPressed && !pageKeyPressed)
+            return;
+
+        var selection = window.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+        if (selectionRange.commonAncestorContainer !== this.listItemElement && !selectionRange.commonAncestorContainer.isDescendant(this.listItemElement))
+            return;
+
+        const styleValueDelimeters = " \t\n\"':;,/()";
+        var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.listItemElement);
+        var wordString = wordRange.toString();
+        var replacementString = wordString;
+
+        var matches = /(.*?)(-?\d+(?:\.\d+)?)(.*)/.exec(wordString);
+        if (matches && matches.length) {
+            var prefix = matches[1];
+            var number = parseFloat(matches[2]);
+            var suffix = matches[3];
+
+            // If the number is near zero or the number is one and the direction will take it near zero.
+            var numberNearZero = (number < 1 && number > -1);
+            if (number === 1 && event.keyIdentifier === "Down")
+                numberNearZero = true;
+            else if (number === -1 && event.keyIdentifier === "Up")
+                numberNearZero = true;
+
+            if (numberNearZero && event.altKey && arrowKeyPressed) {
+                if (event.keyIdentifier === "Down")
+                    number = Math.ceil(number - 1);
+                else
+                    number = Math.floor(number + 1);
+            } else {
+                // Jump by 10 when shift is down or jump by 0.1 when near zero or Alt/Option is down.
+                // Also jump by 10 for page up and down, or by 100 if shift is held with a page key.
+                var changeAmount = 1;
+                if (event.shiftKey && pageKeyPressed)
+                    changeAmount = 100;
+                else if (event.shiftKey || pageKeyPressed)
+                    changeAmount = 10;
+                else if (event.altKey || numberNearZero)
+                    changeAmount = 0.1;
+
+                if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")
+                    changeAmount *= -1;
+
+                // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
+                // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
+                number = Number((number + changeAmount).toFixed(6));
+            }
+
+            replacementString = prefix + number + suffix;
+        } else {
+            // FIXME: this should cycle through known keywords for the current property name.
+            return;
+        }
+
+        var replacementTextNode = document.createTextNode(replacementString);
+
+        wordRange.deleteContents();
+        wordRange.insertNode(replacementTextNode);
+
+        var finalSelectionRange = document.createRange();
+        finalSelectionRange.setStart(replacementTextNode, 0);
+        finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
+
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+
+        event.preventDefault();
+        event.handled = true;
+
+        if (!this.originalCSSText) {
+            // Remember the rule's original CSS text, so it can be restored
+            // if the editing is canceled and before each apply.
+            this.originalCSSText = this.style.styleTextWithShorthands();
+        } else {
+            // Restore the original CSS text before applying user changes. This is needed to prevent
+            // new properties from sticking around if the user adds one, then removes it.
+            InjectedScriptAccess.get(this.style.injectedScriptId).setStyleText(this.style.id, this.originalCSSText);
+        }
+
+        this.applyStyleText(this.listItemElement.textContent);
+    },
+
+    editingEnded: function(context)
+    {
+        this.hasChildren = context.hasChildren;
+        if (context.expanded)
+            this.expand();
+        delete this.listItemElement.handleKeyEvent;
+        delete this.originalCSSText;
+    },
+
+    editingCancelled: function(element, context)
+    {
+        if (this._newProperty)
+            this.treeOutline.removeChild(this);
+        else if (this.originalCSSText) {
+            InjectedScriptAccess.get(this.style.injectedScriptId).setStyleText(this.style.id, this.originalCSSText);
+
+            if (this.treeOutline.section && this.treeOutline.section.pane)
+                this.treeOutline.section.pane.dispatchEventToListeners("style edited");
+
+            this.updateAll();
+        } else
+            this.updateTitle();
+
+        this.editingEnded(context);
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context, moveDirection)
+    {
+        this.editingEnded(context);
+
+        // Determine where to move to before making changes
+        var newProperty, moveToPropertyName, moveToSelector;
+        var moveTo = (moveDirection === "forward" ? this.nextSibling : this.previousSibling);
+        if (moveTo)
+            moveToPropertyName = moveTo.name;
+        else if (moveDirection === "forward")
+            newProperty = true;
+        else if (moveDirection === "backward" && this.treeOutline.section.rule)
+            moveToSelector = true;
+
+        // Make the Changes and trigger the moveToNextCallback after updating
+        var blankInput = /^\s*$/.test(userInput);
+        if (userInput !== previousContent || (this._newProperty && blankInput)) { // only if something changed, or adding a new style and it was blank
+            this.treeOutline.section._afterUpdate = moveToNextCallback.bind(this, this._newProperty, !blankInput);
+            this.applyStyleText(userInput, true);
+        } else
+            moveToNextCallback(this._newProperty, false, this.treeOutline.section, false);
+
+        // The Callback to start editing the next property
+        function moveToNextCallback(alreadyNew, valueChanged, section)
+        {
+            if (!moveDirection)
+                return;
+
+            // User just tabbed through without changes
+            if (moveTo && moveTo.parent) {
+                moveTo.startEditing(moveTo.valueElement);
+                return;
+            }
+
+            // User has made a change then tabbed, wiping all the original treeElements,
+            // recalculate the new treeElement for the same property we were going to edit next
+            if (moveTo && !moveTo.parent) {
+                var treeElement = section.findTreeElementWithName(moveToPropertyName);
+                if (treeElement)
+                    treeElement.startEditing(treeElement.valueElement);
+                return;
+            }
+
+            // Create a new attribute in this section
+            if (newProperty) {
+                if (alreadyNew && !valueChanged)
+                    return;
+
+                section.addNewBlankProperty().startEditing();
+                return;
+            }
+
+            if (moveToSelector)
+                section.startEditingSelector();
+        }
+    },
+
+    applyStyleText: function(styleText, updateInterface)
+    {
+        var section = this.treeOutline.section;
+        var elementsPanel = WebInspector.panels.elements;
+        var styleTextLength = styleText.trim().length;
+        if (!styleTextLength && updateInterface) {
+            if (this._newProperty) {
+                // The user deleted everything, so remove the tree element and update.
+                this.parent.removeChild(this);
+                section.afterUpdate();
+                return;
+            } else {
+                delete section._afterUpdate;
+            }
+        }
+
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // The user typed something, but it didn't parse. Just abort and restore
+                // the original title for this property.  If this was a new attribute and
+                // we couldn't parse, then just remove it.
+                if (self._newProperty) {
+                    self.parent.removeChild(self);
+                    return;
+                }
+                if (updateInterface)
+                    self.updateTitle();
+                return;
+            }
+
+            var newPayload = result[0];
+            var changedProperties = result[1];
+            elementsPanel.removeStyleChange(section.identifier, self.style, self.name);
+
+            if (!styleTextLength) {
+                // Do remove ourselves from UI when the property removal is confirmed.
+                self.parent.removeChild(self);
+            } else {
+                self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
+                for (var i = 0; i < changedProperties.length; ++i)
+                    elementsPanel.addStyleChange(section.identifier, self.style, changedProperties[i]);
+                self._styleRule.style = self.style;
+            }
+
+            if (section && section.pane)
+                section.pane.dispatchEventToListeners("style edited");
+
+            if (updateInterface)
+                self.updateAll(true);
+
+            if (!section.rule)
+                WebInspector.panels.elements.treeOutline.update();
+        }
+
+        InjectedScriptAccess.get(this.style.injectedScriptId).applyStyleText(this.style.id, styleText.trim(), this.name, callback);
+    }
+}
+
+WebInspector.StylePropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* PanelEnablerView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PanelEnablerView = function(identifier, headingText, disclaimerText, buttonTitle)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel-enabler-view");
+    this.element.addStyleClass(identifier);
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "panel-enabler-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.imageElement = document.createElement("img");
+    this.contentElement.appendChild(this.imageElement);
+
+    this.choicesForm = document.createElement("form");
+    this.contentElement.appendChild(this.choicesForm);
+
+    this.headerElement = document.createElement("h1");
+    this.headerElement.textContent = headingText;
+    this.choicesForm.appendChild(this.headerElement);
+
+    var self = this;
+    function enableOption(text, checked) {
+        var label = document.createElement("label");
+        var option = document.createElement("input");
+        option.type = "radio";
+        option.name = "enable-option";
+        if (checked)
+            option.checked = true;
+        label.appendChild(option);
+        label.appendChild(document.createTextNode(text));
+        self.choicesForm.appendChild(label);
+        return option;
+    };
+
+    this.enabledForSession = enableOption(WebInspector.UIString("Only enable for this session"), true);
+    this.enabledAlways = enableOption(WebInspector.UIString("Always enable"));
+
+    this.disclaimerElement = document.createElement("div");
+    this.disclaimerElement.className = "panel-enabler-disclaimer";
+    this.disclaimerElement.textContent = disclaimerText;
+    this.choicesForm.appendChild(this.disclaimerElement);
+
+    this.enableButton = document.createElement("button");
+    this.enableButton.setAttribute("type", "button");
+    this.enableButton.textContent = buttonTitle;
+    this.enableButton.addEventListener("click", this._enableButtonCicked.bind(this), false);
+    this.choicesForm.appendChild(this.enableButton);
+}
+
+WebInspector.PanelEnablerView.prototype = {
+    _enableButtonCicked: function()
+    {
+        this.dispatchEventToListeners("enable clicked");
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+
+        setTimeout(this.resize.bind(this), 0);
+    },
+
+    resize: function()
+    {
+        this.imageElement.removeStyleClass("hidden");
+
+        if (this.element.offsetWidth < (this.choicesForm.offsetWidth + this.imageElement.offsetWidth))
+            this.imageElement.addStyleClass("hidden");
+    },
+
+    get alwaysEnabled() {
+        return this.enabledAlways.checked;
+    }
+}
+
+WebInspector.PanelEnablerView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* WelcomeView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WelcomeView = function(identifier, headingText, instructionsText)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel-enabler-view");
+    this.element.addStyleClass(identifier);
+    this.element.addStyleClass("welcome");
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "panel-enabler-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.alignerElement = document.createElement("div");
+    this.alignerElement.className = "welcome-instructions-aligner";
+    this.contentElement.appendChild(this.alignerElement);
+
+    this.instructionsElement = document.createElement("div");
+    this.instructionsElement.className = "instructions";
+    this.contentElement.appendChild(this.instructionsElement);
+
+    this.headerElement = document.createElement("h1");
+    this.headerElement.textContent = headingText;
+    this.instructionsElement.appendChild(this.headerElement);
+
+    if (instructionsText)
+        this.addMessage(instructionsText);
+}
+
+WebInspector.WelcomeView.prototype = {
+    addMessage: function(message)
+    {
+        var messageElement = document.createElement("div");
+        messageElement.className = "message";
+        if (typeof message == "string")
+            // Message text can contain <br> tags for better text balancing, so we
+            // put it into elements using 'innerHTML', not 'textContent'.
+            messageElement.innerHTML = message;
+        else
+            messageElement.appendChild(message);
+        this.instructionsElement.appendChild(messageElement);
+    }
+}
+
+WebInspector.WelcomeView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* StatusBarButton.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StatusBarButton = function(title, className, states)
+{
+    this.element = document.createElement("button");
+    this.element.className = className + " status-bar-item";
+    this.element.addEventListener("click", this._clicked.bind(this), false);
+
+    this.glyph = document.createElement("div");
+    this.glyph.className = "glyph";
+    this.element.appendChild(this.glyph);
+
+    this.glyphShadow = document.createElement("div");
+    this.glyphShadow.className = "glyph shadow";
+    this.element.appendChild(this.glyphShadow);
+    
+    this.states = states;
+    if (!states)
+        this.states = 2;
+
+    if (states == 2)
+        this._state = false;
+    else
+        this._state = 0;
+    
+    this.title = title;
+    this.disabled = false;
+    this._visible = true;
+}
+
+WebInspector.StatusBarButton.prototype = {
+    _clicked: function()
+    {
+        this.dispatchEventToListeners("click");
+    },
+
+    get disabled()
+    {
+        return this._disabled;
+    },
+
+    set disabled(x)
+    {
+        if (this._disabled === x)
+            return;
+        this._disabled = x;
+        this.element.disabled = x;
+    },
+
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.element.title = x;
+    },
+    
+    get state()
+    {
+        return this._state;
+    },
+    
+    set state(x)
+    {
+        if (this._state === x)
+            return;
+        
+        if (this.states === 2) {
+            if (x)
+                this.element.addStyleClass("toggled-on");
+            else
+                this.element.removeStyleClass("toggled-on");
+        } else {
+            if (x !== 0) {
+                this.element.removeStyleClass("toggled-" + this._state);
+                this.element.addStyleClass("toggled-" + x);
+            } else 
+                this.element.removeStyleClass("toggled-" + this._state);
+        }
+        this._state = x;
+    },
+
+    get toggled()
+    {
+        if (this.states !== 2)
+            throw("Only used toggled when there are 2 states, otherwise, use state");
+        return this.state;
+    },
+
+    set toggled(x)
+    {
+        if (this.states !== 2)
+            throw("Only used toggled when there are 2 states, otherwise, use state");
+        this.state = x;
+    },
+
+    get visible()
+    {
+        return this._visible;
+    },
+
+    set visible(x)
+    {
+        if (this._visible === x)
+            return;
+
+        if (x)
+            this.element.removeStyleClass("hidden");
+        else
+            this.element.addStyleClass("hidden");
+        this._visible = x;
+    }
+}
+
+WebInspector.StatusBarButton.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* SummaryBar.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SummaryBar = function(categories)
+{
+    this.categories = categories;
+
+    this.element = document.createElement("div");
+    this.element.className = "summary-bar";
+
+    this.graphElement = document.createElement("canvas");
+    this.graphElement.setAttribute("width", "450");
+    this.graphElement.setAttribute("height", "38");
+    this.graphElement.className = "summary-graph";
+    this.element.appendChild(this.graphElement);
+
+    this.legendElement = document.createElement("div");
+    this.legendElement.className = "summary-graph-legend";
+    this.element.appendChild(this.legendElement);
+}
+
+WebInspector.SummaryBar.prototype = {
+
+    get calculator() {
+        return this._calculator;
+    },
+
+    set calculator(x) {
+        this._calculator = x;
+    },
+
+    reset: function()
+    {
+        this.legendElement.removeChildren();
+        this._drawSummaryGraph();
+    },
+
+    update: function(data)
+    {
+        var graphInfo = this.calculator.computeSummaryValues(data);
+
+        var fillSegments = [];
+
+        this.legendElement.removeChildren();
+
+        for (var category in this.categories) {
+            var size = graphInfo.categoryValues[category];
+            if (!size)
+                continue;
+
+            var colorString = this.categories[category].color;
+
+            var fillSegment = {color: colorString, value: size};
+            fillSegments.push(fillSegment);
+
+            var legendLabel = this._makeLegendElement(this.categories[category].title, this.calculator.formatValue(size), colorString);
+            this.legendElement.appendChild(legendLabel);
+        }
+
+        if (graphInfo.total) {
+            var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));
+            totalLegendLabel.addStyleClass("total");
+            this.legendElement.appendChild(totalLegendLabel);
+        }
+
+        this._drawSummaryGraph(fillSegments);
+    },
+
+    _drawSwatch: function(canvas, color)
+    {
+        var ctx = canvas.getContext("2d");
+
+        function drawSwatchSquare() {
+            ctx.fillStyle = color;
+            ctx.fillRect(0, 0, 13, 13);
+
+            var gradient = ctx.createLinearGradient(0, 0, 13, 13);
+            gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");
+            gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
+
+            ctx.fillStyle = gradient;
+            ctx.fillRect(0, 0, 13, 13);
+
+            gradient = ctx.createLinearGradient(13, 13, 0, 0);
+            gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");
+            gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
+
+            ctx.fillStyle = gradient;
+            ctx.fillRect(0, 0, 13, 13);
+
+            ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";
+            ctx.strokeRect(0.5, 0.5, 12, 12);
+        }
+
+        ctx.clearRect(0, 0, 13, 24);
+
+        drawSwatchSquare();
+
+        ctx.save();
+
+        ctx.translate(0, 25);
+        ctx.scale(1, -1);
+
+        drawSwatchSquare();
+
+        ctx.restore();
+
+        this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);
+    },
+
+    _drawSummaryGraph: function(segments)
+    {
+        if (!segments || !segments.length) {
+            segments = [{color: "white", value: 1}];
+            this._showingEmptySummaryGraph = true;
+        } else
+            delete this._showingEmptySummaryGraph;
+
+        // Calculate the total of all segments.
+        var total = 0;
+        for (var i = 0; i < segments.length; ++i)
+            total += segments[i].value;
+
+        // Calculate the percentage of each segment, rounded to the nearest percent.
+        var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });
+
+        // Calculate the total percentage.
+        var percentTotal = 0;
+        for (var i = 0; i < percents.length; ++i)
+            percentTotal += percents[i];
+
+        // Make sure our percentage total is not greater-than 100, it can be greater
+        // if we rounded up for a few segments.
+        while (percentTotal > 100) {
+            for (var i = 0; i < percents.length && percentTotal > 100; ++i) {
+                if (percents[i] > 1) {
+                    --percents[i];
+                    --percentTotal;
+                }
+            }
+        }
+
+        // Make sure our percentage total is not less-than 100, it can be less
+        // if we rounded down for a few segments.
+        while (percentTotal < 100) {
+            for (var i = 0; i < percents.length && percentTotal < 100; ++i) {
+                ++percents[i];
+                ++percentTotal;
+            }
+        }
+
+        var ctx = this.graphElement.getContext("2d");
+
+        var x = 0;
+        var y = 0;
+        var w = 450;
+        var h = 19;
+        var r = (h / 2);
+
+        function drawPillShadow()
+        {
+            // This draws a line with a shadow that is offset away from the line. The line is stroked
+            // twice with different X shadow offsets to give more feathered edges. Later we erase the
+            // line with destination-out 100% transparent black, leaving only the shadow. This only
+            // works if nothing has been drawn into the canvas yet.
+
+            ctx.beginPath();
+            ctx.moveTo(x + 4, y + h - 3 - 0.5);
+            ctx.lineTo(x + w - 4, y + h - 3 - 0.5);
+            ctx.closePath();
+
+            ctx.save();
+
+            ctx.shadowBlur = 2;
+            ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
+            ctx.shadowOffsetX = 3;
+            ctx.shadowOffsetY = 5;
+
+            ctx.strokeStyle = "white";
+            ctx.lineWidth = 1;
+
+            ctx.stroke();
+
+            ctx.shadowOffsetX = -3;
+
+            ctx.stroke();
+
+            ctx.restore();
+
+            ctx.save();
+
+            ctx.globalCompositeOperation = "destination-out";
+            ctx.strokeStyle = "rgba(0, 0, 0, 1)";
+            ctx.lineWidth = 1;
+
+            ctx.stroke();
+
+            ctx.restore();
+        }
+
+        function drawPill()
+        {
+            // Make a rounded rect path.
+            ctx.beginPath();
+            ctx.moveTo(x, y + r);
+            ctx.lineTo(x, y + h - r);
+            ctx.quadraticCurveTo(x, y + h, x + r, y + h);
+            ctx.lineTo(x + w - r, y + h);
+            ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
+            ctx.lineTo(x + w, y + r);
+            ctx.quadraticCurveTo(x + w, y, x + w - r, y);
+            ctx.lineTo(x + r, y);
+            ctx.quadraticCurveTo(x, y, x, y + r);
+            ctx.closePath();
+
+            // Clip to the rounded rect path.
+            ctx.save();
+            ctx.clip();
+
+            // Fill the segments with the associated color.
+            var previousSegmentsWidth = 0;
+            for (var i = 0; i < segments.length; ++i) {
+                var segmentWidth = Math.round(w * percents[i] / 100);
+                ctx.fillStyle = segments[i].color;
+                ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);
+                previousSegmentsWidth += segmentWidth;
+            }
+
+            // Draw the segment divider lines.
+            ctx.lineWidth = 1;
+            for (var i = 1; i < 20; ++i) {
+                ctx.beginPath();
+                ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);
+                ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);
+                ctx.closePath();
+
+                ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";
+                ctx.stroke();
+
+                ctx.beginPath();
+                ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);
+                ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);
+                ctx.closePath();
+
+                ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";
+                ctx.stroke();
+            }
+
+            // Draw the pill shading.
+            var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));
+            lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");
+            lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");
+            lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
+
+            var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);
+            darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
+            darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");
+            darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");
+
+            ctx.fillStyle = darkGradient;
+            ctx.fillRect(x, y, w, h);
+
+            ctx.fillStyle = lightGradient;
+            ctx.fillRect(x, y, w, h);
+
+            ctx.restore();
+        }
+
+        ctx.clearRect(x, y, w, (h * 2));
+
+        drawPillShadow();
+        drawPill();
+
+        ctx.save();
+
+        ctx.translate(0, (h * 2) + 1);
+        ctx.scale(1, -1);
+
+        drawPill();
+
+        ctx.restore();
+
+        this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);
+    },
+
+    _fadeOutRect: function(ctx, x, y, w, h, a1, a2)
+    {
+        ctx.save();
+
+        var gradient = ctx.createLinearGradient(x, y, x, y + h);
+        gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");
+        gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");
+        gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");
+
+        ctx.globalCompositeOperation = "destination-out";
+
+        ctx.fillStyle = gradient;
+        ctx.fillRect(x, y, w, h);
+
+        ctx.restore();
+    },
+
+    _makeLegendElement: function(label, value, color)
+    {
+        var legendElement = document.createElement("label");
+        legendElement.className = "summary-graph-legend-item";
+
+        if (color) {
+            var swatch = document.createElement("canvas");
+            swatch.className = "summary-graph-legend-swatch";
+            swatch.setAttribute("width", "13");
+            swatch.setAttribute("height", "24");
+
+            legendElement.appendChild(swatch);
+
+            this._drawSwatch(swatch, color);
+        }
+
+        var labelElement = document.createElement("div");
+        labelElement.className = "summary-graph-legend-label";
+        legendElement.appendChild(labelElement);
+
+        var headerElement = document.createElement("div");
+        headerElement.className = "summary-graph-legend-header";
+        headerElement.textContent = label;
+        labelElement.appendChild(headerElement);
+
+        var valueElement = document.createElement("div");
+        valueElement.className = "summary-graph-legend-value";
+        valueElement.textContent = value;
+        labelElement.appendChild(valueElement);
+
+        return legendElement;
+    }
+}
+
+WebInspector.SummaryBar.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ElementsPanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <[email protected]>
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ElementsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.element.addStyleClass("elements");
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.id = "elements-content";
+    this.contentElement.className = "outline-disclosure source-code";
+
+    this.treeOutline = new WebInspector.ElementsTreeOutline();
+    this.treeOutline.panel = this;
+    this.treeOutline.includeRootDOMNode = false;
+    this.treeOutline.selectEnabled = true;
+
+    this.treeOutline.focusedNodeChanged = function(forceUpdate)
+    {
+        if (this.panel.visible && WebInspector.currentFocusElement !== document.getElementById("search"))
+            WebInspector.currentFocusElement = this.element;
+
+        this.panel.updateBreadcrumb(forceUpdate);
+
+        for (var pane in this.panel.sidebarPanes)
+           this.panel.sidebarPanes[pane].needsUpdate = true;
+
+        this.panel.updateStyles(true);
+        this.panel.updateMetrics();
+        this.panel.updateProperties();
+        this.panel.updateEventListeners();
+
+        if (this._focusedDOMNode)
+            InjectedScriptAccess.get(this._focusedDOMNode.injectedScriptId).addInspectedNode(this._focusedDOMNode.id, function() {});
+    };
+
+    this.contentElement.appendChild(this.treeOutline.element);
+
+    this.crumbsElement = document.createElement("div");
+    this.crumbsElement.className = "crumbs";
+    this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false);
+    this.crumbsElement.addEventListener("mouseout", this._mouseMovedOutOfCrumbs.bind(this), false);
+
+    this.sidebarPanes = {};
+    this.sidebarPanes.styles = new WebInspector.StylesSidebarPane();
+    this.sidebarPanes.metrics = new WebInspector.MetricsSidebarPane();
+    this.sidebarPanes.properties = new WebInspector.PropertiesSidebarPane();
+    this.sidebarPanes.eventListeners = new WebInspector.EventListenersSidebarPane();
+
+    this.sidebarPanes.styles.onexpand = this.updateStyles.bind(this);
+    this.sidebarPanes.metrics.onexpand = this.updateMetrics.bind(this);
+    this.sidebarPanes.properties.onexpand = this.updateProperties.bind(this);
+    this.sidebarPanes.eventListeners.onexpand = this.updateEventListeners.bind(this);
+
+    this.sidebarPanes.styles.expanded = true;
+
+    this.sidebarPanes.styles.addEventListener("style edited", this._stylesPaneEdited, this);
+    this.sidebarPanes.styles.addEventListener("style property toggled", this._stylesPaneEdited, this);
+    this.sidebarPanes.metrics.addEventListener("metrics edited", this._metricsPaneEdited, this);
+
+    this.sidebarElement = document.createElement("div");
+    this.sidebarElement.id = "elements-sidebar";
+
+    this.sidebarElement.appendChild(this.sidebarPanes.styles.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.metrics.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.properties.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.eventListeners.element);
+
+    this.sidebarResizeElement = document.createElement("div");
+    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+    this.sidebarResizeElement.addEventListener("mousedown", this.rightSidebarResizerDragStart.bind(this), false);
+
+    this._nodeSearchButton = new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."), "node-search-status-bar-item");
+    this._nodeSearchButton.addEventListener("click", this._nodeSearchButtonClicked.bind(this), false);
+
+    this.element.appendChild(this.contentElement);
+    this.element.appendChild(this.sidebarElement);
+    this.element.appendChild(this.sidebarResizeElement);
+
+    this._changedStyles = {};
+
+    this.reset();
+}
+
+WebInspector.ElementsPanel.prototype = {
+    toolbarItemClass: "elements",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Elements");
+    },
+
+    get statusBarItems()
+    {
+        return [this._nodeSearchButton.element, this.crumbsElement];
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.treeOutline.element;
+    },
+
+    updateStatusBarItems: function()
+    {
+        this.updateBreadcrumbSizes();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
+        this.updateBreadcrumb();
+        this.treeOutline.updateSelection();
+        if (this.recentlyModifiedNodes.length)
+            this.updateModifiedNodes();
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+
+        WebInspector.hoveredDOMNode = null;
+        InspectorBackend.disableSearchingForNode();
+    },
+
+    resize: function()
+    {
+        this.treeOutline.updateSelection();
+        this.updateBreadcrumbSizes();
+    },
+
+    reset: function()
+    {
+        if (this.focusedDOMNode) {
+            this._selectedPathOnReset = [];
+            var node = this.focusedDOMNode;
+            while ("index" in node) {
+                this._selectedPathOnReset.push(node.nodeName);
+                this._selectedPathOnReset.push(node.index);
+                node = node.parentNode;
+            }
+            this._selectedPathOnReset.reverse();
+        }
+
+        this.rootDOMNode = null;
+        this.focusedDOMNode = null;
+
+        WebInspector.hoveredDOMNode = null;
+
+        this.recentlyModifiedNodes = [];
+
+        delete this.currentQuery;
+        this.searchCanceled();
+    },
+
+    setDocument: function(inspectedRootDocument)
+    {
+        this.reset();
+
+        if (!inspectedRootDocument)
+            return;
+
+        inspectedRootDocument.addEventListener("DOMNodeInserted", this._nodeInserted.bind(this));
+        inspectedRootDocument.addEventListener("DOMNodeRemoved", this._nodeRemoved.bind(this));
+        inspectedRootDocument.addEventListener("DOMAttrModified", this._attributesUpdated.bind(this));
+
+        this.treeOutline.suppressSelectHighlight = true;
+        this.rootDOMNode = inspectedRootDocument;
+        this.treeOutline.suppressSelectHighlight = false;
+
+        function selectNode(candidateFocusNode)
+        {
+            if (!candidateFocusNode)
+                candidateFocusNode = inspectedRootDocument.body || inspectedRootDocument.documentElement;
+
+            if (!candidateFocusNode)
+                return;
+
+            this.treeOutline.suppressSelectHighlight = true;
+            this.focusedDOMNode = candidateFocusNode;
+            if (this.treeOutline.selectedTreeElement)
+                this.treeOutline.selectedTreeElement.expand();
+            this.treeOutline.suppressSelectHighlight = false;
+        }
+
+        function selectLastSelectedNode(nodeId)
+        {
+            if (this.focusedDOMNode) {
+                // Focused node has been explicitly set while reaching out for the last selected node.
+                return;
+            }
+            var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : 0;
+            selectNode.call(this, node);
+        }
+
+        if (this._selectedPathOnReset)
+            InjectedScriptAccess.getDefault().nodeByPath(this._selectedPathOnReset, selectLastSelectedNode.bind(this));
+        else
+            selectNode.call(this);
+        delete this._selectedPathOnReset;
+    },
+
+    searchCanceled: function()
+    {
+        delete this._searchQuery;
+        this._hideSearchHighlights();
+
+        WebInspector.updateSearchMatchesCount(0, this);
+
+        this._currentSearchResultIndex = 0;
+        this._searchResults = [];
+        InjectedScriptAccess.getDefault().searchCanceled(function() {});
+    },
+
+    performSearch: function(query)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        const whitespaceTrimmedQuery = query.trim();
+        if (!whitespaceTrimmedQuery.length)
+            return;
+
+        this._updatedMatchCountOnce = false;
+        this._matchesCountUpdateTimeout = null;
+        this._searchQuery = query;
+
+        InjectedScriptAccess.getDefault().performSearch(whitespaceTrimmedQuery, function() {});
+    },
+
+    searchingForNodeWasEnabled: function()
+    {
+        this._nodeSearchButton.toggled = true;
+    },
+
+    searchingForNodeWasDisabled: function()
+    {
+        this._nodeSearchButton.toggled = false;
+    },
+
+    _updateMatchesCount: function()
+    {
+        WebInspector.updateSearchMatchesCount(this._searchResults.length, this);
+        this._matchesCountUpdateTimeout = null;
+        this._updatedMatchCountOnce = true;
+    },
+
+    _updateMatchesCountSoon: function()
+    {
+        if (!this._updatedMatchCountOnce)
+            return this._updateMatchesCount();
+        if (this._matchesCountUpdateTimeout)
+            return;
+        // Update the matches count every half-second so it doesn't feel twitchy.
+        this._matchesCountUpdateTimeout = setTimeout(this._updateMatchesCount.bind(this), 500);
+    },
+
+    addNodesToSearchResult: function(nodeIds)
+    {
+        if (!nodeIds)
+            return;
+
+        var nodeIdsArray = nodeIds.split(",");
+        for (var i = 0; i < nodeIdsArray.length; ++i) {
+            var nodeId = nodeIdsArray[i];
+            var node = WebInspector.domAgent.nodeForId(nodeId);
+            if (!node)
+                continue;
+
+            this._currentSearchResultIndex = 0;
+            this._searchResults.push(node);
+        }
+        this._highlightCurrentSearchResult();
+        this._updateMatchesCountSoon();
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._highlightCurrentSearchResult();
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._highlightCurrentSearchResult();
+    },
+
+    _highlightCurrentSearchResult: function()
+    {
+        this._hideSearchHighlights();
+        var node = this._searchResults[this._currentSearchResultIndex];
+        var treeElement = this.treeOutline.findTreeElement(node);
+        if (treeElement) {
+            treeElement.highlightSearchResults(this._searchQuery);
+            treeElement.reveal();
+        }
+    },
+
+    _hideSearchHighlights: function(node)
+    {
+        for (var i = 0; this._searchResults && i < this._searchResults.length; ++i) {
+            var node = this._searchResults[i];
+            var treeElement = this.treeOutline.findTreeElement(node);
+            if (treeElement)
+                treeElement.highlightSearchResults(null);
+        }
+    },
+
+    renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)
+    {
+        // TODO: Implement Shifting the oldSelector, and its contents to a newSelector
+    },
+
+    addStyleChange: function(identifier, style, property)
+    {
+        if (!style.parentRule)
+            return;
+
+        var selector = style.parentRule.selectorText;
+        if (!this._changedStyles[identifier])
+            this._changedStyles[identifier] = {};
+
+        if (!this._changedStyles[identifier][selector])
+            this._changedStyles[identifier][selector] = {};
+
+        if (!this._changedStyles[identifier][selector][property])
+            WebInspector.styleChanges += 1;
+
+        this._changedStyles[identifier][selector][property] = style.getPropertyValue(property);
+    },
+
+    removeStyleChange: function(identifier, style, property)
+    {
+        if (!style.parentRule)
+            return;
+
+        var selector = style.parentRule.selectorText;
+        if (!this._changedStyles[identifier] || !this._changedStyles[identifier][selector])
+            return;
+
+        if (this._changedStyles[identifier][selector][property]) {
+            delete this._changedStyles[identifier][selector][property];
+            WebInspector.styleChanges -= 1;
+        }
+    },
+
+    generateStylesheet: function()
+    {
+        if (!WebInspector.styleChanges)
+            return;
+
+        // Merge Down to Just Selectors
+        var mergedSelectors = {};
+        for (var identifier in this._changedStyles) {
+            for (var selector in this._changedStyles[identifier]) {
+                if (!mergedSelectors[selector])
+                    mergedSelectors[selector] = this._changedStyles[identifier][selector];
+                else { // merge on selector
+                    var merge = {};
+                    for (var property in mergedSelectors[selector])
+                        merge[property] = mergedSelectors[selector][property];
+                    for (var property in this._changedStyles[identifier][selector]) {
+                        if (!merge[property])
+                            merge[property] = this._changedStyles[identifier][selector][property];
+                        else { // merge on property within a selector, include comment to notify user
+                            var value1 = merge[property];
+                            var value2 = this._changedStyles[identifier][selector][property];
+
+                            if (value1 === value2)
+                                merge[property] = [value1];
+                            else if (value1 instanceof Array)
+                                merge[property].push(value2);
+                            else
+                                merge[property] = [value1, value2];
+                        }
+                    }
+                    mergedSelectors[selector] = merge;
+                }
+            }
+        }
+
+        var builder = [];
+        builder.push("/**");
+        builder.push(" * Inspector Generated Stylesheet"); // UIString?
+        builder.push(" */\n");
+
+        var indent = "  ";
+        function displayProperty(property, value, comment) {
+            if (comment)
+                return indent + "/* " + property + ": " + value + "; */";
+            else
+                return indent + property + ": " + value + ";";
+        }
+
+        for (var selector in mergedSelectors) {
+            var psuedoStyle = mergedSelectors[selector];
+            var properties = Object.properties(psuedoStyle);
+            if (properties.length) {
+                builder.push(selector + " {");
+                for (var i = 0; i < properties.length; ++i) {
+                    var property = properties[i];
+                    var value = psuedoStyle[property];
+                    if (!(value instanceof Array))
+                        builder.push(displayProperty(property, value));
+                    else {
+                        if (value.length === 1)
+                            builder.push(displayProperty(property, value) + " /* merged from equivalent edits */"); // UIString?
+                        else {                        
+                            builder.push(indent + "/* There was a Conflict... There were Multiple Edits for '" + property + "' */"); // UIString?
+                            for (var j = 0; j < value.length; ++j)
+                                builder.push(displayProperty(property, value, true));
+                        }
+                    }
+                }
+                builder.push("}\n");
+            }
+        }
+
+        WebInspector.showConsole();
+        WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(builder.join("\n")));
+    },
+
+    get rootDOMNode()
+    {
+        return this.treeOutline.rootDOMNode;
+    },
+
+    set rootDOMNode(x)
+    {
+        this.treeOutline.rootDOMNode = x;
+    },
+
+    get focusedDOMNode()
+    {
+        return this.treeOutline.focusedDOMNode;
+    },
+
+    set focusedDOMNode(x)
+    {
+        this.treeOutline.focusedDOMNode = x;
+    },
+
+    _attributesUpdated: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, updated: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _nodeInserted: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, inserted: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _nodeRemoved: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, removed: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _updateModifiedNodesSoon: function()
+    {
+        if ("_updateModifiedNodesTimeout" in this)
+            return;
+        this._updateModifiedNodesTimeout = setTimeout(this.updateModifiedNodes.bind(this), 0);
+    },
+
+    updateModifiedNodes: function()
+    {
+        if ("_updateModifiedNodesTimeout" in this) {
+            clearTimeout(this._updateModifiedNodesTimeout);
+            delete this._updateModifiedNodesTimeout;
+        }
+
+        var updatedParentTreeElements = [];
+        var updateBreadcrumbs = false;
+
+        for (var i = 0; i < this.recentlyModifiedNodes.length; ++i) {
+            var replaced = this.recentlyModifiedNodes[i].replaced;
+            var parent = this.recentlyModifiedNodes[i].parent;
+            var node = this.recentlyModifiedNodes[i].node;
+
+            if (this.recentlyModifiedNodes[i].updated) {
+                var nodeItem = this.treeOutline.findTreeElement(node);
+                if (nodeItem)
+                    nodeItem.updateTitle();
+                continue;
+            }
+            
+            if (!parent)
+                continue;
+
+            var parentNodeItem = this.treeOutline.findTreeElement(parent);
+            if (parentNodeItem && !parentNodeItem.alreadyUpdatedChildren) {
+                parentNodeItem.updateChildren(replaced);
+                parentNodeItem.alreadyUpdatedChildren = true;
+                updatedParentTreeElements.push(parentNodeItem);
+            }
+
+            if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))
+                updateBreadcrumbs = true;
+        }
+
+        for (var i = 0; i < updatedParentTreeElements.length; ++i)
+            delete updatedParentTreeElements[i].alreadyUpdatedChildren;
+
+        this.recentlyModifiedNodes = [];
+
+        if (updateBreadcrumbs)
+            this.updateBreadcrumb(true);
+    },
+
+    _stylesPaneEdited: function()
+    {
+        this.sidebarPanes.metrics.needsUpdate = true;
+        this.updateMetrics();
+    },
+
+    _metricsPaneEdited: function()
+    {
+        this.sidebarPanes.styles.needsUpdate = true;
+        this.updateStyles(true);
+    },
+
+    _mouseMovedInCrumbs: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");
+
+        WebInspector.hoveredDOMNode = (crumbElement ? crumbElement.representedObject : null);
+
+        if ("_mouseOutOfCrumbsTimeout" in this) {
+            clearTimeout(this._mouseOutOfCrumbsTimeout);
+            delete this._mouseOutOfCrumbsTimeout;
+        }
+    },
+
+    _mouseMovedOutOfCrumbs: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.crumbsElement))
+            return;
+
+        WebInspector.hoveredDOMNode = null;
+
+        this._mouseOutOfCrumbsTimeout = setTimeout(this.updateBreadcrumbSizes.bind(this), 1000);
+    },
+
+    updateBreadcrumb: function(forceUpdate)
+    {
+        if (!this.visible)
+            return;
+
+        var crumbs = this.crumbsElement;
+
+        var handled = false;
+        var foundRoot = false;
+        var crumb = crumbs.firstChild;
+        while (crumb) {
+            if (crumb.representedObject === this.rootDOMNode)
+                foundRoot = true;
+
+            if (foundRoot)
+                crumb.addStyleClass("dimmed");
+            else
+                crumb.removeStyleClass("dimmed");
+
+            if (crumb.representedObject === this.focusedDOMNode) {
+                crumb.addStyleClass("selected");
+                handled = true;
+            } else {
+                crumb.removeStyleClass("selected");
+            }
+
+            crumb = crumb.nextSibling;
+        }
+
+        if (handled && !forceUpdate) {
+            // We don't need to rebuild the crumbs, but we need to adjust sizes
+            // to reflect the new focused or root node.
+            this.updateBreadcrumbSizes();
+            return;
+        }
+
+        crumbs.removeChildren();
+
+        var panel = this;
+
+        function selectCrumbFunction(event)
+        {
+            var crumb = event.currentTarget;
+            if (crumb.hasStyleClass("collapsed")) {
+                // Clicking a collapsed crumb will expose the hidden crumbs.
+                if (crumb === panel.crumbsElement.firstChild) {
+                    // If the focused crumb is the first child, pick the farthest crumb
+                    // that is still hidden. This allows the user to expose every crumb.
+                    var currentCrumb = crumb;
+                    while (currentCrumb) {
+                        var hidden = currentCrumb.hasStyleClass("hidden");
+                        var collapsed = currentCrumb.hasStyleClass("collapsed");
+                        if (!hidden && !collapsed)
+                            break;
+                        crumb = currentCrumb;
+                        currentCrumb = currentCrumb.nextSibling;
+                    }
+                }
+
+                panel.updateBreadcrumbSizes(crumb);
+            } else {
+                // Clicking a dimmed crumb or double clicking (event.detail >= 2)
+                // will change the root node in addition to the focused node.
+                if (event.detail >= 2 || crumb.hasStyleClass("dimmed"))
+                    panel.rootDOMNode = crumb.representedObject.parentNode;
+                panel.focusedDOMNode = crumb.representedObject;
+            }
+
+            event.preventDefault();
+        }
+
+        foundRoot = false;
+        for (var current = this.focusedDOMNode; current; current = current.parentNode) {
+            if (current.nodeType === Node.DOCUMENT_NODE)
+                continue;
+
+            if (current === this.rootDOMNode)
+                foundRoot = true;
+
+            var crumb = document.createElement("span");
+            crumb.className = "crumb";
+            crumb.representedObject = current;
+            crumb.addEventListener("mousedown", selectCrumbFunction, false);
+
+            var crumbTitle;
+            switch (current.nodeType) {
+                case Node.ELEMENT_NODE:
+                    crumbTitle = current.nodeName.toLowerCase();
+
+                    var nameElement = document.createElement("span");
+                    nameElement.textContent = crumbTitle;
+                    crumb.appendChild(nameElement);
+
+                    var idAttribute = current.getAttribute("id");
+                    if (idAttribute) {
+                        var idElement = document.createElement("span");
+                        crumb.appendChild(idElement);
+
+                        var part = "#" + idAttribute;
+                        crumbTitle += part;
+                        idElement.appendChild(document.createTextNode(part));
+
+                        // Mark the name as extra, since the ID is more important.
+                        nameElement.className = "extra";
+                    }
+
+                    var classAttribute = current.getAttribute("class");
+                    if (classAttribute) {
+                        var classes = classAttribute.split(/\s+/);
+                        var foundClasses = {};
+
+                        if (classes.length) {
+                            var classesElement = document.createElement("span");
+                            classesElement.className = "extra";
+                            crumb.appendChild(classesElement);
+
+                            for (var i = 0; i < classes.length; ++i) {
+                                var className = classes[i];
+                                if (className && !(className in foundClasses)) {
+                                    var part = "." + className;
+                                    crumbTitle += part;
+                                    classesElement.appendChild(document.createTextNode(part));
+                                    foundClasses[className] = true;
+                                }
+                            }
+                        }
+                    }
+
+                    break;
+
+                case Node.TEXT_NODE:
+                    if (isNodeWhitespace.call(current))
+                        crumbTitle = WebInspector.UIString("(whitespace)");
+                    else
+                        crumbTitle = WebInspector.UIString("(text)");
+                    break
+
+                case Node.COMMENT_NODE:
+                    crumbTitle = "<!-->";
+                    break;
+
+                case Node.DOCUMENT_TYPE_NODE:
+                    crumbTitle = "<!DOCTYPE>";
+                    break;
+
+                default:
+                    crumbTitle = current.nodeName.toLowerCase();
+            }
+
+            if (!crumb.childNodes.length) {
+                var nameElement = document.createElement("span");
+                nameElement.textContent = crumbTitle;
+                crumb.appendChild(nameElement);
+            }
+
+            crumb.title = crumbTitle;
+
+            if (foundRoot)
+                crumb.addStyleClass("dimmed");
+            if (current === this.focusedDOMNode)
+                crumb.addStyleClass("selected");
+            if (!crumbs.childNodes.length)
+                crumb.addStyleClass("end");
+
+            crumbs.appendChild(crumb);
+        }
+
+        if (crumbs.hasChildNodes())
+            crumbs.lastChild.addStyleClass("start");
+
+        this.updateBreadcrumbSizes();
+    },
+
+    updateBreadcrumbSizes: function(focusedCrumb)
+    {
+        if (!this.visible)
+            return;
+
+        if (document.body.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        var crumbs = this.crumbsElement;
+        if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)
+            return; // No crumbs, do nothing.
+
+        // A Zero index is the right most child crumb in the breadcrumb.
+        var selectedIndex = 0;
+        var focusedIndex = 0;
+        var selectedCrumb;
+
+        var i = 0;
+        var crumb = crumbs.firstChild;
+        while (crumb) {
+            // Find the selected crumb and index. 
+            if (!selectedCrumb && crumb.hasStyleClass("selected")) {
+                selectedCrumb = crumb;
+                selectedIndex = i;
+            }
+
+            // Find the focused crumb index. 
+            if (crumb === focusedCrumb)
+                focusedIndex = i;
+
+            // Remove any styles that affect size before
+            // deciding to shorten any crumbs.
+            if (crumb !== crumbs.lastChild)
+                crumb.removeStyleClass("start");
+            if (crumb !== crumbs.firstChild)
+                crumb.removeStyleClass("end");
+
+            crumb.removeStyleClass("compact");
+            crumb.removeStyleClass("collapsed");
+            crumb.removeStyleClass("hidden");
+
+            crumb = crumb.nextSibling;
+            ++i;
+        }
+
+        // Restore the start and end crumb classes in case they got removed in coalesceCollapsedCrumbs().
+        // The order of the crumbs in the document is opposite of the visual order.
+        crumbs.firstChild.addStyleClass("end");
+        crumbs.lastChild.addStyleClass("start");
+
+        function crumbsAreSmallerThanContainer()
+        {
+            var rightPadding = 20;
+            var errorWarningElement = document.getElementById("error-warning-count");
+            if (!WebInspector.drawer.visible && errorWarningElement)
+                rightPadding += errorWarningElement.offsetWidth;
+            return ((crumbs.totalOffsetLeft + crumbs.offsetWidth + rightPadding) < window.innerWidth);
+        }
+
+        if (crumbsAreSmallerThanContainer())
+            return; // No need to compact the crumbs, they all fit at full size.
+
+        var BothSides = 0;
+        var AncestorSide = -1;
+        var ChildSide = 1;
+
+        function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb)
+        {
+            if (!significantCrumb)
+                significantCrumb = (focusedCrumb || selectedCrumb);
+
+            if (significantCrumb === selectedCrumb)
+                var significantIndex = selectedIndex;
+            else if (significantCrumb === focusedCrumb)
+                var significantIndex = focusedIndex;
+            else {
+                var significantIndex = 0;
+                for (var i = 0; i < crumbs.childNodes.length; ++i) {
+                    if (crumbs.childNodes[i] === significantCrumb) {
+                        significantIndex = i;
+                        break;
+                    }
+                }
+            }
+
+            function shrinkCrumbAtIndex(index)
+            {
+                var shrinkCrumb = crumbs.childNodes[index];
+                if (shrinkCrumb && shrinkCrumb !== significantCrumb)
+                    shrinkingFunction(shrinkCrumb);
+                if (crumbsAreSmallerThanContainer())
+                    return true; // No need to compact the crumbs more.
+                return false;
+            }
+
+            // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs
+            // fit in the container or we run out of crumbs to shrink.
+            if (direction) {
+                // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb.
+                var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1);
+                while (index !== significantIndex) {
+                    if (shrinkCrumbAtIndex(index))
+                        return true;
+                    index += (direction > 0 ? 1 : -1);
+                }
+            } else {
+                // Crumbs are shrunk in order of descending distance from the signifcant crumb,
+                // with a tie going to child crumbs.
+                var startIndex = 0;
+                var endIndex = crumbs.childNodes.length - 1;
+                while (startIndex != significantIndex || endIndex != significantIndex) {
+                    var startDistance = significantIndex - startIndex;
+                    var endDistance = endIndex - significantIndex;
+                    if (startDistance >= endDistance)
+                        var index = startIndex++;
+                    else
+                        var index = endIndex--;
+                    if (shrinkCrumbAtIndex(index))
+                        return true;
+                }
+            }
+
+            // We are not small enough yet, return false so the caller knows.
+            return false;
+        }
+
+        function coalesceCollapsedCrumbs()
+        {
+            var crumb = crumbs.firstChild;
+            var collapsedRun = false;
+            var newStartNeeded = false;
+            var newEndNeeded = false;
+            while (crumb) {
+                var hidden = crumb.hasStyleClass("hidden");
+                if (!hidden) {
+                    var collapsed = crumb.hasStyleClass("collapsed"); 
+                    if (collapsedRun && collapsed) {
+                        crumb.addStyleClass("hidden");
+                        crumb.removeStyleClass("compact");
+                        crumb.removeStyleClass("collapsed");
+
+                        if (crumb.hasStyleClass("start")) {
+                            crumb.removeStyleClass("start");
+                            newStartNeeded = true;
+                        }
+
+                        if (crumb.hasStyleClass("end")) {
+                            crumb.removeStyleClass("end");
+                            newEndNeeded = true;
+                        }
+
+                        continue;
+                    }
+
+                    collapsedRun = collapsed;
+
+                    if (newEndNeeded) {
+                        newEndNeeded = false;
+                        crumb.addStyleClass("end");
+                    }
+                } else
+                    collapsedRun = true;
+                crumb = crumb.nextSibling;
+            }
+
+            if (newStartNeeded) {
+                crumb = crumbs.lastChild;
+                while (crumb) {
+                    if (!crumb.hasStyleClass("hidden")) {
+                        crumb.addStyleClass("start");
+                        break;
+                    }
+                    crumb = crumb.previousSibling;
+                }
+            }
+        }
+
+        function compact(crumb)
+        {
+            if (crumb.hasStyleClass("hidden"))
+                return;
+            crumb.addStyleClass("compact");
+        }
+
+        function collapse(crumb, dontCoalesce)
+        {
+            if (crumb.hasStyleClass("hidden"))
+                return;
+            crumb.addStyleClass("collapsed");
+            crumb.removeStyleClass("compact");
+            if (!dontCoalesce)
+                coalesceCollapsedCrumbs();
+        }
+
+        function compactDimmed(crumb)
+        {
+            if (crumb.hasStyleClass("dimmed"))
+                compact(crumb);
+        }
+
+        function collapseDimmed(crumb)
+        {
+            if (crumb.hasStyleClass("dimmed"))
+                collapse(crumb);
+        }
+
+        if (!focusedCrumb) {
+            // When not focused on a crumb we can be biased and collapse less important
+            // crumbs that the user might not care much about.
+
+            // Compact child crumbs.
+            if (makeCrumbsSmaller(compact, ChildSide))
+                return;
+
+            // Collapse child crumbs.
+            if (makeCrumbsSmaller(collapse, ChildSide))
+                return;
+
+            // Compact dimmed ancestor crumbs.
+            if (makeCrumbsSmaller(compactDimmed, AncestorSide))
+                return;
+
+            // Collapse dimmed ancestor crumbs.
+            if (makeCrumbsSmaller(collapseDimmed, AncestorSide))
+                return;
+        }
+
+        // Compact ancestor crumbs, or from both sides if focused.
+        if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide)))
+            return;
+
+        // Collapse ancestor crumbs, or from both sides if focused.
+        if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide)))
+            return;
+
+        if (!selectedCrumb)
+            return;
+
+        // Compact the selected crumb.
+        compact(selectedCrumb);
+        if (crumbsAreSmallerThanContainer())
+            return;
+
+        // Collapse the selected crumb as a last resort. Pass true to prevent coalescing.
+        collapse(selectedCrumb, true);
+    },
+
+    updateStyles: function(forceUpdate)
+    {
+        var stylesSidebarPane = this.sidebarPanes.styles;
+        if (!stylesSidebarPane.expanded || !stylesSidebarPane.needsUpdate)
+            return;
+
+        stylesSidebarPane.update(this.focusedDOMNode, null, forceUpdate);
+        stylesSidebarPane.needsUpdate = false;
+    },
+
+    updateMetrics: function()
+    {
+        var metricsSidebarPane = this.sidebarPanes.metrics;
+        if (!metricsSidebarPane.expanded || !metricsSidebarPane.needsUpdate)
+            return;
+
+        metricsSidebarPane.update(this.focusedDOMNode);
+        metricsSidebarPane.needsUpdate = false;
+    },
+
+    updateProperties: function()
+    {
+        var propertiesSidebarPane = this.sidebarPanes.properties;
+        if (!propertiesSidebarPane.expanded || !propertiesSidebarPane.needsUpdate)
+            return;
+
+        propertiesSidebarPane.update(this.focusedDOMNode);
+        propertiesSidebarPane.needsUpdate = false;
+    },
+
+    updateEventListeners: function()
+    {
+        var eventListenersSidebarPane = this.sidebarPanes.eventListeners;
+        if (!eventListenersSidebarPane.expanded || !eventListenersSidebarPane.needsUpdate)
+            return;
+
+        eventListenersSidebarPane.update(this.focusedDOMNode);
+        eventListenersSidebarPane.needsUpdate = false;
+    },
+
+    handleShortcut: function(event)
+    {
+        // Cmd/Control + Shift + C should be a shortcut to clicking the Node Search Button.
+        // This shortcut matches Firebug.
+        if (event.keyIdentifier === "U+0043") {     // C key
+            if (WebInspector.isMac())
+                var isNodeSearchKey = event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey;
+            else
+                var isNodeSearchKey = event.ctrlKey && !event.metaKey && !event.altKey && event.shiftKey;
+
+            if (isNodeSearchKey) {
+                this._nodeSearchButtonClicked(event);
+                event.handled = true;
+                return;
+            }
+        }
+    },
+
+    handleCopyEvent: function(event)
+    {
+        // Don't prevent the normal copy if the user has a selection.
+        if (!window.getSelection().isCollapsed)
+            return;
+        event.clipboardData.clearData();
+        event.preventDefault();
+        InspectorBackend.copyNode(this.focusedDOMNode.id);
+    },
+
+    rightSidebarResizerDragStart: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarElement, this.rightSidebarResizerDrag.bind(this), this.rightSidebarResizerDragEnd.bind(this), event, "col-resize");
+    },
+
+    rightSidebarResizerDragEnd: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    },
+
+    rightSidebarResizerDrag: function(event)
+    {
+        var x = event.pageX;
+        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minElementsSidebarWidth, window.innerWidth * 0.66);
+
+        this.sidebarElement.style.width = newWidth + "px";
+        this.contentElement.style.right = newWidth + "px";
+        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
+
+        this.treeOutline.updateSelection();
+
+        event.preventDefault();
+    },
+
+    _nodeSearchButtonClicked: function(event)
+    {
+        if (!this._nodeSearchButton.toggled)
+            InspectorBackend.enableSearchingForNode();
+        else
+            InspectorBackend.disableSearchingForNode();
+    }
+}
+
+WebInspector.ElementsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* ResourcesPanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourcesPanel = function()
+{
+    WebInspector.AbstractTimelinePanel.call(this);
+
+    this.element.addStyleClass("resources");
+
+    this._createPanelEnabler();
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "resource-views";
+    this.element.appendChild(this.viewsContainerElement);
+
+    this.createFilterPanel();
+    this.createInterface();
+
+    this._createStatusbarButtons();
+
+    this.reset();
+    this.filter(this.filterAllElement, false);
+    this.graphsTreeElement.children[0].select();
+    this._resourceTrackingEnabled = false;
+}
+
+WebInspector.ResourcesPanel.prototype = {
+    toolbarItemClass: "resources",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Resources");
+    },
+
+    get statusBarItems()
+    {
+        return [this.enableToggleButton.element, this.largerResourcesButton.element, this.sortingSelectElement];
+    },
+
+    get categories()
+    {
+        return WebInspector.resourceCategories;
+    },
+
+    createItemTreeElement: function(item)
+    {
+        return new WebInspector.ResourceSidebarTreeElement(item);
+    },
+
+    createItemGraph: function(item)
+    {
+        return new WebInspector.ResourceGraph(item);
+    },
+
+    isCategoryVisible: function(categoryName)
+    {
+        return (this.itemsGraphsElement.hasStyleClass("filter-all") || this.itemsGraphsElement.hasStyleClass("filter-" + categoryName.toLowerCase()));
+    },
+
+    populateSidebar: function()
+    {
+        var timeGraphItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Time"));
+        timeGraphItem.onselect = this._graphSelected.bind(this);
+
+        var transferTimeCalculator = new WebInspector.ResourceTransferTimeCalculator();
+        var transferDurationCalculator = new WebInspector.ResourceTransferDurationCalculator();
+
+        timeGraphItem.sortingOptions = [
+            { name: WebInspector.UIString("Sort by Start Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by Response Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by End Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by Duration"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration, calculator: transferDurationCalculator },
+            { name: WebInspector.UIString("Sort by Latency"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency, calculator: transferDurationCalculator },
+        ];
+
+        timeGraphItem.isBarOpaqueAtLeft = false;
+        timeGraphItem.selectedSortingOptionIndex = 1;
+
+        var sizeGraphItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Size"));
+        sizeGraphItem.onselect = this._graphSelected.bind(this);
+
+        var transferSizeCalculator = new WebInspector.ResourceTransferSizeCalculator();
+        sizeGraphItem.sortingOptions = [
+            { name: WebInspector.UIString("Sort by Transfer Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingTransferSize, calculator: transferSizeCalculator },
+            { name: WebInspector.UIString("Sort by Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize, calculator: transferSizeCalculator },
+        ];
+
+        sizeGraphItem.isBarOpaqueAtLeft = true;
+        sizeGraphItem.selectedSortingOptionIndex = 0;
+
+        this.graphsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("GRAPHS"), {}, true);
+        this.sidebarTree.appendChild(this.graphsTreeElement);
+
+        this.graphsTreeElement.appendChild(timeGraphItem);
+        this.graphsTreeElement.appendChild(sizeGraphItem);
+        this.graphsTreeElement.expand();
+
+        this.itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESOURCES"), {}, true);
+        this.sidebarTree.appendChild(this.itemsTreeElement);
+
+        this.itemsTreeElement.expand();
+    },
+
+    get resourceTrackingEnabled()
+    {
+        return this._resourceTrackingEnabled;
+    },
+
+    _createPanelEnabler: function()
+    {
+        var panelEnablerHeading = WebInspector.UIString("You need to enable resource tracking to use this panel.");
+        var panelEnablerDisclaimer = WebInspector.UIString("Enabling resource tracking will reload the page and make page loading slower.");
+        var panelEnablerButton = WebInspector.UIString("Enable resource tracking");
+
+        this.panelEnablerView = new WebInspector.PanelEnablerView("resources", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+        this.panelEnablerView.addEventListener("enable clicked", this._enableResourceTracking, this);
+
+        this.element.appendChild(this.panelEnablerView.element);
+
+        this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+        this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
+    },
+
+    _createStatusbarButtons: function()
+    {
+        this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
+
+        WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+        this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
+        this.sortingSelectElement = document.createElement("select");
+        this.sortingSelectElement.className = "status-bar-item";
+        this.sortingSelectElement.addEventListener("change", this._changeSortingFunction.bind(this), false);
+    },
+
+    _settingsLoaded: function()
+    {
+        this.largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
+        if (!WebInspector.settings.resourcesLargeRows)
+            this._setLargerResources(WebInspector.settings.resourcesLargeRows);
+    },
+
+    get mainResourceLoadTime()
+    {
+        return this._mainResourceLoadTime || -1;
+    },
+    
+    set mainResourceLoadTime(x)
+    {
+        if (this._mainResourceLoadTime === x)
+            return;
+        
+        this._mainResourceLoadTime = x;
+        
+        // Update the dividers to draw the new line
+        this.updateGraphDividersIfNeeded(true);
+    },
+    
+    get mainResourceDOMContentTime()
+    {
+        return this._mainResourceDOMContentTime || -1;
+    },
+    
+    set mainResourceDOMContentTime(x)
+    {
+        if (this._mainResourceDOMContentTime === x)
+            return;
+        
+        this._mainResourceDOMContentTime = x;
+        
+        this.updateGraphDividersIfNeeded(true);
+    },
+
+    show: function()
+    {
+        WebInspector.AbstractTimelinePanel.prototype.show.call(this);
+
+        var visibleView = this.visibleView;
+        if (this.visibleResource) {
+            this.visibleView.headersVisible = true;
+            this.visibleView.show(this.viewsContainerElement);
+        } else if (visibleView)
+            visibleView.show();
+
+        // Hide any views that are visible that are not this panel's current visible view.
+        // This can happen when a ResourceView is visible in the Scripts panel then switched
+        // to the this panel.
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            var view = resource._resourcesView;
+            if (!view || view === visibleView)
+                continue;
+            view.visible = false;
+        }
+    },
+
+    get searchableViews()
+    {
+        var views = [];
+
+        const visibleView = this.visibleView;
+        if (visibleView && visibleView.performSearch)
+            views.push(visibleView);
+
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            if (!resource._itemsTreeElement)
+                continue;
+            var resourceView = this.resourceViewForResource(resource);
+            if (!resourceView.performSearch || resourceView === visibleView)
+                continue;
+            views.push(resourceView);
+        }
+
+        return views;
+    },
+
+    get searchResultsSortFunction()
+    {
+        const resourceTreeElementSortFunction = this.sortingFunction;
+
+        function sortFuction(a, b)
+        {
+            return resourceTreeElementSortFunction(a.resource._itemsTreeElement, b.resource._itemsTreeElement);
+        }
+
+        return sortFuction;
+    },
+
+    searchMatchFound: function(view, matches)
+    {
+        view.resource._itemsTreeElement.searchMatches = matches;
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
+
+        if (startingNewSearch || !this._resources)
+            return;
+
+        for (var i = 0; i < this._resources.length; ++i) {
+            var resource = this._resources[i];
+            if (resource._itemsTreeElement)
+                resource._itemsTreeElement.updateErrorsAndWarnings();
+        }
+    },
+
+    performSearch: function(query)
+    {
+        for (var i = 0; i < this._resources.length; ++i) {
+            var resource = this._resources[i];
+            if (resource._itemsTreeElement)
+                resource._itemsTreeElement.resetBubble();
+        }
+
+        WebInspector.Panel.prototype.performSearch.call(this, query);
+    },
+
+    get visibleView()
+    {
+        if (this.visibleResource)
+            return this.visibleResource._resourcesView;
+        return this._resourceTrackingEnabled ? null : this.panelEnablerView;
+    },
+
+    get sortingFunction()
+    {
+        return this._sortingFunction;
+    },
+
+    set sortingFunction(x)
+    {
+        this._sortingFunction = x;
+        this._sortResourcesIfNeeded();
+    },
+
+    refresh: function()
+    {
+        WebInspector.AbstractTimelinePanel.prototype.refresh.call(this);
+
+        this._sortResourcesIfNeeded();
+        this._updateSummaryGraph();
+    },
+
+    _updateSummaryGraph: function()
+    {
+        this.summaryBar.update(this._resources);
+    },
+
+    resourceTrackingWasEnabled: function()
+    {
+        this._resourceTrackingEnabled = true;
+        this.reset();
+    },
+
+    resourceTrackingWasDisabled: function()
+    {
+        this._resourceTrackingEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        this.closeVisibleResource();
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        if (this._resources) {
+            var resourcesLength = this._resources.length;
+            for (var i = 0; i < resourcesLength; ++i) {
+                var resource = this._resources[i];
+
+                resource.warnings = 0;
+                resource.errors = 0;
+
+                delete resource._resourcesView;
+            }
+        }
+
+        WebInspector.AbstractTimelinePanel.prototype.reset.call(this);
+        
+        this.mainResourceLoadTime = -1;
+        this.mainResourceDOMContentTime = -1;
+ 
+        this.viewsContainerElement.removeChildren();
+
+        this.summaryBar.reset();
+
+        if (this._resourceTrackingEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Resource tracking enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            this.largerResourcesButton.visible = true;
+            this.sortingSelectElement.removeStyleClass("hidden");
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Resource tracking disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            this.largerResourcesButton.visible = false;
+            this.sortingSelectElement.addStyleClass("hidden");
+            this.panelEnablerView.visible = true;
+        }
+    },
+
+    addResource: function(resource)
+    {
+        this._resources.push(resource);
+        this.refreshResource(resource);
+    },
+
+    removeResource: function(resource)
+    {
+        if (this.visibleView === resource._resourcesView)
+            this.closeVisibleResource();
+
+        this.removeItem(resource);
+
+        resource.warnings = 0;
+        resource.errors = 0;
+
+        delete resource._resourcesView;
+    },
+
+    addMessageToResource: function(resource, msg)
+    {
+        if (!resource)
+            return;
+
+        switch (msg.level) {
+        case WebInspector.ConsoleMessage.MessageLevel.Warning:
+            resource.warnings += msg.repeatDelta;
+            break;
+        case WebInspector.ConsoleMessage.MessageLevel.Error:
+            resource.errors += msg.repeatDelta;
+            break;
+        }
+
+        if (!this.currentQuery && resource._itemsTreeElement)
+            resource._itemsTreeElement.updateErrorsAndWarnings();
+
+        var view = this.resourceViewForResource(resource);
+        if (view.addMessage)
+            view.addMessage(msg);
+    },
+
+    clearMessages: function()
+    {
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            resource.warnings = 0;
+            resource.errors = 0;
+
+            if (!this.currentQuery && resource._itemsTreeElement)
+                resource._itemsTreeElement.updateErrorsAndWarnings();
+
+            var view = resource._resourcesView;
+            if (!view || !view.clearMessages)
+                continue;
+            view.clearMessages();
+        }
+    },
+
+    refreshResource: function(resource)
+    {
+        this.refreshItem(resource);
+    },
+
+    recreateViewForResourceIfNeeded: function(resource)
+    {
+        if (!resource || !resource._resourcesView)
+            return;
+
+        var newView = this._createResourceView(resource);
+        if (newView.__proto__ === resource._resourcesView.__proto__)
+            return;
+
+        resource.warnings = 0;
+        resource.errors = 0;
+
+        if (!this.currentQuery && resource._itemsTreeElement)
+            resource._itemsTreeElement.updateErrorsAndWarnings();
+
+        var oldView = resource._resourcesView;
+        var oldViewParentNode = oldView.visible ? oldView.element.parentNode : null;
+
+        resource._resourcesView.detach();
+        delete resource._resourcesView;
+
+        resource._resourcesView = newView;
+
+        newView.headersVisible = oldView.headersVisible;
+
+        if (oldViewParentNode)
+            newView.show(oldViewParentNode);
+
+        WebInspector.panels.scripts.viewRecreated(oldView, newView);
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        return this._resourceTrackingEnabled && !!WebInspector.resourceForURL(url);
+    },
+
+    showSourceLine: function(url, line)
+    {
+        this.showResource(WebInspector.resourceForURL(url), line);
+    },
+
+    showResource: function(resource, line)
+    {
+        if (!resource)
+            return;
+
+        this.containerElement.addStyleClass("viewing-resource");
+
+        if (this.visibleResource && this.visibleResource._resourcesView)
+            this.visibleResource._resourcesView.hide();
+
+        var view = this.resourceViewForResource(resource);
+        view.headersVisible = true;
+        view.selectContentTab();
+        view.show(this.viewsContainerElement);
+
+        if (line) {
+            if (view.revealLine)
+                view.revealLine(line);
+            if (view.highlightLine)
+                view.highlightLine(line);
+        }
+
+        this.revealAndSelectItem(resource);
+
+        this.visibleResource = resource;
+
+        this.updateSidebarWidth();
+    },
+
+    showView: function(view)
+    {
+        if (!view)
+            return;
+        this.showResource(view.resource);
+    },
+
+    closeVisibleResource: function()
+    {
+        this.containerElement.removeStyleClass("viewing-resource");
+        this._updateDividersLabelBarPosition();
+
+        if (this.visibleResource && this.visibleResource._resourcesView)
+            this.visibleResource._resourcesView.hide();
+        delete this.visibleResource;
+
+        if (this._lastSelectedGraphTreeElement)
+            this._lastSelectedGraphTreeElement.select(true);
+
+        this.updateSidebarWidth();
+    },
+
+    resourceViewForResource: function(resource)
+    {
+        if (!resource)
+            return null;
+        if (!resource._resourcesView)
+            resource._resourcesView = this._createResourceView(resource);
+        return resource._resourcesView;
+    },
+
+    sourceFrameForResource: function(resource)
+    {
+        var view = this.resourceViewForResource(resource);
+        if (!view)
+            return null;
+
+        if (!view.setupSourceFrameIfNeeded)
+            return null;
+
+        // Setting up the source frame requires that we be attached.
+        if (!this.element.parentNode)
+            this.attach();
+
+        view.setupSourceFrameIfNeeded();
+        return view.sourceFrame;
+    },
+
+    _sortResourcesIfNeeded: function()
+    {
+        this.sortItems(this.sortingFunction);
+    },
+
+    updateGraphDividersIfNeeded: function(force)
+    {
+        var proceed = WebInspector.AbstractTimelinePanel.prototype.updateGraphDividersIfNeeded.call(this, force);
+        
+        if (!proceed)
+            return;
+
+        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
+            // If our current sorting method starts at zero, that means it shows all
+            // resources starting at the same point, and so onLoad event and DOMContent
+            // event lines really wouldn't make much sense here, so don't render them.
+            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
+            // function defined, we are probably sorting by size, and event times aren't relevant
+            // in this case.
+            return;
+        }
+
+        if (this.mainResourceLoadTime !== -1) {
+            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceLoadTime);
+
+            var loadDivider = document.createElement("div");
+            loadDivider.className = "resources-onload-divider";
+
+            var loadDividerPadding = document.createElement("div");
+            loadDividerPadding.className = "resources-event-divider-padding";
+            loadDividerPadding.style.left = percent + "%";
+            loadDividerPadding.title = WebInspector.UIString("Load event fired");
+            loadDividerPadding.appendChild(loadDivider);
+
+            this.addEventDivider(loadDividerPadding);
+        }
+        
+        if (this.mainResourceDOMContentTime !== -1) {
+            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceDOMContentTime);
+
+            var domContentDivider = document.createElement("div");
+            domContentDivider.className = "resources-ondomcontent-divider";
+            
+            var domContentDividerPadding = document.createElement("div");
+            domContentDividerPadding.className = "resources-event-divider-padding";
+            domContentDividerPadding.style.left = percent + "%";
+            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
+            domContentDividerPadding.appendChild(domContentDivider);
+
+            this.addEventDivider(domContentDividerPadding);
+        }
+    },
+
+    _graphSelected: function(treeElement)
+    {
+        if (this._lastSelectedGraphTreeElement)
+            this._lastSelectedGraphTreeElement.selectedSortingOptionIndex = this.sortingSelectElement.selectedIndex;
+
+        this._lastSelectedGraphTreeElement = treeElement;
+
+        this.sortingSelectElement.removeChildren();
+        for (var i = 0; i < treeElement.sortingOptions.length; ++i) {
+            var sortingOption = treeElement.sortingOptions[i];
+            var option = document.createElement("option");
+            option.label = sortingOption.name;
+            option.sortingFunction = sortingOption.sortingFunction;
+            option.calculator = sortingOption.calculator;
+            this.sortingSelectElement.appendChild(option);
+        }
+
+        this.sortingSelectElement.selectedIndex = treeElement.selectedSortingOptionIndex;
+        this._changeSortingFunction();
+
+        this.closeVisibleResource();
+        this.containerElement.scrollTop = 0;
+    },
+
+    _toggleLargerResources: function()
+    {
+        if (!this.itemsTreeElement._childrenListNode)
+            return;
+
+        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
+        this._setLargerResources(this.itemsTreeElement.smallChildren);
+    },
+
+    _setLargerResources: function(enabled)
+    {
+        this.largerResourcesButton.toggled = enabled;
+        this.itemsTreeElement.smallChildren = !enabled;
+        if (!enabled) {
+            this.itemsGraphsElement.addStyleClass("small");
+            this.largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
+            this.adjustScrollPosition();
+        } else {
+            this.itemsGraphsElement.removeStyleClass("small");
+            this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
+        }
+    },
+
+    _changeSortingFunction: function()
+    {
+        var selectedOption = this.sortingSelectElement[this.sortingSelectElement.selectedIndex];
+        this.sortingFunction = selectedOption.sortingFunction;
+        this.calculator = this.summaryBar.calculator = selectedOption.calculator;
+    },
+
+    _createResourceView: function(resource)
+    {
+        switch (resource.category) {
+            case WebInspector.resourceCategories.documents:
+            case WebInspector.resourceCategories.stylesheets:
+            case WebInspector.resourceCategories.scripts:
+            case WebInspector.resourceCategories.xhr:
+                return new WebInspector.SourceView(resource);
+            case WebInspector.resourceCategories.images:
+                return new WebInspector.ImageView(resource);
+            case WebInspector.resourceCategories.fonts:
+                return new WebInspector.FontView(resource);
+            default:
+                return new WebInspector.ResourceView(resource);
+        }
+    },
+
+    setSidebarWidth: function(width)
+    {
+        if (this.visibleResource) {
+            this.containerElement.style.width = width + "px";
+            this.sidebarElement.style.removeProperty("width");
+        } else {
+            this.sidebarElement.style.width = width + "px";
+            this.containerElement.style.removeProperty("width");
+        }
+
+        this.sidebarResizeElement.style.left = (width - 3) + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.viewsContainerElement.style.left = width + "px";
+
+        WebInspector.AbstractTimelinePanel.prototype.updateMainViewWidth.call(this, width);
+        this.resize();
+    },
+
+    _enableResourceTracking: function()
+    {
+        if (this._resourceTrackingEnabled)
+            return;
+        this._toggleResourceTracking(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleResourceTracking: function(optionalAlways)
+    {
+        if (this._resourceTrackingEnabled) {
+            this.largerResourcesButton.visible = false;
+            this.sortingSelectElement.visible = false;
+            WebInspector.resources = {};
+            WebInspector.resourceURLMap = {};
+            InspectorBackend.disableResourceTracking(true);
+        } else {
+            this.largerResourcesButton.visible = true;
+            this.sortingSelectElement.visible = true;
+            InspectorBackend.enableResourceTracking(!!optionalAlways);
+        }
+    },
+
+    get _resources()
+    {
+        return this.items;
+    },
+
+    searchIteratesOverViews: function()
+    {
+        return true;
+    }
+}
+
+WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.AbstractTimelinePanel.prototype;
+
+WebInspector.getResourceContent = function(identifier, callback)
+{
+    InspectorBackend.getResourceContent(WebInspector.Callback.wrap(callback), identifier);
+}
+
+WebInspector.didGetResourceContent = WebInspector.Callback.processCallback;
+
+WebInspector.ResourceTimeCalculator = function(startAtZero)
+{
+    WebInspector.AbstractTimelineCalculator.call(this);
+    this.startAtZero = startAtZero;
+}
+
+WebInspector.ResourceTimeCalculator.prototype = {
+    computeSummaryValues: function(resources)
+    {
+        var resourcesByCategory = {};
+        var resourcesLength = resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = resources[i];
+            if (!(resource.category.name in resourcesByCategory))
+                resourcesByCategory[resource.category.name] = [];
+            resourcesByCategory[resource.category.name].push(resource);
+        }
+
+        var earliestStart;
+        var latestEnd;
+        var categoryValues = {};
+        for (var category in resourcesByCategory) {
+            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
+            categoryValues[category] = 0;
+
+            var segment = {start: -1, end: -1};
+
+            var categoryResources = resourcesByCategory[category];
+            var resourcesLength = categoryResources.length;
+            for (var i = 0; i < resourcesLength; ++i) {
+                var resource = categoryResources[i];
+                if (resource.startTime === -1 || resource.endTime === -1)
+                    continue;
+
+                if (typeof earliestStart === "undefined")
+                    earliestStart = resource.startTime;
+                else
+                    earliestStart = Math.min(earliestStart, resource.startTime);
+
+                if (typeof latestEnd === "undefined")
+                    latestEnd = resource.endTime;
+                else
+                    latestEnd = Math.max(latestEnd, resource.endTime);
+
+                if (resource.startTime <= segment.end) {
+                    segment.end = Math.max(segment.end, resource.endTime);
+                    continue;
+                }
+
+                categoryValues[category] += segment.end - segment.start;
+
+                segment.start = resource.startTime;
+                segment.end = resource.endTime;
+            }
+
+            // Add the last segment
+            categoryValues[category] += segment.end - segment.start;
+        }
+
+        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
+    },
+
+    computeBarGraphPercentages: function(resource)
+    {
+        if (resource.startTime !== -1)
+            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var start = 0;
+
+        if (resource.responseReceivedTime !== -1)
+            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var middle = (this.startAtZero ? start : 100);
+
+        if (resource.endTime !== -1)
+            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var end = (this.startAtZero ? middle : 100);
+
+        if (this.startAtZero) {
+            end -= start;
+            middle -= start;
+            start = 0;
+        }
+
+        return {start: start, middle: middle, end: end};
+    },
+    
+    computePercentageFromEventTime: function(eventTime)
+    {
+        // This function computes a percentage in terms of the total loading time
+        // of a specific event. If startAtZero is set, then this is useless, and we
+        // want to return 0.
+        if (eventTime !== -1 && !this.startAtZero)
+            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
+
+        return 0;
+    },
+
+    computeBarGraphLabels: function(resource)
+    {
+        var rightLabel = "";
+        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
+            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
+
+        var hasLatency = resource.latency > 0;
+        if (hasLatency)
+            var leftLabel = this.formatValue(resource.latency);
+        else
+            var leftLabel = rightLabel;
+
+        if (hasLatency && rightLabel) {
+            var total = this.formatValue(resource.duration);
+            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
+        } else if (hasLatency)
+            var tooltip = WebInspector.UIString("%s latency", leftLabel);
+        else if (rightLabel)
+            var tooltip = WebInspector.UIString("%s download", rightLabel);
+
+        if (resource.cached)
+            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
+
+        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
+    },
+
+    updateBoundaries: function(resource)
+    {
+        var didChange = false;
+
+        var lowerBound;
+        if (this.startAtZero)
+            lowerBound = 0;
+        else
+            lowerBound = this._lowerBound(resource);
+
+        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
+            this.minimumBoundary = lowerBound;
+            didChange = true;
+        }
+
+        var upperBound = this._upperBound(resource);
+        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
+            this.maximumBoundary = upperBound;
+            didChange = true;
+        }
+
+        return didChange;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _lowerBound: function(resource)
+    {
+        return 0;
+    },
+
+    _upperBound: function(resource)
+    {
+        return 0;
+    }
+}
+
+WebInspector.ResourceTimeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
+
+WebInspector.ResourceTransferTimeCalculator = function()
+{
+    WebInspector.ResourceTimeCalculator.call(this, false);
+}
+
+WebInspector.ResourceTransferTimeCalculator.prototype = {
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _lowerBound: function(resource)
+    {
+        return resource.startTime;
+    },
+
+    _upperBound: function(resource)
+    {
+        return resource.endTime;
+    }
+}
+
+WebInspector.ResourceTransferTimeCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
+
+WebInspector.ResourceTransferDurationCalculator = function()
+{
+    WebInspector.ResourceTimeCalculator.call(this, true);
+}
+
+WebInspector.ResourceTransferDurationCalculator.prototype = {
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _upperBound: function(resource)
+    {
+        return resource.duration;
+    }
+}
+
+WebInspector.ResourceTransferDurationCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
+
+WebInspector.ResourceTransferSizeCalculator = function()
+{
+    WebInspector.AbstractTimelineCalculator.call(this);
+}
+
+WebInspector.ResourceTransferSizeCalculator.prototype = {
+    computeBarGraphLabels: function(resource)
+    {
+        var networkBytes = this._networkBytes(resource);
+        var resourceBytes = this._value(resource);
+        if (networkBytes && networkBytes !== resourceBytes) {
+            // Transferred size is not the same as reported resource length.
+            var networkBytesString = this.formatValue(networkBytes);
+            var left = networkBytesString;
+            var right = this.formatValue(resourceBytes);
+            var tooltip = right ? WebInspector.UIString("%s (%s transferred)", right, networkBytesString) : right;
+        } else {
+            var left = this.formatValue(resourceBytes);
+            var right = left;
+            var tooltip = left;
+        }
+        if (resource.cached)
+            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
+        return {left: left, right: right, tooltip: tooltip};
+    },
+
+    computeBarGraphPercentages: function(item)
+    {
+        const resourceBytesAsPercent = (this._value(item) / this.boundarySpan) * 100;
+        const networkBytesAsPercent = this._networkBytes(item) ? (this._networkBytes(item) / this.boundarySpan) * 100 : resourceBytesAsPercent;
+        return {start: 0, middle: networkBytesAsPercent, end: resourceBytesAsPercent};
+    },
+
+    _value: function(resource)
+    {
+        return resource.resourceSize;
+    },
+
+    _networkBytes: function(resource)
+    {
+        return resource.transferSize;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.bytesToString(value, WebInspector.UIString.bind(WebInspector));
+    }
+}
+
+WebInspector.ResourceTransferSizeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
+
+WebInspector.ResourceSidebarTreeElement = function(resource)
+{
+    this.resource = resource;
+
+    this.createIconElement();
+
+    WebInspector.SidebarTreeElement.call(this, "resource-sidebar-tree-item", "", "", resource);
+
+    this.refreshTitles();
+}
+
+WebInspector.ResourceSidebarTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
+
+        this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
+        this._listItemNode.draggable = true;
+        
+        // FIXME: should actually add handler to parent, to be resolved via
+        // https://bugs.webkit.org/show_bug.cgi?id=30227
+        this._listItemNode.addEventListener("dragstart", this.ondragstart.bind(this), false);
+        this.updateErrorsAndWarnings();
+    },
+
+    onselect: function()
+    {
+        WebInspector.panels.resources.showResource(this.resource);
+    },
+    
+    ondblclick: function(event)
+    {
+        InjectedScriptAccess.getDefault().openInInspectedWindow(this.resource.url, function() {});
+    },
+
+    ondragstart: function(event) {
+        event.dataTransfer.setData("text/plain", this.resource.url);
+        event.dataTransfer.setData("text/uri-list", this.resource.url + "\r\n");
+        event.dataTransfer.effectAllowed = "copy";
+        return true;
+    },
+
+    get mainTitle()
+    {
+        return this.resource.displayName;
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        var subtitle = this.resource.displayDomain;
+
+        if (this.resource.path && this.resource.lastPathComponent) {
+            var lastPathComponentIndex = this.resource.path.lastIndexOf("/" + this.resource.lastPathComponent);
+            if (lastPathComponentIndex != -1)
+                subtitle += this.resource.path.substring(0, lastPathComponentIndex);
+        }
+
+        return subtitle;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    },
+
+    get selectable()
+    {
+        return WebInspector.panels.resources.isCategoryVisible(this.resource.category.name);
+    },
+
+    createIconElement: function()
+    {
+        var previousIconElement = this.iconElement;
+
+        if (this.resource.category === WebInspector.resourceCategories.images) {
+            var previewImage = document.createElement("img");
+            previewImage.className = "image-resource-icon-preview";
+            previewImage.src = this.resource.url;
+
+            this.iconElement = document.createElement("div");
+            this.iconElement.className = "icon";
+            this.iconElement.appendChild(previewImage);
+        } else {
+            this.iconElement = document.createElement("img");
+            this.iconElement.className = "icon";
+        }
+
+        if (previousIconElement)
+            previousIconElement.parentNode.replaceChild(this.iconElement, previousIconElement);
+    },
+
+    refresh: function()
+    {
+        this.refreshTitles();
+
+        if (!this._listItemNode.hasStyleClass("resources-category-" + this.resource.category.name)) {
+            this._listItemNode.removeMatchingStyleClasses("resources-category-\\w+");
+            this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
+
+            this.createIconElement();
+        }
+
+        this.tooltip = this.resource.url;
+    },
+
+    resetBubble: function()
+    {
+        this.bubbleText = "";
+        this.bubbleElement.removeStyleClass("search-matches");
+        this.bubbleElement.removeStyleClass("warning");
+        this.bubbleElement.removeStyleClass("error");
+    },
+
+    set searchMatches(matches)
+    {
+        this.resetBubble();
+
+        if (!matches)
+            return;
+
+        this.bubbleText = matches;
+        this.bubbleElement.addStyleClass("search-matches");
+    },
+
+    updateErrorsAndWarnings: function()
+    {
+        this.resetBubble();
+
+        if (this.resource.warnings || this.resource.errors)
+            this.bubbleText = (this.resource.warnings + this.resource.errors);
+
+        if (this.resource.warnings)
+            this.bubbleElement.addStyleClass("warning");
+
+        if (this.resource.errors)
+            this.bubbleElement.addStyleClass("error");
+    }
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByDuration(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByLatency(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareBySize(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingTransferSize = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByTransferSize(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.ResourceGraph = function(resource)
+{
+    this.resource = resource;
+
+    this._graphElement = document.createElement("div");
+    this._graphElement.className = "resources-graph-side";
+    this._graphElement.addEventListener("mouseover", this.refreshLabelPositions.bind(this), false);
+
+    if (resource.cached)
+        this._graphElement.addStyleClass("resource-cached");
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "resources-graph-bar-area hidden";
+    this._graphElement.appendChild(this._barAreaElement);
+
+    this._barLeftElement = document.createElement("div");
+    this._barLeftElement.className = "resources-graph-bar waiting";
+    this._barAreaElement.appendChild(this._barLeftElement);
+
+    this._barRightElement = document.createElement("div");
+    this._barRightElement.className = "resources-graph-bar";
+    this._barAreaElement.appendChild(this._barRightElement);
+
+    this._labelLeftElement = document.createElement("div");
+    this._labelLeftElement.className = "resources-graph-label waiting";
+    this._barAreaElement.appendChild(this._labelLeftElement);
+
+    this._labelRightElement = document.createElement("div");
+    this._labelRightElement.className = "resources-graph-label";
+    this._barAreaElement.appendChild(this._labelRightElement);
+
+    this._graphElement.addStyleClass("resources-category-" + resource.category.name);
+}
+
+WebInspector.ResourceGraph.prototype = {
+    get graphElement()
+    {
+        return this._graphElement;
+    },
+
+    refreshLabelPositions: function()
+    {
+        this._labelLeftElement.style.removeProperty("left");
+        this._labelLeftElement.style.removeProperty("right");
+        this._labelLeftElement.removeStyleClass("before");
+        this._labelLeftElement.removeStyleClass("hidden");
+
+        this._labelRightElement.style.removeProperty("left");
+        this._labelRightElement.style.removeProperty("right");
+        this._labelRightElement.removeStyleClass("after");
+        this._labelRightElement.removeStyleClass("hidden");
+
+        const labelPadding = 10;
+        const barRightElementOffsetWidth = this._barRightElement.offsetWidth;
+        const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;
+
+        if (this._isBarOpaqueAtLeft) {
+            var leftBarWidth = barLeftElementOffsetWidth - labelPadding;
+            var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;
+        } else {
+            var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;
+            var rightBarWidth = barRightElementOffsetWidth - labelPadding;
+        }
+
+        const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;
+        const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;
+
+        const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);
+        const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);
+        const graphElementOffsetWidth = this._graphElement.offsetWidth;
+
+        if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))
+            var leftHidden = true;
+
+        if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))
+            var rightHidden = true;
+
+        if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {
+            // The left/right label data are the same, so a before/after label can be replaced by an on-bar label.
+            if (labelBefore && !labelAfter)
+                leftHidden = true;
+            else if (labelAfter && !labelBefore)
+                rightHidden = true;
+        }
+
+        if (labelBefore) {
+            if (leftHidden)
+                this._labelLeftElement.addStyleClass("hidden");
+            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
+            this._labelLeftElement.addStyleClass("before");
+        } else {
+            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
+            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
+        }
+
+        if (labelAfter) {
+            if (rightHidden)
+                this._labelRightElement.addStyleClass("hidden");
+            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
+            this._labelRightElement.addStyleClass("after");
+        } else {
+            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
+            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
+        }
+    },
+
+    refresh: function(calculator, isBarOpaqueAtLeft)
+    {
+        var percentages = calculator.computeBarGraphPercentages(this.resource);
+        var labels = calculator.computeBarGraphLabels(this.resource);
+
+        this._percentages = percentages;
+
+        this._barAreaElement.removeStyleClass("hidden");
+
+        if (!this._graphElement.hasStyleClass("resources-category-" + this.resource.category.name)) {
+            this._graphElement.removeMatchingStyleClasses("resources-category-\\w+");
+            this._graphElement.addStyleClass("resources-category-" + this.resource.category.name);
+        }
+
+        this._barLeftElement.style.setProperty("left", percentages.start + "%");
+        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
+
+        if (!isBarOpaqueAtLeft) {
+            this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
+            this._barRightElement.style.setProperty("left", percentages.middle + "%");
+
+            if (this._isBarOpaqueAtLeft != isBarOpaqueAtLeft) {
+                this._barLeftElement.addStyleClass("waiting");
+                this._barRightElement.removeStyleClass("waiting-right");
+                this._labelLeftElement.addStyleClass("waiting");
+                this._labelRightElement.removeStyleClass("waiting-right");
+            }
+        } else {
+            this._barLeftElement.style.setProperty("right", (100 - percentages.middle) + "%");
+            this._barRightElement.style.setProperty("left", percentages.start + "%");
+
+            if (this._isBarOpaqueAtLeft != isBarOpaqueAtLeft) {
+                this._barLeftElement.removeStyleClass("waiting");
+                this._barRightElement.addStyleClass("waiting-right");
+                this._labelLeftElement.removeStyleClass("waiting");
+                this._labelRightElement.addStyleClass("waiting-right");
+            }
+        }
+
+        this._isBarOpaqueAtLeft = isBarOpaqueAtLeft;
+
+        this._labelLeftElement.textContent = labels.left;
+        this._labelRightElement.textContent = labels.right;
+
+        var tooltip = (labels.tooltip || "");
+        this._barLeftElement.title = tooltip;
+        this._labelLeftElement.title = tooltip;
+        this._labelRightElement.title = tooltip;
+        this._barRightElement.title = tooltip;
+    }
+}
+
+/* InjectedFakeWorker.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var InjectedFakeWorker = function()
+{
+
+Worker = function(url)
+{
+    var impl = new FakeWorker(this, url);
+    if (impl === null)
+        return null;
+
+    this.isFake = true;
+    this.postMessage = bind(impl.postMessage, impl);
+    this.terminate = bind(impl.terminate, impl);
+    this.onmessage = noop;
+}
+
+function FakeWorker(worker, url)
+{
+    var scriptURL = new URL(document.baseURI).completeWith(url);
+
+    if (!scriptURL.sameOrigin(location.href))
+        throw new DOMCoreException("SECURITY_ERR",18);
+
+    this._worker = worker;
+    this._buildWorker(scriptURL);
+}
+
+FakeWorker.prototype = {
+    postMessage: function(msg)
+    {
+        if (this._frame != null)
+            this._dispatchMessage(this._frame, bind(this._onmessageWrapper, this), msg);
+    },
+
+    terminate: function()
+    {
+        if (this._frame != null) {
+            this._frame.onmessage = this._worker.onmessage = noop;
+            this._frame.frameElement.parentNode.removeChild(this._frame.frameElement);
+        }
+        this._frame = null;
+        this._worker = null; // Break reference loop.
+    },
+
+    _onmessageWrapper: function(msg)
+    {
+        // Shortcut -- if no exception handlers installed, avoid try/catch so as not to obscure line number.
+        if (!this._frame.onerror && !this._worker.onerror) {
+            this._frame.onmessage(msg);
+            return;
+        }
+
+        try {
+            this._frame.onmessage(msg);
+        } catch (e) {
+            this._handleException(e, this._frame.onerror, this._worker.onerror);
+        }
+    },
+
+    _dispatchMessage: function(targetWindow, handler, msg)
+    {
+        var event = this._document.createEvent("MessageEvent");
+        event.initMessageEvent("MessageEvent", false, false, msg);
+        targetWindow.setTimeout(handler, 0, event);
+    },
+
+    _handleException: function(e)
+    {
+        // NB: it should be an ErrorEvent, but creating it from script is not
+        // currently supported, to emulate it on top of plain vanilla Event.
+        var errorEvent = this._document.createEvent("Event");
+        errorEvent.initEvent("Event", false, false);
+        errorEvent.message = "Uncaught exception";
+
+        for (var i = 1; i < arguments.length; ++i) {
+            if (arguments[i] && arguments[i](errorEvent))
+                return;
+        }
+
+        throw e;
+    },
+
+    _buildWorker: function(url)
+    {
+        var code = this._loadScript(url.url);
+        var iframeElement = document.createElement("iframe");
+        iframeElement.style.display = "none";
+        document.body.appendChild(iframeElement);
+
+        var frame = window.frames[window.frames.length - 1];
+
+        this._document = document;
+        this._frame = frame;
+
+        this._setupWorkerContext(frame, url);
+
+        var frameContents = '(function(location, window) { ' + code + '})(__devtools.location, undefined);\n' + '//@ sourceURL=' + url.url;
+
+        frame.eval(frameContents);
+    },
+
+    _setupWorkerContext: function(workerFrame, url)
+    {
+        workerFrame.__devtools = {
+            handleException: bind(this._handleException, this),
+            location: url.mockLocation()
+        };
+        var worker = this._worker;
+
+        function handler(event) // Late binding to onmessage desired, so no bind() here.
+        {
+            worker.onmessage(event);
+        }
+
+        workerFrame.onmessage = noop;
+        workerFrame.postMessage = bind(this._dispatchMessage, this, window, handler);
+        workerFrame.importScripts = bind(this._importScripts, this, workerFrame);
+        workerFrame.close = bind(this.terminate, this);
+    },
+
+    _importScripts: function(evalTarget)
+    {
+        for (var i = 1; i < arguments.length; ++i)
+            evalTarget.eval(this._loadScript(arguments[i]));
+    },
+
+    _loadScript: function(url)
+    {
+        var xhr = new XMLHttpRequest();
+        xhr.open("GET", url, false);
+        xhr.send(null);
+
+        var text = xhr.responseText;
+        if (xhr.status != 0 && xhr.status/100 !== 2) { // We're getting status === 0 when using file://.
+            console.error("Failed to load worker: " + url + "[" + xhr.status + "]");
+            text = ""; // We've got error message, not worker code.
+        }
+        return text;
+    }
+};
+
+function URL(url)
+{
+    this.url = url;
+    this.split();
+}
+
+URL.prototype = {
+    urlRegEx: (/^(http[s]?|file):\/\/([^\/:]*)(:[\d]+)?(?:(\/[^#?]*)(\?[^#]*)?(?:#(.*))?)?$/i),
+
+    split: function()
+    {
+        function emptyIfNull(str)
+        {
+            return str == null ? "" : str;
+        }
+        var parts = this.urlRegEx.exec(this.url);
+
+        this.schema = parts[1];
+        this.host = parts[2];
+        this.port = emptyIfNull(parts[3]);
+        this.path = emptyIfNull(parts[4]);
+        this.query = emptyIfNull(parts[5]);
+        this.fragment = emptyIfNull(parts[6]);
+    },
+
+    mockLocation: function()
+    {
+        var host = this.host.replace(/^[^@]*@/, "");
+
+        return {
+            href:     this.url,
+            protocol: this.schema + ":",
+            host:     host,
+            hostname: host,
+            port:     this.port,
+            pathname: this.path,
+            search:   this.query,
+            hash:     this.fragment
+        };
+    },
+
+    completeWith: function(url)
+    {
+        if (url === "" || /^[^/]*:/.exec(url)) // If given absolute url, return as is now.
+            return new URL(url);
+
+        var relParts = /^([^#?]*)(.*)$/.exec(url); // => [ url, path, query-andor-fragment ]
+
+        var path = (relParts[1].slice(0, 1) === "/" ? "" : this.path.replace(/[^/]*$/, "")) + relParts[1];
+        path = path.replace(/(\/\.)+(\/|$)/g, "/").replace(/[^/]*\/\.\.(\/|$)/g, "");
+
+        return new URL(this.schema + "://" + this.host + this.port + path + relParts[2]);
+    },
+
+    sameOrigin: function(url)
+    {
+        function normalizePort(schema, port)
+        {
+            var portNo = port.slice(1);
+            return (schema === "https" && portNo == 443 || schema === "http" && portNo == 80) ? "" : port;
+        }
+
+        var other = new URL(url);
+
+        return this.schema === other.schema &&
+            this.host === other.host &&
+            normalizePort(this.schema, this.port) === normalizePort(other.schema, other.port);
+    }
+};
+
+function DOMCoreException(name, code)
+{
+    function formatError()
+    {
+        return "Error: " + this.message;
+    }
+
+    this.name = name;
+    this.message = name + ": DOM Exception " + code;
+    this.code = code;
+    this.toString = bind(formatError, this);
+}
+
+function bind(func, thisObject)
+{
+    var args = Array.prototype.slice.call(arguments, 2);
+    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };
+}
+
+function noop()
+{
+}
+
+}
+
+/* ScriptsPanel.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScriptsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.element.addStyleClass("scripts");
+
+    this.topStatusBar = document.createElement("div");
+    this.topStatusBar.className = "status-bar";
+    this.topStatusBar.id = "scripts-status-bar";
+    this.element.appendChild(this.topStatusBar);
+
+    this.backButton = document.createElement("button");
+    this.backButton.className = "status-bar-item";
+    this.backButton.id = "scripts-back";
+    this.backButton.title = WebInspector.UIString("Show the previous script resource.");
+    this.backButton.disabled = true;
+    this.backButton.appendChild(document.createElement("img"));
+    this.backButton.addEventListener("click", this._goBack.bind(this), false);
+    this.topStatusBar.appendChild(this.backButton);
+
+    this.forwardButton = document.createElement("button");
+    this.forwardButton.className = "status-bar-item";
+    this.forwardButton.id = "scripts-forward";
+    this.forwardButton.title = WebInspector.UIString("Show the next script resource.");
+    this.forwardButton.disabled = true;
+    this.forwardButton.appendChild(document.createElement("img"));
+    this.forwardButton.addEventListener("click", this._goForward.bind(this), false);
+    this.topStatusBar.appendChild(this.forwardButton);
+
+    this.filesSelectElement = document.createElement("select");
+    this.filesSelectElement.className = "status-bar-item";
+    this.filesSelectElement.id = "scripts-files";
+    this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false);
+    this.topStatusBar.appendChild(this.filesSelectElement);
+
+    this.functionsSelectElement = document.createElement("select");
+    this.functionsSelectElement.className = "status-bar-item";
+    this.functionsSelectElement.id = "scripts-functions";
+
+    // FIXME: append the functions select element to the top status bar when it is implemented.
+    // this.topStatusBar.appendChild(this.functionsSelectElement);
+
+    this.sidebarButtonsElement = document.createElement("div");
+    this.sidebarButtonsElement.id = "scripts-sidebar-buttons";
+    this.topStatusBar.appendChild(this.sidebarButtonsElement);
+
+    this.pauseButton = document.createElement("button");
+    this.pauseButton.className = "status-bar-item";
+    this.pauseButton.id = "scripts-pause";
+    this.pauseButton.title = WebInspector.UIString("Pause script execution.");
+    this.pauseButton.disabled = true;
+    this.pauseButton.appendChild(document.createElement("img"));
+    this.pauseButton.addEventListener("click", this._togglePause.bind(this), false);
+    this.sidebarButtonsElement.appendChild(this.pauseButton);
+
+    this.stepOverButton = document.createElement("button");
+    this.stepOverButton.className = "status-bar-item";
+    this.stepOverButton.id = "scripts-step-over";
+    this.stepOverButton.title = WebInspector.UIString("Step over next function call.");
+    this.stepOverButton.disabled = true;
+    this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false);
+    this.stepOverButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepOverButton);
+
+    this.stepIntoButton = document.createElement("button");
+    this.stepIntoButton.className = "status-bar-item";
+    this.stepIntoButton.id = "scripts-step-into";
+    this.stepIntoButton.title = WebInspector.UIString("Step into next function call.");
+    this.stepIntoButton.disabled = true;
+    this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false);
+    this.stepIntoButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepIntoButton);
+
+    this.stepOutButton = document.createElement("button");
+    this.stepOutButton.className = "status-bar-item";
+    this.stepOutButton.id = "scripts-step-out";
+    this.stepOutButton.title = WebInspector.UIString("Step out of current function.");
+    this.stepOutButton.disabled = true;
+    this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false);
+    this.stepOutButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepOutButton);
+
+    this.toggleBreakpointsButton = new WebInspector.StatusBarButton("", "toggle-breakpoints");
+    this.toggleBreakpointsButton.addEventListener("click", this._toggleBreakpointsClicked.bind(this), false);
+    this.sidebarButtonsElement.appendChild(this.toggleBreakpointsButton.element);
+    // Breakpoints should be activated by default, so emulate a click to toggle on.
+    this._toggleBreakpointsClicked();
+
+    this.debuggerStatusElement = document.createElement("div");
+    this.debuggerStatusElement.id = "scripts-debugger-status";
+    this.sidebarButtonsElement.appendChild(this.debuggerStatusElement);
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "script-resource-views";
+
+    this.sidebarElement = document.createElement("div");
+    this.sidebarElement.id = "scripts-sidebar";
+
+    this.sidebarResizeElement = document.createElement("div");
+    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+    this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
+
+    this.sidebarResizeWidgetElement = document.createElement("div");
+    this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget";
+    this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
+    this.topStatusBar.appendChild(this.sidebarResizeWidgetElement);
+
+    this.sidebarPanes = {};
+    this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
+    this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
+    this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
+    this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane();
+
+    for (var pane in this.sidebarPanes)
+        this.sidebarElement.appendChild(this.sidebarPanes[pane].element);
+
+    this.sidebarPanes.callstack.expanded = true;
+    this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this);
+
+    this.sidebarPanes.scopechain.expanded = true;
+    this.sidebarPanes.breakpoints.expanded = true;
+
+    var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel.");
+    var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower.");
+    var panelEnablerButton = WebInspector.UIString("Enable Debugging");
+
+    this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+    this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this);
+
+    this.element.appendChild(this.panelEnablerView.element);
+    this.element.appendChild(this.viewsContainerElement);
+    this.element.appendChild(this.sidebarElement);
+    this.element.appendChild(this.sidebarResizeElement);
+
+    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+    this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false);
+
+    this._pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item", 3);
+    this._pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false);
+    this._pauseOnExceptionButton.state = WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions;
+
+    this._shortcuts = {};
+    var handler, shortcut;
+    var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
+
+    // Continue.
+    handler = this.pauseButton.click.bind(this.pauseButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F8);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Slash, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step over.
+    handler = this.stepOverButton.click.bind(this.stepOverButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F10);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.SingleQuote, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step into.
+    handler = this.stepIntoButton.click.bind(this.stepIntoButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step out.
+    handler = this.stepOutButton.click.bind(this.stepOutButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11, WebInspector.KeyboardShortcut.Modifiers.Shift);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    this._debuggerEnabled = Preferences.debuggerAlwaysEnabled;
+    this.reset();
+}
+
+// Keep these in sync with WebCore::ScriptDebugServer
+WebInspector.ScriptsPanel.PauseOnExceptionsState = {
+    DontPauseOnExceptions : 0,
+    PauseOnAllExceptions : 1,
+    PauseOnUncaughtExceptions: 2
+};
+
+WebInspector.ScriptsPanel.prototype = {
+    toolbarItemClass: "scripts",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Scripts");
+    },
+
+    get statusBarItems()
+    {
+        return [this.enableToggleButton.element, this._pauseOnExceptionButton.element];
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.filesSelectElement;
+    },
+
+    get paused()
+    {
+        return this._paused;
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
+
+        if (this.visibleView) {
+            if (this.visibleView instanceof WebInspector.ResourceView)
+                this.visibleView.headersVisible = false;
+            this.visibleView.show(this.viewsContainerElement);
+        }
+        if (this._attachDebuggerWhenShown) {
+            InspectorBackend.enableDebugger(false);
+            delete this._attachDebuggerWhenShown;
+        }
+    },
+
+    get searchableViews()
+    {
+        return [ this.visibleView ];
+    },
+
+    get breakpointsActivated()
+    {
+        return this.toggleBreakpointsButton.toggled;
+    },
+
+    addScript: function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
+    {
+        var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, errorLine, errorMessage);
+        this._sourceIDMap[sourceID] = script;
+
+        var resource = WebInspector.resourceURLMap[sourceURL];
+        if (resource) {
+            if (resource.finished) {
+                // Resource is finished, bind the script right away.
+                resource.addScript(script);
+                this._sourceIDMap[sourceID] = resource;
+            } else {
+                // Resource is not finished, bind the script later.
+                if (!resource._scriptsPendingResourceLoad) {
+                    resource._scriptsPendingResourceLoad = [];
+                    resource.addEventListener("finished", this._resourceLoadingFinished, this);
+                }
+                resource._scriptsPendingResourceLoad.push(script);
+            }
+        }
+        this._addScriptToFilesMenu(script);
+    },
+
+    _resourceLoadingFinished: function(e)
+    {
+        var resource = e.target;
+        for (var i = 0; i < resource._scriptsPendingResourceLoad.length; ++i) {
+            // Bind script to resource.
+            var script = resource._scriptsPendingResourceLoad[i];
+            resource.addScript(script);
+            this._sourceIDMap[script.sourceID] = resource;
+
+            // Remove script from the files list.
+            script.filesSelectOption.parentElement.removeChild(script.filesSelectOption);
+            
+            // Move breakpoints to the resource's frame.
+            if (script._scriptView) {
+                var sourceFrame = script._scriptView.sourceFrame;
+                for (var j = 0; j < sourceFrame.breakpoints; ++j) {
+                    var resourceFrame = this._sourceFrameForScriptOrResource(resource);
+                    resourceFrame.addBreakpoint(sourceFrame.breakpoints[j]);
+                }
+            }
+        }
+        // Adding first script will add resource.
+        this._addScriptToFilesMenu(resource._scriptsPendingResourceLoad[0]);
+        delete resource._scriptsPendingResourceLoad;
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        if (!this.breakpointsActivated)
+            this._toggleBreakpointsClicked();
+
+        this.sidebarPanes.breakpoints.addBreakpoint(breakpoint);
+
+        var sourceFrame;
+        if (breakpoint.url) {
+            var resource = WebInspector.resourceURLMap[breakpoint.url];
+            if (resource && resource.finished)
+                sourceFrame = this._sourceFrameForScriptOrResource(resource);
+        }
+
+        if (breakpoint.sourceID && !sourceFrame) {
+            var object = this._sourceIDMap[breakpoint.sourceID]
+            sourceFrame = this._sourceFrameForScriptOrResource(object);
+        }
+
+        if (sourceFrame)
+            sourceFrame.addBreakpoint(breakpoint);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        this.sidebarPanes.breakpoints.removeBreakpoint(breakpoint);
+
+        var sourceFrame;
+        if (breakpoint.url) {
+            var resource = WebInspector.resourceURLMap[breakpoint.url];
+            if (resource && resource.finished)
+                sourceFrame = this._sourceFrameForScriptOrResource(resource);
+        }
+
+        if (breakpoint.sourceID && !sourceFrame) {
+            var object = this._sourceIDMap[breakpoint.sourceID]
+            sourceFrame = this._sourceFrameForScriptOrResource(object);
+        }
+
+        if (sourceFrame)
+            sourceFrame.removeBreakpoint(breakpoint);
+    },
+
+    selectedCallFrameId: function()
+    {
+        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
+        if (!selectedCallFrame)
+            return null;
+        return selectedCallFrame.id;
+    },
+
+    evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)
+    {
+        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
+        if (!this._paused || !selectedCallFrame)
+            return;
+
+        if (typeof updateInterface === "undefined")
+            updateInterface = true;
+
+        var self = this;
+        function updatingCallbackWrapper(result, exception)
+        {
+            callback(result, exception);
+            if (updateInterface)
+                self.sidebarPanes.scopechain.update(selectedCallFrame);
+        }
+        this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);
+    },
+
+    doEvalInCallFrame: function(callFrame, code, objectGroup, callback)
+    {
+        function evalCallback(result)
+        {
+            if (result)
+                callback(result.value, result.isException);
+        }
+        InjectedScriptAccess.get(callFrame.injectedScriptId).evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
+    },
+
+    debuggerPaused: function(callFrames)
+    {
+        this._paused = true;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        this._updateDebuggerButtons();
+
+        this.sidebarPanes.callstack.update(callFrames, this._sourceIDMap);
+        this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];
+
+        WebInspector.currentPanel = this;
+        window.focus();
+    },
+
+    debuggerResumed: function()
+    {
+        this._paused = false;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        this._clearInterface();
+    },
+
+    attachDebuggerWhenShown: function()
+    {
+        if (this.element.parentElement) {
+            InspectorBackend.enableDebugger(false);
+        } else {
+            this._attachDebuggerWhenShown = true;
+        }
+    },
+
+    debuggerWasEnabled: function()
+    {
+        if (this._debuggerEnabled)
+            return;
+
+        this._debuggerEnabled = true;
+        this.reset();
+    },
+
+    debuggerWasDisabled: function()
+    {
+        if (!this._debuggerEnabled)
+            return;
+
+        this._debuggerEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        this.visibleView = null;
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        if (!this._debuggerEnabled) {
+            this._paused = false;
+            this._waitingToPause = false;
+            this._stepping = false;
+        }
+
+        this._clearInterface();
+
+        this._backForwardList = [];
+        this._currentBackForwardIndex = -1;
+        this._updateBackAndForwardButtons();
+
+        this._resourceForURLInFilesSelect = {};
+        this.filesSelectElement.removeChildren();
+        this.functionsSelectElement.removeChildren();
+        this.viewsContainerElement.removeChildren();
+
+        if (this._sourceIDMap) {
+            for (var sourceID in this._sourceIDMap) {
+                var object = this._sourceIDMap[sourceID];
+                if (object instanceof WebInspector.Resource)
+                    object.removeAllScripts();
+            }
+        }
+
+        this._sourceIDMap = {};
+        
+        this.sidebarPanes.watchExpressions.refreshExpressions();
+        this.sidebarPanes.breakpoints.reset();
+    },
+
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x)
+            return;
+
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x)
+            x.show(this.viewsContainerElement);
+    },
+
+    viewRecreated: function(oldView, newView)
+    {
+        if (this._visibleView === oldView)
+            this._visibleView = newView;
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        if (!this._debuggerEnabled)
+            return false;
+        return !!this._scriptOrResourceForURLAndLine(url, line);
+    },
+
+    showSourceLine: function(url, line)
+    {
+        var scriptOrResource = this._scriptOrResourceForURLAndLine(url, line);
+        this._showScriptOrResource(scriptOrResource, {line: line, shouldHighlightLine: true});
+    },
+
+    _scriptOrResourceForURLAndLine: function(url, line) 
+    {
+        var scriptWithMatchingUrl = null;
+        for (var sourceID in this._sourceIDMap) {
+            var scriptOrResource = this._sourceIDMap[sourceID];
+            if (scriptOrResource instanceof WebInspector.Script) {
+                if (scriptOrResource.sourceURL !== url)
+                    continue;
+                scriptWithMatchingUrl = scriptOrResource;
+                if (scriptWithMatchingUrl.startingLine <= line && scriptWithMatchingUrl.startingLine + scriptWithMatchingUrl.linesCount > line)
+                    return scriptWithMatchingUrl;
+            } else {
+                var resource = scriptOrResource;
+                if (resource.url === url)
+                    return resource;
+            }
+        }
+        return scriptWithMatchingUrl;
+    },
+
+    showView: function(view)
+    {
+        if (!view)
+            return;
+        this._showScriptOrResource(view.resource || view.script);
+    },
+
+    handleShortcut: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.handled = true;
+        } else
+            this.sidebarPanes.callstack.handleShortcut(event);
+    },
+
+    scriptViewForScript: function(script)
+    {
+        if (!script)
+            return null;
+        if (!script._scriptView)
+            script._scriptView = new WebInspector.ScriptView(script);
+        return script._scriptView;
+    },
+
+    sourceFrameForScript: function(script)
+    {
+        var view = this.scriptViewForScript(script);
+        if (!view)
+            return null;
+
+        // Setting up the source frame requires that we be attached.
+        if (!this.element.parentNode)
+            this.attach();
+
+        view.setupSourceFrameIfNeeded();
+        return view.sourceFrame;
+    },
+
+    _sourceViewForScriptOrResource: function(scriptOrResource)
+    {
+        if (scriptOrResource instanceof WebInspector.Resource) {
+            if (!WebInspector.panels.resources)
+                return null;
+            return WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
+        }
+        if (scriptOrResource instanceof WebInspector.Script)
+            return this.scriptViewForScript(scriptOrResource);
+    },
+
+    _sourceFrameForScriptOrResource: function(scriptOrResource)
+    {
+        if (scriptOrResource instanceof WebInspector.Resource)
+            return WebInspector.panels.resources.sourceFrameForResource(scriptOrResource);
+        if (scriptOrResource instanceof WebInspector.Script)
+            return this.sourceFrameForScript(scriptOrResource);
+    },
+
+    _showScriptOrResource: function(scriptOrResource, options)
+    {
+        // options = {line:, shouldHighlightLine:, fromBackForwardAction:, initialLoad:}
+        if (!options) 
+            options = {};
+
+        if (!scriptOrResource)
+            return;
+
+        var view;
+        if (scriptOrResource instanceof WebInspector.Resource) {
+            if (!WebInspector.panels.resources)
+                return null;
+            view = WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
+            view.headersVisible = false;
+            var breakpoints = this.sidebarPanes.breakpoints.breakpoints;
+            for (var breakpointId in breakpoints) {
+                var breakpoint = breakpoints[breakpointId];
+                if (breakpoint.url === scriptOrResource.url) {
+                    var sourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
+                    sourceFrame.addBreakpoint(breakpoint);
+                }
+            }
+        } else if (scriptOrResource instanceof WebInspector.Script)
+            view = this.scriptViewForScript(scriptOrResource);
+
+        if (!view)
+            return;
+
+        var url = scriptOrResource.url || scriptOrResource.sourceURL;
+        if (url && !options.initialLoad)
+            WebInspector.settings.lastViewedScriptFile = url;
+
+        if (!options.fromBackForwardAction) {
+            var oldIndex = this._currentBackForwardIndex;
+            if (oldIndex >= 0)
+                this._backForwardList.splice(oldIndex + 1, this._backForwardList.length - oldIndex);
+
+            // Check for a previous entry of the same object in _backForwardList.
+            // If one is found, remove it and update _currentBackForwardIndex to match.
+            var previousEntryIndex = this._backForwardList.indexOf(scriptOrResource);
+            if (previousEntryIndex !== -1) {
+                this._backForwardList.splice(previousEntryIndex, 1);
+                --this._currentBackForwardIndex;
+            }
+
+            this._backForwardList.push(scriptOrResource);
+            ++this._currentBackForwardIndex;
+
+            this._updateBackAndForwardButtons();
+        }
+
+        this.visibleView = view;
+
+        if (options.line) {
+            if (view.revealLine)
+                view.revealLine(options.line);
+            if (view.highlightLine && options.shouldHighlightLine)
+                view.highlightLine(options.line);
+        }
+
+        var option;
+        if (scriptOrResource instanceof WebInspector.Script) {
+            option = scriptOrResource.filesSelectOption;
+
+            // hasn't been added yet - happens for stepping in evals,
+            // so use the force option to force the script into the menu.
+            if (!option) {
+                this._addScriptToFilesMenu(scriptOrResource, true);
+                option = scriptOrResource.filesSelectOption;
+            }
+
+            console.assert(option);
+        } else
+            option = scriptOrResource.filesSelectOption;
+
+        if (option)
+            this.filesSelectElement.selectedIndex = option.index;
+    },
+
+    _addScriptToFilesMenu: function(script, force)
+    {
+        if (!script.sourceURL && !force)
+            return;
+
+        if (script.resource) {
+            if (this._resourceForURLInFilesSelect[script.resource.url])
+                return;
+            this._resourceForURLInFilesSelect[script.resource.url] = script.resource;
+        }
+ 
+        var displayName = script.sourceURL ? WebInspector.displayNameForURL(script.sourceURL) : WebInspector.UIString("(program)");
+
+        var select = this.filesSelectElement;
+        var option = document.createElement("option");
+        option.representedObject = script.resource || script;
+        option.url = displayName;
+        option.startingLine = script.startingLine;
+        option.text = script.resource || script.startingLine === 1 ? displayName : String.sprintf("%s:%d", displayName, script.startingLine);
+
+        function optionCompare(a, b)
+        {
+            if (a.url < b.url)
+                return -1;
+            else if (a.url > b.url)
+                return 1;
+
+            if (typeof a.startingLine !== "number")
+                return -1;
+            if (typeof b.startingLine !== "number")
+                return -1;
+            return a.startingLine - b.startingLine;
+        }
+
+        var insertionIndex = insertionIndexForObjectInListSortedByFunction(option, select.childNodes, optionCompare);
+        if (insertionIndex < 0)
+            select.appendChild(option);
+        else
+            select.insertBefore(option, select.childNodes.item(insertionIndex));
+
+        if (script.resource)
+            script.resource.filesSelectOption = option;
+        else
+            script.filesSelectOption = option;
+
+        // Call _showScriptOrResource if the option we just appended ended up being selected.
+        // This will happen for the first item added to the menu.
+        if (select.options[select.selectedIndex] === option)
+            this._showScriptOrResource(option.representedObject, {initialLoad: true});
+        else {
+            // if not first item, check to see if this was the last viewed
+            var url = option.representedObject.url || option.representedObject.sourceURL;
+            var lastURL = WebInspector.settings.lastViewedScriptFile;
+            if (url && url === lastURL)
+                this._showScriptOrResource(option.representedObject, {initialLoad: true});
+        }
+    },
+
+    _clearCurrentExecutionLine: function()
+    {
+        if (this._executionSourceFrame)
+            this._executionSourceFrame.executionLine = 0;
+        delete this._executionSourceFrame;
+    },
+
+    _callFrameSelected: function()
+    {
+        this._clearCurrentExecutionLine();
+
+        var callStackPane = this.sidebarPanes.callstack;
+        var currentFrame = callStackPane.selectedCallFrame;
+        if (!currentFrame)
+            return;
+
+        this.sidebarPanes.scopechain.update(currentFrame);
+        this.sidebarPanes.watchExpressions.refreshExpressions();
+
+        var scriptOrResource = this._sourceIDMap[currentFrame.sourceID];
+        this._showScriptOrResource(scriptOrResource, {line: currentFrame.line});
+
+        this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
+        if (this._executionSourceFrame)
+            this._executionSourceFrame.executionLine = currentFrame.line;
+    },
+
+    _changeVisibleFile: function(event)
+    {
+        var select = this.filesSelectElement;
+        this._showScriptOrResource(select.options[select.selectedIndex].representedObject);
+    },
+
+    _startSidebarResizeDrag: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarElement, this._sidebarResizeDrag.bind(this), this._endSidebarResizeDrag.bind(this), event, "col-resize");
+
+        if (event.target === this.sidebarResizeWidgetElement)
+            this._dragOffset = (event.target.offsetWidth - (event.pageX - event.target.totalOffsetLeft));
+        else
+            this._dragOffset = 0;
+    },
+
+    _endSidebarResizeDrag: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+
+        delete this._dragOffset;
+    },
+
+    _sidebarResizeDrag: function(event)
+    {
+        var x = event.pageX + this._dragOffset;
+        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minScriptsSidebarWidth, window.innerWidth * 0.66);
+
+        this.sidebarElement.style.width = newWidth + "px";
+        this.sidebarButtonsElement.style.width = newWidth + "px";
+        this.viewsContainerElement.style.right = newWidth + "px";
+        this.sidebarResizeWidgetElement.style.right = newWidth + "px";
+        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
+
+        this.resize();
+        event.preventDefault();
+    },
+    
+    updatePauseOnExceptionsState: function(pauseOnExceptionsState)
+    {
+        if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.\nClick to Pause on all exceptions.");
+        else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnAllExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on all exceptions.\nClick to Pause on uncaught exceptions.");
+        else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on uncaught exceptions.\nClick to Not pause on exceptions.");
+
+        this._pauseOnExceptionButton.state = pauseOnExceptionsState;
+    },
+
+    _updateDebuggerButtons: function()
+    {
+        if (this._debuggerEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Debugging enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            this._pauseOnExceptionButton.visible = true;
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Debugging disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            this._pauseOnExceptionButton.visible = false;
+            this.panelEnablerView.visible = true;
+        }
+
+        if (this._paused) {
+            this.pauseButton.addStyleClass("paused");
+
+            this.pauseButton.disabled = false;
+            this.stepOverButton.disabled = false;
+            this.stepIntoButton.disabled = false;
+            this.stepOutButton.disabled = false;
+
+            this.debuggerStatusElement.textContent = WebInspector.UIString("Paused");
+        } else {
+            this.pauseButton.removeStyleClass("paused");
+
+            this.pauseButton.disabled = this._waitingToPause;
+            this.stepOverButton.disabled = true;
+            this.stepIntoButton.disabled = true;
+            this.stepOutButton.disabled = true;
+
+            if (this._waitingToPause)
+                this.debuggerStatusElement.textContent = WebInspector.UIString("Pausing");
+            else if (this._stepping)
+                this.debuggerStatusElement.textContent = WebInspector.UIString("Stepping");
+            else
+                this.debuggerStatusElement.textContent = "";
+        }
+    },
+
+    _updateBackAndForwardButtons: function()
+    {
+        this.backButton.disabled = this._currentBackForwardIndex <= 0;
+        this.forwardButton.disabled = this._currentBackForwardIndex >= (this._backForwardList.length - 1);
+    },
+
+    _clearInterface: function()
+    {
+        this.sidebarPanes.callstack.update(null);
+        this.sidebarPanes.scopechain.update(null);
+
+        this._clearCurrentExecutionLine();
+        this._updateDebuggerButtons();
+    },
+
+    _goBack: function()
+    {
+        if (this._currentBackForwardIndex <= 0) {
+            console.error("Can't go back from index " + this._currentBackForwardIndex);
+            return;
+        }
+
+        this._showScriptOrResource(this._backForwardList[--this._currentBackForwardIndex], {fromBackForwardAction: true});
+        this._updateBackAndForwardButtons();
+    },
+
+    _goForward: function()
+    {
+        if (this._currentBackForwardIndex >= this._backForwardList.length - 1) {
+            console.error("Can't go forward from index " + this._currentBackForwardIndex);
+            return;
+        }
+
+        this._showScriptOrResource(this._backForwardList[++this._currentBackForwardIndex], {fromBackForwardAction: true});
+        this._updateBackAndForwardButtons();
+    },
+
+    _enableDebugging: function()
+    {
+        if (this._debuggerEnabled)
+            return;
+        this._toggleDebugging(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleDebugging: function(optionalAlways)
+    {
+        this._paused = false;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        if (this._debuggerEnabled)
+            InspectorBackend.disableDebugger(true);
+        else
+            InspectorBackend.enableDebugger(!!optionalAlways);
+    },
+
+    _togglePauseOnExceptions: function()
+    {
+        InspectorBackend.setPauseOnExceptionsState((this._pauseOnExceptionButton.state + 1) % this._pauseOnExceptionButton.states);
+    },
+
+    _togglePause: function()
+    {
+        if (this._paused) {
+            this._paused = false;
+            this._waitingToPause = false;
+            InspectorBackend.resumeDebugger();
+        } else {
+            this._stepping = false;
+            this._waitingToPause = true;
+            InspectorBackend.pauseInDebugger();
+        }
+
+        this._clearInterface();
+    },
+
+    _stepOverClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepOverStatementInDebugger();
+    },
+
+    _stepIntoClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepIntoStatementInDebugger();
+    },
+
+    _stepOutClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepOutOfFunctionInDebugger();
+    },
+
+    _toggleBreakpointsClicked: function()
+    {
+        this.toggleBreakpointsButton.toggled = !this.toggleBreakpointsButton.toggled;
+        if (this.toggleBreakpointsButton.toggled) {
+            InspectorBackend.activateBreakpoints();
+            this.toggleBreakpointsButton.title = WebInspector.UIString("Deactivate all breakpoints.");
+            document.getElementById("main-panels").removeStyleClass("breakpoints-deactivated");
+        } else {
+            InspectorBackend.deactivateBreakpoints();
+            this.toggleBreakpointsButton.title = WebInspector.UIString("Activate all breakpoints.");
+            document.getElementById("main-panels").addStyleClass("breakpoints-deactivated");
+        }
+    }
+}
+
+WebInspector.ScriptsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* StoragePanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StoragePanel = function(database)
+{
+    WebInspector.Panel.call(this);
+
+    this.createSidebar();
+
+    this.databasesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("DATABASES"), {}, true);
+    this.sidebarTree.appendChild(this.databasesListTreeElement);
+    this.databasesListTreeElement.expand();
+
+    this.localStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("LOCAL STORAGE"), {}, true);
+    this.sidebarTree.appendChild(this.localStorageListTreeElement);
+    this.localStorageListTreeElement.expand();
+
+    this.sessionStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("SESSION STORAGE"), {}, true);
+    this.sidebarTree.appendChild(this.sessionStorageListTreeElement);
+    this.sessionStorageListTreeElement.expand();
+
+    this.cookieListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("COOKIES"), {}, true);
+    this.sidebarTree.appendChild(this.cookieListTreeElement);
+    this.cookieListTreeElement.expand();
+
+    this.storageViews = document.createElement("div");
+    this.storageViews.id = "storage-views";
+    this.element.appendChild(this.storageViews);
+
+    this.storageViewStatusBarItemsContainer = document.createElement("div");
+    this.storageViewStatusBarItemsContainer.id = "storage-view-status-bar-items";
+
+    this.reset();
+}
+
+WebInspector.StoragePanel.prototype = {
+    toolbarItemClass: "storage",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Storage");
+    },
+
+    get statusBarItems()
+    {
+        return [this.storageViewStatusBarItemsContainer];
+    },
+
+    reset: function()
+    {
+        if (this._databases) {
+            var databasesLength = this._databases.length;
+            for (var i = 0; i < databasesLength; ++i) {
+                var database = this._databases[i];
+
+                delete database._tableViews;
+                delete database._queryView;
+            }
+        }
+
+        this._databases = [];
+
+        if (this._domStorage) {
+            var domStorageLength = this._domStorage.length;
+            for (var i = 0; i < domStorageLength; ++i) {
+                var domStorage = this._domStorage[i];
+
+                delete domStorage._domStorageView;
+            }
+        }
+
+        this._domStorage = [];
+
+        this._cookieViews = {};
+
+        this.databasesListTreeElement.removeChildren();
+        this.localStorageListTreeElement.removeChildren();
+        this.sessionStorageListTreeElement.removeChildren();
+        this.cookieListTreeElement.removeChildren();
+
+        this.storageViews.removeChildren();        
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        
+        if (this.sidebarTree.selectedTreeElement)
+            this.sidebarTree.selectedTreeElement.deselect();
+    },
+
+    addDatabase: function(database)
+    {
+        this._databases.push(database);
+
+        var databaseTreeElement = new WebInspector.DatabaseSidebarTreeElement(database);
+        database._databasesTreeElement = databaseTreeElement;
+        this.databasesListTreeElement.appendChild(databaseTreeElement);
+    },
+    
+    addCookieDomain: function(domain)
+    {
+        var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
+        this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
+    },
+
+    addDOMStorage: function(domStorage)
+    {
+        this._domStorage.push(domStorage);
+        var domStorageTreeElement = new WebInspector.DOMStorageSidebarTreeElement(domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage"));
+        domStorage._domStorageTreeElement = domStorageTreeElement;
+        if (domStorage.isLocalStorage)
+            this.localStorageListTreeElement.appendChild(domStorageTreeElement);
+        else
+            this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
+    },
+
+    selectDatabase: function(databaseId)
+    {
+        var database;
+        for (var i = 0, len = this._databases.length; i < len; ++i) {
+            database = this._databases[i];
+            if (database.id === databaseId) {
+                this.showDatabase(database);
+                database._databasesTreeElement.select();
+                return;
+            }
+        }
+    },
+
+    selectDOMStorage: function(storageId)
+    {
+        var domStorage = this._domStorageForId(storageId);
+        if (domStorage) {
+            this.showDOMStorage(domStorage);
+            domStorage._domStorageTreeElement.select();
+        }
+    },
+
+    showDatabase: function(database, tableName)
+    {
+        if (!database)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view;
+        if (tableName) {
+            if (!("_tableViews" in database))
+                database._tableViews = {};
+            view = database._tableViews[tableName];
+            if (!view) {
+                view = new WebInspector.DatabaseTableView(database, tableName);
+                database._tableViews[tableName] = view;
+            }
+        } else {
+            view = database._queryView;
+            if (!view) {
+                view = new WebInspector.DatabaseQueryView(database);
+                database._queryView = view;
+            }
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems || [];
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i].element);
+    },
+
+    showDOMStorage: function(domStorage)
+    {
+        if (!domStorage)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view;
+        view = domStorage._domStorageView;
+        if (!view) {
+            view = new WebInspector.DOMStorageItemsView(domStorage);
+            domStorage._domStorageView = view;
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    showCookies: function(treeElement, cookieDomain)
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view = this._cookieViews[cookieDomain];
+        if (!view) {
+            view = new WebInspector.CookieItemsView(treeElement, cookieDomain);
+            this._cookieViews[cookieDomain] = view;
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    closeVisibleView: function()
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+        delete this.visibleView;
+    },
+
+    updateDatabaseTables: function(database)
+    {
+        if (!database || !database._databasesTreeElement)
+            return;
+
+        database._databasesTreeElement.shouldRefreshChildren = true;
+
+        if (!("_tableViews" in database))
+            return;
+
+        var tableNamesHash = {};
+        var self = this;
+        function tableNamesCallback(tableNames)
+        {
+            var tableNamesLength = tableNames.length;
+            for (var i = 0; i < tableNamesLength; ++i)
+                tableNamesHash[tableNames[i]] = true;
+
+            for (var tableName in database._tableViews) {
+                if (!(tableName in tableNamesHash)) {
+                    if (self.visibleView === database._tableViews[tableName])
+                        self.closeVisibleView();
+                    delete database._tableViews[tableName];
+                }
+            }
+        }
+        database.getTableNames(tableNamesCallback);
+    },
+
+    dataGridForResult: function(rows)
+    {
+        if (!rows.length)
+            return null;
+
+        var columns = {};
+        var numColumns = 0;
+
+        for (var columnIdentifier in rows[0]) {
+            var column = {};
+            column.width = columnIdentifier.length;
+            column.title = columnIdentifier;
+
+            columns[columnIdentifier] = column;
+            ++numColumns;
+        }
+
+        var nodes = [];
+        var length = rows.length;
+        for (var i = 0; i < length; ++i) {
+            var data = {};
+
+            var row = rows[i];
+            for (var columnIdentifier in row)
+                data[columnIdentifier] = row[columnIdentifier];
+
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = false;
+            nodes.push(node);
+        }
+
+        var dataGrid = new WebInspector.DataGrid(columns);
+        var length = nodes.length;
+        for (var i = 0; i < length; ++i)
+            dataGrid.appendChild(nodes[i]);
+
+        return dataGrid;
+    },
+
+    updateDOMStorage: function(storageId)
+    {
+        var domStorage = this._domStorageForId(storageId);
+        if (!domStorage)
+            return;
+
+        var view = domStorage._domStorageView;
+        if (this.visibleView && view === this.visibleView)
+            domStorage._domStorageView.update();
+    },
+
+    _domStorageForId: function(storageId)
+    {
+        if (!this._domStorage)
+            return null;
+        var domStorageLength = this._domStorage.length;
+        for (var i = 0; i < domStorageLength; ++i) {
+            var domStorage = this._domStorage[i];
+            if (domStorage.id == storageId)
+                return domStorage;
+        }
+        return null;
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.storageViews.style.left = width + "px";
+        this.storageViewStatusBarItemsContainer.style.left = width + "px";
+        this.resize();
+    }
+}
+
+WebInspector.StoragePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.DatabaseSidebarTreeElement = function(database)
+{
+    this.database = database;
+
+    WebInspector.SidebarTreeElement.call(this, "database-sidebar-tree-item", "", "", database, true);
+
+    this.refreshTitles();
+}
+
+WebInspector.DatabaseSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDatabase(this.database);
+    },
+
+    oncollapse: function()
+    {
+        // Request a refresh after every collapse so the next
+        // expand will have an updated table list.
+        this.shouldRefreshChildren = true;
+    },
+
+    onpopulate: function()
+    {
+        this.removeChildren();
+
+        var self = this;
+        function tableNamesCallback(tableNames)
+        {
+            var tableNamesLength = tableNames.length;
+            for (var i = 0; i < tableNamesLength; ++i)
+                self.appendChild(new WebInspector.SidebarDatabaseTableTreeElement(self.database, tableNames[i]));
+        }
+        this.database.getTableNames(tableNamesCallback);
+    },
+
+    get mainTitle()
+    {
+        return this.database.name;
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return this.database.displayDomain;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    }
+}
+
+WebInspector.DatabaseSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.SidebarDatabaseTableTreeElement = function(database, tableName)
+{
+    this.database = database;
+    this.tableName = tableName;
+
+    WebInspector.SidebarTreeElement.call(this, "database-table-sidebar-tree-item small", tableName, "", null, false);
+}
+
+WebInspector.SidebarDatabaseTableTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDatabase(this.database, this.tableName);
+    }
+}
+
+WebInspector.SidebarDatabaseTableTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.DOMStorageSidebarTreeElement = function(domStorage, className)
+{
+
+    this.domStorage = domStorage;
+
+    WebInspector.SidebarTreeElement.call(this, "domstorage-sidebar-tree-item " + className, domStorage, "", null, false);
+
+    this.refreshTitles();
+}
+
+WebInspector.DOMStorageSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDOMStorage(this.domStorage);
+    },
+
+    get mainTitle()
+    {
+        return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files");
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return ""; //this.database.displayDomain;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    }
+}
+
+WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.CookieSidebarTreeElement = function(cookieDomain)
+{
+    WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
+    this._cookieDomain = cookieDomain;
+    this._subtitle = "";
+
+    this.refreshTitles();
+}
+
+WebInspector.CookieSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showCookies(this, this._cookieDomain);
+    },
+
+    get mainTitle()
+    {
+        return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files");
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        this._subtitle = x;
+        this.refreshTitles();
+    }
+}
+
+WebInspector.CookieSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+/* ProfilesPanel.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
+
+WebInspector.ProfileType = function(id, name)
+{
+    this._id = id;
+    this._name = name;
+}
+
+WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;
+
+WebInspector.ProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return "";
+    },
+
+    get buttonStyle()
+    {
+        return undefined;
+    },
+
+    get buttonCaption()
+    {
+        return this.name;
+    },
+
+    get id()
+    {
+        return this._id;
+    },
+
+    get name()
+    {
+        return this._name;
+    },
+
+    buttonClicked: function()
+    {
+    },
+
+    viewForProfile: function(profile)
+    {
+        if (!profile._profileView)
+            profile._profileView = this.createView(profile);
+        return profile._profileView;
+    },
+
+    get welcomeMessage()
+    {
+        return "";
+    },
+
+    // Must be implemented by subclasses.
+    createView: function(profile)
+    {
+        throw new Error("Needs implemented.");
+    },
+
+    // Must be implemented by subclasses.
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        throw new Error("Needs implemented.");
+    }
+}
+
+WebInspector.ProfilesPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.createSidebar();
+
+    this.element.addStyleClass("profiles");
+    this._profileTypesByIdMap = {};
+    this._profileTypeButtonsByIdMap = {};
+
+    var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
+    var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
+    var panelEnablerButton = WebInspector.UIString("Enable Profiling");
+    this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+    this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);
+
+    this.element.appendChild(this.panelEnablerView.element);
+
+    this.profileViews = document.createElement("div");
+    this.profileViews.id = "profile-views";
+    this.element.appendChild(this.profileViews);
+
+    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+    this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
+
+    this.profileViewStatusBarItemsContainer = document.createElement("div");
+    this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
+
+    this.welcomeView = new WebInspector.WelcomeView("profiles", WebInspector.UIString("Welcome to the Profiles panel"));
+    this.element.appendChild(this.welcomeView.element);
+
+    this._profiles = [];
+    this._profilerEnabled = Preferences.profilerAlwaysEnabled;
+    this.reset();
+}
+
+WebInspector.ProfilesPanel.prototype = {
+    toolbarItemClass: "profiles",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Profiles");
+    },
+
+    get statusBarItems()
+    {
+        function clickHandler(profileType, buttonElement)
+        {
+            profileType.buttonClicked.call(profileType);
+            this.updateProfileTypeButtons();
+        }
+
+        var items = [this.enableToggleButton.element];
+        // FIXME: Generate a single "combo-button".
+        for (var typeId in this._profileTypesByIdMap) {
+            var profileType = this.getProfileType(typeId);
+            if (profileType.buttonStyle) {
+                var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
+                this._profileTypeButtonsByIdMap[typeId] = button.element;
+                button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);
+                items.push(button.element);
+            }
+        }
+        items.push(this.profileViewStatusBarItemsContainer);
+        return items;
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        if (this._shouldPopulateProfiles)
+            this._populateProfiles();
+    },
+
+    populateInterface: function()
+    {
+        if (this.visible)
+            this._populateProfiles();
+        else
+            this._shouldPopulateProfiles = true;
+    },
+
+    profilerWasEnabled: function()
+    {
+        if (this._profilerEnabled)
+            return;
+
+        this._profilerEnabled = true;
+        this.reset();
+        this.populateInterface();
+    },
+
+    profilerWasDisabled: function()
+    {
+        if (!this._profilerEnabled)
+            return;
+
+        this._profilerEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        for (var i = 0; i < this._profiles.length; ++i)
+            delete this._profiles[i]._profileView;
+        delete this.visibleView;
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        this._profiles = [];
+        this._profilesIdMap = {};
+        this._profileGroups = {};
+        this._profileGroupsForLinks = {}
+
+        this.sidebarTreeElement.removeStyleClass("some-expandable");
+
+        for (var typeId in this._profileTypesByIdMap)
+            this.getProfileType(typeId).treeElement.removeChildren();
+
+        this.profileViews.removeChildren();
+
+        this.profileViewStatusBarItemsContainer.removeChildren();
+
+        this._updateInterface();
+        this.welcomeView.show();
+    },
+
+    registerProfileType: function(profileType)
+    {
+        this._profileTypesByIdMap[profileType.id] = profileType;
+        profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);
+        this.sidebarTree.appendChild(profileType.treeElement);
+        profileType.treeElement.expand();
+        this._addWelcomeMessage(profileType);
+    },
+
+    _addWelcomeMessage: function(profileType)
+    {
+        var message = profileType.welcomeMessage;
+        // Message text is supposed to have a '%s' substring as a placeholder
+        // for a status bar button. If it is there, we split the message in two
+        // parts, and insert the button between them.
+        var buttonPos = message.indexOf("%s");
+        if (buttonPos > -1) {
+            var container = document.createDocumentFragment();
+            var part1 = document.createElement("span");
+            part1.innerHTML = message.substr(0, buttonPos);
+            container.appendChild(part1);
+     
+            var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
+            button.element.addEventListener("click", profileType.buttonClicked.bind(profileType), false);
+            container.appendChild(button.element);
+       
+            var part2 = document.createElement("span");
+            part2.innerHTML = message.substr(buttonPos + 2);
+            container.appendChild(part2);
+            this.welcomeView.addMessage(container);
+        } else
+            this.welcomeView.addMessage(message);
+    },
+
+    _makeKey: function(text, profileTypeId)
+    {
+        return escape(text) + '/' + escape(profileTypeId);
+    },
+
+    addProfileHeader: function(profile)
+    {
+        var typeId = profile.typeId;
+        var profileType = this.getProfileType(typeId);
+        var sidebarParent = profileType.treeElement;
+        var small = false;
+        var alternateTitle;
+
+        profile.__profilesPanelProfileType = profileType;
+        this._profiles.push(profile);
+        this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;
+
+        if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
+            var profileTitleKey = this._makeKey(profile.title, typeId);
+            if (!(profileTitleKey in this._profileGroups))
+                this._profileGroups[profileTitleKey] = [];
+
+            var group = this._profileGroups[profileTitleKey];
+            group.push(profile);
+
+            if (group.length === 2) {
+                // Make a group TreeElement now that there are 2 profiles.
+                group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
+
+                // Insert at the same index for the first profile of the group.
+                var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);
+                sidebarParent.insertChild(group._profilesTreeElement, index);
+
+                // Move the first profile to the group.
+                var selected = group[0]._profilesTreeElement.selected;
+                sidebarParent.removeChild(group[0]._profilesTreeElement);
+                group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
+                if (selected) {
+                    group[0]._profilesTreeElement.select();
+                    group[0]._profilesTreeElement.reveal();
+                }
+
+                group[0]._profilesTreeElement.small = true;
+                group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);
+
+                this.sidebarTreeElement.addStyleClass("some-expandable");
+            }
+
+            if (group.length >= 2) {
+                sidebarParent = group._profilesTreeElement;
+                alternateTitle = WebInspector.UIString("Run %d", group.length);
+                small = true;
+            }
+        }
+
+        var profileTreeElement = profileType.createSidebarTreeElementForProfile(profile);
+        profileTreeElement.small = small;
+        if (alternateTitle)
+            profileTreeElement.mainTitle = alternateTitle;
+        profile._profilesTreeElement = profileTreeElement;
+
+        sidebarParent.appendChild(profileTreeElement);
+        this.welcomeView.hide();
+        if (!this.visibleView)
+            this.showProfile(profile);
+    },
+
+    showProfile: function(profile)
+    {
+        if (!profile)
+            return;
+
+        this.closeVisibleView();
+
+        var view = profile.__profilesPanelProfileType.viewForProfile(profile);
+
+        view.show(this.profileViews);
+
+        profile._profilesTreeElement.select(true);
+        profile._profilesTreeElement.reveal();
+
+        this.visibleView = view;
+
+        this.profileViewStatusBarItemsContainer.removeChildren();
+
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    showView: function(view)
+    {
+        this.showProfile(view.profile);
+    },
+
+    getProfileType: function(typeId)
+    {
+        return this._profileTypesByIdMap[typeId];
+    },
+
+    showProfileForURL: function(url)
+    {
+        var match = url.match(WebInspector.ProfileType.URLRegExp);
+        if (!match)
+            return;
+        this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);
+    },
+
+    updateProfileTypeButtons: function()
+    {
+        for (var typeId in this._profileTypeButtonsByIdMap) {
+            var buttonElement = this._profileTypeButtonsByIdMap[typeId];
+            var profileType = this.getProfileType(typeId);
+            buttonElement.className = profileType.buttonStyle;
+            buttonElement.title = profileType.buttonTooltip;
+            // FIXME: Apply profileType.buttonCaption once captions are added to button controls.
+        }
+    },
+
+    closeVisibleView: function()
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+        delete this.visibleView;
+    },
+
+    displayTitleForProfileLink: function(title, typeId)
+    {
+        title = unescape(title);
+        if (title.indexOf(UserInitiatedProfileName) === 0) {
+            title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
+        } else {
+            var titleKey = this._makeKey(title, typeId);
+            if (!(titleKey in this._profileGroupsForLinks))
+                this._profileGroupsForLinks[titleKey] = 0;
+
+            groupNumber = ++this._profileGroupsForLinks[titleKey];
+
+            if (groupNumber > 2)
+                // The title is used in the console message announcing that a profile has started so it gets
+                // incremented twice as often as it's displayed
+                title += " " + WebInspector.UIString("Run %d", groupNumber / 2);
+        }
+        
+        return title;
+    },
+
+    get searchableViews()
+    {
+        var views = [];
+
+        const visibleView = this.visibleView;
+        if (visibleView && visibleView.performSearch)
+            views.push(visibleView);
+
+        var profilesLength = this._profiles.length;
+        for (var i = 0; i < profilesLength; ++i) {
+            var profile = this._profiles[i];
+            var view = profile.__profilesPanelProfileType.viewForProfile(profile);
+            if (!view.performSearch || view === visibleView)
+                continue;
+            views.push(view);
+        }
+
+        return views;
+    },
+
+    searchMatchFound: function(view, matches)
+    {
+        view.profile._profilesTreeElement.searchMatches = matches;
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
+
+        if (!this._profiles)
+            return;
+
+        for (var i = 0; i < this._profiles.length; ++i) {
+            var profile = this._profiles[i];
+            profile._profilesTreeElement.searchMatches = 0;
+        }
+    },
+
+    _updateInterface: function()
+    {
+        // FIXME: Replace ProfileType-specific button visibility changes by a single ProfileType-agnostic "combo-button" visibility change.
+        if (this._profilerEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            for (var typeId in this._profileTypeButtonsByIdMap)
+                this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");
+            this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            for (var typeId in this._profileTypeButtonsByIdMap)
+                this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");
+            this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
+            this.panelEnablerView.visible = true;
+        }
+    },
+
+    _enableProfiling: function()
+    {
+        if (this._profilerEnabled)
+            return;
+        this._toggleProfiling(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleProfiling: function(optionalAlways)
+    {
+        if (this._profilerEnabled)
+            InspectorBackend.disableProfiler(true);
+        else
+            InspectorBackend.enableProfiler(!!optionalAlways);
+    },
+
+    _populateProfiles: function()
+    {
+        var sidebarTreeChildrenCount = this.sidebarTree.children.length;
+        for (var i = 0; i < sidebarTreeChildrenCount; ++i) {
+            var treeElement = this.sidebarTree.children[i];
+            if (treeElement.children.length)
+                return;
+        }
+
+        function populateCallback(profileHeaders) {
+            profileHeaders.sort(function(a, b) { return a.uid - b.uid; });
+            var profileHeadersLength = profileHeaders.length;
+            for (var i = 0; i < profileHeadersLength; ++i)
+                WebInspector.addProfileHeader(profileHeaders[i]);
+        }
+
+        var callId = WebInspector.Callback.wrap(populateCallback);
+        InspectorBackend.getProfileHeaders(callId);
+
+        delete this._shouldPopulateProfiles;
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.welcomeView.element.style.left = width + "px";
+        this.profileViews.style.left = width + "px";
+        this.profileViewStatusBarItemsContainer.style.left = width + "px";
+        this.resize();
+    }
+}
+
+WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.ProfileSidebarTreeElement = function(profile)
+{
+    this.profile = profile;
+
+    if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+        this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);
+
+    WebInspector.SidebarTreeElement.call(this, "profile-sidebar-tree-item", "", "", profile, false);
+
+    this.refreshTitles();
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.profiles.showProfile(this.profile);
+    },
+
+    get mainTitle()
+    {
+        if (this._mainTitle)
+            return this._mainTitle;
+        if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+            return WebInspector.UIString("Profile %d", this._profileNumber);
+        return this.profile.title;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    },
+
+    get subtitle()
+    {
+        // There is no subtitle.
+    },
+
+    set subtitle(x)
+    {
+        // Can't change subtitle.
+    },
+
+    set searchMatches(matches)
+    {
+        if (!matches) {
+            if (!this.bubbleElement)
+                return;
+            this.bubbleElement.removeStyleClass("search-matches");
+            this.bubbleText = "";
+            return;
+        }
+
+        this.bubbleText = matches;
+        this.bubbleElement.addStyleClass("search-matches");
+    }
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)
+{
+    WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);
+    }
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.didGetProfileHeaders = WebInspector.Callback.processCallback;
+WebInspector.didGetProfile = WebInspector.Callback.processCallback;
+
+/* ConsolePanel.js */
+
+/*
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ConsolePanel = function()
+{
+    WebInspector.Panel.call(this);
+}
+
+WebInspector.ConsolePanel.prototype = {
+    toolbarItemClass: "console",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Console");
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+
+        this._previousConsoleState = WebInspector.drawer.state;
+        WebInspector.drawer.enterPanelMode();
+        WebInspector.showConsole();
+        
+        // Move the scope bar to the top of the messages, like the resources filter.
+        var scopeBar = document.getElementById("console-filter");
+        var consoleMessages = document.getElementById("console-messages");
+
+        scopeBar.parentNode.removeChild(scopeBar);
+        document.getElementById("console-view").insertBefore(scopeBar, consoleMessages);
+        
+        // Update styles, and give console-messages a top margin so it doesn't overwrite the scope bar.
+        scopeBar.addStyleClass("console-filter-top");
+        scopeBar.removeStyleClass("status-bar-item");
+
+        consoleMessages.addStyleClass("console-filter-top");
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+
+        if (this._previousConsoleState === WebInspector.Drawer.State.Hidden)
+            WebInspector.drawer.immediatelyExitPanelMode();
+        else
+            WebInspector.drawer.exitPanelMode();
+        delete this._previousConsoleState;
+        
+        // Move the scope bar back to the bottom bar, next to Clear Console.
+        var scopeBar = document.getElementById("console-filter");
+
+        scopeBar.parentNode.removeChild(scopeBar);
+        document.getElementById("other-drawer-status-bar-items").appendChild(scopeBar);
+        
+        // Update styles, and remove the top margin on console-messages.
+        scopeBar.removeStyleClass("console-filter-top");
+        scopeBar.addStyleClass("status-bar-item");
+
+        document.getElementById("console-messages").removeStyleClass("console-filter-top");
+    }
+}
+
+WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* AuditsPanel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this._constructCategories();
+
+    this.createSidebar();
+    this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);
+    this.sidebarTree.appendChild(this.auditsTreeElement);
+    this.auditsTreeElement.listItemElement.addStyleClass("hidden");
+    this.auditsTreeElement.expand();
+
+    this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();
+    this.auditsTreeElement.appendChild(this.auditsItemTreeElement);
+
+    this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);
+    this.sidebarTree.appendChild(this.auditResultsTreeElement);
+    this.auditResultsTreeElement.expand();
+
+    this.element.addStyleClass("audits");
+
+    this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-audit-results-status-bar-item");
+    this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "audit-views";
+    this.element.appendChild(this.viewsContainerElement);
+
+    this._launcherView = new WebInspector.AuditLauncherView(this.categoriesById, this.initiateAudit.bind(this));
+}
+
+WebInspector.AuditsPanel.prototype = {
+    toolbarItemClass: "audits",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Audits");
+    },
+
+    get statusBarItems()
+    {
+        return [this.clearResultsButton.element];
+    },
+
+    get mainResourceLoadTime()
+    {
+        return this._mainResourceLoadTime;
+    },
+
+    set mainResourceLoadTime(x)
+    {
+        this._mainResourceLoadTime = x;
+        this._didMainResourceLoad();
+    },
+
+    get mainResourceDOMContentTime()
+    {
+        return this._mainResourceDOMContentTime;
+    },
+
+    set mainResourceDOMContentTime(x)
+    {
+        this._mainResourceDOMContentTime = x;
+    },
+
+    get categoriesById()
+    {
+        return this._auditCategoriesById;
+    },
+
+    _constructCategories: function()
+    {
+        this._auditCategoriesById = {};
+        for (var categoryCtorID in WebInspector.AuditCategories) {
+            var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();
+            auditCategory._id = categoryCtorID;
+            this.categoriesById[categoryCtorID] = auditCategory;
+        }
+    },
+
+    _executeAudit: function(categories, resultCallback)
+    {
+        var resources = [];
+        for (var id in WebInspector.resources)
+            resources.push(WebInspector.resources[id]);
+
+        var rulesRemaining = 0;
+        for (var i = 0; i < categories.length; ++i)
+            rulesRemaining += categories[i].ruleCount;
+
+        var results = [];
+        var mainResourceURL = WebInspector.mainResource.url;
+
+        function ruleResultReadyCallback(categoryResult, ruleResult)
+        {
+            if (ruleResult && ruleResult.children)
+                categoryResult.addRuleResult(ruleResult);
+
+            --rulesRemaining;
+
+            if (!rulesRemaining && resultCallback)
+                resultCallback(mainResourceURL, results);
+        }
+
+        if (!rulesRemaining) {
+            resultCallback(mainResourceURL, results);
+            return;
+        }
+
+        for (var i = 0; i < categories.length; ++i) {
+            var category = categories[i];
+            var result = new WebInspector.AuditCategoryResult(category);
+            results.push(result);
+            category.runRules(resources, ruleResultReadyCallback.bind(null, result));
+        }
+    },
+
+    _auditFinishedCallback: function(launcherCallback, mainResourceURL, results)
+    {
+        var children = this.auditResultsTreeElement.children;
+        var ordinal = 1;
+        for (var i = 0; i < children.length; ++i) {
+            if (children[i].mainResourceURL === mainResourceURL)
+                ordinal++;
+        }
+
+        var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);
+        this.auditResultsTreeElement.appendChild(resultTreeElement);
+        resultTreeElement.reveal();
+        resultTreeElement.select();
+        if (launcherCallback)
+            launcherCallback();
+    },
+
+    initiateAudit: function(categoryIds, runImmediately, launcherCallback)
+    {
+        if (!categoryIds || !categoryIds.length)
+            return;
+
+        var categories = [];
+        for (var i = 0; i < categoryIds.length; ++i)
+            categories.push(this.categoriesById[categoryIds[i]]);
+
+        function initiateAuditCallback(categories, launcherCallback)
+        {
+            this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));
+        }
+
+        if (runImmediately)
+            initiateAuditCallback.call(this, categories, launcherCallback);
+        else
+            this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));
+    },
+
+    _reloadResources: function(callback)
+    {
+        this._resourceTrackingCallback = callback;
+
+        if (!WebInspector.panels.resources.resourceTrackingEnabled) {
+            InspectorBackend.enableResourceTracking(false);
+            this._updateLauncherViewControls(true);
+        } else
+            InspectorBackend.reloadPage();
+    },
+
+    _didMainResourceLoad: function()
+    {
+        if (this._resourceTrackingCallback) {
+            var callback = this._resourceTrackingCallback;
+            delete this._resourceTrackingCallback;
+            callback();
+        }
+    },
+
+    showResults: function(categoryResults)
+    {
+        if (!categoryResults._resultView)
+            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
+
+        this.visibleView = categoryResults._resultView;
+    },
+
+    showLauncherView: function()
+    {
+        this.visibleView = this._launcherView;
+    },
+    
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x)
+            return;
+
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x)
+            x.show(this.viewsContainerElement);
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this._updateLauncherViewControls(WebInspector.panels.resources.resourceTrackingEnabled);
+    },
+
+    attach: function()
+    {
+        WebInspector.Panel.prototype.attach.call(this);
+
+        this.auditsItemTreeElement.select();
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.viewsContainerElement.style.left = width + "px";
+    },
+
+    _updateLauncherViewControls: function(isTracking)
+    {
+        if (this._launcherView)
+            this._launcherView.updateResourceTrackingState(isTracking);
+    },
+
+    _clearButtonClicked: function()
+    {
+        this.auditsItemTreeElement.reveal();
+        this.auditsItemTreeElement.select();
+        this.auditResultsTreeElement.removeChildren();
+    }
+}
+
+WebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+
+
+WebInspector.AuditCategory = function(displayName)
+{
+    this._displayName = displayName;
+    this._rules = [];
+}
+
+WebInspector.AuditCategory.prototype = {
+    get id()
+    {
+        // this._id value is injected at construction time.
+        return this._id;
+    },
+
+    get displayName()
+    {
+        return this._displayName;
+    },
+
+    get ruleCount()
+    {
+        this._ensureInitialized();
+        return this._rules.length;
+    },
+
+    addRule: function(rule, severity)
+    {
+        rule.severity = severity;
+        this._rules.push(rule);
+    },
+
+    runRules: function(resources, callback)
+    {
+        this._ensureInitialized();
+        for (var i = 0; i < this._rules.length; ++i)
+            this._rules[i].run(resources, callback);
+    },
+
+    _ensureInitialized: function()
+    {
+        if (!this._initialized) {
+            if ("initialize" in this)
+                this.initialize();
+            this._initialized = true;
+        }
+    }
+}
+
+
+WebInspector.AuditRule = function(id, displayName)
+{
+    this._id = id;
+    this._displayName = displayName;
+}
+
+WebInspector.AuditRule.Severity = {
+    Info: "info",
+    Warning: "warning",
+    Severe: "severe"
+}
+
+WebInspector.AuditRule.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get displayName()
+    {
+        return this._displayName;
+    },
+
+    set severity(severity)
+    {
+        this._severity = severity;
+    },
+
+    run: function(resources, callback)
+    {
+        var result = new WebInspector.AuditRuleResult(this.displayName);
+        result.severity = this._severity;
+        this.doRun(resources, result, callback);
+    },
+
+    doRun: function(resources, result, callback)
+    {
+        throw new Error("doRun() not implemented");
+    }
+}
+
+WebInspector.AuditCategoryResult = function(category)
+{
+    this.title = category.displayName;
+    this.ruleResults = [];
+}
+
+WebInspector.AuditCategoryResult.prototype = {
+    addRuleResult: function(ruleResult)
+    {
+        this.ruleResults.push(ruleResult);
+    }
+}
+
+WebInspector.AuditRuleResult = function(value, expanded, className)
+{
+    this.value = value;
+    this.className = className;
+    this.expanded = expanded;
+    this.violationCount = 0;
+}
+
+WebInspector.AuditRuleResult.prototype = {
+    addChild: function(value, expanded, className)
+    {
+        if (!this.children)
+            this.children = [];
+        var entry = new WebInspector.AuditRuleResult(value, expanded, className);
+        this.children.push(entry);
+        return entry;
+    },
+
+    addURL: function(url)
+    {
+        return this.addChild(WebInspector.linkifyURL(url));
+    },
+
+    addURLs: function(urls)
+    {
+        for (var i = 0; i < urls.length; ++i)
+            this.addURL(urls[i]);
+    },
+
+    addSnippet: function(snippet)
+    {
+        return this.addChild(snippet, false, "source-code");
+    }
+}
+
+WebInspector.AuditsSidebarTreeElement = function()
+{
+    this.small = false;
+
+    WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);
+}
+
+WebInspector.AuditsSidebarTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
+    },
+
+    onselect: function()
+    {
+        WebInspector.panels.audits.showLauncherView();
+    },
+
+    get selectable()
+    {
+        return true;
+    },
+
+    refresh: function()
+    {
+        this.refreshTitles();
+    }
+}
+
+WebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+
+WebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)
+{
+    this.results = results;
+    this.mainResourceURL = mainResourceURL;
+
+    WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);
+}
+
+WebInspector.AuditResultSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.audits.showResults(this.results);
+    },
+
+    get selectable()
+    {
+        return true;
+    }
+}
+
+WebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+// Contributed audit rules should go into this namespace.
+WebInspector.AuditRules = {};
+
+// Contributed audit categories should go into this namespace.
+WebInspector.AuditCategories = {};
+
+/* AuditResultView.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditResultView = function(categoryResults)
+{
+    WebInspector.View.call(this);
+    this.element.className = "audit-result-view";
+
+    for (var i = 0; i < categoryResults.length; ++i)
+        this.element.appendChild(new WebInspector.AuditCategoryResultPane(categoryResults[i]).element);
+}
+
+WebInspector.AuditResultView.prototype.__proto__ = WebInspector.View.prototype;
+
+
+WebInspector.AuditCategoryResultPane = function(categoryResult)
+{
+    WebInspector.SidebarPane.call(this, categoryResult.title);
+    var treeOutlineElement = document.createElement("ol");
+    this.bodyElement.addStyleClass("audit-result-tree");
+    this.bodyElement.appendChild(treeOutlineElement);
+
+    this._treeOutline = new TreeOutline(treeOutlineElement);
+    this._treeOutline.expandTreeElementsWhenArrowing = true;
+    for (var i = 0; i < categoryResult.ruleResults.length; ++i) {
+        var ruleResult = categoryResult.ruleResults[i];
+        var treeElement = this._appendResult(this._treeOutline, ruleResult);
+        treeElement.listItemElement.addStyleClass("audit-result");
+
+        if (ruleResult.severity) {
+            var severityElement = document.createElement("img");
+            severityElement.className = "severity-" + ruleResult.severity;
+            treeElement.listItemElement.appendChild(severityElement);
+        }
+    }
+    this.expand();
+}
+
+WebInspector.AuditCategoryResultPane.prototype = {
+    _appendResult: function(parentTreeElement, result)
+    {
+        var title = result.value;
+        if (result.violationCount)
+            title = String.sprintf("%s (%d)", title, result.violationCount);
+
+        var treeElement = new TreeElement(title, null, !!result.children);
+        parentTreeElement.appendChild(treeElement);
+
+        if (result.className)
+            treeElement.listItemElement.addStyleClass(result.className);
+        if (result.children) {
+            for (var i = 0; i < result.children.length; ++i)
+                this._appendResult(treeElement, result.children[i]);
+        }
+        if (result.expanded) {
+            treeElement.listItemElement.removeStyleClass("parent");
+            treeElement.listItemElement.addStyleClass("parent-expanded");
+            treeElement.expand();
+        }
+        return treeElement;
+    }
+}
+
+WebInspector.AuditCategoryResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* AuditLauncherView.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditLauncherView = function(categoriesById, runnerCallback)
+{
+    WebInspector.View.call(this);
+    this._categoriesById = categoriesById;
+    this._runnerCallback = runnerCallback;
+    this._categoryIdPrefix = "audit-category-item-";
+    this._auditRunning = false;
+
+    this.element.addStyleClass("audit-launcher-view");
+
+    this._contentElement = document.createElement("div");
+    this._contentElement.className = "audit-launcher-view-content";
+    this.element.appendChild(this._contentElement);
+
+    function categorySortFunction(a, b)
+    {
+        var aTitle = a.displayName || "";
+        var bTitle = b.displayName || "";
+        return aTitle.localeCompare(bTitle);
+    }
+    var sortedCategories = [];
+    for (var id in this._categoriesById)
+        sortedCategories.push(this._categoriesById[id]);
+    sortedCategories.sort(categorySortFunction);
+
+    if (!sortedCategories.length) {
+        this._headerElement = document.createElement("h1");
+        this._headerElement.className = "no-audits";
+        this._headerElement.textContent = WebInspector.UIString("No audits to run");
+        this._contentElement.appendChild(this._headerElement);
+    } else
+        this._createLauncherUI(sortedCategories);
+}
+
+WebInspector.AuditLauncherView.prototype = {
+    updateResourceTrackingState: function(isTracking)
+    {
+        if (!this._auditPresentStateLabelElement)
+            return;
+        if (isTracking) {
+            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State");
+            this._auditPresentStateElement.disabled = false;
+            this._auditPresentStateElement.parentElement.removeStyleClass("disabled");
+        } else {
+            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)");
+            this._auditPresentStateElement.disabled = true;
+            this._auditPresentStateElement.parentElement.addStyleClass("disabled");
+            this.auditReloadedStateElement.checked = true;
+        }
+    },
+
+    _setAuditRunning: function(auditRunning)
+    {
+        if (this._auditRunning === auditRunning)
+            return;
+        this._auditRunning = auditRunning;
+        this._updateButton();
+    },
+
+    _launchButtonClicked: function(event)
+    {
+        var catIds = [];
+        var childNodes = this._categoriesElement.childNodes;
+        for (var id in this._categoriesById) {
+            if (this._categoriesById[id]._checkboxElement.checked)
+                catIds.push(id);
+        }
+        function profilingFinishedCallback()
+        {
+            this._setAuditRunning(false);
+        }
+        this._setAuditRunning(true);
+        this._runnerCallback(catIds, this._auditPresentStateElement.checked, profilingFinishedCallback.bind(this));
+    },
+
+    _selectAllClicked: function(checkCategories)
+    {
+        var childNodes = this._categoriesElement.childNodes;
+        for (var i = 0, length = childNodes.length; i < length; ++i)
+            childNodes[i].firstChild.checked = checkCategories;
+        this._currentCategoriesCount = checkCategories ? this._totalCategoriesCount : 0;
+        this._updateButton();
+    },
+
+    _categoryClicked: function(event)
+    {
+        this._currentCategoriesCount += event.target.checked ? 1 : -1;
+        this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._totalCategoriesCount;
+        this._updateButton();
+    },
+
+    _createCategoryElement: function(title, id)
+    {
+        var element;
+        var labelElement = document.createElement("label");
+        labelElement.id = this._categoryIdPrefix + id;
+
+        element = document.createElement("input");
+        element.type = "checkbox";
+        labelElement.appendChild(element);
+        labelElement.appendChild(document.createTextNode(title));
+
+        return labelElement;
+    },
+
+    _createLauncherUI: function(sortedCategories)
+    {
+        this._headerElement = document.createElement("h1");
+        this._headerElement.textContent = WebInspector.UIString("Select audits to run");
+        this._contentElement.appendChild(this._headerElement);
+
+        function handleSelectAllClick(event)
+        {
+            this._selectAllClicked(event.target.checked);
+        }
+        var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");
+        categoryElement.id = "audit-launcher-selectall";
+        this._selectAllCheckboxElement = categoryElement.firstChild;
+        this._selectAllCheckboxElement.checked = true;
+        this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);
+        this._contentElement.appendChild(categoryElement);
+
+        this._categoriesElement = document.createElement("div");
+        this._categoriesElement.className = "audit-categories-container";
+        this._contentElement.appendChild(this._categoriesElement);
+
+        var boundCategoryClickListener = this._categoryClicked.bind(this);
+
+        for (var i = 0; i < sortedCategories.length; ++i) {
+            categoryElement = this._createCategoryElement(sortedCategories[i].displayName, sortedCategories[i].id);
+            categoryElement.firstChild.addEventListener("click", boundCategoryClickListener, false);
+            sortedCategories[i]._checkboxElement = categoryElement.firstChild;
+            this._categoriesElement.appendChild(categoryElement);
+        }
+
+        this._totalCategoriesCount = this._categoriesElement.childNodes.length;
+        this._currentCategoriesCount = 0;
+
+        this._buttonContainerElement = document.createElement("div");
+        this._buttonContainerElement.className = "button-container";
+
+        var labelElement = document.createElement("label");
+        this._auditPresentStateElement = document.createElement("input");
+        this._auditPresentStateElement.name = "audit-mode";
+        this._auditPresentStateElement.type = "radio";
+        this._auditPresentStateElement.checked = true;
+        this._auditPresentStateLabelElement = document.createTextNode("");
+        labelElement.appendChild(this._auditPresentStateElement);
+        labelElement.appendChild(this._auditPresentStateLabelElement);
+        this._buttonContainerElement.appendChild(labelElement);
+
+        labelElement = document.createElement("label");
+        this.auditReloadedStateElement = document.createElement("input");
+        this.auditReloadedStateElement.name = "audit-mode";
+        this.auditReloadedStateElement.type = "radio";
+        labelElement.appendChild(this.auditReloadedStateElement);
+        labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));
+        this._buttonContainerElement.appendChild(labelElement);
+
+        this._launchButton = document.createElement("button");
+        this._launchButton.setAttribute("type", "button");
+        this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);
+        this._buttonContainerElement.appendChild(this._launchButton);
+
+        this._contentElement.appendChild(this._buttonContainerElement);
+
+        this._selectAllClicked(this._selectAllCheckboxElement.checked);
+        this.updateResourceTrackingState();
+        this._updateButton();
+    },
+
+    _updateButton: function()
+    {
+        this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;
+        if (this._auditRunning)
+            this._launchButton.textContent = WebInspector.UIString("Running...");
+        else
+            this._launchButton.textContent = WebInspector.UIString("Run");
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        setTimeout(this.resize(), 0);
+    },
+
+    resize: function()
+    {
+        if (this._categoriesElement)
+            this._categoriesElement.style.height = (this._buttonContainerElement.totalOffsetTop - this._categoriesElement.totalOffsetTop) + "px";
+    }
+}
+
+WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* AuditRules.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditRules.IPAddressRegexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
+
+WebInspector.AuditRules.CacheableResponseCodes =
+{
+    200: true,
+    203: true,
+    206: true,
+    300: true,
+    301: true,
+    410: true,
+
+    304: true // Underlying resource is cacheable
+}
+
+WebInspector.AuditRules.getDomainToResourcesMap = function(resources, types, regexp, needFullResources)
+{
+    var domainToResourcesMap = {};
+    for (var i = 0, size = resources.length; i < size; ++i) {
+        var resource = resources[i];
+        if (types && types.indexOf(resource.type) === -1)
+            continue;
+        var match = resource.url.match(regexp);
+        if (!match)
+            continue;
+        var domain = match[2];
+        var domainResources = domainToResourcesMap[domain];
+        if (domainResources === undefined) {
+          domainResources = [];
+          domainToResourcesMap[domain] = domainResources;
+        }
+        domainResources.push(needFullResources ? resource : resource.url);
+    }
+    return domainToResourcesMap;
+}
+
+WebInspector.AuditRules.evaluateInTargetWindow = function(func, callback)
+{
+    InjectedScriptAccess.getDefault().evaluateOnSelf(func.toString(), callback);
+}
+
+
+WebInspector.AuditRules.GzipRule = function()
+{
+    WebInspector.AuditRule.call(this, "network-gzip", "Enable gzip compression");
+}
+
+WebInspector.AuditRules.GzipRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var totalSavings = 0;
+        var compressedSize = 0;
+        var candidateSize = 0;
+        var summary = result.addChild("", true);
+        for (var i = 0, length = resources.length; i < length; ++i) {
+            var resource = resources[i];
+            if (this._shouldCompress(resource)) {
+                var size = resource.resourceSize;
+                candidateSize += size;
+                if (this._isCompressed(resource)) {
+                    compressedSize += size;
+                    continue;
+                }
+                var savings = 2 * size / 3;
+                totalSavings += savings;
+                summary.addChild(String.sprintf("%s could save ~%s", WebInspector.linkifyURL(resource.url), Number.bytesToString(savings)));
+                result.violationCount++;
+            }
+        }
+        if (!totalSavings)
+            return callback(null);
+        summary.value = String.sprintf("Compressing the following resources with gzip could reduce their transfer size by about two thirds (~%s):", Number.bytesToString(totalSavings));
+        callback(result);
+    },
+
+    _isCompressed: function(resource)
+    {
+        var encoding = resource.responseHeaders["Content-Encoding"];
+        return encoding === "gzip" || encoding === "deflate";
+    },
+
+    _shouldCompress: function(resource)
+    {
+        return WebInspector.Resource.Type.isTextType(resource.type) && resource.domain && resource.resourceSize !== undefined && resource.resourceSize > 150;
+    }
+}
+
+WebInspector.AuditRules.GzipRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CombineExternalResourcesRule = function(id, name, type, resourceTypeName, allowedPerDomain)
+{
+    WebInspector.AuditRule.call(this, id, name);
+    this._type = type;
+    this._resourceTypeName = resourceTypeName;
+    this._allowedPerDomain = allowedPerDomain;
+}
+
+WebInspector.AuditRules.CombineExternalResourcesRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, [this._type], WebInspector.URLRegExp);
+        var penalizedResourceCount = 0;
+        // TODO: refactor according to the chosen i18n approach
+        var summary = result.addChild("", true);
+        for (var domain in domainToResourcesMap) {
+            var domainResources = domainToResourcesMap[domain];
+            var extraResourceCount = domainResources.length - this._allowedPerDomain;
+            if (extraResourceCount <= 0)
+                continue;
+            penalizedResourceCount += extraResourceCount - 1;
+            summary.addChild(String.sprintf("%d %s resources served from %s.", domainResources.length, this._resourceTypeName, domain));
+            result.violationCount += domainResources.length;
+        }
+        if (!penalizedResourceCount)
+            return callback(null);
+
+        summary.value = "There are multiple resources served from same domain. Consider combining them into as few files as possible.";
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.CombineExternalResourcesRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CombineJsResourcesRule = function(allowedPerDomain) {
+    WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externaljs", "Combine external JavaScript", WebInspector.Resource.Type.Script, "JavaScript", allowedPerDomain);
+}
+
+WebInspector.AuditRules.CombineJsResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;
+
+
+WebInspector.AuditRules.CombineCssResourcesRule = function(allowedPerDomain) {
+    WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externalcss", "Combine external CSS", WebInspector.Resource.Type.Stylesheet, "CSS", allowedPerDomain);
+}
+
+WebInspector.AuditRules.CombineCssResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;
+
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule = function(hostCountThreshold) {
+    WebInspector.AuditRule.call(this, "network-minimizelookups", "Minimize DNS lookups");
+    this._hostCountThreshold = hostCountThreshold;
+}
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var summary = result.addChild("");
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, undefined, WebInspector.URLRegExp);
+        for (var domain in domainToResourcesMap) {
+            if (domainToResourcesMap[domain].length > 1)
+                continue;
+            var match = domain.match(WebInspector.URLRegExp);
+            if (!match)
+                continue;
+            if (!match[2].search(WebInspector.AuditRules.IPAddressRegexp))
+                continue; // an IP address
+            summary.addSnippet(match[2]);
+            result.violationCount++;
+        }
+        if (!summary.children || summary.children.length <= this._hostCountThreshold)
+            return callback(null);
+
+        summary.value = "The following domains only serve one resource each. If possible, avoid the extra DNS lookups by serving these resources from existing domains.";
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.ParallelizeDownloadRule = function(optimalHostnameCount, minRequestThreshold, minBalanceThreshold)
+{
+    WebInspector.AuditRule.call(this, "network-parallelizehosts", "Parallelize downloads across hostnames");
+    this._optimalHostnameCount = optimalHostnameCount;
+    this._minRequestThreshold = minRequestThreshold;
+    this._minBalanceThreshold = minBalanceThreshold;
+}
+
+
+WebInspector.AuditRules.ParallelizeDownloadRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function hostSorter(a, b)
+        {
+            var aCount = domainToResourcesMap[a].length;
+            var bCount = domainToResourcesMap[b].length;
+            return (aCount < bCount) ? 1 : (aCount == bCount) ? 0 : -1;
+        }
+
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(
+            resources,
+            [WebInspector.Resource.Type.Stylesheet, WebInspector.Resource.Type.Image],
+            WebInspector.URLRegExp,
+            true);
+
+        var hosts = [];
+        for (var url in domainToResourcesMap)
+            hosts.push(url);
+
+        if (!hosts.length)
+            return callback(null); // no hosts (local file or something)
+
+        hosts.sort(hostSorter);
+
+        var optimalHostnameCount = this._optimalHostnameCount;
+        if (hosts.length > optimalHostnameCount)
+            hosts.splice(optimalHostnameCount);
+
+        var busiestHostResourceCount = domainToResourcesMap[hosts[0]].length;
+        var resourceCountAboveThreshold = busiestHostResourceCount - this._minRequestThreshold;
+        if (resourceCountAboveThreshold <= 0)
+            return callback(null);
+
+        var avgResourcesPerHost = 0;
+        for (var i = 0, size = hosts.length; i < size; ++i)
+            avgResourcesPerHost += domainToResourcesMap[hosts[i]].length;
+
+        // Assume optimal parallelization.
+        avgResourcesPerHost /= optimalHostnameCount;
+        avgResourcesPerHost = Math.max(avgResourcesPerHost, 1);
+
+        var pctAboveAvg = (resourceCountAboveThreshold / avgResourcesPerHost) - 1.0;
+        var minBalanceThreshold = this._minBalanceThreshold;
+        if (pctAboveAvg < minBalanceThreshold)
+            return callback(null);
+
+        var resourcesOnBusiestHost = domainToResourcesMap[hosts[0]];
+        var entry = result.addChild(String.sprintf("This page makes %d parallelizable requests to %s. Increase download parallelization by distributing the following requests across multiple hostnames.", busiestHostResourceCount, hosts[0]), true);
+        for (var i = 0; i < resourcesOnBusiestHost.length; ++i)
+            entry.addURL(resourcesOnBusiestHost[i].url);
+
+        result.violationCount = resourcesOnBusiestHost.length;
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.ParallelizeDownloadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+// The reported CSS rule size is incorrect (parsed != original in WebKit),
+// so use percentages instead, which gives a better approximation.
+WebInspector.AuditRules.UnusedCssRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-unusedcss", "Remove unused CSS rules");
+}
+
+WebInspector.AuditRules.UnusedCssRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var self = this;
+        function evalCallback(routineResult, isException) {
+            if (isException || !routineResult || !routineResult.styleSheets.length)
+                return callback(null);
+
+            var totalUnusedPercent = Math.round(100 * routineResult.unusedSize / routineResult.totalSize);
+            var summary = result.addChild(String.sprintf("%d%% of CSS (estimated) is not used by the current page.", totalUnusedPercent), true);
+
+            for (var i = 0; i < routineResult.styleSheets.length; ++i) {
+                var stylesheet = routineResult.styleSheets[i];
+
+                var url = stylesheet.type === "href" ? WebInspector.linkifyURL(stylesheet.location) : String.sprintf("Inline block #%s", stylesheet.location);
+                var pctUnused = Math.round(100 * stylesheet.unusedSize / stylesheet.totalSize);
+                var entry = summary.addChild(String.sprintf("%s: %d%% (estimated) is not used by the current page.", url, pctUnused));
+
+                for (var j = 0; j < stylesheet.unusedRules.length; ++j)
+                    entry.addSnippet(stylesheet.unusedRules[j]);
+
+                result.violationCount += stylesheet.unusedRules.length;
+            }
+
+            callback(result);
+        }
+
+        function routine()
+        {
+            var styleSheets = document.styleSheets;
+            if (!styleSheets)
+                return false;
+            var routineResult = { styleSheets: [] };
+            var inlineBlockOrdinal = 0;
+            var totalStylesheetSize = 0;
+            var totalUnusedStylesheetSize = 0;
+            var pseudoSelectorRegexp = /:hover|:link|:active|:visited|:focus/;
+            for (var i = 0; i < styleSheets.length; ++i) {
+                var styleSheet = styleSheets[i];
+                if (!styleSheet.cssRules)
+                    continue;
+                var stylesheetSize = 0;
+                var unusedStylesheetSize = 0;
+                var unusedRules = [];
+                for (var curRule = 0; curRule < styleSheet.cssRules.length; ++curRule) {
+                    var rule = styleSheet.cssRules[curRule];
+                    var textLength = rule.cssText ? rule.cssText.length : 0;
+                    stylesheetSize += textLength;
+                    if (rule.type !== 1 || rule.selectorText.match(pseudoSelectorRegexp))
+                        continue;
+                    var nodes = document.querySelectorAll(rule.selectorText);
+                    if (nodes && nodes.length)
+                        continue;
+                    unusedStylesheetSize += textLength;
+                    unusedRules.push(rule.selectorText);
+                }
+                totalStylesheetSize += stylesheetSize;
+                totalUnusedStylesheetSize += unusedStylesheetSize;
+
+                if (unusedRules.length) {
+                    var entry = { type: styleSheet.href ? "href" : "inline",
+                                  totalSize: stylesheetSize,
+                                  unusedSize: unusedStylesheetSize,
+                                  location: styleSheet.href ? styleSheet.href : ++inlineBlockOrdinal,
+                                  unusedRules: unusedRules };
+                    routineResult.styleSheets.push(entry);
+                }
+            }
+            routineResult.totalSize = totalStylesheetSize;
+            routineResult.unusedSize = totalUnusedStylesheetSize;
+            return routineResult;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback);
+    }
+}
+
+WebInspector.AuditRules.UnusedCssRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CacheControlRule = function(id, name)
+{
+    WebInspector.AuditRule.call(this, id, name);
+}
+
+WebInspector.AuditRules.CacheControlRule.MillisPerMonth = 1000 * 60 * 60 * 24 * 30;
+
+WebInspector.AuditRules.CacheControlRule.prototype = {
+
+    doRun: function(resources, result, callback)
+    {
+        var cacheableAndNonCacheableResources = this._cacheableAndNonCacheableResources(resources);
+        if (cacheableAndNonCacheableResources[0].length)
+            this.runChecks(cacheableAndNonCacheableResources[0], result);
+        this.handleNonCacheableResources(cacheableAndNonCacheableResources[1], result);
+
+        callback(result);
+    },
+
+    handleNonCacheableResources: function()
+    {
+    },
+
+    _cacheableAndNonCacheableResources: function(resources)
+    {
+        var processedResources = [[], []];
+        for (var i = 0; i < resources.length; ++i) {
+            var resource = resources[i];
+            if (!this.isCacheableResource(resource))
+                continue;
+            if (this._isExplicitlyNonCacheable(resource))
+                processedResources[1].push(resource);
+            else
+                processedResources[0].push(resource);
+        }
+        return processedResources;
+    },
+
+    execCheck: function(messageText, resourceCheckFunction, resources, result)
+    {
+        var resourceCount = resources.length;
+        var urls = [];
+        for (var i = 0; i < resourceCount; ++i) {
+            if (resourceCheckFunction.call(this, resources[i]))
+                urls.push(resources[i].url);
+        }
+        if (urls.length) {
+            var entry = result.addChild(messageText, true);
+            entry.addURLs(urls);
+            result.violationCount += urls.length;
+        }
+    },
+
+    freshnessLifetimeGreaterThan: function(resource, timeMs)
+    {
+        var dateHeader = this.responseHeader(resource, "Date");
+        if (!dateHeader)
+            return false;
+
+        var dateHeaderMs = Date.parse(dateHeader);
+        if (isNaN(dateHeaderMs))
+            return false;
+
+        var freshnessLifetimeMs;
+        var maxAgeMatch = this.responseHeaderMatch(resource, "Cache-Control", "max-age=(\\d+)");
+
+        if (maxAgeMatch)
+            freshnessLifetimeMs = (maxAgeMatch[1]) ? 1000 * maxAgeMatch[1] : 0;
+        else {
+            var expiresHeader = this.responseHeader(resource, "Expires");
+            if (expiresHeader) {
+                var expDate = Date.parse(expiresHeader);
+                if (!isNaN(expDate))
+                    freshnessLifetimeMs = expDate - dateHeaderMs;
+            }
+        }
+
+        return (isNaN(freshnessLifetimeMs)) ? false : freshnessLifetimeMs > timeMs;
+    },
+
+    responseHeader: function(resource, header)
+    {
+        return resource.responseHeaders[header];
+    },
+
+    hasResponseHeader: function(resource, header)
+    {
+        return resource.responseHeaders[header] !== undefined;
+    },
+
+    isCompressible: function(resource)
+    {
+        return WebInspector.Resource.Type.isTextType(resource.type);
+    },
+
+    isPubliclyCacheable: function(resource)
+    {
+        if (this._isExplicitlyNonCacheable(resource))
+            return false;
+
+        if (this.responseHeaderMatch(resource, "Cache-Control", "public"))
+            return true;
+
+        return resource.url.indexOf("?") == -1 && !this.responseHeaderMatch(resource, "Cache-Control", "private");
+    },
+
+    responseHeaderMatch: function(resource, header, regexp)
+    {
+        return resource.responseHeaders[header]
+            ? resource.responseHeaders[header].match(new RegExp(regexp, "im"))
+            : undefined;
+    },
+
+    hasExplicitExpiration: function(resource)
+    {
+        return this.hasResponseHeader(resource, "Date") &&
+            (this.hasResponseHeader(resource, "Expires") || this.responseHeaderMatch(resource, "Cache-Control", "max-age"));
+    },
+
+    _isExplicitlyNonCacheable: function(resource)
+    {
+        var hasExplicitExp = this.hasExplicitExpiration(resource);
+        return this.responseHeaderMatch(resource, "Cache-Control", "(no-cache|no-store|must-revalidate)") ||
+            this.responseHeaderMatch(resource, "Pragma", "no-cache") ||
+            (hasExplicitExp && !this.freshnessLifetimeGreaterThan(resource, 0)) ||
+            (!hasExplicitExp && resource.url && resource.url.indexOf("?") >= 0) ||
+            (!hasExplicitExp && !this.isCacheableResource(resource));
+    },
+
+    isCacheableResource: function(resource)
+    {
+        return resource.statusCode !== undefined && WebInspector.AuditRules.CacheableResponseCodes[resource.statusCode];
+    }
+}
+
+WebInspector.AuditRules.CacheControlRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.BrowserCacheControlRule = function()
+{
+    WebInspector.AuditRules.CacheControlRule.call(this, "http-browsercache", "Leverage browser caching");
+}
+
+WebInspector.AuditRules.BrowserCacheControlRule.prototype = {
+    handleNonCacheableResources: function(resources, result)
+    {
+        if (resources.length) {
+            var entry = result.addChild("The following resources are explicitly non-cacheable. Consider making them cacheable if possible:", true);
+            result.violationCount += resources.length;
+            for (var i = 0; i < resources.length; ++i)
+                entry.addURL(resources[i].url);
+        }
+    },
+
+    runChecks: function(resources, result, callback)
+    {
+        this.execCheck("The following resources are missing a cache expiration. Resources that do not specify an expiration may not be cached by browsers:",
+            this._missingExpirationCheck, resources, result);
+        this.execCheck("The following resources specify a \"Vary\" header that disables caching in most versions of Internet Explorer:",
+            this._varyCheck, resources, result);
+        this.execCheck("The following cacheable resources have a short freshness lifetime:",
+            this._oneMonthExpirationCheck, resources, result);
+
+        // Unable to implement the favicon check due to the WebKit limitations.
+        this.execCheck("To further improve cache hit rate, specify an expiration one year in the future for the following cacheable resources:",
+            this._oneYearExpirationCheck, resources, result);
+    },
+
+    _missingExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) && !this.hasResponseHeader(resource, "Set-Cookie") && !this.hasExplicitExpiration(resource);
+    },
+
+    _varyCheck: function(resource)
+    {
+        var varyHeader = this.responseHeader(resource, "Vary");
+        if (varyHeader) {
+            varyHeader = varyHeader.replace(/User-Agent/gi, "");
+            varyHeader = varyHeader.replace(/Accept-Encoding/gi, "");
+            varyHeader = varyHeader.replace(/[, ]*/g, "");
+        }
+        return varyHeader && varyHeader.length && this.isCacheableResource(resource) && this.freshnessLifetimeGreaterThan(resource, 0);
+    },
+
+    _oneMonthExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.hasResponseHeader(resource, "Set-Cookie") &&
+            !this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&
+            this.freshnessLifetimeGreaterThan(resource, 0);
+    },
+
+    _oneYearExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.hasResponseHeader(resource, "Set-Cookie") &&
+            !this.freshnessLifetimeGreaterThan(resource, 11 * WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&
+            this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth);
+    }
+}
+
+WebInspector.AuditRules.BrowserCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;
+
+
+WebInspector.AuditRules.ProxyCacheControlRule = function() {
+    WebInspector.AuditRules.CacheControlRule.call(this, "http-proxycache", "Leverage proxy caching");
+}
+
+WebInspector.AuditRules.ProxyCacheControlRule.prototype = {
+    runChecks: function(resources, result, callback)
+    {
+        this.execCheck("Resources with a \"?\" in the URL are not cached by most proxy caching servers:",
+            this._questionMarkCheck, resources, result);
+        this.execCheck("Consider adding a \"Cache-Control: public\" header to the following resources:",
+            this._publicCachingCheck, resources, result);
+        this.execCheck("The following publicly cacheable resources contain a Set-Cookie header. This security vulnerability can cause cookies to be shared by multiple users.",
+            this._setCookieCacheableCheck, resources, result);
+    },
+
+    _questionMarkCheck: function(resource)
+    {
+        return resource.url.indexOf("?") >= 0 && !this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);
+    },
+
+    _publicCachingCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.isCompressible(resource) &&
+            !this.responseHeaderMatch(resource, "Cache-Control", "public") &&
+            !this.hasResponseHeader(resource, "Set-Cookie");
+    },
+
+    _setCookieCacheableCheck: function(resource)
+    {
+        return this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);
+    }
+}
+
+WebInspector.AuditRules.ProxyCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;
+
+
+WebInspector.AuditRules.ImageDimensionsRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-imagedims", "Specify image dimensions");
+}
+
+WebInspector.AuditRules.ImageDimensionsRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(evalResult, isException)
+        {
+            if (isException || !evalResult || !evalResult.totalImages)
+                return callback(null);
+
+            var entry = result.addChild("A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:", true);
+            var map = evalResult.map;
+            for (var url in map) {
+                var value = WebInspector.linkifyURL(url);
+                if (map[url] > 1)
+                    value += " (" + map[url] + " uses)";
+                entry.addChild(value);
+                result.violationCount++;
+            }
+            callback(result);
+        }
+
+        function routine()
+        {
+            var images = document.getElementsByTagName("img");
+            const widthRegExp = /width[^:;]*:/gim;
+            const heightRegExp = /height[^:;]*:/gim;
+
+            function hasDimension(element, cssText, rules, regexp, attributeName) {
+                if (element.attributes.getNamedItem(attributeName) != null || (cssText && cssText.match(regexp)))
+                    return true;
+
+                if (!rules)
+                    return false;
+                for (var i = 0; i < rules.length; ++i) {
+                    if (rules.item(i).style.cssText.match(regexp))
+                        return true;
+                }
+                return false;
+            }
+
+            function hasWidth(element, cssText, rules) {
+                return hasDimension(element, cssText, rules, widthRegExp, "width");
+            }
+
+            function hasHeight(element, cssText, rules) {
+                return hasDimension(element, cssText, rules, heightRegExp, "height");
+            }
+
+            var urlToNoDimensionCount = {};
+            var found = false;
+            for (var i = 0; i < images.length; ++i) {
+                var image = images[i];
+                if (!image.src)
+                    continue;
+                var position = document.defaultView.getComputedStyle(image).getPropertyValue("position");
+                if (position === "absolute")
+                    continue;
+                var cssText = (image.style && image.style.cssText) ? image.style.cssText : "";
+                var rules = document.defaultView.getMatchedCSSRules(image, "", true);
+                if (!hasWidth(image, cssText, rules) || !hasHeight(image, cssText, rules)) {
+                    found = true;
+                    if (urlToNoDimensionCount.hasOwnProperty(image.src))
+                        ++urlToNoDimensionCount[image.src];
+                    else
+                        urlToNoDimensionCount[image.src] = 1;
+                }
+            }
+            return found ? {totalImages: images.length, map: urlToNoDimensionCount} : null;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback.bind(this));
+    }
+}
+
+WebInspector.AuditRules.ImageDimensionsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CssInHeadRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-cssinhead", "Put CSS in the document head");
+}
+
+WebInspector.AuditRules.CssInHeadRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(evalResult, isException)
+        {
+            if (isException || !evalResult)
+                return callback(null);
+
+            var summary = result.addChild("");
+
+            var outputMessages = [];
+            for (var url in evalResult) {
+                var urlViolations = evalResult[url];
+                if (urlViolations[0])
+                    result.addChild(String.sprintf("%s style block(s) in the %s body should be moved to the document head.", urlViolations[0], WebInspector.linkifyURL(url)));
+                for (var i = 0; i < urlViolations[1].length; ++i)
+                    result.addChild(String.sprintf("Link node %s should be moved to the document head in %s", WebInspector.linkifyURL(urlViolations[1])), WebInspector.linkifyURL(url));
+                result.violationCount += urlViolations.length;
+            }
+            summary.value = String.sprintf("CSS in the document body adversely impacts rendering performance.");
+            callback(result);
+        }
+
+        function routine()
+        {
+            function allViews() {
+                var views = [document.defaultView];
+                var curView = 0;
+                while (curView < views.length) {
+                    var view = views[curView];
+                    var frames = view.frames;
+                    for (var i = 0; i < frames.length; ++i) {
+                        if (frames[i] !== view)
+                            views.push(frames[i]);
+                    }
+                    ++curView;
+                }
+                return views;
+            }
+
+            var views = allViews();
+            var urlToViolationsArray = {};
+            var found = false;
+            for (var i = 0; i < views.length; ++i) {
+                var view = views[i];
+                if (!view.document)
+                    continue;
+
+                var inlineStyles = view.document.querySelectorAll("body style");
+                var inlineStylesheets = view.document.querySelectorAll("body link[rel~='stylesheet'][href]");
+                if (!inlineStyles.length && !inlineStylesheets.length)
+                    continue;
+
+                found = true;
+                var inlineStylesheetHrefs = [];
+                for (var j = 0; j < inlineStylesheets.length; ++j)
+                    inlineStylesheetHrefs.push(inlineStylesheets[j].href);
+                urlToViolationsArray[view.location.href] = [inlineStyles.length, inlineStylesheetHrefs];
+            }
+            return found ? urlToViolationsArray : null;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback);
+    }
+}
+
+WebInspector.AuditRules.CssInHeadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.StylesScriptsOrderRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-stylescriptorder", "Optimize the order of styles and scripts");
+}
+
+WebInspector.AuditRules.StylesScriptsOrderRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(resultValue, isException)
+        {
+            if (isException || !resultValue)
+                return callback(null);
+
+            var lateCssUrls = resultValue[0];
+            var cssBeforeInlineCount = resultValue[1];
+
+            var entry = result.addChild("The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.", true);
+            entry.addURLs(lateCssUrls);
+            result.violationCount += lateCssUrls.length;
+
+            if (cssBeforeInlineCount) {
+                result.addChild(String.sprintf(" %d inline script block%s found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.", cssBeforeInlineCount, cssBeforeInlineCount > 1 ? "s were" : " was"));
+                result.violationCount += cssBeforeInlineCount;
+            }
+            callback(result);
+        }
+
+        function routine()
+        {
+            var lateStyles = document.querySelectorAll("head script[src] ~ link[rel~='stylesheet'][href]");
+            var cssBeforeInlineCount = document.querySelectorAll("head link[rel~='stylesheet'][href] ~ script:not([src])").length;
+            if (!lateStyles.length && !cssBeforeInlineCount)
+                return null;
+
+            var lateStyleUrls = [];
+            for (var i = 0; i < lateStyles.length; ++i)
+                lateStyleUrls.push(lateStyles[i].href);
+            return [ lateStyleUrls, cssBeforeInlineCount ];
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback.bind(this));
+    }
+}
+
+WebInspector.AuditRules.StylesScriptsOrderRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CookieRuleBase = function(id, name)
+{
+    WebInspector.AuditRule.call(this, id, name);
+}
+
+WebInspector.AuditRules.CookieRuleBase.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var self = this;
+        function resultCallback(receivedCookies, isAdvanced) {
+            self.processCookies(isAdvanced ? receivedCookies : [], resources, result);
+            callback(result);
+        }
+        WebInspector.Cookies.getCookiesAsync(resultCallback);
+    },
+
+    mapResourceCookies: function(resourcesByDomain, allCookies, callback)
+    {
+        for (var i = 0; i < allCookies.length; ++i) {
+            for (var resourceDomain in resourcesByDomain) {
+                if (WebInspector.Cookies.cookieDomainMatchesResourceDomain(allCookies[i].domain, resourceDomain))
+                    this._callbackForResourceCookiePairs(resourcesByDomain[resourceDomain], allCookies[i], callback);
+            }
+        }
+    },
+
+    _callbackForResourceCookiePairs: function(resources, cookie, callback)
+    {
+        if (!resources)
+            return;
+        for (var i = 0; i < resources.length; ++i) {
+            if (WebInspector.Cookies.cookieMatchesResourceURL(cookie, resources[i].url))
+                callback(resources[i], cookie);
+        }
+    }
+}
+
+WebInspector.AuditRules.CookieRuleBase.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CookieSizeRule = function(avgBytesThreshold)
+{
+    WebInspector.AuditRules.CookieRuleBase.call(this, "http-cookiesize", "Minimize cookie size");
+    this._avgBytesThreshold = avgBytesThreshold;
+    this._maxBytesThreshold = 1000;
+}
+
+WebInspector.AuditRules.CookieSizeRule.prototype = {
+    _average: function(cookieArray)
+    {
+        var total = 0;
+        for (var i = 0; i < cookieArray.length; ++i)
+            total += cookieArray[i].size;
+        return cookieArray.length ? Math.round(total / cookieArray.length) : 0;
+    },
+
+    _max: function(cookieArray)
+    {
+        var result = 0;
+        for (var i = 0; i < cookieArray.length; ++i)
+            result = Math.max(cookieArray[i].size, result);
+        return result;
+    },
+
+    processCookies: function(allCookies, resources, result)
+    {
+        function maxSizeSorter(a, b)
+        {
+            return b.maxCookieSize - a.maxCookieSize;
+        }
+
+        function avgSizeSorter(a, b)
+        {
+            return b.avgCookieSize - a.avgCookieSize;
+        }
+
+        var cookiesPerResourceDomain = {};
+
+        function collectorCallback(resource, cookie)
+        {
+            var cookies = cookiesPerResourceDomain[resource.domain];
+            if (!cookies) {
+                cookies = [];
+                cookiesPerResourceDomain[resource.domain] = cookies;
+            }
+            cookies.push(cookie);
+        }
+
+        if (!allCookies.length)
+            return;
+
+        var sortedCookieSizes = [];
+
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,
+                null,
+                WebInspector.URLRegExp,
+                true);
+        var matchingResourceData = {};
+        this.mapResourceCookies(domainToResourcesMap, allCookies, collectorCallback.bind(this));
+
+        for (var resourceDomain in cookiesPerResourceDomain) {
+            var cookies = cookiesPerResourceDomain[resourceDomain];
+            sortedCookieSizes.push({
+                domain: resourceDomain,
+                avgCookieSize: this._average(cookies),
+                maxCookieSize: this._max(cookies)
+            });
+        }
+        var avgAllCookiesSize = this._average(allCookies);
+
+        var hugeCookieDomains = [];
+        sortedCookieSizes.sort(maxSizeSorter);
+
+        for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {
+            var maxCookieSize = sortedCookieSizes[i].maxCookieSize;
+            if (maxCookieSize > this._maxBytesThreshold)
+                hugeCookieDomains.push(sortedCookieSizes[i].domain + ": " + Number.bytesToString(maxCookieSize));
+        }
+
+        var bigAvgCookieDomains = [];
+        sortedCookieSizes.sort(avgSizeSorter);
+        for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {
+            var domain = sortedCookieSizes[i].domain;
+            var avgCookieSize = sortedCookieSizes[i].avgCookieSize;
+            if (avgCookieSize > this._avgBytesThreshold && avgCookieSize < this._maxBytesThreshold)
+                bigAvgCookieDomains.push(domain + ": " + Number.bytesToString(avgCookieSize));
+        }
+        result.addChild(String.sprintf("The average cookie size for all requests on this page is %s", Number.bytesToString(avgAllCookiesSize)));
+
+        var message;
+        if (hugeCookieDomains.length) {
+            var entry = result.addChild("The following domains have a cookie size in excess of 1KB. This is harmful because requests with cookies larger than 1KB typically cannot fit into a single network packet.", true);
+            entry.addURLs(hugeCookieDomains);
+            result.violationCount += hugeCookieDomains.length;
+        }
+
+        if (bigAvgCookieDomains.length) {
+            var entry = result.addChild(String.sprintf("The following domains have an average cookie size in excess of %d bytes. Reducing the size of cookies for these domains can reduce the time it takes to send requests.", this._avgBytesThreshold), true);
+            entry.addURLs(bigAvgCookieDomains.length);
+            result.violationCount += bigAvgCookieDomains.length;
+        }
+    }
+}
+
+WebInspector.AuditRules.CookieSizeRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;
+
+
+WebInspector.AuditRules.StaticCookielessRule = function(minResources)
+{
+    WebInspector.AuditRules.CookieRuleBase.call(this, "http-staticcookieless", "Serve static content from a cookieless domain");
+    this._minResources = minResources;
+}
+
+WebInspector.AuditRules.StaticCookielessRule.prototype = {
+    processCookies: function(allCookies, resources, result)
+    {
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,
+                [WebInspector.Resource.Type.Stylesheet,
+                 WebInspector.Resource.Type.Image],
+                WebInspector.URLRegExp,
+                true);
+        var totalStaticResources = 0;
+        for (var domain in domainToResourcesMap)
+            totalStaticResources += domainToResourcesMap[domain].length;
+        if (totalStaticResources < this._minResources)
+            return;
+        var matchingResourceData = {};
+        this.mapResourceCookies(domainToResourcesMap, allCookies, this._collectorCallback.bind(this, matchingResourceData));
+
+        var badUrls = [];
+        var cookieBytes = 0;
+        for (var url in matchingResourceData) {
+            badUrls.push(url);
+            cookieBytes += matchingResourceData[url]
+        }
+        if (badUrls.length < this._minResources)
+            return;
+
+        var entry = result.addChild(String.sprintf("%s of cookies were sent with the following static resources. Serve these static resources from a domain that does not set cookies:", Number.bytesToString(cookieBytes)), true);
+        entry.addURLs(badUrls);
+        result.violationCount = badUrls.length;
+    },
+
+    _collectorCallback: function(matchingResourceData, resource, cookie)
+    {
+        matchingResourceData[resource.url] = (matchingResourceData[resource.url] || 0) + cookie.size;
+    }
+}
+
+WebInspector.AuditRules.StaticCookielessRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;
+
+/* AuditCategories.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditCategories.PagePerformance = function() {
+    WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.PagePerformance.AuditCategoryName);
+}
+
+WebInspector.AuditCategories.PagePerformance.AuditCategoryName = "Web Page Performance";
+
+WebInspector.AuditCategories.PagePerformance.prototype = {
+    initialize: function()
+    {
+        this.addRule(new WebInspector.AuditRules.UnusedCssRule(), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CssInHeadRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.StylesScriptsOrderRule(), WebInspector.AuditRule.Severity.Severe);
+    }
+}
+
+WebInspector.AuditCategories.PagePerformance.prototype.__proto__ = WebInspector.AuditCategory.prototype;
+
+WebInspector.AuditCategories.NetworkUtilization = function() {
+    WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName);
+}
+
+WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName = "Network Utilization";
+
+WebInspector.AuditCategories.NetworkUtilization.prototype = {
+    initialize: function()
+    {
+        this.addRule(new WebInspector.AuditRules.GzipRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.ImageDimensionsRule(), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CookieSizeRule(400), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.StaticCookielessRule(5), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CombineJsResourcesRule(2), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.CombineCssResourcesRule(2), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.MinimizeDnsLookupsRule(4), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.ParallelizeDownloadRule(4, 10, 0.5), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.BrowserCacheControlRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.ProxyCacheControlRule(), WebInspector.AuditRule.Severity.Warning);
+    }
+}
+
+WebInspector.AuditCategories.NetworkUtilization.prototype.__proto__ = WebInspector.AuditCategory.prototype;
+
+/* ResourceView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) IBM Corp. 2009  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourceView = function(resource)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("resource-view");
+
+    this.resource = resource;
+
+    this.tabsElement = document.createElement("div");
+    this.tabsElement.className = "scope-bar";
+    this.element.appendChild(this.tabsElement);
+
+    this.headersTabElement = document.createElement("li");
+    this.headersTabElement.textContent = WebInspector.UIString("Headers");
+    this.contentTabElement = document.createElement("li");
+    this.contentTabElement.textContent = WebInspector.UIString("Content");
+    this.tabsElement.appendChild(this.headersTabElement);
+    this.tabsElement.appendChild(this.contentTabElement);
+
+    this.headersTabElement.addEventListener("click", this._selectHeadersTab.bind(this), false);
+    this.contentTabElement.addEventListener("click", this.selectContentTab.bind(this), false);
+
+    this.headersElement = document.createElement("div");
+    this.headersElement.className = "resource-view-headers";
+    this.element.appendChild(this.headersElement);
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "resource-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.headersListElement = document.createElement("ol");
+    this.headersListElement.className = "outline-disclosure";
+    this.headersElement.appendChild(this.headersListElement);
+
+    this.headersTreeOutline = new TreeOutline(this.headersListElement);
+    this.headersTreeOutline.expandTreeElementsWhenArrowing = true;
+
+    this.urlTreeElement = new TreeElement("", null, false);
+    this.urlTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.urlTreeElement);
+
+    this.requestMethodTreeElement = new TreeElement("", null, false);
+    this.requestMethodTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.requestMethodTreeElement);
+
+    this.statusCodeTreeElement = new TreeElement("", null, false);
+    this.statusCodeTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.statusCodeTreeElement);
+     
+    this.requestHeadersTreeElement = new TreeElement("", null, true);
+    this.requestHeadersTreeElement.expanded = true;
+    this.requestHeadersTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.requestHeadersTreeElement);
+
+    this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
+    this._decodeRequestParameters = true;
+
+    this.queryStringTreeElement = new TreeElement("", null, true);
+    this.queryStringTreeElement.expanded = true;
+    this.queryStringTreeElement.selectable = false;
+    this.queryStringTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.queryStringTreeElement);
+
+    this.formDataTreeElement = new TreeElement("", null, true);
+    this.formDataTreeElement.expanded = true;
+    this.formDataTreeElement.selectable = false;
+    this.formDataTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.formDataTreeElement);
+
+    this.requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);
+    this.requestPayloadTreeElement.expanded = true;
+    this.requestPayloadTreeElement.selectable = false;
+    this.requestPayloadTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.requestPayloadTreeElement);
+
+    this.responseHeadersTreeElement = new TreeElement("", null, true);
+    this.responseHeadersTreeElement.expanded = true;
+    this.responseHeadersTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.responseHeadersTreeElement);
+
+    this.headersVisible = true;
+
+    resource.addEventListener("url changed", this._refreshURL, this);
+    resource.addEventListener("requestHeaders changed", this._refreshRequestHeaders, this);
+    resource.addEventListener("responseHeaders changed", this._refreshResponseHeaders, this);
+    resource.addEventListener("finished", this._refreshHTTPInformation, this);
+
+    this._refreshURL();
+    this._refreshRequestHeaders();
+    this._refreshResponseHeaders();
+    this._refreshHTTPInformation();
+    this._selectTab();
+}
+
+WebInspector.ResourceView.prototype = {
+    attach: function()
+    {
+        if (!this.element.parentNode) {
+            var parentElement = (document.getElementById("resource-views") || document.getElementById("script-resource-views"));
+            if (parentElement)
+                parentElement.appendChild(this.element);
+        }
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this._selectTab();
+    },
+
+    set headersVisible(x)
+    {
+        if (x === this._headersVisible)
+            return;
+        this._headersVisible = x;
+        if (x)
+            this.element.addStyleClass("headers-visible"); 
+        else
+            this.element.removeStyleClass("headers-visible"); 
+        this._selectTab();
+    },
+
+    _selectTab: function()
+    {
+        if (this._headersVisible) {
+            if (WebInspector.settings.resourceViewTab === "headers")
+                this._selectHeadersTab();
+            else
+                this.selectContentTab();
+        } else
+            this._innerSelectContentTab();
+    },
+
+    _selectHeadersTab: function()
+    {
+        WebInspector.settings.resourceViewTab = "headers";
+        this.headersTabElement.addStyleClass("selected");
+        this.contentTabElement.removeStyleClass("selected");
+        this.headersElement.removeStyleClass("hidden");
+        this.contentElement.addStyleClass("hidden");
+    },
+
+    selectContentTab: function()
+    {
+        WebInspector.settings.resourceViewTab = "content";
+        this._innerSelectContentTab();
+    },
+
+    _innerSelectContentTab: function()
+    {
+        this.contentTabElement.addStyleClass("selected");
+        this.headersTabElement.removeStyleClass("selected");
+        this.contentElement.removeStyleClass("hidden");
+        this.headersElement.addStyleClass("hidden");
+        if ("resize" in this)
+            this.resize();
+        if ("contentTabSelected" in this)
+            this.contentTabSelected();
+    },
+
+    _refreshURL: function()
+    {
+        this.urlTreeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request URL") + ":</div>" +
+            "<div class=\"header-value source-code\">" + this.resource.url.escapeHTML() + "</div>";
+    },
+
+    _refreshQueryString: function()
+    {
+        var url = this.resource.url;
+        var hasQueryString = url.indexOf("?") >= 0;
+
+        if (!hasQueryString) {
+            this.queryStringTreeElement.hidden = true;
+            return;
+        }
+
+        this.queryStringTreeElement.hidden = false;
+        var parmString = url.split("?", 2)[1];
+        this._refreshParms(WebInspector.UIString("Query String Parameters"), parmString, this.queryStringTreeElement);
+    },
+
+    _refreshFormData: function()
+    {
+        this.formDataTreeElement.hidden = true;
+        this.requestPayloadTreeElement.hidden = true;
+
+        var isFormData = this.resource.requestFormData;
+        if (!isFormData)
+            return;
+
+        var isFormEncoded = false;
+        var requestContentType = this._getHeaderValue(this.resource.requestHeaders, "Content-Type");
+        if (requestContentType && requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
+            isFormEncoded = true;
+
+        if (isFormEncoded) {
+            this.formDataTreeElement.hidden = false;
+            this._refreshParms(WebInspector.UIString("Form Data"), this.resource.requestFormData, this.formDataTreeElement);
+        } else {
+            this.requestPayloadTreeElement.hidden = false;
+            this._refreshRequestPayload(this.resource.requestFormData);
+        }
+    },
+
+    _refreshRequestPayload: function(formData)
+    {
+        this.requestPayloadTreeElement.removeChildren();
+
+        var title = "<div class=\"header-name\">&nbsp;</div>";
+        title += "<div class=\"raw-form-data header-value source-code\">" + formData.escapeHTML() + "</div>";
+        var parmTreeElement = new TreeElement(title, null, false);
+        parmTreeElement.selectable = false;
+        this.requestPayloadTreeElement.appendChild(parmTreeElement);
+    },
+
+    _refreshParms: function(title, parmString, parmsTreeElement)
+    {
+        var parms = parmString.split("&");
+        for (var i = 0; i < parms.length; ++i) {
+            var parm = parms[i];
+            parm = parm.split("=", 2);
+            if (parm.length == 1)
+                parm.push("");
+            parms[i] = parm;
+        }
+
+        parmsTreeElement.removeChildren();
+
+        parmsTreeElement.title = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
+
+        for (var i = 0; i < parms.length; ++i) {
+            var key = parms[i][0];
+            var value = parms[i][1];
+
+            var errorDecoding = false;
+            if (this._decodeRequestParameters) {
+                if (value.indexOf("%") >= 0) {
+                    try {
+                        value = decodeURIComponent(value);
+                    } catch(e) {
+                        errorDecoding = true;
+                    }
+                }
+                    
+                value = value.replace(/\+/g, " ");
+            }
+
+            valueEscaped = value.escapeHTML();
+            if (errorDecoding)
+                valueEscaped += " <span class=\"error-message\">" + WebInspector.UIString("(unable to decode value)").escapeHTML() + "</span>";
+
+            var title = "<div class=\"header-name\">" + key.escapeHTML() + ":</div>";
+            title += "<div class=\"header-value source-code\">" + valueEscaped + "</div>";
+
+            var parmTreeElement = new TreeElement(title, null, false);
+            parmTreeElement.selectable = false;
+            parmTreeElement.tooltip = this._decodeHover;
+            parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
+            parmsTreeElement.appendChild(parmTreeElement);
+        }
+    },
+
+    _toggleURLdecoding: function(event)
+    {
+        this._decodeRequestParameters = !this._decodeRequestParameters;
+        this._refreshQueryString();
+        this._refreshFormData();
+    },
+
+    _getHeaderValue: function(headers, key)
+    {
+        var lowerKey = key.toLowerCase();
+        for (var testKey in headers) {
+            if (testKey.toLowerCase() === lowerKey)
+                return headers[testKey];
+        }
+    },
+
+    _refreshRequestHeaders: function()
+    {
+        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
+        this._refreshFormData();
+    },
+
+    _refreshResponseHeaders: function()
+    {
+        this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement);
+    },
+
+    _refreshHTTPInformation: function()
+    {
+        var requestMethodElement = this.requestMethodTreeElement;
+        requestMethodElement.hidden = !this.resource.statusCode;
+        var statusCodeElement = this.statusCodeTreeElement;
+        statusCodeElement.hidden = !this.resource.statusCode;
+        var statusCodeImage = "";
+
+        if (this.resource.statusCode) {
+            var statusImageSource = "";
+            if (this.resource.statusCode < 300)
+                statusImageSource = "Images/successGreenDot.png";
+            else if (this.resource.statusCode < 400)
+                statusImageSource = "Images/warningOrangeDot.png";
+            else
+                statusImageSource = "Images/errorRedDot.png";
+            statusCodeImage = "<img class=\"resource-status-image\" src=\"" + statusImageSource + "\" title=\"" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "\">";
+    
+            requestMethodElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request Method") + ":</div>" +
+                "<div class=\"header-value source-code\">" + this.resource.requestMethod + "</div>";
+
+            statusCodeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Status Code") + ":</div>" +
+                statusCodeImage + "<div class=\"header-value source-code\">" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "</div>";
+        }
+    },
+    
+    _refreshHeaders: function(title, headers, headersTreeElement)
+    {
+        headersTreeElement.removeChildren();
+
+        var length = headers.length;
+        headersTreeElement.title = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";
+        headersTreeElement.hidden = !length;
+
+        var length = headers.length;
+        for (var i = 0; i < length; ++i) {
+            var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";
+            title += "<div class=\"header-value source-code\">" + headers[i].value.escapeHTML() + "</div>"
+
+            var headerTreeElement = new TreeElement(title, null, false);
+            headerTreeElement.selectable = false;
+            headersTreeElement.appendChild(headerTreeElement);
+        }
+    }
+}
+
+WebInspector.ResourceView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* SourceFrame.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceFrame = function(parentElement, addBreakpointDelegate, removeBreakpointDelegate)
+{
+    this._parentElement = parentElement;
+
+    this._textModel = new WebInspector.TextEditorModel();
+    this._textModel.replaceTabsWithSpaces = true;
+
+    this._messages = [];
+    this._rowMessages = {};
+    this._messageBubbles = {};
+    this.breakpoints = [];
+    this._shortcuts = {};
+
+    this._loaded = false;
+
+    this._addBreakpointDelegate = addBreakpointDelegate;
+    this._removeBreakpointDelegate = removeBreakpointDelegate;
+    this._popoverObjectGroup = "popover";
+}
+
+WebInspector.SourceFrame.prototype = {
+
+    set visible(visible)
+    {
+        this._visible = visible;
+        this._createViewerIfNeeded();
+        if (!visible && this._textViewer)
+            this._textViewer.freeCachedElements();
+            
+    },
+
+    get executionLine()
+    {
+        return this._executionLine;
+    },
+
+    set executionLine(x)
+    {
+        if (this._executionLine === x)
+            return;
+
+        var previousLine = this._executionLine;
+        this._executionLine = x;
+
+        if (this._textViewer)
+            this._updateExecutionLine(previousLine);
+    },
+
+    revealLine: function(lineNumber)
+    {
+        if (this._textViewer)
+            this._textViewer.revealLine(lineNumber - 1, 0);
+        else
+            this._lineNumberToReveal = lineNumber;
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        this.breakpoints.push(breakpoint);
+        breakpoint.addEventListener("enabled", this._breakpointChanged, this);
+        breakpoint.addEventListener("disabled", this._breakpointChanged, this);
+        breakpoint.addEventListener("condition-changed", this._breakpointChanged, this);
+        if (this._textViewer)
+            this._addBreakpointToSource(breakpoint);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        this.breakpoints.remove(breakpoint);
+        breakpoint.removeEventListener("enabled", null, this);
+        breakpoint.removeEventListener("disabled", null, this);
+        breakpoint.removeEventListener("condition-changed", null, this);
+        if (this._textViewer)
+            this._removeBreakpointFromSource(breakpoint);
+    },
+
+    addMessage: function(msg)
+    {
+        // Don't add the message if there is no message or valid line or if the msg isn't an error or warning.
+        if (!msg.message || msg.line <= 0 || !msg.isErrorOrWarning())
+            return;
+        this._messages.push(msg)
+        if (this._textViewer)
+            this._addMessageToSource(msg);
+    },
+
+    clearMessages: function()
+    {
+        for (var line in this._messageBubbles) {
+            var bubble = this._messageBubbles[line];
+            bubble.parentNode.removeChild(bubble);
+        }
+
+        this._messages = [];
+        this._rowMessages = {};
+        this._messageBubbles = {};
+        if (this._textViewer)
+            this._textViewer.resize();
+    },
+
+    sizeToFitContentHeight: function()
+    {
+        if (this._textViewer)
+            this._textViewer.revalidateDecorationsAndPaint();
+    },
+
+    setContent: function(mimeType, content, url)
+    {
+        this._loaded = true;
+        this._textModel.setText(null, content);
+        this._mimeType = mimeType;
+        this._url = url;
+        this._createViewerIfNeeded();
+    },
+
+    highlightLine: function(line)
+    {
+        if (this._textViewer)
+            this._textViewer.highlightLine(line - 1);
+        else
+            this._lineToHighlight = line;
+    },
+
+    _createViewerIfNeeded: function()
+    {
+        if (!this._visible || !this._loaded || this._textViewer)
+            return;
+
+        this._textViewer = new WebInspector.TextViewer(this._textModel, WebInspector.platform, this._url);
+        var element = this._textViewer.element;
+        element.addEventListener("keydown", this._keyDown.bind(this), true);
+        element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
+        element.addEventListener("mousedown", this._mouseDown.bind(this), true);
+        element.addEventListener("mousemove", this._mouseMove.bind(this), true);
+        element.addEventListener("scroll", this._scroll.bind(this), true);
+        this._parentElement.appendChild(element);
+
+        this._needsProgramCounterImage = true;
+        this._needsBreakpointImages = true;
+
+        this._textViewer.beginUpdates();
+
+        this._textViewer.mimeType = this._mimeType;
+        this._addExistingMessagesToSource();
+        this._addExistingBreakpointsToSource();
+        this._updateExecutionLine();
+        this._textViewer.resize();
+
+        if (this._lineNumberToReveal) {
+            this.revealLine(this._lineNumberToReveal);
+            delete this._lineNumberToReveal;
+        }
+
+        if (this._pendingMarkRange) {
+            var range = this._pendingMarkRange;
+            this.markAndRevealRange(range);
+            delete this._pendingMarkRange;
+        }
+
+        if (this._lineToHighlight) {
+            this.highlightLine(this._lineToHighlight);
+            delete this._lineToHighlight;
+        }
+        this._textViewer.endUpdates();
+    },
+
+    findSearchMatches: function(query)
+    {
+        var ranges = [];
+
+        // First do case-insensitive search.
+        var regexObject = createSearchRegex(query);
+        this._collectRegexMatches(regexObject, ranges);
+
+        // Then try regex search if user knows the / / hint.
+        try {
+            if (/^\/.*\/$/.test(query))
+                this._collectRegexMatches(new RegExp(query.substring(1, query.length - 1)), ranges);
+        } catch (e) {
+            // Silent catch.
+        }
+        return ranges;
+    },
+
+    _collectRegexMatches: function(regexObject, ranges)
+    {
+        for (var i = 0; i < this._textModel.linesCount; ++i) {
+            var line = this._textModel.line(i);
+            var offset = 0;
+            do {
+                var match = regexObject.exec(line);
+                if (match) {
+                    ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + match.index + match[0].length));
+                    offset += match.index + 1;
+                    line = line.substring(match.index + 1);
+                }
+            } while (match)
+        }
+        return ranges;
+    },
+
+    markAndRevealRange: function(range)
+    {
+        if (this._textViewer)
+            this._textViewer.markAndRevealRange(range);
+        else
+            this._pendingMarkRange = range;
+    },
+
+    clearMarkedRange: function()
+    {
+        if (this._textViewer) {
+            this._textViewer.markAndRevealRange(null);
+        } else
+            delete this._pendingMarkRange;
+    },
+
+    _incrementMessageRepeatCount: function(msg, repeatDelta)
+    {
+        if (!msg._resourceMessageLineElement)
+            return;
+
+        if (!msg._resourceMessageRepeatCountElement) {
+            var repeatedElement = document.createElement("span");
+            msg._resourceMessageLineElement.appendChild(repeatedElement);
+            msg._resourceMessageRepeatCountElement = repeatedElement;
+        }
+
+        msg.repeatCount += repeatDelta;
+        msg._resourceMessageRepeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", msg.repeatCount);
+    },
+
+    _breakpointChanged: function(event)
+    {
+        var breakpoint = event.target;
+        var lineNumber = breakpoint.line - 1;
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        if (breakpoint.enabled)
+            this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");
+        else
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-disabled");
+
+        if (breakpoint.condition)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-conditional");
+        else
+            this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");
+    },
+
+    _updateExecutionLine: function(previousLine)
+    {
+        if (previousLine) {
+            if (previousLine - 1 < this._textModel.linesCount)
+                this._textViewer.removeDecoration(previousLine - 1, "webkit-execution-line");
+        }
+
+        if (!this._executionLine)
+            return;
+
+        if (this._executionLine < this._textModel.linesCount)
+            this._textViewer.addDecoration(this._executionLine - 1, "webkit-execution-line");
+    },
+
+    _addExistingMessagesToSource: function()
+    {
+        var length = this._messages.length;
+        for (var i = 0; i < length; ++i)
+            this._addMessageToSource(this._messages[i]);
+    },
+
+    _addMessageToSource: function(msg)
+    {
+        if (msg.line >= this._textModel.linesCount)
+            return;
+
+        var messageBubbleElement = this._messageBubbles[msg.line];
+        if (!messageBubbleElement || messageBubbleElement.nodeType !== Node.ELEMENT_NODE || !messageBubbleElement.hasStyleClass("webkit-html-message-bubble")) {
+            messageBubbleElement = document.createElement("div");
+            messageBubbleElement.className = "webkit-html-message-bubble";
+            this._messageBubbles[msg.line] = messageBubbleElement;
+            this._textViewer.addDecoration(msg.line - 1, messageBubbleElement);
+        }
+
+        var rowMessages = this._rowMessages[msg.line];
+        if (!rowMessages) {
+            rowMessages = [];
+            this._rowMessages[msg.line] = rowMessages;
+        }
+
+        for (var i = 0; i < rowMessages.length; ++i) {
+            if (rowMessages[i].isEqual(msg, true)) {
+                this._incrementMessageRepeatCount(rowMessages[i], msg.repeatDelta);
+                return;
+            }
+        }
+
+        rowMessages.push(msg);
+
+        var imageURL;
+        switch (msg.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                messageBubbleElement.addStyleClass("webkit-html-error-message");
+                imageURL = "Images/errorIcon.png";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                messageBubbleElement.addStyleClass("webkit-html-warning-message");
+                imageURL = "Images/warningIcon.png";
+                break;
+        }
+
+        var messageLineElement = document.createElement("div");
+        messageLineElement.className = "webkit-html-message-line";
+        messageBubbleElement.appendChild(messageLineElement);
+
+        // Create the image element in the Inspector's document so we can use relative image URLs.
+        var image = document.createElement("img");
+        image.src = imageURL;
+        image.className = "webkit-html-message-icon";
+        messageLineElement.appendChild(image);
+        messageLineElement.appendChild(document.createTextNode(msg.message));
+
+        msg._resourceMessageLineElement = messageLineElement;
+    },
+
+    _addExistingBreakpointsToSource: function()
+    {
+        for (var i = 0; i < this.breakpoints.length; ++i)
+            this._addBreakpointToSource(this.breakpoints[i]);
+    },
+
+    _addBreakpointToSource: function(breakpoint)
+    {
+        var lineNumber = breakpoint.line - 1;
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        this._textModel.setAttribute(lineNumber, "breakpoint", breakpoint);
+        breakpoint.sourceText = this._textModel.line(breakpoint.line - 1);
+
+        this._textViewer.beginUpdates();
+        this._textViewer.addDecoration(lineNumber, "webkit-breakpoint");
+        if (!breakpoint.enabled)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-disabled");
+        if (breakpoint.condition)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-conditional");
+        this._textViewer.endUpdates();
+    },
+
+    _removeBreakpointFromSource: function(breakpoint)
+    {
+        var lineNumber = breakpoint.line - 1;
+        this._textViewer.beginUpdates();
+        this._textModel.removeAttribute(lineNumber, "breakpoint");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");
+        this._textViewer.endUpdates();
+    },
+
+    _contextMenu: function(event)
+    {
+        var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");
+        if (!target)
+            return;
+        var row = target.parentElement;
+
+        var lineNumber = row.lineNumber;
+        var contextMenu = new WebInspector.ContextMenu();
+
+        var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+        if (!breakpoint) {
+            // This row doesn't have a breakpoint: We want to show Add Breakpoint and Add and Edit Breakpoint.
+            contextMenu.appendItem(WebInspector.UIString("Add Breakpoint"), this._addBreakpointDelegate.bind(this, lineNumber + 1));
+
+            function addConditionalBreakpoint() 
+            {
+                this._addBreakpointDelegate(lineNumber + 1);
+                var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+                if (breakpoint)
+                    this._editBreakpointCondition(breakpoint);
+            }
+
+            contextMenu.appendItem(WebInspector.UIString("Add Conditional Breakpoint..."), addConditionalBreakpoint.bind(this));
+        } else {
+            // This row has a breakpoint, we want to show edit and remove breakpoint, and either disable or enable.
+            contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), WebInspector.panels.scripts.removeBreakpoint.bind(WebInspector.panels.scripts, breakpoint));
+            contextMenu.appendItem(WebInspector.UIString("Edit Breakpoint..."), this._editBreakpointCondition.bind(this, breakpoint));
+            if (breakpoint.enabled)
+                contextMenu.appendItem(WebInspector.UIString("Disable Breakpoint"), function() { breakpoint.enabled = false; });
+            else
+                contextMenu.appendItem(WebInspector.UIString("Enable Breakpoint"), function() { breakpoint.enabled = true; });
+        }
+        contextMenu.show(event);
+    },
+
+    _scroll: function(event)
+    {
+        this._hidePopup();
+    },
+
+    _mouseDown: function(event)
+    {
+        this._resetHoverTimer();
+        this._hidePopup();
+        if (event.button != 0 || event.altKey || event.ctrlKey || event.metaKey)
+            return;
+        var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");
+        if (!target)
+            return;
+        var row = target.parentElement;
+
+        var lineNumber = row.lineNumber;
+
+        var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+        if (breakpoint) {
+            if (event.shiftKey)
+                breakpoint.enabled = !breakpoint.enabled;
+            else
+                this._removeBreakpointDelegate(breakpoint);
+        } else
+            this._addBreakpointDelegate(lineNumber + 1);
+        event.preventDefault();
+    },
+
+    _mouseMove: function(event)
+    {
+        // Pretend that nothing has happened.
+        if (this._hoverElement === event.target || event.target.hasStyleClass("source-frame-eval-expression"))
+            return;
+
+        this._resetHoverTimer();
+        // User has 500ms to reach the popup.
+        if (this._popup) {
+            var self = this;
+            function doHide()
+            {
+                self._hidePopup();
+                delete self._hidePopupTimer;
+            }
+            this._hidePopupTimer = setTimeout(doHide, 500);
+        }
+
+        this._hoverElement = event.target;
+
+        // Now that cleanup routines are set up above, leave this in case we are not on a break.
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        // We are interested in identifiers and "this" keyword.
+        if (this._hoverElement.hasStyleClass("webkit-javascript-keyword")) {
+            if (this._hoverElement.textContent !== "this")
+                return;
+        } else if (!this._hoverElement.hasStyleClass("webkit-javascript-ident"))
+            return;
+
+        const toolTipDelay = this._popup ? 600 : 1000;
+        this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
+    },
+
+    _resetHoverTimer: function()
+    {
+        if (this._hoverTimer) {
+            clearTimeout(this._hoverTimer);
+            delete this._hoverTimer;
+        }
+    },
+
+    _hidePopup: function()
+    {
+        if (!this._popup)
+            return;
+
+        // Replace higlight element with its contents inplace.
+        var parentElement = this._popup.highlightElement.parentElement;
+        var child = this._popup.highlightElement.firstChild;
+        while (child) {
+            var nextSibling = child.nextSibling;
+            parentElement.insertBefore(child, this._popup.highlightElement);
+            child = nextSibling;
+        }
+        parentElement.removeChild(this._popup.highlightElement);
+
+        this._popup.hide();
+        delete this._popup;
+        InspectorBackend.releaseWrapperObjectGroup(0, this._popoverObjectGroup);
+    },
+
+    _mouseHover: function(element)
+    {
+        delete this._hoverTimer;
+
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        var lineRow = element.enclosingNodeOrSelfWithNodeName("tr");
+        if (!lineRow)
+            return;
+
+        // Collect tokens belonging to evaluated exression.
+        var tokens = [ element ];
+        var token = element.previousSibling;
+        while (token && (token.className === "webkit-javascript-ident" || token.className === "webkit-javascript-keyword" || token.textContent.trim() === ".")) {
+            tokens.push(token);
+            token = token.previousSibling;
+        }
+        tokens.reverse();
+
+        // Wrap them with highlight element.
+        var parentElement = element.parentElement;
+        var nextElement = element.nextSibling;
+        var container = document.createElement("span");
+        for (var i = 0; i < tokens.length; ++i)
+            container.appendChild(tokens[i]);
+        parentElement.insertBefore(container, nextElement);
+        this._showPopup(container);
+    },
+
+    _showPopup: function(element)
+    {
+        function killHidePopupTimer()
+        {
+            if (this._hidePopupTimer) {
+                clearTimeout(this._hidePopupTimer);
+                delete this._hidePopupTimer;
+
+                // We know that we reached the popup, but we might have moved over other elements.
+                // Discard pending command.
+                this._resetHoverTimer();
+            }
+        }
+
+        function showObjectPopup(result)
+        {
+            if (!WebInspector.panels.scripts.paused)
+                return;
+
+            var popupContentElement = null;
+            if (result.type !== "object" && result.type !== "node" && result.type !== "array") {
+                popupContentElement = document.createElement("span");
+                popupContentElement.className = "monospace";
+                popupContentElement.style.whiteSpace = "pre";
+                popupContentElement.textContent = result.description;
+                this._popup = new WebInspector.Popover(popupContentElement);
+                this._popup.show(element);
+            } else {
+                var popupContentElement = document.createElement("div");
+
+                var titleElement = document.createElement("div");
+                titleElement.className = "source-frame-popover-title monospace";
+                titleElement.textContent = result.description;
+                popupContentElement.appendChild(titleElement);
+
+                var section = new WebInspector.ObjectPropertiesSection(result, "", null, false);
+                section.expanded = true;
+                section.element.addStyleClass("source-frame-popover-tree");
+                section.headerElement.addStyleClass("hidden");
+                popupContentElement.appendChild(section.element);
+
+                this._popup = new WebInspector.Popover(popupContentElement);
+                const popupWidth = 300;
+                const popupHeight = 250;
+                this._popup.show(element, popupWidth, popupHeight);
+            }
+            this._popup.highlightElement = element;
+            this._popup.highlightElement.addStyleClass("source-frame-eval-expression");
+            popupContentElement.addEventListener("mousemove", killHidePopupTimer.bind(this), true);
+        }
+
+        function evaluateCallback(result, exception)
+        {
+            if (exception)
+                return;
+            if (!WebInspector.panels.scripts.paused)
+                return;
+            showObjectPopup.call(this, result);
+        }
+        WebInspector.panels.scripts.evaluateInSelectedCallFrame(element.textContent, false, this._popoverObjectGroup, evaluateCallback.bind(this));
+    },
+
+    _editBreakpointCondition: function(breakpoint)
+    {
+        this._showBreakpointConditionPopup(breakpoint.line);
+
+        function committed(element, newText)
+        {
+            breakpoint.condition = newText;
+            dismissed.call(this);
+        }
+
+        function dismissed()
+        {
+            if (this._conditionElement)
+                this._textViewer.removeDecoration(breakpoint.line - 1, this._conditionElement);
+            delete this._conditionEditorElement;
+            delete this._conditionElement;
+        }
+
+        var dismissedHandler = dismissed.bind(this);
+        this._conditionEditorElement.addEventListener("blur", dismissedHandler, false);
+
+        WebInspector.startEditing(this._conditionEditorElement, committed.bind(this), dismissedHandler);
+        this._conditionEditorElement.value = breakpoint.condition;
+        this._conditionEditorElement.select();
+    },
+
+    _showBreakpointConditionPopup: function(lineNumber)
+    {
+        this._conditionElement = this._createConditionElement(lineNumber);
+        this._textViewer.addDecoration(lineNumber - 1, this._conditionElement);
+    },
+
+    _createConditionElement: function(lineNumber)
+    {
+        var conditionElement = document.createElement("div");
+        conditionElement.className = "source-frame-breakpoint-condition";
+
+        var labelElement = document.createElement("label");
+        labelElement.className = "source-frame-breakpoint-message";
+        labelElement.htmlFor = "source-frame-breakpoint-condition";
+        labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:", lineNumber)));
+        conditionElement.appendChild(labelElement);
+
+        var editorElement = document.createElement("input");
+        editorElement.id = "source-frame-breakpoint-condition";
+        editorElement.className = "monospace";
+        editorElement.type = "text"
+        conditionElement.appendChild(editorElement);
+        this._conditionEditorElement = editorElement;
+
+        return conditionElement;
+    },
+
+    _keyDown: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.preventDefault();
+        } else
+            WebInspector.documentKeyDown(event);
+    },
+
+    _evalSelectionInCallFrame: function(event)
+    {
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        var selection = this.element.contentWindow.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var expression = selection.getRangeAt(0).toString().trimWhitespace();
+        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result, exception) {
+            WebInspector.showConsole();
+            var commandMessage = new WebInspector.ConsoleCommand(expression);
+            WebInspector.console.addMessage(commandMessage);
+            WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+        });
+    },
+
+    resize: function()
+    {
+        if (this._textViewer)
+            this._textViewer.resize();
+    }
+}
+
+
+WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* DOMSyntaxHighlighter.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMSyntaxHighlighter = function(mimeType)
+{
+    this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
+}
+
+WebInspector.DOMSyntaxHighlighter.prototype = {
+    createSpan: function(content, className)
+    {
+        var span = document.createElement("span");
+        span.className = "webkit-" + className;
+        span.appendChild(document.createTextNode(content));
+        return span;
+    },
+
+    syntaxHighlightNode: function(node)
+    {
+        this._tokenizer.condition = this._tokenizer.initialCondition;
+        var lines = node.textContent.split("\n");
+        node.removeChildren();
+
+        for (var i = lines[0].length ? 0 : 1; i < lines.length; ++i) {
+            var line = lines[i];
+            var plainTextStart = 0;
+            this._tokenizer.line = line;
+            var column = 0;
+            do {
+                var newColumn = this._tokenizer.nextToken(column);
+                var tokenType = this._tokenizer.tokenType;
+                if (tokenType) {
+                    if (column > plainTextStart) {
+                        var plainText = line.substring(plainTextStart, column);
+                        node.appendChild(document.createTextNode(plainText));
+                    }
+                    var token = line.substring(column, newColumn);
+                    node.appendChild(this.createSpan(token, tokenType));
+                    plainTextStart = newColumn;
+                }
+                column = newColumn;
+           } while (column < line.length)
+
+           if (plainTextStart < line.length) {
+               var plainText = line.substring(plainTextStart, line.length);
+               node.appendChild(document.createTextNode(plainText));
+           }
+           if (i < lines.length - 1)
+               node.appendChild(document.createElement("br"));
+        }
+    }
+}
+
+/* TextEditorModel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn)
+{
+    this.startLine = startLine;
+    this.startColumn = startColumn;
+    this.endLine = endLine;
+    this.endColumn = endColumn;
+}
+
+WebInspector.TextRange.prototype = {
+    isEmpty: function()
+    {
+        return this.startLine === this.endLine && this.startColumn === this.endColumn;
+    },
+
+    get linesCount()
+    {
+        return this.endLine - this.startLine;
+    },
+
+    clone: function()
+    {
+        return new WebInspector.TextRange(this.startLine, this.startColumn, this.endLine, this.endColumn); 
+    }
+}
+
+WebInspector.TextEditorModel = function()
+{
+    this._lines = [""];
+    this._attributes = [];
+    this._undoStack = [];
+    this._noPunctuationRegex = /[^ !%&()*+,-.:;<=>?\[\]\^{|}~]+/;
+}
+
+WebInspector.TextEditorModel.prototype = {
+    set changeListener(changeListener)
+    {
+        this._changeListener = changeListener;
+    },
+
+    get linesCount()
+    {
+        return this._lines.length;
+    },
+
+    line: function(lineNumber)
+    {
+        if (lineNumber >= this._lines.length)
+            throw "Out of bounds:" + lineNumber;
+        return this._lines[lineNumber];
+    },
+
+    lineLength: function(lineNumber)
+    {
+        return this._lines[lineNumber].length;
+    },
+
+    setText: function(range, text)
+    {
+        if (!range)
+            range = new WebInspector.TextRange(0, 0, this._lines.length - 1, this._lines[this._lines.length - 1].length);
+        var command = this._pushUndoableCommand(range, text);
+        var newRange = this._innerSetText(range, text);
+        command.range = newRange.clone();
+
+        if (this._changeListener)
+            this._changeListener(range, newRange, command.text, text);
+        return newRange;
+    },
+
+    set replaceTabsWithSpaces(replaceTabsWithSpaces)
+    {
+        this._replaceTabsWithSpaces = replaceTabsWithSpaces;
+    },
+
+    _innerSetText: function(range, text)
+    {
+        this._eraseRange(range);
+        if (text === "")
+            return new WebInspector.TextRange(range.startLine, range.startColumn, range.startLine, range.startColumn);
+
+        var newLines = text.split("\n");
+        this._replaceTabsIfNeeded(newLines);
+
+        var prefix = this._lines[range.startLine].substring(0, range.startColumn);
+        var prefixArguments = this._arguments
+        var suffix = this._lines[range.startLine].substring(range.startColumn);
+
+        var postCaret = prefix.length;
+        // Insert text.
+        if (newLines.length === 1) {
+            this._setLine(range.startLine, prefix + newLines[0] + suffix);
+            postCaret += newLines[0].length;
+        } else {
+            this._setLine(range.startLine, prefix + newLines[0]);
+            for (var i = 1; i < newLines.length; ++i)
+                this._insertLine(range.startLine + i, newLines[i]);
+            this._setLine(range.startLine + newLines.length - 1, newLines[newLines.length - 1] + suffix);
+            postCaret = newLines[newLines.length - 1].length;
+        }
+        return new WebInspector.TextRange(range.startLine, range.startColumn,
+                                          range.startLine + newLines.length - 1, postCaret);
+    },
+
+    _replaceTabsIfNeeded: function(lines)
+    {
+        if (!this._replaceTabsWithSpaces)
+            return;
+        var spaces = [ "    ", "   ", "  ", " "];
+        for (var i = 0; i < lines.length; ++i) {
+            var line = lines[i];
+            var index = line.indexOf("\t");
+            while (index !== -1) {
+                line = line.substring(0, index) + spaces[index % 4] + line.substring(index + 1);
+                index = line.indexOf("\t", index + 1);
+            }
+            lines[i] = line;
+        }
+    },
+
+    _eraseRange: function(range)
+    {
+        if (range.isEmpty())
+            return;
+
+        var prefix = this._lines[range.startLine].substring(0, range.startColumn);
+        var suffix = this._lines[range.endLine].substring(range.endColumn);
+
+        if (range.endLine > range.startLine)
+            this._removeLines(range.startLine + 1, range.endLine - range.startLine);
+        this._setLine(range.startLine, prefix + suffix);
+    },
+
+    _setLine: function(lineNumber, text)
+    {
+        this._lines[lineNumber] = text;
+    },
+
+    _removeLines: function(fromLine, count)
+    {
+        this._lines.splice(fromLine, count);
+        this._attributes.splice(fromLine, count);
+    },
+
+    _insertLine: function(lineNumber, text)
+    {
+        this._lines.splice(lineNumber, 0, text);
+        this._attributes.splice(lineNumber, 0, {});
+    },
+
+    wordRange: function(lineNumber, column)
+    {
+        return new WebInspector.TextRange(lineNumber, this.wordStart(lineNumber, column, true), lineNumber, this.wordEnd(lineNumber, column, true));
+    },
+
+    wordStart: function(lineNumber, column, gapless)
+    {
+        var line = this._lines[lineNumber];
+        var prefix = line.substring(0, column).split("").reverse().join("");
+        var prefixMatch = this._noPunctuationRegex.exec(prefix);
+        return prefixMatch && (!gapless || prefixMatch.index === 0) ? column - prefixMatch.index - prefixMatch[0].length : column;
+    },
+
+    wordEnd: function(lineNumber, column, gapless)
+    {
+        var line = this._lines[lineNumber];
+        var suffix = line.substring(column);
+        var suffixMatch = this._noPunctuationRegex.exec(suffix);
+        return suffixMatch && (!gapless || suffixMatch.index === 0) ? column + suffixMatch.index + suffixMatch[0].length : column;
+    },
+
+    copyRange: function(range)
+    {
+        var clip = [];
+        if (range.startLine === range.endLine) {
+            clip.push(this._lines[range.startLine].substring(range.startColumn, range.endColumn));
+            return clip.join("\n");
+        }
+        clip.push(this._lines[range.startLine].substring(range.startColumn));
+        for (var i = range.startLine + 1; i < range.endLine; ++i)
+            clip.push(this._lines[i]);
+        clip.push(this._lines[range.endLine].substring(0, range.endColumn));
+        return clip.join("\n");
+    },
+
+    setAttribute: function(line, name, value)
+    {
+        var attrs = this._attributes[line];
+        if (!attrs) {
+            attrs = {};
+            this._attributes[line] = attrs;
+        }
+        attrs[name] = value;
+    },
+
+    getAttribute: function(line, name)
+    {
+        var attrs = this._attributes[line];
+        return attrs ? attrs[name] : null;
+    },
+
+    removeAttribute: function(line, name)
+    {
+        var attrs = this._attributes[line];
+        if (attrs)
+            delete attrs[name];
+    },
+
+    _pushUndoableCommand: function(range, text)
+    {
+        var command = {
+            text: this.copyRange(range),
+            startLine: range.startLine,
+            startColumn: range.startColumn,
+            endLine: range.startLine,
+            endColumn: range.startColumn
+        };
+        if (this._inUndo)
+            this._redoStack.push(command);
+        else {
+            if (!this._inRedo)
+                this._redoStack = [];
+            this._undoStack.push(command);
+        }
+        return command;
+    },
+
+    undo: function()
+    {
+        this._markRedoableState();
+
+        this._inUndo = true;
+        var range = this._doUndo(this._undoStack);
+        delete this._inUndo;
+
+        return range;
+    },
+
+    redo: function()
+    {
+        this.markUndoableState();
+
+        this._inRedo = true;
+        var range = this._doUndo(this._redoStack);
+        delete this._inRedo;
+
+        return range;
+    },
+
+    _doUndo: function(stack)
+    {
+        var range = null;
+        for (var i = stack.length - 1; i >= 0; --i) {
+            var command = stack[i];
+            stack.length = i;
+
+            range = this.setText(command.range, command.text);
+            if (i > 0 && stack[i - 1].explicit)
+                return range;
+        }
+        return range;
+    },
+
+    markUndoableState: function()
+    {
+        if (this._undoStack.length)
+            this._undoStack[this._undoStack.length - 1].explicit = true;
+    },
+
+    _markRedoableState: function()
+    {
+        if (this._redoStack.length)
+            this._redoStack[this._redoStack.length - 1].explicit = true;
+    },
+
+    resetUndoStack: function()
+    {
+        this._undoStack = [];
+    }
+}
+
+/* TextEditorHighlighter.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextEditorHighlighter = function(textModel, damageCallback)
+{
+    this._textModel = textModel;
+    this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/html");
+    this._damageCallback = damageCallback;
+    this._lastHighlightedLine = 0;
+    this._lastHighlightedColumn = 0;
+}
+
+WebInspector.TextEditorHighlighter.prototype = {
+    set mimeType(mimeType)
+    {
+        var tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
+        if (tokenizer) {
+            this._tokenizer = tokenizer;
+            this._tokenizerCondition = this._tokenizer.initialCondition;
+        }
+    },
+
+    highlight: function(endLine)
+    {
+        // First check if we have work to do.
+        if (endLine <= this._lastHighlightedLine)
+            return;
+
+        this._requestedEndLine = endLine;
+
+        if (this._highlightTimer) {
+            // There is a timer scheduled, it will catch the new job based on the new endLine set.
+            return;
+        }
+
+        // Do small highlight synchronously. This will provide instant highlight on PageUp / PageDown, gentle scrolling.
+        this._highlightInChunks(endLine);
+
+        // Schedule tail highlight if necessary.
+        if (this._lastHighlightedLine < endLine)
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, endLine), 100);
+    },
+
+    _highlightInChunks: function(endLine)
+    {
+        delete this._highlightTimer;
+
+        // First we always check if we have work to do. Could be that user scrolled back and we can quit.
+        if (this._requestedEndLine <= this._lastHighlightedLine)
+            return;
+
+        if (this._requestedEndLine !== endLine) {
+            // User keeps updating the job in between of our timer ticks. Just reschedule self, don't eat CPU (they must be scrolling).
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 100);
+            return;
+        }
+
+        this._highlightLines(this._requestedEndLine);
+
+        // Schedule tail highlight if necessary.
+        if (this._lastHighlightedLine < this._requestedEndLine)
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 10);
+    },
+
+    _highlightLines: function(endLine)
+    {
+        // Tokenizer is stateless and reused accross viewers, restore its condition before highlight and save it after.
+        this._tokenizer.condition = this._tokenizerCondition;
+        var tokensCount = 0;
+        for (var lineNumber = this._lastHighlightedLine; lineNumber < endLine; ++lineNumber) {
+            var line = this._textModel.line(lineNumber);
+            this._tokenizer.line = line;
+            var attributes = this._textModel.getAttribute(lineNumber, "highlight") || {};
+
+            // Highlight line.
+            do {
+                var newColumn = this._tokenizer.nextToken(this._lastHighlightedColumn);
+                var tokenType = this._tokenizer.tokenType;
+                if (tokenType)
+                    attributes[this._lastHighlightedColumn] = { length: newColumn - this._lastHighlightedColumn, tokenType: tokenType, subTokenizer: this._tokenizer.subTokenizer };
+                this._lastHighlightedColumn = newColumn;
+                if (++tokensCount > 1000)
+                    break;
+            } while (this._lastHighlightedColumn < line.length)
+
+            this._textModel.setAttribute(lineNumber, "highlight", attributes);
+            if (this._lastHighlightedColumn < line.length) {
+                // Too much work for single chunk - exit.
+                break;
+            } else
+                this._lastHighlightedColumn = 0;
+        }
+
+        this._damageCallback(this._lastHighlightedLine, lineNumber);
+        this._tokenizerCondition = this._tokenizer.condition;
+        this._lastHighlightedLine = lineNumber;
+    }
+}
+
+/* TextViewer.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextViewer = function(textModel, platform, url)
+{
+    this._textModel = textModel;
+    this._textModel.changeListener = this._buildChunks.bind(this);
+    this._highlighter = new WebInspector.TextEditorHighlighter(this._textModel, this._highlightDataReady.bind(this));
+
+    this.element = document.createElement("div");
+    this.element.className = "text-editor monospace";
+    this.element.tabIndex = 0;
+
+    this.element.addEventListener("scroll", this._scroll.bind(this), false);
+    this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
+
+    this._url = url;
+
+    this._linesContainerElement = document.createElement("table");
+    this._linesContainerElement.className = "text-editor-lines";
+    this._linesContainerElement.setAttribute("cellspacing", 0);
+    this._linesContainerElement.setAttribute("cellpadding", 0);
+    this.element.appendChild(this._linesContainerElement);
+
+    this._defaultChunkSize = 50;
+    this._paintCoalescingLevel = 0;
+
+    this.freeCachedElements();
+    this._buildChunks();
+}
+
+WebInspector.TextViewer.prototype = {
+    set mimeType(mimeType)
+    {
+        this._highlighter.mimeType = mimeType;
+    },
+
+    get textModel()
+    {
+        return this._textModel;
+    },
+
+    revealLine: function(lineNumber)
+    {
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.element.scrollIntoViewIfNeeded();
+    },
+
+    addDecoration: function(lineNumber, decoration)
+    {
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.addDecoration(decoration);
+    },
+
+    removeDecoration: function(lineNumber, decoration)
+    {
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.removeDecoration(decoration);
+    },
+
+    markAndRevealRange: function(range)
+    {
+        if (this._rangeToMark) {
+            var markedLine = this._rangeToMark.startLine;
+            this._rangeToMark = null;
+            this._paintLines(markedLine, markedLine + 1);
+        }
+
+        if (range) {
+            this._rangeToMark = range;
+            this.revealLine(range.startLine);
+            this._paintLines(range.startLine, range.startLine + 1);
+            if (this._markedRangeElement)
+                this._markedRangeElement.scrollIntoViewIfNeeded();
+        }
+        delete this._markedRangeElement;
+    },
+
+    highlightLine: function(lineNumber)
+    {
+        if (typeof this._highlightedLine === "number") {
+            var chunk = this._makeLineAChunk(this._highlightedLine);
+            chunk.removeDecoration("webkit-highlighted-line");
+        }
+        this._highlightedLine = lineNumber;
+        this.revealLine(lineNumber);
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.addDecoration("webkit-highlighted-line");
+    },
+
+    freeCachedElements: function()
+    {
+        this._cachedSpans = [];
+        this._cachedTextNodes = [];
+        this._cachedRows = [];
+    },
+
+    _buildChunks: function()
+    {
+        this._linesContainerElement.removeChildren();
+
+        this._textChunks = [];
+        for (var i = 0; i < this._textModel.linesCount; i += this._defaultChunkSize) {
+            var chunk = new WebInspector.TextChunk(this, i, i + this._defaultChunkSize);
+            this._textChunks.push(chunk);
+            this._linesContainerElement.appendChild(chunk.element);
+        }
+        this._indexChunks();
+        this._repaintAll();
+    },
+
+    _makeLineAChunk: function(lineNumber)
+    {
+        if (!this._textChunks)
+            this._buildChunks();
+
+        var chunkNumber = this._chunkNumberForLine(lineNumber);
+        var oldChunk = this._textChunks[chunkNumber];
+        if (oldChunk.linesCount === 1)
+            return oldChunk;
+
+        var wasExpanded = oldChunk.expanded;
+        oldChunk.expanded = false;
+
+        var insertIndex = oldChunk.chunkNumber + 1;
+
+        // Prefix chunk.
+        if (lineNumber > oldChunk.startLine) {
+            var prefixChunk = new WebInspector.TextChunk(this, oldChunk.startLine, lineNumber);
+            this._textChunks.splice(insertIndex++, 0, prefixChunk);
+            this._linesContainerElement.insertBefore(prefixChunk.element, oldChunk.element);
+        }
+
+        // Line chunk.
+        var lineChunk = new WebInspector.TextChunk(this, lineNumber, lineNumber + 1);
+        this._textChunks.splice(insertIndex++, 0, lineChunk);
+        this._linesContainerElement.insertBefore(lineChunk.element, oldChunk.element);
+
+        // Suffix chunk.
+        if (oldChunk.startLine + oldChunk.linesCount > lineNumber + 1) {
+            var suffixChunk = new WebInspector.TextChunk(this, lineNumber + 1, oldChunk.startLine + oldChunk.linesCount);
+            this._textChunks.splice(insertIndex, 0, suffixChunk);
+            this._linesContainerElement.insertBefore(suffixChunk.element, oldChunk.element);
+        }
+
+        // Remove enclosing chunk.
+        this._textChunks.splice(oldChunk.chunkNumber, 1);
+        this._linesContainerElement.removeChild(oldChunk.element);
+        this._indexChunks();
+
+        if (wasExpanded) {
+            if (prefixChunk)
+                prefixChunk.expanded = true;
+            lineChunk.expanded = true;
+            if (suffixChunk)
+                suffixChunk.expanded = true;
+        }
+
+        return lineChunk;
+    },
+
+    _indexChunks: function()
+    {
+        for (var i = 0; i < this._textChunks.length; ++i)
+            this._textChunks[i].chunkNumber = i;
+    },
+
+    _scroll: function()
+    {
+        var scrollTop = this.element.scrollTop;
+        setTimeout(function() {
+            if (scrollTop === this.element.scrollTop)
+                this._repaintAll();
+        }.bind(this), 50);
+    },
+    
+    _handleKeyDown: function()
+    {
+        if (event.metaKey || event.shiftKey || event.ctrlKey || event.altKey)
+            return;
+        
+        var scrollValue = 0;
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Up)
+            scrollValue = -1;
+        else if (event.keyCode == WebInspector.KeyboardShortcut.KeyCodes.Down)
+            scrollValue = 1;
+        
+        if (scrollValue) {
+            event.preventDefault();
+            event.stopPropagation();
+            this.element.scrollByLines(scrollValue);
+            return;
+        }
+        
+        scrollValue = 0;
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Left)
+            scrollValue = -40;
+        else if (event.keyCode == WebInspector.KeyboardShortcut.KeyCodes.Right)
+            scrollValue = 40;
+        
+        if (scrollValue) {
+            event.preventDefault();
+            event.stopPropagation();
+            this.element.scrollLeft += scrollValue;
+        }
+    },
+
+    beginUpdates: function(enabled)
+    {
+        this._paintCoalescingLevel++;
+    },
+
+    endUpdates: function(enabled)
+    {
+        this._paintCoalescingLevel--;
+        if (!this._paintCoalescingLevel)
+            this._repaintAll();
+    },
+
+    _chunkForOffset: function(offset)
+    {
+        var currentOffset = 0;
+        var row = this._linesContainerElement.firstChild;
+        while (row) {
+            var rowHeight = row.offsetHeight;
+            if (offset >= currentOffset && offset < currentOffset + rowHeight)
+                return row.chunkNumber;
+            row = row.nextSibling;
+            currentOffset += rowHeight;
+        }
+        return this._textChunks.length - 1;
+    },
+
+    _chunkNumberForLine: function(lineNumber)
+    {
+        for (var i = 0; i < this._textChunks.length; ++i) {
+            var line = this._textChunks[i].startLine;
+            if (lineNumber >= this._textChunks[i].startLine && lineNumber < this._textChunks[i].startLine + this._textChunks[i].linesCount)
+                return i;
+        }
+        return this._textChunks.length - 1;
+    },
+
+    _chunkForLine: function(lineNumber)
+    {
+        return this._textChunks[this._chunkNumberForLine(lineNumber)];
+    },
+
+    _chunkStartLine: function(chunkNumber)
+    {
+        var lineNumber = 0;
+        for (var i = 0; i < chunkNumber && i < this._textChunks.length; ++i)
+            lineNumber += this._textChunks[i].linesCount;
+        return lineNumber;
+    },
+
+    _repaintAll: function()
+    {
+        if (this._paintCoalescingLevel)
+            return;
+
+        if (!this._textChunks)
+            this._buildChunks();
+
+        var visibleFrom = this.element.scrollTop;
+        var visibleTo = this.element.scrollTop + this.element.clientHeight;
+
+        var offset = 0;
+        var firstVisibleLine = -1;
+        var lastVisibleLine = 0;
+        var toExpand = [];
+        var toCollapse = [];
+        for (var i = 0; i < this._textChunks.length; ++i) {
+            var chunk = this._textChunks[i];
+            var chunkHeight = chunk.height;
+            if (offset + chunkHeight > visibleFrom && offset < visibleTo) {
+                toExpand.push(chunk);
+                if (firstVisibleLine === -1)
+                    firstVisibleLine = chunk.startLine;
+                lastVisibleLine = chunk.startLine + chunk.linesCount;
+            } else {
+                toCollapse.push(chunk);
+                if (offset >= visibleTo)
+                    break;
+            }
+            offset += chunkHeight;
+        }
+
+        for (var j = i; j < this._textChunks.length; ++j)
+            toCollapse.push(this._textChunks[i]);
+
+        var selection = this._getSelection();
+
+        this._muteHighlightListener = true;
+        this._highlighter.highlight(lastVisibleLine);
+        delete this._muteHighlightListener;
+
+        for (var i = 0; i < toCollapse.length; ++i)
+            toCollapse[i].expanded = false;
+        for (var i = 0; i < toExpand.length; ++i)
+            toExpand[i].expanded = true;
+
+        this._restoreSelection(selection);
+    },
+
+    _highlightDataReady: function(fromLine, toLine)
+    {
+        if (this._muteHighlightListener)
+            return;
+
+        var selection;
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (!lineRow || lineRow.highlighted)
+                continue;
+            if (!selection)
+                selection = this._getSelection();
+            this._paintLine(lineRow, i);
+        }
+        this._restoreSelection(selection);
+    },
+
+    _paintLines: function(fromLine, toLine)
+    {
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (lineRow)
+                this._paintLine(lineRow, i);
+        }
+    },
+
+    _paintLine: function(lineRow, lineNumber)
+    {
+        var element = lineRow.lastChild;
+        var highlight = this._textModel.getAttribute(lineNumber, "highlight");
+        if (!highlight) {
+            if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
+                this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
+            return;
+        }
+
+        element.removeChildren();
+        var line = this._textModel.line(lineNumber);
+
+        var plainTextStart = -1;
+        for (var j = 0; j < line.length;) {
+            if (j > 1000) {
+                // This line is too long - do not waste cycles on minified js highlighting.
+                if (plainTextStart === -1)
+                    plainTextStart = j;
+                break;
+            }
+            var attribute = highlight[j];
+            if (!attribute || !attribute.tokenType) {
+                if (plainTextStart === -1)
+                    plainTextStart = j;
+                j++;
+            } else {
+                if (plainTextStart !== -1) {
+                    this._appendTextNode(element, line.substring(plainTextStart, j));
+                    plainTextStart = -1;
+                }
+                this._appendSpan(element, line.substring(j, j + attribute.length), attribute.tokenType);
+                j += attribute.length;
+            }
+        }
+        if (plainTextStart !== -1)
+            this._appendTextNode(element, line.substring(plainTextStart, line.length));
+        if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
+            this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
+        if (lineRow.decorationsElement)
+            element.appendChild(lineRow.decorationsElement);
+    },
+
+    _releaseLinesHighlight: function(fromLine, toLine)
+    {
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (!lineRow)
+                continue;
+            var element = lineRow.lastChild;
+            if ("spans" in element) {
+                var spans = element.spans;
+                for (var j = 0; j < spans.length; ++j)
+                    this._cachedSpans.push(spans[j]);
+                delete element.spans;
+            }
+            if ("textNodes" in element) {
+                var textNodes = element.textNodes;
+                for (var j = 0; j < textNodes.length; ++j)
+                    this._cachedTextNodes.push(textNodes[j]);
+                delete element.textNodes;
+            }
+        }
+    },
+
+    _getSelection: function()
+    {
+        var selection = window.getSelection();
+        if (selection.isCollapsed)
+            return null;
+        var selectionRange = selection.getRangeAt(0);
+        var start = this._selectionToPosition(selectionRange.startContainer, selectionRange.startOffset);
+        var end = this._selectionToPosition(selectionRange.endContainer, selectionRange.endOffset);
+        return new WebInspector.TextRange(start.line, start.column, end.line, end.column);
+    },
+
+    _restoreSelection: function(range)
+    {
+        if (!range)
+            return;
+        var startRow = this._textModel.getAttribute(range.startLine, "line-row");
+        if (startRow)
+            var start = startRow.lastChild.rangeBoundaryForOffset(range.startColumn);
+        else {
+            var offset = range.startColumn;
+            var chunkNumber = this._chunkNumberForLine(range.startLine);
+            for (var i = this._chunkStartLine(chunkNumber); i < range.startLine; ++i)
+                offset += this._textModel.line(i).length + 1; // \n
+            var lineCell = this._textChunks[chunkNumber].element.lastChild;
+            if (lineCell.firstChild)
+                var start = { container: lineCell.firstChild, offset: offset };
+            else
+                var start = { container: lineCell, offset: 0 };
+        }
+
+        var endRow = this._textModel.getAttribute(range.endLine, "line-row");
+        if (endRow)
+            var end = endRow.lastChild.rangeBoundaryForOffset(range.endColumn);
+        else {
+            var offset = range.endColumn;
+            var chunkNumber = this._chunkNumberForLine(range.endLine);
+            for (var i = this._chunkStartLine(chunkNumber); i < range.endLine; ++i)
+                offset += this._textModel.line(i).length + 1; // \n
+            var lineCell = this._textChunks[chunkNumber].element.lastChild;
+            if (lineCell.firstChild)
+                var end = { container: lineCell.firstChild, offset: offset };
+            else
+                var end = { container: lineCell, offset: 0 };
+        }
+
+        var selectionRange = document.createRange();
+        selectionRange.setStart(start.container, start.offset);
+        selectionRange.setEnd(end.container, end.offset);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+    },
+
+    _selectionToPosition: function(container, offset)
+    {
+        if (container === this.element && offset === 0)
+            return { line: 0, column: 0 };
+        if (container === this.element && offset === 1)
+            return { line: this._textModel.linesCount - 1, column: this._textModel.lineLength(this._textModel.linesCount - 1) };
+
+        var lineRow = container.enclosingNodeOrSelfWithNodeName("tr");
+        var lineNumber = lineRow.lineNumber;
+        if (container.nodeName === "TD" && offset === 0)
+            return { line: lineNumber, column: 0 };
+        if (container.nodeName === "TD" && offset === 1)
+            return { line: lineNumber, column: this._textModel.lineLength(lineNumber) };
+
+        var column = 0;
+        if (lineRow.chunk) {
+            // This is chunk.
+            var text = lineRow.lastChild.textContent;
+            for (var i = 0; i < offset; ++i) {
+                if (text.charAt(i) === "\n") {
+                    lineNumber++;
+                    column = 0;
+                } else
+                    column++; 
+            }
+            return { line: lineNumber, column: column };
+        }
+
+        // This is individul line.
+        var column = 0;
+        var node = lineRow.lastChild.traverseNextTextNode(lineRow.lastChild);
+        while (node && node !== container) {
+            column += node.textContent.length;
+            node = node.traverseNextTextNode(lineRow.lastChild);
+        }
+        column += offset;
+        return { line: lineRow.lineNumber, column: column };
+    },
+
+    _appendSpan: function(element, content, className)
+    {
+        if (className === "html-resource-link" || className === "html-external-link") {
+            element.appendChild(this._createLink(content, className === "html-external-link"));
+            return;
+        }
+
+        var span = this._cachedSpans.pop() || document.createElement("span");
+        span.className = "webkit-" + className;
+        span.textContent = content;
+        element.appendChild(span);
+        if (!("spans" in element))
+            element.spans = [];
+        element.spans.push(span);
+    },
+
+    _appendTextNode: function(element, text)
+    {
+        var textNode = this._cachedTextNodes.pop();
+        if (textNode) {
+            textNode.nodeValue = text;
+        } else
+            textNode = document.createTextNode(text);
+        element.appendChild(textNode);
+        if (!("textNodes" in element))
+            element.textNodes = [];
+        element.textNodes.push(textNode);
+    },
+
+    _createLink: function(content, isExternal)
+    {
+        var quote = content.charAt(0);
+        if (content.length > 1 && (quote === "\"" ||   quote === "'"))
+            content = content.substring(1, content.length - 1);
+        else
+            quote = null;
+
+        var a = WebInspector.linkifyURLAsNode(this._rewriteHref(content), content, null, isExternal);
+        var span = document.createElement("span");
+        span.className = "webkit-html-attribute-value";
+        if (quote)
+            span.appendChild(document.createTextNode(quote));
+        span.appendChild(a);
+        if (quote)
+            span.appendChild(document.createTextNode(quote));
+        return span;
+    },
+
+    _rewriteHref: function(hrefValue, isExternal)
+    {
+        if (!this._url || !hrefValue || hrefValue.indexOf("://") > 0)
+            return hrefValue;
+        return WebInspector.completeURL(this._url, hrefValue);
+    },
+
+    resize: function()
+    {
+        this._repaintAll();
+    }
+}
+
+var cachedSpans = [];
+
+WebInspector.TextChunk = function(textViewer, startLine, endLine)
+{
+    this._textViewer = textViewer;
+    this.element = document.createElement("tr");
+    this._textModel = textViewer._textModel;
+    this.element.chunk = this;
+    this.element.lineNumber = startLine;
+
+    this.startLine = startLine;
+    endLine = Math.min(this._textModel.linesCount, endLine);
+    this.linesCount = endLine - startLine;
+
+    this._lineNumberElement = document.createElement("td");
+    this._lineNumberElement.className = "webkit-line-number";
+    this.element.appendChild(this._lineNumberElement);
+
+    this._lineContentElement = document.createElement("td");
+    this._lineContentElement.className = "webkit-line-content";
+    this.element.appendChild(this._lineContentElement);
+
+    this._expanded = false;
+
+    var lineNumbers = [];
+    var lines = [];
+    for (var i = startLine; i < endLine; ++i) {
+        lineNumbers.push(i + 1);
+        lines.push(this._textModel.line(i));
+    }
+    if (this.linesCount === 1) {
+        // Single line chunks are typically created for decorations. Host line number in
+        // the sub-element in order to allow flexible border / margin management.
+        var innerSpan = document.createElement("span");
+        innerSpan.className = "webkit-line-number-inner";
+        innerSpan.textContent = startLine + 1;
+        var outerSpan = document.createElement("div");
+        outerSpan.className = "webkit-line-number-outer";
+        outerSpan.appendChild(innerSpan);
+        this._lineNumberElement.appendChild(outerSpan);
+    } else
+        this._lineNumberElement.textContent = lineNumbers.join("\n");
+    this._lineContentElement.textContent = lines.join("\n");
+}
+
+WebInspector.TextChunk.prototype = {
+    addDecoration: function(decoration)
+    {
+        if (typeof decoration === "string") {
+            this.element.addStyleClass(decoration);
+            return;
+        }
+        if (!this.element.decorationsElement) {
+            this.element.decorationsElement = document.createElement("div");
+            this._lineContentElement.appendChild(this.element.decorationsElement);
+        }
+        this.element.decorationsElement.appendChild(decoration);
+    },
+
+    removeDecoration: function(decoration)
+    {
+        if (typeof decoration === "string") {
+            this.element.removeStyleClass(decoration);
+            return;
+        }
+        if (!this.element.decorationsElement)
+            return;
+        this.element.decorationsElement.removeChild(decoration);
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(expanded)
+    {
+        if (this._expanded === expanded)
+            return;
+
+        this._expanded = expanded;
+
+        if (this.linesCount === 1) {
+            this._textModel.setAttribute(this.startLine, "line-row", this.element);
+            if (expanded)
+                this._textViewer._paintLines(this.startLine, this.startLine + 1);
+            return;
+        }
+
+        if (expanded) {
+            var parentElement = this.element.parentElement;
+            for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+                var lineRow = this._createRow(i);
+                this._textModel.setAttribute(i, "line-row", lineRow);
+                parentElement.insertBefore(lineRow, this.element);
+            }
+            parentElement.removeChild(this.element);
+
+            this._textViewer._paintLines(this.startLine, this.startLine + this.linesCount);
+        } else {
+            var firstLine = this._textModel.getAttribute(this.startLine, "line-row");
+            var parentElement = firstLine.parentElement;
+            this._textViewer._releaseLinesHighlight(this.startLine, this.startLine + this.linesCount);
+
+            parentElement.insertBefore(this.element, firstLine);
+            for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+                var lineRow = this._textModel.getAttribute(i, "line-row");
+                this._textModel.removeAttribute(i, "line-row");
+                this._textViewer._cachedRows.push(lineRow);
+                parentElement.removeChild(lineRow);
+            }
+        }
+    },
+
+    get height()
+    {
+        if (!this._expanded)
+            return this.element.offsetHeight;
+        var result = 0;
+        for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            result += lineRow.offsetHeight;
+        }
+        return result;
+    },
+
+    _createRow: function(lineNumber)
+    {
+        var cachedRows = this._textViewer._cachedRows;
+        if (cachedRows.length) {
+            var lineRow = cachedRows[cachedRows.length - 1];
+            cachedRows.length--;
+            var lineNumberElement = lineRow.firstChild;
+            var lineContentElement = lineRow.lastChild;
+        } else {
+            var lineRow = document.createElement("tr");
+
+            var lineNumberElement = document.createElement("td");
+            lineNumberElement.className = "webkit-line-number";
+            lineRow.appendChild(lineNumberElement);
+
+            var lineContentElement = document.createElement("td");
+            lineContentElement.className = "webkit-line-content";
+            lineRow.appendChild(lineContentElement);        
+        }
+        lineRow.lineNumber = lineNumber;
+        lineNumberElement.textContent = lineNumber + 1;
+        lineContentElement.textContent = this._textModel.line(lineNumber);
+        return lineRow;
+    }
+}
+
+/* SourceTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Tue Jan 26 01:16:33 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceTokenizer = function()
+{
+}
+
+WebInspector.SourceTokenizer.prototype = {
+    set line(line) {
+        this._line = line;
+    },
+
+    set condition(condition)
+    {
+        this._condition = condition;
+    },
+
+    get condition()
+    {
+        return this._condition;
+    },
+
+    get subTokenizer()
+    {
+        return this._condition.subTokenizer;
+    },
+
+    getLexCondition: function()
+    {
+        return this.condition.lexCondition;
+    },
+
+    setLexCondition: function(lexCondition)
+    {
+        this.condition.lexCondition = lexCondition;
+    },
+
+    _charAt: function(cursor)
+    {
+        return cursor < this._line.length ? this._line.charAt(cursor) : "\n";
+    }
+}
+
+
+WebInspector.SourceTokenizer.Registry = function() {
+    this._tokenizers = {};
+    this._tokenizerConstructors = {
+        "text/css": "SourceCSSTokenizer",
+        "text/html": "SourceHTMLTokenizer",
+        "text/javascript": "SourceJavaScriptTokenizer",
+        "application/javascript": "SourceJavaScriptTokenizer",
+        "application/x-javascript": "SourceJavaScriptTokenizer"
+    };
+}
+
+WebInspector.SourceTokenizer.Registry.getInstance = function()
+{
+    if (!WebInspector.SourceTokenizer.Registry._instance)
+        WebInspector.SourceTokenizer.Registry._instance = new WebInspector.SourceTokenizer.Registry();
+    return WebInspector.SourceTokenizer.Registry._instance;
+}
+
+WebInspector.SourceTokenizer.Registry.prototype = {
+    getTokenizer: function(mimeType)
+    {
+        if (!this._tokenizerConstructors[mimeType])
+            return null;
+        var tokenizerClass = this._tokenizerConstructors[mimeType];
+        var tokenizer = this._tokenizers[tokenizerClass];
+        if (!tokenizer) {
+            tokenizer = new WebInspector[tokenizerClass]();
+            this._tokenizers[mimeType] = tokenizer;
+        }
+        return tokenizer;
+    }
+}
+
+/* SourceCSSTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceCSSTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceCSSTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    this._propertyKeywords = [
+        "background", "background-attachment", "background-clip", "background-color", "background-image",
+        "background-origin", "background-position", "background-position-x", "background-position-y",
+        "background-repeat", "background-repeat-x", "background-repeat-y", "background-size", "border",
+        "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius",
+        "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-left",
+        "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right",
+        "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style",
+        "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style",
+        "border-top-width", "border-width", "bottom", "caption-side", "clear", "clip", "color", "content",
+        "counter-increment", "counter-reset", "cursor", "direction", "display", "empty-cells", "float",
+        "font", "font-family", "font-size", "font-stretch", "font-style", "font-variant", "font-weight",
+        "height", "left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position",
+        "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "max-height",
+        "max-width", "min-height", "min-width", "opacity", "orphans", "outline", "outline-color", "outline-offset",
+        "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y", "padding", "padding-bottom",
+        "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before",
+        "page-break-inside", "pointer-events", "position", "quotes", "resize", "right", "size", "src",
+        "table-layout", "text-align", "text-decoration", "text-indent", "text-line-through", "text-line-through-color",
+        "text-line-through-mode", "text-line-through-style", "text-line-through-width", "text-overflow", "text-overline",
+        "text-overline-color", "text-overline-mode", "text-overline-style", "text-overline-width", "text-rendering",
+        "text-shadow", "text-transform", "text-underline", "text-underline-color", "text-underline-mode",
+        "text-underline-style", "text-underline-width", "top", "unicode-bidi", "unicode-range", "vertical-align",
+        "visibility", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "zoom",
+        "-webkit-animation", "-webkit-animation-delay", "-webkit-animation-direction", "-webkit-animation-duration",
+        "-webkit-animation-iteration-count", "-webkit-animation-name", "-webkit-animation-play-state",
+        "-webkit-animation-timing-function", "-webkit-appearance", "-webkit-backface-visibility",
+        "-webkit-background-clip", "-webkit-background-composite", "-webkit-background-origin", "-webkit-background-size",
+        "-webkit-binding", "-webkit-border-fit", "-webkit-border-horizontal-spacing", "-webkit-border-image",
+        "-webkit-border-radius", "-webkit-border-vertical-spacing", "-webkit-box-align", "-webkit-box-direction",
+        "-webkit-box-flex", "-webkit-box-flex-group", "-webkit-box-lines", "-webkit-box-ordinal-group",
+        "-webkit-box-orient", "-webkit-box-pack", "-webkit-box-reflect", "-webkit-box-shadow", "-webkit-box-sizing",
+        "-webkit-column-break-after", "-webkit-column-break-before", "-webkit-column-break-inside", "-webkit-column-count",
+        "-webkit-column-gap", "-webkit-column-rule", "-webkit-column-rule-color", "-webkit-column-rule-style",
+        "-webkit-column-rule-width", "-webkit-column-width", "-webkit-columns", "-webkit-font-size-delta",
+        "-webkit-font-smoothing", "-webkit-highlight", "-webkit-line-break", "-webkit-line-clamp",
+        "-webkit-margin-bottom-collapse", "-webkit-margin-collapse", "-webkit-margin-start", "-webkit-margin-top-collapse",
+        "-webkit-marquee", "-webkit-marquee-direction", "-webkit-marquee-increment", "-webkit-marquee-repetition",
+        "-webkit-marquee-speed", "-webkit-marquee-style", "-webkit-mask", "-webkit-mask-attachment",
+        "-webkit-mask-box-image", "-webkit-mask-clip", "-webkit-mask-composite", "-webkit-mask-image",
+        "-webkit-mask-origin", "-webkit-mask-position", "-webkit-mask-position-x", "-webkit-mask-position-y",
+        "-webkit-mask-repeat", "-webkit-mask-repeat-x", "-webkit-mask-repeat-y", "-webkit-mask-size",
+        "-webkit-match-nearest-mail-blockquote-color", "-webkit-nbsp-mode", "-webkit-padding-start",
+        "-webkit-perspective", "-webkit-perspective-origin", "-webkit-perspective-origin-x", "-webkit-perspective-origin-y",
+        "-webkit-rtl-ordering", "-webkit-text-decorations-in-effect", "-webkit-text-fill-color", "-webkit-text-security",
+        "-webkit-text-size-adjust", "-webkit-text-stroke", "-webkit-text-stroke-color", "-webkit-text-stroke-width",
+        "-webkit-transform", "-webkit-transform-origin", "-webkit-transform-origin-x", "-webkit-transform-origin-y",
+        "-webkit-transform-origin-z", "-webkit-transform-style", "-webkit-transition", "-webkit-transition-delay",
+        "-webkit-transition-duration", "-webkit-transition-property", "-webkit-transition-timing-function",
+        "-webkit-user-drag", "-webkit-user-modify", "-webkit-user-select", "-webkit-variable-declaration-block"
+    ].keySet();
+    
+    this._valueKeywords = [
+        "above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll",
+        "alternate", "always","amharic", "amharic-abegede", "antialiased", "appworkspace", "aqua", "arabic-indic", "armenian",
+        "auto", "avoid", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "black", "blink",
+        "block", "block-axis", "blue", "bold", "bolder", "border", "border-box", "both", "bottom", "break-all", "break-word", "button",
+        "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator",
+        "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic",
+        "clear", "clip", "close-quote", "col-resize", "collapse", "compact", "condensed", "contain", "content", "content-box", "context-menu",
+        "continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default",
+        "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document",
+        "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element",
+        "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez",
+        "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et",
+        "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et",
+        "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded",
+        "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "forwards", "from", "fuchsia", "geometricPrecision",
+        "georgian", "gray", "graytext", "green", "grey", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help",
+        "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
+        "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline",
+        "inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana",
+        "katakana-iroha", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "lime", "line-through", "linear", "lines",
+        "list-button", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-greek", "lower-hexadecimal", "lower-latin",
+        "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "maroon", "match", "media-controls-background", "media-current-time-display",
+        "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button",
+        "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display",
+        "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button",
+        "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple",
+        "myanmar", "n-resize", "narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none",
+        "normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "olive", "open-quote", "optimizeLegibility",
+        "optimizeSpeed", "orange", "oriya", "oromo", "outset", "outside", "overlay", "overline", "padding", "padding-box", "painted", "paused",
+        "persian", "plus-darker", "plus-lighter", "pointer", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "purple",
+        "push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "red", "relative", "repeat", "repeat-x",
+        "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif",
+        "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
+        "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "silver", "single",
+        "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
+        "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over",
+        "space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super",
+        "sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group",
+        "table-row", "table-row-group", "teal", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin",
+        "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede",
+        "tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-greek",
+        "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible",
+        "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider", "window", "windowframe", "windowtext",
+        "x-large", "x-small", "xor", "xx-large", "xx-small", "yellow", "-wap-marquee", "-webkit-activelink", "-webkit-auto", "-webkit-baseline-middle",
+        "-webkit-body", "-webkit-box", "-webkit-center", "-webkit-control", "-webkit-focus-ring-color", "-webkit-grab", "-webkit-grabbing",
+        "-webkit-gradient", "-webkit-inline-box", "-webkit-left", "-webkit-link", "-webkit-marquee", "-webkit-mini-control", "-webkit-nowrap", "-webkit-right",
+        "-webkit-small-control", "-webkit-text", "-webkit-xxx-large", "-webkit-zoom-in", "-webkit-zoom-out",
+    ].keySet();
+
+    this._mediaTypes = ["all", "aural", "braille", "embossed", "handheld", "import", "print", "projection", "screen", "tty", "tv"].keySet();
+
+    this._lexConditions = {
+        INITIAL: 0,
+        COMMENT: 1,
+        DSTRING: 2,
+        SSTRING: 3
+    };
+
+    this._parseConditions = {
+        INITIAL: 0,
+        PROPERTY: 1,
+        PROPERTY_VALUE: 2,
+        AT_RULE: 3
+    };
+
+    this.case_INITIAL = 1000;
+    this.case_COMMENT = 1002;
+    this.case_DSTRING = 1003;
+    this.case_SSTRING = 1004;
+
+    this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL }
+}
+
+WebInspector.SourceCSSTokenizer.prototype = {
+    _stringToken: function(cursor, stringEnds)
+    {
+        if (this._isPropertyValue())
+            this.tokenType = "css-string";
+        else
+            this.tokenType = null;
+        return cursor;
+    },
+
+    _isPropertyValue: function()
+    {
+        return this._condition.parseCondition === this._parseConditions.PROPERTY_VALUE || this._condition.parseCondition === this._parseConditions.AT_RULE;
+    },
+
+    nextToken: function(cursor)
+    {
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 2) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_INITIAL; continue; };
+                } else {
+                    { gotoCase = this.case_COMMENT; continue; };
+                }
+            } else {
+                if (this.getLexCondition() < 3) {
+                    { gotoCase = this.case_DSTRING; continue; };
+                } else {
+                    { gotoCase = this.case_SSTRING; continue; };
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '*') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "css-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 12; continue; };
+case 4:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych != '/') { gotoCase = 11; continue; };
+case 7:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "css-comment"; return cursor; }
+case 9:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych == '/') { gotoCase = 7; continue; };
+case 11:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 12:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 11; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '*') { gotoCase = 9; continue; };
+                { gotoCase = 11; continue; };
+            }
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 17; continue; };
+                if (yych <= '\f') { gotoCase = 16; continue; };
+                { gotoCase = 17; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 16; continue; };
+                    { gotoCase = 19; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 21; continue; };
+                    { gotoCase = 16; continue; };
+                }
+            }
+case 15:
+            { return this._stringToken(cursor); }
+case 16:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 23; continue; };
+case 17:
+            ++cursor;
+case 18:
+            { this.tokenType = null; return cursor; }
+case 19:
+            ++cursor;
+case 20:
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { return this._stringToken(cursor, true); }
+case 21:
+            yych = this._charAt(++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 22; continue; };
+                    if (yych <= '&') { gotoCase = 18; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 18; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 22; continue; };
+                        if (yych <= 'q') { gotoCase = 18; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych != 'v') { gotoCase = 18; continue; };
+                    }
+                }
+            }
+case 22:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 23:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 15; continue; };
+                if (yych <= '\f') { gotoCase = 22; continue; };
+                { gotoCase = 15; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 22; continue; };
+                    { gotoCase = 26; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 22; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 22; continue; };
+                    if (yych >= '\'') { gotoCase = 22; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych >= '\\') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 22; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 22; continue; };
+                        if (yych >= 'r') { gotoCase = 22; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych >= 't') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 22; continue; };
+                    }
+                }
+            }
+            cursor = YYMARKER;
+            { gotoCase = 15; continue; };
+case 26:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 20; continue; };
+/* *********************************** */
+case this.case_INITIAL:
+            yych = this._charAt(cursor);
+            if (yych <= ';') {
+                if (yych <= '\'') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 29; continue; };
+                        if (yych <= '!') { gotoCase = 31; continue; };
+                        { gotoCase = 33; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 31; continue; };
+                        if (yych >= '\'') { gotoCase = 34; continue; };
+                    }
+                } else {
+                    if (yych <= '.') {
+                        if (yych <= ',') { gotoCase = 29; continue; };
+                        if (yych <= '-') { gotoCase = 35; continue; };
+                        { gotoCase = 36; continue; };
+                    } else {
+                        if (yych <= '/') { gotoCase = 37; continue; };
+                        if (yych <= '9') { gotoCase = 38; continue; };
+                        if (yych <= ':') { gotoCase = 40; continue; };
+                        { gotoCase = 42; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '^') {
+                    if (yych <= '?') {
+                        if (yych == '=') { gotoCase = 31; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 29; continue; };
+                        if (yych <= ']') { gotoCase = 31; continue; };
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych != '`') { gotoCase = 31; continue; };
+                    } else {
+                        if (yych <= '{') { gotoCase = 44; continue; };
+                        if (yych == '}') { gotoCase = 46; continue; };
+                    }
+                }
+            }
+case 29:
+            ++cursor;
+case 30:
+            { this.tokenType = null; return cursor; }
+case 31:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 49; continue; };
+case 32:
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (this._condition.parseCondition === this._parseConditions.INITIAL) {
+                        if (token === "@import" || token === "@media") {
+                            this.tokenType = "css-at-rule";
+                            this._condition.parseCondition = this._parseConditions.AT_RULE;
+                        } else if (token.indexOf("@") === 0)
+                            this.tokenType = "css-at-rule";
+                        else
+                            this.tokenType = "css-selector";
+                    }
+                    else if (this._condition.parseCondition === this._parseConditions.AT_RULE && token in this._mediaTypes)
+                        this.tokenType = "css-keyword";
+                    else if (this._condition.parseCondition === this._parseConditions.PROPERTY && token in this._propertyKeywords)
+                        this.tokenType = "css-property";
+                    else if (this._isPropertyValue() && token in this._valueKeywords)
+                        this.tokenType = "css-keyword";
+                    else if (token === "!important")
+                        this.tokenType = "css-important";
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 33:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '-') {
+                if (yych <= '!') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '$') {
+                        if (yych <= '"') { gotoCase = 114; continue; };
+                        if (yych <= '#') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '\'') { gotoCase = 122; continue; };
+                        if (yych <= ',') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 124; continue; };
+                        if (yych <= '9') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 122; continue; };
+                        if (yych <= '?') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 126; continue; };
+                        if (yych <= ']') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 124; continue; };
+                        if (yych <= 'z') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    }
+                }
+            }
+case 34:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '-') {
+                if (yych <= '"') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '&') {
+                        if (yych == '$') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\'') { gotoCase = 114; continue; };
+                        if (yych <= ',') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 116; continue; };
+                        if (yych <= '9') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 112; continue; };
+                        if (yych <= '?') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 118; continue; };
+                        if (yych <= ']') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 116; continue; };
+                        if (yych <= 'z') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    }
+                }
+            }
+case 35:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '.') { gotoCase = 65; continue; };
+            if (yych <= '/') { gotoCase = 49; continue; };
+            if (yych <= '9') { gotoCase = 50; continue; };
+            { gotoCase = 49; continue; };
+case 36:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 30; continue; };
+            if (yych <= '9') { gotoCase = 68; continue; };
+            { gotoCase = 30; continue; };
+case 37:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 104; continue; };
+            { gotoCase = 49; continue; };
+case 38:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            switch (yych) {
+            case '!':
+            case '"':
+            case '$':
+            case '\'':
+            case '-':
+            case '/':
+            case '=':
+            case '@':
+            case 'A':
+            case 'B':
+            case 'C':
+            case 'D':
+            case 'E':
+            case 'F':
+            case 'G':
+            case 'I':
+            case 'J':
+            case 'K':
+            case 'L':
+            case 'M':
+            case 'N':
+            case 'O':
+            case 'P':
+            case 'Q':
+            case 'R':
+            case 'S':
+            case 'T':
+            case 'U':
+            case 'V':
+            case 'W':
+            case 'X':
+            case 'Y':
+            case 'Z':
+            case '[':
+            case ']':
+            case 'a':
+            case 'b':
+            case 'f':
+            case 'h':
+            case 'j':
+            case 'l':
+            case 'n':
+            case 'o':
+            case 'q':
+            case 'u':
+            case 'v':
+            case 'w':
+            case 'x':
+            case 'y':
+            case 'z':    { gotoCase = 48; continue; };
+            case '%':    { gotoCase = 67; continue; };
+            case '.':    { gotoCase = 65; continue; };
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':    { gotoCase = 50; continue; };
+            case 'H':    { gotoCase = 52; continue; };
+            case '_':    { gotoCase = 53; continue; };
+            case 'c':    { gotoCase = 54; continue; };
+            case 'd':    { gotoCase = 55; continue; };
+            case 'e':    { gotoCase = 56; continue; };
+            case 'g':    { gotoCase = 57; continue; };
+            case 'i':    { gotoCase = 58; continue; };
+            case 'k':    { gotoCase = 59; continue; };
+            case 'm':    { gotoCase = 60; continue; };
+            case 'p':    { gotoCase = 61; continue; };
+            case 'r':    { gotoCase = 62; continue; };
+            case 's':    { gotoCase = 63; continue; };
+            case 't':    { gotoCase = 64; continue; };
+            default:    { gotoCase = 39; continue; };
+            }
+case 39:
+            {
+                    if (this._isPropertyValue())
+                        this.tokenType = "css-number";
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 40:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.PROPERTY)
+                        this._condition.parseCondition = this._parseConditions.PROPERTY_VALUE;
+                    return cursor;
+                }
+case 42:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.AT_RULE)
+                        this._condition.parseCondition = this._parseConditions.INITIAL;
+                    else
+                        this._condition.parseCondition = this._parseConditions.PROPERTY;
+                    return cursor;
+                }
+case 44:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.AT_RULE)
+                        this._condition.parseCondition = this._parseConditions.INITIAL;
+                    else
+                        this._condition.parseCondition = this._parseConditions.PROPERTY;
+                    return cursor;
+                }
+case 46:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+case 48:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 49:
+            if (yych <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    } else {
+                        if (yych == '.') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych <= '<') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 32; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych == '^') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 32; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                }
+            }
+case 50:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            switch (yych) {
+            case '!':
+            case '"':
+            case '$':
+            case '\'':
+            case '-':
+            case '/':
+            case '=':
+            case '@':
+            case 'A':
+            case 'B':
+            case 'C':
+            case 'D':
+            case 'E':
+            case 'F':
+            case 'G':
+            case 'I':
+            case 'J':
+            case 'K':
+            case 'L':
+            case 'M':
+            case 'N':
+            case 'O':
+            case 'P':
+            case 'Q':
+            case 'R':
+            case 'S':
+            case 'T':
+            case 'U':
+            case 'V':
+            case 'W':
+            case 'X':
+            case 'Y':
+            case 'Z':
+            case '[':
+            case ']':
+            case 'a':
+            case 'b':
+            case 'f':
+            case 'h':
+            case 'j':
+            case 'l':
+            case 'n':
+            case 'o':
+            case 'q':
+            case 'u':
+            case 'v':
+            case 'w':
+            case 'x':
+            case 'y':
+            case 'z':    { gotoCase = 48; continue; };
+            case '%':    { gotoCase = 67; continue; };
+            case '.':    { gotoCase = 65; continue; };
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':    { gotoCase = 50; continue; };
+            case 'H':    { gotoCase = 52; continue; };
+            case '_':    { gotoCase = 53; continue; };
+            case 'c':    { gotoCase = 54; continue; };
+            case 'd':    { gotoCase = 55; continue; };
+            case 'e':    { gotoCase = 56; continue; };
+            case 'g':    { gotoCase = 57; continue; };
+            case 'i':    { gotoCase = 58; continue; };
+            case 'k':    { gotoCase = 59; continue; };
+            case 'm':    { gotoCase = 60; continue; };
+            case 'p':    { gotoCase = 61; continue; };
+            case 'r':    { gotoCase = 62; continue; };
+            case 's':    { gotoCase = 63; continue; };
+            case 't':    { gotoCase = 64; continue; };
+            default:    { gotoCase = 39; continue; };
+            }
+case 52:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 53:
+            yych = this._charAt(++cursor);
+            if (yych == '_') { gotoCase = 101; continue; };
+            { gotoCase = 49; continue; };
+case 54:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 55:
+            yych = this._charAt(++cursor);
+            if (yych == 'e') { gotoCase = 100; continue; };
+            { gotoCase = 49; continue; };
+case 56:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            if (yych == 'x') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 57:
+            yych = this._charAt(++cursor);
+            if (yych == 'r') { gotoCase = 98; continue; };
+            { gotoCase = 49; continue; };
+case 58:
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 59:
+            yych = this._charAt(++cursor);
+            if (yych == 'H') { gotoCase = 97; continue; };
+            { gotoCase = 49; continue; };
+case 60:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            if (yych == 's') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 61:
+            yych = this._charAt(++cursor);
+            if (yych <= 's') {
+                if (yych == 'c') { gotoCase = 63; continue; };
+                { gotoCase = 49; continue; };
+            } else {
+                if (yych <= 't') { gotoCase = 63; continue; };
+                if (yych == 'x') { gotoCase = 63; continue; };
+                { gotoCase = 49; continue; };
+            }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych == 'a') { gotoCase = 95; continue; };
+            if (yych == 'e') { gotoCase = 96; continue; };
+            { gotoCase = 49; continue; };
+case 63:
+            yych = this._charAt(++cursor);
+            if (yych <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych == '.') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych <= '<') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 39; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych == '^') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 39; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                }
+            }
+case 64:
+            yych = this._charAt(++cursor);
+            if (yych == 'u') { gotoCase = 93; continue; };
+            { gotoCase = 49; continue; };
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 66; continue; };
+            if (yych <= '9') { gotoCase = 68; continue; };
+case 66:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 32; continue; };
+            } else {
+                { gotoCase = 39; continue; };
+            }
+case 67:
+            yych = this._charAt(++cursor);
+            { gotoCase = 39; continue; };
+case 68:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'f') {
+                if (yych <= 'H') {
+                    if (yych <= '/') {
+                        if (yych == '%') { gotoCase = 67; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= '9') { gotoCase = 68; continue; };
+                        if (yych <= 'G') { gotoCase = 39; continue; };
+                        { gotoCase = 80; continue; };
+                    }
+                } else {
+                    if (yych <= 'b') {
+                        if (yych == '_') { gotoCase = 72; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= 'c') { gotoCase = 74; continue; };
+                        if (yych <= 'd') { gotoCase = 77; continue; };
+                        if (yych >= 'f') { gotoCase = 39; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'm') {
+                    if (yych <= 'i') {
+                        if (yych <= 'g') { gotoCase = 78; continue; };
+                        if (yych <= 'h') { gotoCase = 39; continue; };
+                        { gotoCase = 76; continue; };
+                    } else {
+                        if (yych == 'k') { gotoCase = 81; continue; };
+                        if (yych <= 'l') { gotoCase = 39; continue; };
+                        { gotoCase = 75; continue; };
+                    }
+                } else {
+                    if (yych <= 'q') {
+                        if (yych == 'p') { gotoCase = 73; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= 'r') { gotoCase = 71; continue; };
+                        if (yych <= 's') { gotoCase = 67; continue; };
+                        if (yych <= 't') { gotoCase = 79; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                }
+            }
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            if (yych == 'x') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 71:
+            yych = this._charAt(++cursor);
+            if (yych == 'a') { gotoCase = 91; continue; };
+            if (yych == 'e') { gotoCase = 92; continue; };
+            { gotoCase = 66; continue; };
+case 72:
+            yych = this._charAt(++cursor);
+            if (yych == '_') { gotoCase = 88; continue; };
+            { gotoCase = 66; continue; };
+case 73:
+            yych = this._charAt(++cursor);
+            if (yych <= 's') {
+                if (yych == 'c') { gotoCase = 67; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= 't') { gotoCase = 67; continue; };
+                if (yych == 'x') { gotoCase = 67; continue; };
+                { gotoCase = 66; continue; };
+            }
+case 74:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 75:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            if (yych == 's') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 76:
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 77:
+            yych = this._charAt(++cursor);
+            if (yych == 'e') { gotoCase = 87; continue; };
+            { gotoCase = 66; continue; };
+case 78:
+            yych = this._charAt(++cursor);
+            if (yych == 'r') { gotoCase = 85; continue; };
+            { gotoCase = 66; continue; };
+case 79:
+            yych = this._charAt(++cursor);
+            if (yych == 'u') { gotoCase = 83; continue; };
+            { gotoCase = 66; continue; };
+case 80:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 81:
+            yych = this._charAt(++cursor);
+            if (yych != 'H') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 83:
+            yych = this._charAt(++cursor);
+            if (yych != 'r') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 85:
+            yych = this._charAt(++cursor);
+            if (yych != 'a') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 87:
+            yych = this._charAt(++cursor);
+            if (yych == 'g') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 88:
+            yych = this._charAt(++cursor);
+            if (yych != 'q') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych != 'e') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 91:
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 92:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 93:
+            yych = this._charAt(++cursor);
+            if (yych != 'r') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 95:
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 96:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 97:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 98:
+            yych = this._charAt(++cursor);
+            if (yych != 'a') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 100:
+            yych = this._charAt(++cursor);
+            if (yych == 'g') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 101:
+            yych = this._charAt(++cursor);
+            if (yych != 'q') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych != 'e') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 108; continue; };
+                { gotoCase = 104; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 108; continue; };
+                if (yych != '*') { gotoCase = 104; continue; };
+            }
+case 106:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 106; continue; };
+            if (yych == '/') { gotoCase = 110; continue; };
+            { gotoCase = 104; continue; };
+case 108:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "css-comment"; return cursor; }
+case 110:
+            ++cursor;
+            { this.tokenType = "css-comment"; return cursor; }
+case 112:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '-') {
+                if (yych <= '"') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '&') {
+                        if (yych == '$') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\'') { gotoCase = 114; continue; };
+                        if (yych <= ',') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 116; continue; };
+                        if (yych <= '9') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 112; continue; };
+                        if (yych <= '?') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 118; continue; };
+                        if (yych <= ']') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 116; continue; };
+                        if (yych <= 'z') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    }
+                }
+            }
+case 114:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych >= '!') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych != '.') { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych >= '=') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 115; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych != '^') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 115; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                    }
+                }
+            }
+case 115:
+            { return this._stringToken(cursor, true); }
+case 116:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 66; continue; };
+                if (yych <= '\f') { gotoCase = 116; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 116; continue; };
+                    { gotoCase = 121; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 116; continue; };
+                }
+            }
+case 118:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 66; continue; };
+                    } else {
+                        if (yych != '\r') { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 116; continue; };
+                        if (yych <= '&') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 116; continue; };
+                        if (yych <= 'e') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { return this._stringToken(cursor); }
+case 121:
+            yych = this._charAt(++cursor);
+            { gotoCase = 115; continue; };
+case 122:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '-') {
+                if (yych <= '!') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych >= '!') { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '$') {
+                        if (yych <= '"') { gotoCase = 114; continue; };
+                        if (yych >= '$') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '\'') { gotoCase = 122; continue; };
+                        if (yych >= '-') { gotoCase = 122; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 124; continue; };
+                        if (yych <= '9') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 122; continue; };
+                        if (yych >= '@') { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 126; continue; };
+                        if (yych <= ']') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 124; continue; };
+                        if (yych <= 'z') { gotoCase = 122; continue; };
+                    }
+                }
+            }
+case 124:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 66; continue; };
+                if (yych <= '\f') { gotoCase = 124; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 124; continue; };
+                    { gotoCase = 121; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 124; continue; };
+                }
+            }
+case 126:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 66; continue; };
+                    } else {
+                        if (yych != '\r') { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 124; continue; };
+                        if (yych <= '&') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 124; continue; };
+                        if (yych <= 'e') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { return this._stringToken(cursor); }
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 133; continue; };
+                if (yych <= '\f') { gotoCase = 132; continue; };
+                { gotoCase = 133; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 132; continue; };
+                    { gotoCase = 135; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 137; continue; };
+                    { gotoCase = 132; continue; };
+                }
+            }
+case 131:
+            { return this._stringToken(cursor); }
+case 132:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 139; continue; };
+case 133:
+            ++cursor;
+case 134:
+            { this.tokenType = null; return cursor; }
+case 135:
+            ++cursor;
+case 136:
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { return this._stringToken(cursor, true); }
+case 137:
+            yych = this._charAt(++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 138; continue; };
+                    if (yych <= '&') { gotoCase = 134; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 134; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 138; continue; };
+                        if (yych <= 'q') { gotoCase = 134; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych != 'v') { gotoCase = 134; continue; };
+                    }
+                }
+            }
+case 138:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 139:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 131; continue; };
+                if (yych <= '\f') { gotoCase = 138; continue; };
+                { gotoCase = 131; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 138; continue; };
+                    { gotoCase = 142; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 138; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 138; continue; };
+                    if (yych >= '\'') { gotoCase = 138; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych >= '\\') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 138; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 138; continue; };
+                        if (yych >= 'r') { gotoCase = 138; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych >= 't') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 138; continue; };
+                    }
+                }
+            }
+            cursor = YYMARKER;
+            { gotoCase = 131; continue; };
+case 142:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 136; continue; };
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceCSSTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceHTMLTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceHTMLTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceHTMLTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    // The order is determined by the generated code.
+    this._lexConditions = {
+        INITIAL: 0,
+        COMMENT: 1,
+        DOCTYPE: 2,
+        TAG: 3,
+        DSTRING: 4,
+        SSTRING: 5
+    };
+    this.case_INITIAL = 1000;
+    this.case_COMMENT = 1001;
+    this.case_DOCTYPE = 1002;
+    this.case_TAG = 1003;
+    this.case_DSTRING = 1004;
+    this.case_SSTRING = 1005;
+
+    this._parseConditions = {
+        INITIAL: 0,
+        ATTRIBUTE: 1,
+        ATTRIBUTE_VALUE: 2,
+        LINKIFY: 4,
+        A_NODE: 8,
+        SCRIPT: 16
+    };
+
+    this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL };
+    this.condition = this.initialCondition;
+}
+
+WebInspector.SourceHTMLTokenizer.prototype = {
+    set line(line) {
+        if (this._internalJavaScriptTokenizer) {
+            var match = /<\/script/i.exec(line);
+            if (match) {
+                this._internalJavaScriptTokenizer.line = line.substring(0, match.index);
+            } else
+                this._internalJavaScriptTokenizer.line = line;
+        }
+        this._line = line;
+    },
+
+    _isExpectingAttribute: function()
+    {
+        return this._condition.parseCondition & this._parseConditions.ATTRIBUTE;
+    },
+
+    _isExpectingAttributeValue: function()
+    {
+        return this._condition.parseCondition & this._parseConditions.ATTRIBUTE_VALUE;
+    },
+
+    _setExpectingAttribute: function()
+    {
+        if (this._isExpectingAttributeValue())
+            this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE_VALUE;
+        this._condition.parseCondition |= this._parseConditions.ATTRIBUTE;
+    },
+
+    _setExpectingAttributeValue: function()
+    {
+        if (this._isExpectingAttribute())
+            this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE;
+        this._condition.parseCondition |= this._parseConditions.ATTRIBUTE_VALUE;
+    },
+
+    _stringToken: function(cursor, stringEnds)
+    {
+        if (!this._isExpectingAttributeValue()) {
+            this.tokenType = null;
+            return cursor;
+        }
+        this.tokenType = this._attrValueTokenType();
+        if (stringEnds)
+            this._setExpectingAttribute();
+        return cursor;
+    },
+
+    _attrValueTokenType: function()
+    {
+        if (this._condition.parseCondition & this._parseConditions.LINKIFY) {
+            if (this._condition.parseCondition & this._parseConditions.A_NODE)
+                return "html-external-link";
+            return "html-resource-link";
+        }
+        return "html-attribute-value";
+    },
+
+    nextToken: function(cursor)
+    {
+        if (this._internalJavaScriptTokenizer) {
+            // Re-set line to force </script> detection first.
+            this.line = this._line;
+            if (cursor !== this._internalJavaScriptTokenizer._line.length) {
+                // Tokenizer is stateless, so restore its condition before tokenizing and save it after.
+                this._internalJavaScriptTokenizer.condition = this._condition.internalJavaScriptTokenizerCondition;
+                var result = this._internalJavaScriptTokenizer.nextToken(cursor);
+                this.tokenType = this._internalJavaScriptTokenizer.tokenType;
+                this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.condition;
+                return result;
+            } else if (cursor !== this._line.length)
+                delete this._internalJavaScriptTokenizer;
+        }
+
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 3) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_INITIAL; continue; };
+                } else {
+                    if (this.getLexCondition() < 2) {
+                        { gotoCase = this.case_COMMENT; continue; };
+                    } else {
+                        { gotoCase = this.case_DOCTYPE; continue; };
+                    }
+                }
+            } else {
+                if (this.getLexCondition() < 4) {
+                    { gotoCase = this.case_TAG; continue; };
+                } else {
+                    if (this.getLexCondition() < 5) {
+                        { gotoCase = this.case_DSTRING; continue; };
+                    } else {
+                        { gotoCase = this.case_SSTRING; continue; };
+                    }
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '-') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "html-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 9; continue; };
+case 4:
+            ++cursor;
+case 5:
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych != '-') { gotoCase = 5; continue; };
+case 7:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '>') { gotoCase = 10; continue; };
+case 8:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 9:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 8; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '-') { gotoCase = 12; continue; };
+                { gotoCase = 8; continue; };
+            }
+case 10:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "html-comment"; return cursor; }
+case 12:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '-') { gotoCase = 7; continue; };
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 2; continue; };
+            } else {
+                { gotoCase = 5; continue; };
+            }
+/* *********************************** */
+case this.case_DOCTYPE:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 18; continue; };
+                { gotoCase = 17; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 18; continue; };
+                if (yych == '>') { gotoCase = 20; continue; };
+                { gotoCase = 17; continue; };
+            }
+case 16:
+            { this.tokenType = "html-doctype"; return cursor; }
+case 17:
+            yych = this._charAt(++cursor);
+            { gotoCase = 23; continue; };
+case 18:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 20:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "html-doctype"; return cursor; }
+case 22:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 23:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 16; continue; };
+                { gotoCase = 22; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 16; continue; };
+                if (yych == '>') { gotoCase = 16; continue; };
+                { gotoCase = 22; continue; };
+            }
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 28; continue; };
+                { gotoCase = 27; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 28; continue; };
+                if (yych == '"') { gotoCase = 30; continue; };
+                { gotoCase = 27; continue; };
+            }
+case 26:
+            { return this._stringToken(cursor); }
+case 27:
+            yych = this._charAt(++cursor);
+            { gotoCase = 34; continue; };
+case 28:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 30:
+            ++cursor;
+case 31:
+            this.setLexCondition(this._lexConditions.TAG);
+            { return this._stringToken(cursor, true); }
+case 32:
+            yych = this._charAt(++cursor);
+            { gotoCase = 31; continue; };
+case 33:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 34:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 26; continue; };
+                { gotoCase = 33; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 26; continue; };
+                if (yych == '"') { gotoCase = 32; continue; };
+                { gotoCase = 33; continue; };
+            }
+/* *********************************** */
+case this.case_INITIAL:
+            yych = this._charAt(cursor);
+            if (yych == '<') { gotoCase = 39; continue; };
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 39:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '/') {
+                if (yych == '!') { gotoCase = 44; continue; };
+                if (yych >= '/') { gotoCase = 41; continue; };
+            } else {
+                if (yych <= 'S') {
+                    if (yych >= 'S') { gotoCase = 42; continue; };
+                } else {
+                    if (yych == 's') { gotoCase = 42; continue; };
+                }
+            }
+case 40:
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        // Do not tokenize script tag contents, keep lexer state although processing "<".
+                        this.setLexCondition(this._lexConditions.INITIAL);
+                        this.tokenType = null;
+                        return cursor;
+                    }
+
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    this.tokenType = "html-tag";
+                    return cursor;
+                }
+case 41:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'S') { gotoCase = 68; continue; };
+            if (yych == 's') { gotoCase = 68; continue; };
+            { gotoCase = 40; continue; };
+case 42:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 62; continue; };
+            if (yych == 'c') { gotoCase = 62; continue; };
+case 43:
+            cursor = YYMARKER;
+            { gotoCase = 40; continue; };
+case 44:
+            yych = this._charAt(++cursor);
+            if (yych <= 'C') {
+                if (yych != '-') { gotoCase = 43; continue; };
+            } else {
+                if (yych <= 'D') { gotoCase = 46; continue; };
+                if (yych == 'd') { gotoCase = 46; continue; };
+                { gotoCase = 43; continue; };
+            }
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 54; continue; };
+            { gotoCase = 43; continue; };
+case 46:
+            yych = this._charAt(++cursor);
+            if (yych == 'O') { gotoCase = 47; continue; };
+            if (yych != 'o') { gotoCase = 43; continue; };
+case 47:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 48; continue; };
+            if (yych != 'c') { gotoCase = 43; continue; };
+case 48:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 49; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 49:
+            yych = this._charAt(++cursor);
+            if (yych == 'Y') { gotoCase = 50; continue; };
+            if (yych != 'y') { gotoCase = 43; continue; };
+case 50:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 51; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 51:
+            yych = this._charAt(++cursor);
+            if (yych == 'E') { gotoCase = 52; continue; };
+            if (yych != 'e') { gotoCase = 43; continue; };
+case 52:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DOCTYPE);
+            { this.tokenType = "html-doctype"; return cursor; }
+case 54:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 57; continue; };
+                { gotoCase = 54; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 57; continue; };
+                if (yych != '-') { gotoCase = 54; continue; };
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '-') { gotoCase = 59; continue; };
+            { gotoCase = 43; continue; };
+case 57:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "html-comment"; return cursor; }
+case 59:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != '>') { gotoCase = 54; continue; };
+            ++cursor;
+            { this.tokenType = "html-comment"; return cursor; }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych == 'R') { gotoCase = 63; continue; };
+            if (yych != 'r') { gotoCase = 43; continue; };
+case 63:
+            yych = this._charAt(++cursor);
+            if (yych == 'I') { gotoCase = 64; continue; };
+            if (yych != 'i') { gotoCase = 43; continue; };
+case 64:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 65; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 66; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 66:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        // Do not tokenize script tag contents, keep lexer state although processing "<".
+                        this.setLexCondition(this._lexConditions.INITIAL);
+                        this.tokenType = null;
+                        return cursor;
+                    }
+                    this.tokenType = "html-tag";
+                    this._condition.parseCondition = this._parseConditions.SCRIPT;
+                    this._setExpectingAttribute();
+                    return cursor;
+                }
+case 68:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 69; continue; };
+            if (yych != 'c') { gotoCase = 43; continue; };
+case 69:
+            yych = this._charAt(++cursor);
+            if (yych == 'R') { gotoCase = 70; continue; };
+            if (yych != 'r') { gotoCase = 43; continue; };
+case 70:
+            yych = this._charAt(++cursor);
+            if (yych == 'I') { gotoCase = 71; continue; };
+            if (yych != 'i') { gotoCase = 43; continue; };
+case 71:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 72; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 72:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 73; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 73:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    this.tokenType = "html-tag";
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 79; continue; };
+                { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 79; continue; };
+                if (yych == '\'') { gotoCase = 81; continue; };
+                { gotoCase = 78; continue; };
+            }
+case 77:
+            { return this._stringToken(cursor); }
+case 78:
+            yych = this._charAt(++cursor);
+            { gotoCase = 85; continue; };
+case 79:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 81:
+            ++cursor;
+case 82:
+            this.setLexCondition(this._lexConditions.TAG);
+            { return this._stringToken(cursor, true); }
+case 83:
+            yych = this._charAt(++cursor);
+            { gotoCase = 82; continue; };
+case 84:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 85:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 77; continue; };
+                { gotoCase = 84; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 77; continue; };
+                if (yych == '\'') { gotoCase = 83; continue; };
+                { gotoCase = 84; continue; };
+            }
+/* *********************************** */
+case this.case_TAG:
+            yych = this._charAt(cursor);
+            if (yych <= '&') {
+                if (yych <= '\r') {
+                    if (yych == '\n') { gotoCase = 90; continue; };
+                    if (yych >= '\r') { gotoCase = 90; continue; };
+                } else {
+                    if (yych <= ' ') {
+                        if (yych >= ' ') { gotoCase = 90; continue; };
+                    } else {
+                        if (yych == '"') { gotoCase = 92; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '>') {
+                    if (yych <= ';') {
+                        if (yych <= '\'') { gotoCase = 93; continue; };
+                    } else {
+                        if (yych <= '<') { gotoCase = 90; continue; };
+                        if (yych <= '=') { gotoCase = 94; continue; };
+                        { gotoCase = 96; continue; };
+                    }
+                } else {
+                    if (yych <= '[') {
+                        if (yych >= '[') { gotoCase = 90; continue; };
+                    } else {
+                        if (yych == ']') { gotoCase = 90; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 109; continue; };
+case 89:
+            {
+                    if (this._condition.parseCondition === this._parseConditions.SCRIPT) {
+                        // Fall through if expecting attributes.
+                        this.tokenType = null;
+                        return cursor;
+                    }
+
+                    if (this._condition.parseCondition === this._parseConditions.INITIAL) {
+                        this.tokenType = "html-tag";
+                        this._setExpectingAttribute();
+                        var token = this._line.substring(cursorOnEnter, cursor);
+                        if (token === "a")
+                            this._condition.parseCondition |= this._parseConditions.A_NODE;
+                        else if (this._condition.parseCondition & this._parseConditions.A_NODE)
+                            this._condition.parseCondition ^= this._parseConditions.A_NODE;
+                    } else if (this._isExpectingAttribute()) {
+                        var token = this._line.substring(cursorOnEnter, cursor);
+                        if (token === "href" || token === "src")
+                            this._condition.parseCondition |= this._parseConditions.LINKIFY;
+                        else if (this._condition.parseCondition |= this._parseConditions.LINKIFY)
+                            this._condition.parseCondition ^= this._parseConditions.LINKIFY;
+                        this.tokenType = "html-attribute-name";
+                    } else if (this._isExpectingAttributeValue())
+                        this.tokenType = this._attrValueTokenType();
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 90:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 92:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 105; continue; };
+case 93:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 99; continue; };
+case 94:
+            ++cursor;
+            {
+                    if (this._isExpectingAttribute())
+                        this._setExpectingAttributeValue();
+                    this.tokenType = null;
+                    return cursor;
+                }
+case 96:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            {
+                    this.tokenType = "html-tag";
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        if (!this._internalJavaScriptTokenizer) {
+                            this._internalJavaScriptTokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/javascript");
+                            this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.initialCondition;
+                        }
+                        // Do not tokenize script tag contents.
+                        return cursor;
+                    }
+
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+case 98:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 99:
+            if (yych <= '\f') {
+                if (yych != '\n') { gotoCase = 98; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 100; continue; };
+                if (yych == '\'') { gotoCase = 102; continue; };
+                { gotoCase = 98; continue; };
+            }
+case 100:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { return this._stringToken(cursor); }
+case 102:
+            ++cursor;
+            { return this._stringToken(cursor, true); }
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 105:
+            if (yych <= '\f') {
+                if (yych != '\n') { gotoCase = 104; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 106; continue; };
+                if (yych == '"') { gotoCase = 102; continue; };
+                { gotoCase = 104; continue; };
+            }
+case 106:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { return this._stringToken(cursor); }
+case 108:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 109:
+            if (yych <= '"') {
+                if (yych <= '\r') {
+                    if (yych == '\n') { gotoCase = 89; continue; };
+                    if (yych <= '\f') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                } else {
+                    if (yych == ' ') { gotoCase = 89; continue; };
+                    if (yych <= '!') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                }
+            } else {
+                if (yych <= '>') {
+                    if (yych == '\'') { gotoCase = 89; continue; };
+                    if (yych <= ';') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                } else {
+                    if (yych <= '[') {
+                        if (yych <= 'Z') { gotoCase = 108; continue; };
+                        { gotoCase = 89; continue; };
+                    } else {
+                        if (yych == ']') { gotoCase = 89; continue; };
+                        { gotoCase = 108; continue; };
+                    }
+                }
+            }
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceHTMLTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceJavaScriptTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceJavaScriptTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceJavaScriptTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    this._keywords = [
+        "null", "true", "false", "break", "case", "catch", "const", "default", "finally", "for",
+        "instanceof", "new", "var", "continue", "function", "return", "void", "delete", "if",
+        "this", "do", "while", "else", "in", "switch", "throw", "try", "typeof", "debugger",
+        "class", "enum", "export", "extends", "import", "super", "get", "set", "with"
+    ].keySet();
+
+    this._lexConditions = {
+        DIV: 0,
+        NODIV: 1,
+        COMMENT: 2,
+        DSTRING: 3,
+        SSTRING: 4,
+        REGEX: 5
+    };
+
+    this.case_DIV = 1000;
+    this.case_NODIV = 1001;
+    this.case_COMMENT = 1002;
+    this.case_DSTRING = 1003;
+    this.case_SSTRING = 1004;
+    this.case_REGEX = 1005;
+
+    this.initialCondition = { lexCondition: this._lexConditions.NODIV }
+    this.condition = this.initialCondition;
+}
+
+WebInspector.SourceJavaScriptTokenizer.prototype = {
+    nextToken: function(cursor)
+    {
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 3) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_DIV; continue; };
+                } else {
+                    if (this.getLexCondition() < 2) {
+                        { gotoCase = this.case_NODIV; continue; };
+                    } else {
+                        { gotoCase = this.case_COMMENT; continue; };
+                    }
+                }
+            } else {
+                if (this.getLexCondition() < 4) {
+                    { gotoCase = this.case_DSTRING; continue; };
+                } else {
+                    if (this.getLexCondition() < 5) {
+                        { gotoCase = this.case_SSTRING; continue; };
+                    } else {
+                        { gotoCase = this.case_REGEX; continue; };
+                    }
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '*') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 12; continue; };
+case 4:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych != '/') { gotoCase = 11; continue; };
+case 7:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 9:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych == '/') { gotoCase = 7; continue; };
+case 11:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 12:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 11; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '*') { gotoCase = 9; continue; };
+                { gotoCase = 11; continue; };
+            }
+/* *********************************** */
+case this.case_DIV:
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych <= '(') {
+                    if (yych <= '#') {
+                        if (yych <= ' ') { gotoCase = 15; continue; };
+                        if (yych <= '!') { gotoCase = 17; continue; };
+                        if (yych <= '"') { gotoCase = 19; continue; };
+                    } else {
+                        if (yych <= '%') {
+                            if (yych <= '$') { gotoCase = 20; continue; };
+                            { gotoCase = 22; continue; };
+                        } else {
+                            if (yych <= '&') { gotoCase = 23; continue; };
+                            if (yych <= '\'') { gotoCase = 24; continue; };
+                            { gotoCase = 25; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= ')') { gotoCase = 26; continue; };
+                        if (yych <= '*') { gotoCase = 28; continue; };
+                        if (yych <= '+') { gotoCase = 29; continue; };
+                        { gotoCase = 25; continue; };
+                    } else {
+                        if (yych <= '.') {
+                            if (yych <= '-') { gotoCase = 30; continue; };
+                            { gotoCase = 31; continue; };
+                        } else {
+                            if (yych <= '/') { gotoCase = 32; continue; };
+                            if (yych <= '0') { gotoCase = 34; continue; };
+                            { gotoCase = 36; continue; };
+                        }
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '>') {
+                        if (yych <= ';') { gotoCase = 25; continue; };
+                        if (yych <= '<') { gotoCase = 37; continue; };
+                        if (yych <= '=') { gotoCase = 38; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= '@') {
+                            if (yych <= '?') { gotoCase = 25; continue; };
+                        } else {
+                            if (yych <= 'Z') { gotoCase = 20; continue; };
+                            if (yych <= '[') { gotoCase = 25; continue; };
+                            { gotoCase = 40; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych <= '^') {
+                            if (yych <= ']') { gotoCase = 25; continue; };
+                            { gotoCase = 41; continue; };
+                        } else {
+                            if (yych != '`') { gotoCase = 20; continue; };
+                        }
+                    } else {
+                        if (yych <= '|') {
+                            if (yych <= '{') { gotoCase = 25; continue; };
+                            { gotoCase = 42; continue; };
+                        } else {
+                            if (yych <= '~') { gotoCase = 25; continue; };
+                            if (yych >= 0x80) { gotoCase = 20; continue; };
+                        }
+                    }
+                }
+            }
+case 15:
+            ++cursor;
+case 16:
+            { this.tokenType = null; return cursor; }
+case 17:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 115; continue; };
+case 18:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = null; return cursor; }
+case 19:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 16; continue; };
+            if (yych == '\r') { gotoCase = 16; continue; };
+            { gotoCase = 107; continue; };
+case 20:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 50; continue; };
+case 21:
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (token in this._keywords)
+                        this.tokenType = "javascript-keyword";
+                    else
+                        this.tokenType = "javascript-ident";
+                    return cursor;
+                }
+case 22:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 23:
+            yych = this._charAt(++cursor);
+            if (yych == '&') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 24:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 16; continue; };
+            if (yych == '\r') { gotoCase = 16; continue; };
+            { gotoCase = 96; continue; };
+case 25:
+            yych = this._charAt(++cursor);
+            { gotoCase = 18; continue; };
+case 26:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 28:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 29:
+            yych = this._charAt(++cursor);
+            if (yych == '+') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 30:
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 31:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 18; continue; };
+            if (yych <= '9') { gotoCase = 89; continue; };
+            { gotoCase = 18; continue; };
+case 32:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '.') {
+                if (yych == '*') { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '/') { gotoCase = 80; continue; };
+                if (yych == '=') { gotoCase = 77; continue; };
+            }
+case 33:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = null; return cursor; }
+case 34:
+            yyaccept = 3;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'E') {
+                if (yych <= '/') {
+                    if (yych == '.') { gotoCase = 63; continue; };
+                } else {
+                    if (yych <= '7') { gotoCase = 72; continue; };
+                    if (yych >= 'E') { gotoCase = 62; continue; };
+                }
+            } else {
+                if (yych <= 'd') {
+                    if (yych == 'X') { gotoCase = 74; continue; };
+                } else {
+                    if (yych <= 'e') { gotoCase = 62; continue; };
+                    if (yych == 'x') { gotoCase = 74; continue; };
+                }
+            }
+case 35:
+            { this.tokenType = "javascript-number"; return cursor; }
+case 36:
+            yyaccept = 3;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 63; continue; };
+                if (yych <= '/') { gotoCase = 35; continue; };
+                { gotoCase = 60; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 35; continue; };
+                    { gotoCase = 62; continue; };
+                } else {
+                    if (yych == 'e') { gotoCase = 62; continue; };
+                    { gotoCase = 35; continue; };
+                }
+            }
+case 37:
+            yych = this._charAt(++cursor);
+            if (yych <= ';') { gotoCase = 18; continue; };
+            if (yych <= '<') { gotoCase = 59; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 38:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 58; continue; };
+            { gotoCase = 18; continue; };
+case 39:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 18; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            if (yych <= '>') { gotoCase = 56; continue; };
+            { gotoCase = 18; continue; };
+case 40:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'u') { gotoCase = 44; continue; };
+            { gotoCase = 16; continue; };
+case 41:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 42:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            if (yych != '|') { gotoCase = 18; continue; };
+case 43:
+            yych = this._charAt(++cursor);
+            { gotoCase = 18; continue; };
+case 44:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 46; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 46; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 46; continue; };
+            }
+case 45:
+            cursor = YYMARKER;
+            if (yyaccept <= 1) {
+                if (yyaccept <= 0) {
+                    { gotoCase = 16; continue; };
+                } else {
+                    { gotoCase = 21; continue; };
+                }
+            } else {
+                if (yyaccept <= 2) {
+                    { gotoCase = 33; continue; };
+                } else {
+                    { gotoCase = 35; continue; };
+                }
+            }
+case 46:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 47; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 47:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 48; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 48:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 49; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 49:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 50:
+            if (yych <= '[') {
+                if (yych <= '/') {
+                    if (yych == '$') { gotoCase = 49; continue; };
+                    { gotoCase = 21; continue; };
+                } else {
+                    if (yych <= '9') { gotoCase = 49; continue; };
+                    if (yych <= '@') { gotoCase = 21; continue; };
+                    if (yych <= 'Z') { gotoCase = 49; continue; };
+                    { gotoCase = 21; continue; };
+                }
+            } else {
+                if (yych <= '_') {
+                    if (yych <= '\\') { gotoCase = 51; continue; };
+                    if (yych <= '^') { gotoCase = 21; continue; };
+                    { gotoCase = 49; continue; };
+                } else {
+                    if (yych <= '`') { gotoCase = 21; continue; };
+                    if (yych <= 'z') { gotoCase = 49; continue; };
+                    if (yych <= 0x7F) { gotoCase = 21; continue; };
+                    { gotoCase = 49; continue; };
+                }
+            }
+case 51:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != 'u') { gotoCase = 45; continue; };
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 53; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 53:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 54; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 54:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 55; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 55:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 49; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 49; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 49; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 56:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 18; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            if (yych >= '?') { gotoCase = 18; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 58:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 59:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 60:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 63; continue; };
+                if (yych <= '/') { gotoCase = 35; continue; };
+                { gotoCase = 60; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 35; continue; };
+                } else {
+                    if (yych != 'e') { gotoCase = 35; continue; };
+                }
+            }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych == '+') { gotoCase = 69; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 69; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 70; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 63:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 63; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 65; continue; };
+                if (yych != 'e') { gotoCase = 35; continue; };
+            }
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 66; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 67; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 66:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 67:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 67; continue; };
+            { gotoCase = 35; continue; };
+case 69:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 70:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 70; continue; };
+            { gotoCase = 35; continue; };
+case 72:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '7') { gotoCase = 72; continue; };
+            { gotoCase = 35; continue; };
+case 74:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 75; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 75:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 75; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 75; continue; };
+                if (yych <= '`') { gotoCase = 35; continue; };
+                if (yych <= 'f') { gotoCase = 75; continue; };
+                { gotoCase = 35; continue; };
+            }
+case 77:
+            yych = this._charAt(++cursor);
+            { gotoCase = 33; continue; };
+case 78:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 85; continue; };
+                { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 85; continue; };
+                if (yych == '*') { gotoCase = 83; continue; };
+                { gotoCase = 78; continue; };
+            }
+case 80:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 82; continue; };
+            if (yych != '\r') { gotoCase = 80; continue; };
+case 82:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 83:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 83; continue; };
+            if (yych == '/') { gotoCase = 87; continue; };
+            { gotoCase = 78; continue; };
+case 85:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 87:
+            ++cursor;
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 89:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 89; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 91; continue; };
+                if (yych != 'e') { gotoCase = 35; continue; };
+            }
+case 91:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 92; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 93; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 92:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 93:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 93; continue; };
+            { gotoCase = 35; continue; };
+case 95:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 96:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 45; continue; };
+                if (yych <= '\f') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 95; continue; };
+                    { gotoCase = 98; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 95; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 45; continue; };
+                        { gotoCase = 101; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 101; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 95; continue; };
+                        if (yych <= '&') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 95; continue; };
+                        if (yych <= 'e') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 100; continue; };
+                        if (yych <= 'v') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            }
+case 98:
+            ++cursor;
+            { this.tokenType = "javascript-string"; return cursor; }
+case 100:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 103; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 103; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 103; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 101:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 103:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 104; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 105; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 105:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 95; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 106:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 107:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 45; continue; };
+                if (yych <= '\f') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 106; continue; };
+                    { gotoCase = 98; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 106; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 45; continue; };
+                        { gotoCase = 110; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 110; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 106; continue; };
+                        if (yych <= '&') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 106; continue; };
+                        if (yych <= 'e') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 109; continue; };
+                        if (yych <= 'v') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            }
+case 109:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 112; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 112; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 112; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 110:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 112:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 113; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 113:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 114; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 114:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 106; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 115:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 120; continue; };
+                if (yych <= '\f') { gotoCase = 119; continue; };
+                { gotoCase = 120; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 119; continue; };
+                    { gotoCase = 122; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 124; continue; };
+                    { gotoCase = 119; continue; };
+                }
+            }
+case 118:
+            { this.tokenType = "javascript-string"; return cursor; }
+case 119:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 126; continue; };
+case 120:
+            ++cursor;
+case 121:
+            { this.tokenType = null; return cursor; }
+case 122:
+            ++cursor;
+case 123:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 124:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 125; continue; };
+                    if (yych <= '&') { gotoCase = 121; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 121; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 125; continue; };
+                        if (yych <= 'q') { gotoCase = 121; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 127; continue; };
+                        if (yych >= 'w') { gotoCase = 121; continue; };
+                    }
+                }
+            }
+case 125:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 126:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 118; continue; };
+                if (yych <= '\f') { gotoCase = 125; continue; };
+                { gotoCase = 118; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 125; continue; };
+                    { gotoCase = 133; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 132; continue; };
+                    { gotoCase = 125; continue; };
+                }
+            }
+case 127:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych <= '9') { gotoCase = 129; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 129; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych <= 'f') { gotoCase = 129; continue; };
+            }
+case 128:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 118; continue; };
+            } else {
+                { gotoCase = 121; continue; };
+            }
+case 129:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych >= ':') { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 130; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych >= 'g') { gotoCase = 128; continue; };
+            }
+case 130:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych >= ':') { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 131; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych >= 'g') { gotoCase = 128; continue; };
+            }
+case 131:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych <= '9') { gotoCase = 125; continue; };
+                { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 125; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych <= 'f') { gotoCase = 125; continue; };
+                { gotoCase = 128; continue; };
+            }
+case 132:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 125; continue; };
+                    if (yych <= '&') { gotoCase = 128; continue; };
+                    { gotoCase = 125; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 125; continue; };
+                        if (yych <= 'q') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 127; continue; };
+                        if (yych <= 'v') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    }
+                }
+            }
+case 133:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 123; continue; };
+/* *********************************** */
+case this.case_NODIV:
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych <= '(') {
+                    if (yych <= '#') {
+                        if (yych <= ' ') { gotoCase = 136; continue; };
+                        if (yych <= '!') { gotoCase = 138; continue; };
+                        if (yych <= '"') { gotoCase = 140; continue; };
+                    } else {
+                        if (yych <= '%') {
+                            if (yych <= '$') { gotoCase = 141; continue; };
+                            { gotoCase = 143; continue; };
+                        } else {
+                            if (yych <= '&') { gotoCase = 144; continue; };
+                            if (yych <= '\'') { gotoCase = 145; continue; };
+                            { gotoCase = 146; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= ')') { gotoCase = 147; continue; };
+                        if (yych <= '*') { gotoCase = 149; continue; };
+                        if (yych <= '+') { gotoCase = 150; continue; };
+                        { gotoCase = 146; continue; };
+                    } else {
+                        if (yych <= '.') {
+                            if (yych <= '-') { gotoCase = 151; continue; };
+                            { gotoCase = 152; continue; };
+                        } else {
+                            if (yych <= '/') { gotoCase = 153; continue; };
+                            if (yych <= '0') { gotoCase = 154; continue; };
+                            { gotoCase = 156; continue; };
+                        }
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '>') {
+                        if (yych <= ';') { gotoCase = 146; continue; };
+                        if (yych <= '<') { gotoCase = 157; continue; };
+                        if (yych <= '=') { gotoCase = 158; continue; };
+                        { gotoCase = 159; continue; };
+                    } else {
+                        if (yych <= '@') {
+                            if (yych <= '?') { gotoCase = 146; continue; };
+                        } else {
+                            if (yych <= 'Z') { gotoCase = 141; continue; };
+                            if (yych <= '[') { gotoCase = 146; continue; };
+                            { gotoCase = 160; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych <= '^') {
+                            if (yych <= ']') { gotoCase = 146; continue; };
+                            { gotoCase = 161; continue; };
+                        } else {
+                            if (yych != '`') { gotoCase = 141; continue; };
+                        }
+                    } else {
+                        if (yych <= '|') {
+                            if (yych <= '{') { gotoCase = 146; continue; };
+                            { gotoCase = 162; continue; };
+                        } else {
+                            if (yych <= '~') { gotoCase = 146; continue; };
+                            if (yych >= 0x80) { gotoCase = 141; continue; };
+                        }
+                    }
+                }
+            }
+case 136:
+            ++cursor;
+case 137:
+            { this.tokenType = null; return cursor; }
+case 138:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 260; continue; };
+case 139:
+            { this.tokenType = null; return cursor; }
+case 140:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 137; continue; };
+            if (yych == '\r') { gotoCase = 137; continue; };
+            { gotoCase = 252; continue; };
+case 141:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 170; continue; };
+case 142:
+            this.setLexCondition(this._lexConditions.DIV);
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (token in this._keywords)
+                        this.tokenType = "javascript-keyword";
+                    else
+                        this.tokenType = "javascript-ident";
+                    return cursor;
+                }
+case 143:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 144:
+            yych = this._charAt(++cursor);
+            if (yych == '&') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 145:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 137; continue; };
+            if (yych == '\r') { gotoCase = 137; continue; };
+            { gotoCase = 241; continue; };
+case 146:
+            yych = this._charAt(++cursor);
+            { gotoCase = 139; continue; };
+case 147:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DIV);
+            { this.tokenType = null; return cursor; }
+case 149:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 150:
+            yych = this._charAt(++cursor);
+            if (yych == '+') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 151:
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 152:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 139; continue; };
+            if (yych <= '9') { gotoCase = 234; continue; };
+            { gotoCase = 139; continue; };
+case 153:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 137; continue; };
+                    { gotoCase = 197; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 137; continue; };
+                    if (yych <= ')') { gotoCase = 197; continue; };
+                    { gotoCase = 202; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 204; continue; };
+                    { gotoCase = 197; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 200; continue; };
+                    if (yych <= '\\') { gotoCase = 199; continue; };
+                    if (yych <= ']') { gotoCase = 137; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            }
+case 154:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'E') {
+                if (yych <= '/') {
+                    if (yych == '.') { gotoCase = 183; continue; };
+                } else {
+                    if (yych <= '7') { gotoCase = 192; continue; };
+                    if (yych >= 'E') { gotoCase = 182; continue; };
+                }
+            } else {
+                if (yych <= 'd') {
+                    if (yych == 'X') { gotoCase = 194; continue; };
+                } else {
+                    if (yych <= 'e') { gotoCase = 182; continue; };
+                    if (yych == 'x') { gotoCase = 194; continue; };
+                }
+            }
+case 155:
+            this.setLexCondition(this._lexConditions.DIV);
+            { this.tokenType = "javascript-number"; return cursor; }
+case 156:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 183; continue; };
+                if (yych <= '/') { gotoCase = 155; continue; };
+                { gotoCase = 180; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 155; continue; };
+                    { gotoCase = 182; continue; };
+                } else {
+                    if (yych == 'e') { gotoCase = 182; continue; };
+                    { gotoCase = 155; continue; };
+                }
+            }
+case 157:
+            yych = this._charAt(++cursor);
+            if (yych <= ';') { gotoCase = 139; continue; };
+            if (yych <= '<') { gotoCase = 179; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 158:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 178; continue; };
+            { gotoCase = 139; continue; };
+case 159:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 139; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            if (yych <= '>') { gotoCase = 176; continue; };
+            { gotoCase = 139; continue; };
+case 160:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'u') { gotoCase = 164; continue; };
+            { gotoCase = 137; continue; };
+case 161:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 162:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            if (yych != '|') { gotoCase = 139; continue; };
+case 163:
+            yych = this._charAt(++cursor);
+            { gotoCase = 139; continue; };
+case 164:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 166; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 166; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 166; continue; };
+            }
+case 165:
+            cursor = YYMARKER;
+            if (yyaccept <= 1) {
+                if (yyaccept <= 0) {
+                    { gotoCase = 137; continue; };
+                } else {
+                    { gotoCase = 142; continue; };
+                }
+            } else {
+                if (yyaccept <= 2) {
+                    { gotoCase = 155; continue; };
+                } else {
+                    { gotoCase = 217; continue; };
+                }
+            }
+case 166:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 167; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 167:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 168; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 168:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 169; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 169:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 170:
+            if (yych <= '[') {
+                if (yych <= '/') {
+                    if (yych == '$') { gotoCase = 169; continue; };
+                    { gotoCase = 142; continue; };
+                } else {
+                    if (yych <= '9') { gotoCase = 169; continue; };
+                    if (yych <= '@') { gotoCase = 142; continue; };
+                    if (yych <= 'Z') { gotoCase = 169; continue; };
+                    { gotoCase = 142; continue; };
+                }
+            } else {
+                if (yych <= '_') {
+                    if (yych <= '\\') { gotoCase = 171; continue; };
+                    if (yych <= '^') { gotoCase = 142; continue; };
+                    { gotoCase = 169; continue; };
+                } else {
+                    if (yych <= '`') { gotoCase = 142; continue; };
+                    if (yych <= 'z') { gotoCase = 169; continue; };
+                    if (yych <= 0x7F) { gotoCase = 142; continue; };
+                    { gotoCase = 169; continue; };
+                }
+            }
+case 171:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != 'u') { gotoCase = 165; continue; };
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 173; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 173:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 174; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 174:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 175; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 175:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 169; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 169; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 169; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 176:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 139; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            if (yych >= '?') { gotoCase = 139; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 178:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 179:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 180:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 183; continue; };
+                if (yych <= '/') { gotoCase = 155; continue; };
+                { gotoCase = 180; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 155; continue; };
+                } else {
+                    if (yych != 'e') { gotoCase = 155; continue; };
+                }
+            }
+case 182:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych == '+') { gotoCase = 189; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 189; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 190; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 183:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 183; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 185; continue; };
+                if (yych != 'e') { gotoCase = 155; continue; };
+            }
+case 185:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 186; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 187; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 186:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 187:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 187; continue; };
+            { gotoCase = 155; continue; };
+case 189:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 190:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 190; continue; };
+            { gotoCase = 155; continue; };
+case 192:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '7') { gotoCase = 192; continue; };
+            { gotoCase = 155; continue; };
+case 194:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 195; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 195:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 195; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 195; continue; };
+                if (yych <= '`') { gotoCase = 155; continue; };
+                if (yych <= 'f') { gotoCase = 195; continue; };
+                { gotoCase = 155; continue; };
+            }
+case 197:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 197; continue; };
+                    { gotoCase = 165; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 165; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 220; continue; };
+                    if (yych <= 'Z') { gotoCase = 197; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 227; continue; };
+                    if (yych <= ']') { gotoCase = 165; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            }
+case 199:
+            yych = this._charAt(++cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 197; continue; };
+case 200:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 200; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 200; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 200; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 215; continue; };
+                    if (yych <= ']') { gotoCase = 213; continue; };
+                    { gotoCase = 200; continue; };
+                }
+            }
+case 202:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 209; continue; };
+                { gotoCase = 202; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 209; continue; };
+                if (yych == '*') { gotoCase = 207; continue; };
+                { gotoCase = 202; continue; };
+            }
+case 204:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 206; continue; };
+            if (yych != '\r') { gotoCase = 204; continue; };
+case 206:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 207:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 207; continue; };
+            if (yych == '/') { gotoCase = 211; continue; };
+            { gotoCase = 202; continue; };
+case 209:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 211:
+            ++cursor;
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 213:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 213; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 213; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 213; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 218; continue; };
+                    if (yych <= '\\') { gotoCase = 216; continue; };
+                    { gotoCase = 213; continue; };
+                }
+            }
+case 215:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 200; continue; };
+case 216:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych != '\r') { gotoCase = 213; continue; };
+case 217:
+            this.setLexCondition(this._lexConditions.REGEX);
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 218:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 218; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 218; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 218; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 225; continue; };
+                    if (yych <= ']') { gotoCase = 223; continue; };
+                    { gotoCase = 218; continue; };
+                }
+            }
+case 220:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'h') {
+                if (yych == 'g') { gotoCase = 220; continue; };
+            } else {
+                if (yych <= 'i') { gotoCase = 220; continue; };
+                if (yych == 'm') { gotoCase = 220; continue; };
+            }
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 223:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 223; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 223; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 223; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 218; continue; };
+                    if (yych <= '\\') { gotoCase = 226; continue; };
+                    { gotoCase = 223; continue; };
+                }
+            }
+case 225:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 218; continue; };
+case 226:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 223; continue; };
+case 227:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 197; continue; };
+case 228:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 228; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 232; continue; };
+                    if (yych >= '^') { gotoCase = 228; continue; };
+                }
+            }
+case 230:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 230; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 230; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 230; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 228; continue; };
+                    if (yych <= '\\') { gotoCase = 233; continue; };
+                    { gotoCase = 230; continue; };
+                }
+            }
+case 232:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 228; continue; };
+case 233:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 230; continue; };
+case 234:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 234; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 236; continue; };
+                if (yych != 'e') { gotoCase = 155; continue; };
+            }
+case 236:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 237; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 238; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 237:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 238:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 238; continue; };
+            { gotoCase = 155; continue; };
+case 240:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 241:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 165; continue; };
+                if (yych <= '\f') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 240; continue; };
+                    { gotoCase = 243; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 240; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 165; continue; };
+                        { gotoCase = 246; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 246; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 240; continue; };
+                        if (yych <= '&') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 240; continue; };
+                        if (yych <= 'e') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 245; continue; };
+                        if (yych <= 'v') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            }
+case 243:
+            ++cursor;
+            { this.tokenType = "javascript-string"; return cursor; }
+case 245:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 248; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 248; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 248; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 246:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 248:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 249; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 249:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 250; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 250:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 240; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 251:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 252:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 165; continue; };
+                if (yych <= '\f') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 251; continue; };
+                    { gotoCase = 243; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 251; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 165; continue; };
+                        { gotoCase = 255; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 255; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 251; continue; };
+                        if (yych <= '&') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 251; continue; };
+                        if (yych <= 'e') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 254; continue; };
+                        if (yych <= 'v') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            }
+case 254:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 257; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 257; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 257; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 255:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 257:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 258; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 258:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 259; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 259:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 251; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 260:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+/* *********************************** */
+case this.case_REGEX:
+            yych = this._charAt(cursor);
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 264; continue; };
+                    { gotoCase = 265; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 265; continue; };
+                    { gotoCase = 264; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 267; continue; };
+                    if (yych <= 'Z') { gotoCase = 264; continue; };
+                    { gotoCase = 269; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 270; continue; };
+                    if (yych <= ']') { gotoCase = 265; continue; };
+                    { gotoCase = 264; continue; };
+                }
+            }
+case 263:
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 264:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 272; continue; };
+case 265:
+            ++cursor;
+case 266:
+            { this.tokenType = null; return cursor; }
+case 267:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 278; continue; };
+case 268:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 269:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 266; continue; };
+                if (yych <= '\f') { gotoCase = 276; continue; };
+                { gotoCase = 266; continue; };
+            } else {
+                if (yych <= '*') {
+                    if (yych <= ')') { gotoCase = 276; continue; };
+                    { gotoCase = 266; continue; };
+                } else {
+                    if (yych == '/') { gotoCase = 266; continue; };
+                    { gotoCase = 276; continue; };
+                }
+            }
+case 270:
+            yych = this._charAt(++cursor);
+            if (yych == '\n') { gotoCase = 266; continue; };
+            if (yych == '\r') { gotoCase = 266; continue; };
+case 271:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 272:
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 271; continue; };
+                    { gotoCase = 263; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 263; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 277; continue; };
+                    if (yych <= 'Z') { gotoCase = 271; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 273; continue; };
+                    if (yych <= ']') { gotoCase = 263; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            }
+case 273:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych != '\r') { gotoCase = 271; continue; };
+case 274:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 263; continue; };
+            } else {
+                { gotoCase = 266; continue; };
+            }
+case 275:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 276:
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 274; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 274; continue; };
+                    if (yych <= ')') { gotoCase = 275; continue; };
+                    { gotoCase = 274; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 274; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 281; continue; };
+                    if (yych <= ']') { gotoCase = 279; continue; };
+                    { gotoCase = 275; continue; };
+                }
+            }
+case 277:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 278:
+            if (yych <= 'h') {
+                if (yych == 'g') { gotoCase = 277; continue; };
+                { gotoCase = 268; continue; };
+            } else {
+                if (yych <= 'i') { gotoCase = 277; continue; };
+                if (yych == 'm') { gotoCase = 277; continue; };
+                { gotoCase = 268; continue; };
+            }
+case 279:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 263; continue; };
+                    { gotoCase = 279; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 263; continue; };
+                    if (yych <= ')') { gotoCase = 279; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 277; continue; };
+                    { gotoCase = 279; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 275; continue; };
+                    if (yych <= '\\') { gotoCase = 282; continue; };
+                    { gotoCase = 279; continue; };
+                }
+            }
+case 281:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych == '\r') { gotoCase = 274; continue; };
+            { gotoCase = 275; continue; };
+case 282:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych == '\r') { gotoCase = 274; continue; };
+            { gotoCase = 279; continue; };
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 287; continue; };
+                if (yych <= '\f') { gotoCase = 286; continue; };
+                { gotoCase = 287; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 286; continue; };
+                    { gotoCase = 289; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 291; continue; };
+                    { gotoCase = 286; continue; };
+                }
+            }
+case 285:
+            { this.tokenType = "javascript-string"; return cursor; }
+case 286:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 293; continue; };
+case 287:
+            ++cursor;
+case 288:
+            { this.tokenType = null; return cursor; }
+case 289:
+            ++cursor;
+case 290:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 291:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 292; continue; };
+                    if (yych <= '&') { gotoCase = 288; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 288; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 292; continue; };
+                        if (yych <= 'q') { gotoCase = 288; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 294; continue; };
+                        if (yych >= 'w') { gotoCase = 288; continue; };
+                    }
+                }
+            }
+case 292:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 293:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 285; continue; };
+                if (yych <= '\f') { gotoCase = 292; continue; };
+                { gotoCase = 285; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 292; continue; };
+                    { gotoCase = 300; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 299; continue; };
+                    { gotoCase = 292; continue; };
+                }
+            }
+case 294:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych <= '9') { gotoCase = 296; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 296; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych <= 'f') { gotoCase = 296; continue; };
+            }
+case 295:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 285; continue; };
+            } else {
+                { gotoCase = 288; continue; };
+            }
+case 296:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych >= ':') { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 297; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych >= 'g') { gotoCase = 295; continue; };
+            }
+case 297:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych >= ':') { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 298; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych >= 'g') { gotoCase = 295; continue; };
+            }
+case 298:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych <= '9') { gotoCase = 292; continue; };
+                { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 292; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych <= 'f') { gotoCase = 292; continue; };
+                { gotoCase = 295; continue; };
+            }
+case 299:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 292; continue; };
+                    if (yych <= '&') { gotoCase = 295; continue; };
+                    { gotoCase = 292; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 292; continue; };
+                        if (yych <= 'q') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 294; continue; };
+                        if (yych <= 'v') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    }
+                }
+            }
+case 300:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 290; continue; };
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceJavaScriptTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("source");
+
+    this.sourceFrame = new WebInspector.SourceFrame(this.contentElement, this._addBreakpoint.bind(this), this._removeBreakpoint.bind(this));
+    resource.addEventListener("finished", this._resourceLoadingFinished, this);
+    this._frameNeedsSetup = true;
+}
+
+WebInspector.SourceView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.ResourceView.prototype.show.call(this, parentElement);
+        this.sourceFrame.visible = true;
+        this.resize();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.sourceFrame.visible = false;
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.sourceFrame)
+            this.sourceFrame.resize();
+    },
+
+    setupSourceFrameIfNeeded: function()
+    {
+        if (!this._frameNeedsSetup)
+            return;
+
+        this.attach();
+
+        delete this._frameNeedsSetup;
+        WebInspector.getResourceContent(this.resource.identifier, this._contentLoaded.bind(this));
+    },
+
+    contentTabSelected: function()
+    {
+        this.setupSourceFrameIfNeeded();
+    },
+
+    _contentLoaded: function(content)
+    {
+        this.sourceFrame.setContent(this.resource.mimeType, content, this.resource.url);
+        this._sourceFrameSetupFinished();
+    },
+
+    _resourceLoadingFinished: function(event)
+    {
+        this._frameNeedsSetup = true;
+        this._sourceFrameSetup = false;
+        if (this.visible)
+            this.setupSourceFrameIfNeeded();
+        this.resource.removeEventListener("finished", this._resourceLoadingFinished, this);
+    },
+
+    _addBreakpoint: function(line)
+    {
+        var sourceID = null;
+        var closestStartingLine = 0;
+        var scripts = this.resource.scripts;
+        for (var i = 0; i < scripts.length; ++i) {
+            var script = scripts[i];
+            if (script.startingLine <= line && script.startingLine >= closestStartingLine) {
+                closestStartingLine = script.startingLine;
+                sourceID = script.sourceID;
+            }
+        }
+
+        if (WebInspector.panels.scripts) {
+            var breakpoint = new WebInspector.Breakpoint(this.resource.url, line, sourceID);
+            WebInspector.panels.scripts.addBreakpoint(breakpoint);
+        }
+    },
+
+    _removeBreakpoint: function(breakpoint)
+    {
+        if (WebInspector.panels.scripts)
+            WebInspector.panels.scripts.removeBreakpoint(breakpoint);
+    },
+
+    // The rest of the methods in this prototype need to be generic enough to work with a ScriptView.
+    // The ScriptView prototype pulls these methods into it's prototype to avoid duplicate code.
+
+    searchCanceled: function()
+    {
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+        this.sourceFrame.clearMarkedRange();
+        delete this._delayedFindSearchMatches;
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        this._searchFinishedCallback = finishedCallback;
+
+        function findSearchMatches(query, finishedCallback)
+        {
+            this._searchResults = this.sourceFrame.findSearchMatches(query);
+            if (this._searchResults)
+                finishedCallback(this, this._searchResults.length);
+        }
+
+        if (!this._sourceFrameSetup) {
+            // The search is performed in _sourceFrameSetupFinished by calling _delayedFindSearchMatches.
+            this._delayedFindSearchMatches = findSearchMatches.bind(this, query, finishedCallback);
+            this.setupSourceFrameIfNeeded();
+            return;
+        }
+
+        findSearchMatches.call(this, query, finishedCallback);
+    },
+
+    jumpToFirstSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToLastSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    showingFirstSearchResult: function()
+    {
+        return (this._currentSearchResultIndex === 0);
+    },
+
+    showingLastSearchResult: function()
+    {
+        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
+    },
+
+    revealLine: function(lineNumber)
+    {
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.revealLine(lineNumber);
+    },
+
+    highlightLine: function(lineNumber)
+    {
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.highlightLine(lineNumber);
+    },
+
+    addMessage: function(msg)
+    {
+        this.sourceFrame.addMessage(msg);
+    },
+
+    clearMessages: function()
+    {
+        this.sourceFrame.clearMessages();
+    },
+
+    _jumpToSearchResult: function(index)
+    {
+        var foundRange = this._searchResults[index];
+        if (!foundRange)
+            return;
+
+        this.sourceFrame.markAndRevealRange(foundRange);
+    },
+
+    _sourceFrameSetupFinished: function()
+    {
+        this._sourceFrameSetup = true;
+        this.resize();
+        if (this._delayedFindSearchMatches) {
+            this._delayedFindSearchMatches();
+            delete this._delayedFindSearchMatches;
+        }
+    }
+}
+
+WebInspector.SourceView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* FontView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.FontView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("font");
+
+    var uniqueFontName = "WebInspectorFontPreview" + this.resource.identifier;
+
+    this.fontStyleElement = document.createElement("style");
+    this.fontStyleElement.textContent = "@font-face { font-family: \"" + uniqueFontName + "\"; src: url(" + this.resource.url + "); }";
+    document.head.appendChild(this.fontStyleElement);
+
+    this.fontPreviewElement = document.createElement("div");
+    this.fontPreviewElement.className = "preview";
+    this.contentElement.appendChild(this.fontPreviewElement);
+
+    this.fontPreviewElement.style.setProperty("font-family", uniqueFontName, null);
+    this.fontPreviewElement.innerHTML = "ABCDEFGHIJKLM<br>NOPQRSTUVWXYZ<br>abcdefghijklm<br>nopqrstuvwxyz<br>1234567890";
+
+    this.updateFontPreviewSize();
+}
+
+WebInspector.FontView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.ResourceView.prototype.show.call(this, parentElement);
+        this.updateFontPreviewSize();
+    },
+
+    resize: function()
+    {
+        this.updateFontPreviewSize();
+    },
+
+    updateFontPreviewSize: function ()
+    {
+        if (!this.fontPreviewElement || !this.visible)
+            return;
+
+        this.fontPreviewElement.removeStyleClass("preview");
+
+        var measureFontSize = 50;
+        this.fontPreviewElement.style.setProperty("position", "absolute", null);
+        this.fontPreviewElement.style.setProperty("font-size", measureFontSize + "px", null);
+        this.fontPreviewElement.style.removeProperty("height");
+
+        var height = this.fontPreviewElement.offsetHeight;
+        var width = this.fontPreviewElement.offsetWidth;
+
+        var containerWidth = this.contentElement.offsetWidth;
+
+        // Subtract some padding. This should match the padding in the CSS plus room for the scrollbar.
+        containerWidth -= 40;
+
+        if (!height || !width || !containerWidth) {
+            this.fontPreviewElement.style.removeProperty("font-size");
+            this.fontPreviewElement.style.removeProperty("position");
+            this.fontPreviewElement.addStyleClass("preview");
+            return;
+        }
+
+        var lineCount = this.fontPreviewElement.getElementsByTagName("br").length + 1;
+        var realLineHeight = Math.floor(height / lineCount);
+        var fontSizeLineRatio = measureFontSize / realLineHeight;
+        var widthRatio = containerWidth / width;
+        var finalFontSize = Math.floor(realLineHeight * widthRatio * fontSizeLineRatio) - 1;
+
+        this.fontPreviewElement.style.setProperty("font-size", finalFontSize + "px", null);
+        this.fontPreviewElement.style.setProperty("height", this.fontPreviewElement.offsetHeight + "px", null);
+        this.fontPreviewElement.style.removeProperty("position");
+
+        this.fontPreviewElement.addStyleClass("preview");
+    }
+}
+
+WebInspector.FontView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* ImageView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ImageView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("image");
+
+    var container = document.createElement("div");
+    container.className = "image";
+    this.contentElement.appendChild(container);
+
+    this.imagePreviewElement = document.createElement("img");
+    this.imagePreviewElement.addStyleClass("resource-image-view");
+    this.imagePreviewElement.setAttribute("src", this.resource.url);
+
+    container.appendChild(this.imagePreviewElement);
+
+    container = document.createElement("div");
+    container.className = "info";
+    this.contentElement.appendChild(container);
+
+    var imageNameElement = document.createElement("h1");
+    imageNameElement.className = "title";
+    imageNameElement.textContent = this.resource.displayName;
+    container.appendChild(imageNameElement);
+
+    var infoListElement = document.createElement("dl");
+    infoListElement.className = "infoList";
+
+    var imageProperties = [
+        { name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", this.imagePreviewElement.naturalWidth, this.imagePreviewElement.height) },
+        { name: WebInspector.UIString("File size"), value: Number.bytesToString(this.resource.resourceSize, WebInspector.UIString.bind(WebInspector)) },
+        { name: WebInspector.UIString("MIME type"), value: this.resource.mimeType }
+    ];
+
+    var listHTML = '';
+    for (var i = 0; i < imageProperties.length; ++i)
+        listHTML += "<dt>" + imageProperties[i].name + "</dt><dd>" + imageProperties[i].value + "</dd>";
+
+    infoListElement.innerHTML = listHTML;
+    container.appendChild(infoListElement);
+}
+
+WebInspector.ImageView.prototype = {
+    
+}
+
+WebInspector.ImageView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* DatabaseTableView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DatabaseTableView = function(database, tableName)
+{
+    WebInspector.View.call(this);
+
+    this.database = database;
+    this.tableName = tableName;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+}
+
+WebInspector.DatabaseTableView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.update();
+    },
+
+    get statusBarItems()
+    {
+        return [this.refreshButton];
+    },
+
+    update: function()
+    {
+        this.database.executeSql("SELECT * FROM " + this.tableName, this._queryFinished.bind(this), this._queryError.bind(this));
+    },
+
+    _queryFinished: function(result)
+    {
+        this.element.removeChildren();
+
+        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
+        if (!dataGrid) {
+            var emptyMsgElement = document.createElement("div");
+            emptyMsgElement.className = "storage-table-empty";
+            emptyMsgElement.textContent = WebInspector.UIString("The “%s”\ntable is empty.", this.tableName);
+            this.element.appendChild(emptyMsgElement);
+            return;
+        }
+
+        this.element.appendChild(dataGrid.element);
+        dataGrid.autoSizeColumns(5);
+    },
+
+    _queryError: function(error)
+    {
+        this.element.removeChildren();
+
+        var errorMsgElement = document.createElement("div");
+        errorMsgElement.className = "storage-table-error";
+        errorMsgElement.textContent = WebInspector.UIString("An error occurred trying to\nread the “%s” table.", this.tableName);
+        this.element.appendChild(errorMsgElement);
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this.update();
+    }
+}
+
+WebInspector.DatabaseTableView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* DatabaseQueryView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DatabaseQueryView = function(database)
+{
+    WebInspector.View.call(this);
+
+    this.database = database;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("query");
+    this.element.addStyleClass("monospace");
+    this.element.tabIndex = 0;
+
+    this.element.addEventListener("selectstart", this._selectStart.bind(this), false);
+
+    this.promptElement = document.createElement("div");
+    this.promptElement.className = "database-query-prompt";
+    this.promptElement.appendChild(document.createElement("br"));
+    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
+    this.element.appendChild(this.promptElement);
+
+    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " ");
+}
+
+WebInspector.DatabaseQueryView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+
+        function moveBackIfOutside()
+        {
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+        }
+
+        setTimeout(moveBackIfOutside.bind(this), 0);
+    },
+
+    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
+    {
+        var prefix = wordRange.toString().toLowerCase();
+        if (!prefix.length)
+            return;
+
+        var results = [];
+
+        function accumulateMatches(textArray)
+        {
+            if (bestMatchOnly && results.length)
+                return;
+            for (var i = 0; i < textArray.length; ++i) {
+                var text = textArray[i].toLowerCase();
+                if (text.length < prefix.length)
+                    continue;
+                if (text.indexOf(prefix) !== 0)
+                    continue;
+                results.push(textArray[i]);
+                if (bestMatchOnly)
+                    return;
+            }
+        }
+        
+        function tableNamesCallback(tableNames)
+        {
+            accumulateMatches(tableNames.map(function(name) { return name + " " }));
+            accumulateMatches(["SELECT ", "FROM ", "WHERE ", "LIMIT ", "DELETE FROM ", "CREATE ", "DROP ", "TABLE ", "INDEX ", "UPDATE ", "INSERT INTO ", "VALUES ("]);
+
+            completionsReadyCallback(results);
+        }
+        this.database.getTableNames(tableNamesCallback);
+    },
+
+    _promptKeyDown: function(event)
+    {
+        if (isEnterKey(event)) {
+            this._enterKeyPressed(event);
+            return;
+        }
+    },
+
+    _selectStart: function(event)
+    {
+        if (this._selectionTimeout)
+            clearTimeout(this._selectionTimeout);
+
+        this.prompt.clearAutoComplete();
+
+        function moveBackIfOutside()
+        {
+            delete this._selectionTimeout;
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+            this.prompt.autoCompleteSoon();
+        }
+
+        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
+    },
+
+    _enterKeyPressed: function(event)
+    {
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.prompt.clearAutoComplete(true);
+
+        var query = this.prompt.text;
+        if (!query.length)
+            return;
+
+        this.prompt.history.push(query);
+        this.prompt.historyOffset = 0;
+        this.prompt.text = "";
+
+        this.database.executeSql(query, this._queryFinished.bind(this, query), this._queryError.bind(this, query));
+    },
+
+    _queryFinished: function(query, result)
+    {
+        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
+        if (!dataGrid)
+            return;
+        dataGrid.element.addStyleClass("inline");
+        this._appendQueryResult(query, dataGrid.element);
+        dataGrid.autoSizeColumns(5);
+
+        if (query.match(/^create /i) || query.match(/^drop table /i))
+            WebInspector.panels.storage.updateDatabaseTables(this.database);
+    },
+
+    _queryError: function(query, error)
+    {
+        if (error.code == 1)
+            var message = error.message;
+        else if (error.code == 2)
+            var message = WebInspector.UIString("Database no longer has expected version.");
+        else
+            var message = WebInspector.UIString("An unexpected error %s occurred.", error.code);
+
+        this._appendQueryResult(query, message, "error");
+    },
+
+    _appendQueryResult: function(query, result, resultClassName)
+    {
+        var element = document.createElement("div");
+        element.className = "database-user-query";
+
+        var commandTextElement = document.createElement("span");
+        commandTextElement.className = "database-query-text";
+        commandTextElement.textContent = query;
+        element.appendChild(commandTextElement);
+
+        var resultElement = document.createElement("div");
+        resultElement.className = "database-query-result";
+
+        if (resultClassName)
+            resultElement.addStyleClass(resultClassName);
+
+        if (typeof result === "string" || result instanceof String)
+            resultElement.textContent = result;
+        else if (result && result.nodeName)
+            resultElement.appendChild(result);
+
+        if (resultElement.childNodes.length)
+            element.appendChild(resultElement);
+
+        this.element.insertBefore(element, this.promptElement);
+        this.promptElement.scrollIntoView(false);
+    }
+}
+
+WebInspector.DatabaseQueryView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ScriptView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScriptView = function(script)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("script-view");
+
+    this.script = script;
+
+    this._frameNeedsSetup = true;
+    this._sourceFrameSetup = false;
+    this.sourceFrame = new WebInspector.SourceFrame(this.element, this._addBreakpoint.bind(this), this._removeBreakpoint.bind(this));
+}
+
+WebInspector.ScriptView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.visible = true;
+        this.resize();
+    },
+
+    setupSourceFrameIfNeeded: function()
+    {
+        if (!this._frameNeedsSetup)
+            return;
+
+        this.attach();
+
+        var prefix = "";
+        for (var i = 0; i < this.script.startingLine - 1; ++i)
+            prefix += "\n";
+
+        this.sourceFrame.setContent("text/javascript", prefix + this.script.source);
+        this._sourceFrameSetup = true;
+        delete this._frameNeedsSetup;
+    },
+
+    attach: function()
+    {
+        if (!this.element.parentNode)
+            document.getElementById("script-resource-views").appendChild(this.element);
+    },
+
+    _addBreakpoint: function(line)
+    {
+        var breakpoint = new WebInspector.Breakpoint(this.script.sourceURL, line, this.script.sourceID);
+        WebInspector.panels.scripts.addBreakpoint(breakpoint);
+    },
+
+    // The follow methods are pulled from SourceView, since they are
+    // generic and work with ScriptView just fine.
+
+    hide: WebInspector.SourceView.prototype.hide,
+    revealLine: WebInspector.SourceView.prototype.revealLine,
+    highlightLine: WebInspector.SourceView.prototype.highlightLine,
+    addMessage: WebInspector.SourceView.prototype.addMessage,
+    clearMessages: WebInspector.SourceView.prototype.clearMessages,
+    searchCanceled: WebInspector.SourceView.prototype.searchCanceled,
+    performSearch: WebInspector.SourceView.prototype.performSearch,
+    jumpToFirstSearchResult: WebInspector.SourceView.prototype.jumpToFirstSearchResult,
+    jumpToLastSearchResult: WebInspector.SourceView.prototype.jumpToLastSearchResult,
+    jumpToNextSearchResult: WebInspector.SourceView.prototype.jumpToNextSearchResult,
+    jumpToPreviousSearchResult: WebInspector.SourceView.prototype.jumpToPreviousSearchResult,
+    showingFirstSearchResult: WebInspector.SourceView.prototype.showingFirstSearchResult,
+    showingLastSearchResult: WebInspector.SourceView.prototype.showingLastSearchResult,
+    _jumpToSearchResult: WebInspector.SourceView.prototype._jumpToSearchResult,
+    _sourceFrameSetupFinished: WebInspector.SourceView.prototype._sourceFrameSetupFinished,
+    _removeBreakpoint: WebInspector.SourceView.prototype._removeBreakpoint,
+    resize: WebInspector.SourceView.prototype.resize
+}
+
+WebInspector.ScriptView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ProfileDataGridNode = function(profileView, profileNode, owningTree, hasChildren)
+{
+    this.profileView = profileView;
+    this.profileNode = profileNode;
+
+    WebInspector.DataGridNode.call(this, null, hasChildren);
+
+    this.addEventListener("populate", this._populate, this);
+
+    this.tree = owningTree;
+
+    this.childrenByCallUID = {};
+    this.lastComparator = null;
+
+    this.callUID = profileNode.callUID;
+    this.selfTime = profileNode.selfTime;
+    this.totalTime = profileNode.totalTime;
+    this.functionName = profileNode.functionName;
+    this.numberOfCalls = profileNode.numberOfCalls;
+    this.url = profileNode.url;
+}
+
+WebInspector.ProfileDataGridNode.prototype = {
+    get data()
+    {
+        function formatMilliseconds(time)
+        {
+            return Number.secondsToString(time / 1000, WebInspector.UIString.bind(WebInspector), !Preferences.samplingCPUProfiler);
+        }
+
+        var data = {};
+
+        data["function"] = this.functionName;
+        data["calls"] = this.numberOfCalls;
+
+        if (this.profileView.showSelfTimeAsPercent)
+            data["self"] = WebInspector.UIString("%.2f%%", this.selfPercent);
+        else
+            data["self"] = formatMilliseconds(this.selfTime);
+
+        if (this.profileView.showTotalTimeAsPercent)
+            data["total"] = WebInspector.UIString("%.2f%%", this.totalPercent);
+        else
+            data["total"] = formatMilliseconds(this.totalTime);
+
+        if (this.profileView.showAverageTimeAsPercent)
+            data["average"] = WebInspector.UIString("%.2f%%", this.averagePercent);
+        else
+            data["average"] = formatMilliseconds(this.averageTime);
+
+        return data;
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
+
+        if (columnIdentifier === "self" && this._searchMatchedSelfColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "total" && this._searchMatchedTotalColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "average" && this._searchMatchedAverageColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "calls" && this._searchMatchedCallsColumn)
+            cell.addStyleClass("highlight");
+
+        if (columnIdentifier !== "function")
+            return cell;
+
+        if (this.profileNode._searchMatchedFunctionColumn)
+            cell.addStyleClass("highlight");
+
+        if (this.profileNode.url) {
+            var fileName = WebInspector.displayNameForURL(this.profileNode.url);
+
+            var urlElement = document.createElement("a");
+            urlElement.className = "profile-node-file webkit-html-resource-link";
+            urlElement.href = this.profileNode.url;
+            urlElement.lineNumber = this.profileNode.lineNumber;
+            urlElement.preferredPanel = "scripts";
+
+            if (this.profileNode.lineNumber > 0)
+                urlElement.textContent = fileName + ":" + this.profileNode.lineNumber;
+            else
+                urlElement.textContent = fileName;
+
+            cell.insertBefore(urlElement, cell.firstChild);
+        }
+
+        return cell;
+    },
+
+    select: function(supressSelectedEvent)
+    {
+        WebInspector.DataGridNode.prototype.select.call(this, supressSelectedEvent);
+        this.profileView._dataGridNodeSelected(this);
+    },
+
+    deselect: function(supressDeselectedEvent)
+    {
+        WebInspector.DataGridNode.prototype.deselect.call(this, supressDeselectedEvent);
+        this.profileView._dataGridNodeDeselected(this);
+    },
+
+    sort: function(/*Function*/ comparator, /*Boolean*/ force)
+    {
+        var gridNodeGroups = [[this]];
+
+        for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) {
+            var gridNodes = gridNodeGroups[gridNodeGroupIndex];
+            var count = gridNodes.length;
+
+            for (var index = 0; index < count; ++index) {
+                var gridNode = gridNodes[index];
+
+                // If the grid node is collapsed, then don't sort children (save operation for later).
+                // If the grid node has the same sorting as previously, then there is no point in sorting it again.
+                if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) {
+                    if (gridNode.children.length)
+                        gridNode.shouldRefreshChildren = true;
+                    continue;
+                }
+
+                gridNode.lastComparator = comparator;
+
+                var children = gridNode.children;
+                var childCount = children.length;
+
+                if (childCount) {
+                    children.sort(comparator);
+
+                    for (var childIndex = 0; childIndex < childCount; ++childIndex)
+                        children[childIndex]._recalculateSiblings(childIndex);
+
+                    gridNodeGroups.push(children);
+                }
+            }
+        }
+    },
+
+    insertChild: function(/*ProfileDataGridNode*/ profileDataGridNode, index)
+    {
+        WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index);
+
+        this.childrenByCallUID[profileDataGridNode.callUID] = profileDataGridNode;
+    },
+
+    removeChild: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode);
+
+        delete this.childrenByCallUID[profileDataGridNode.callUID];
+    },
+
+    removeChildren: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        WebInspector.DataGridNode.prototype.removeChildren.call(this);
+
+        this.childrenByCallUID = {};
+    },
+
+    findChild: function(/*Node*/ node)
+    {
+        if (!node)
+            return null;
+        return this.childrenByCallUID[node.callUID];
+    },
+
+    get averageTime()
+    {
+        return this.selfTime / Math.max(1, this.numberOfCalls);
+    },
+
+    get averagePercent()
+    {
+        return this.averageTime / this.tree.totalTime * 100.0;
+    },
+
+    get selfPercent()
+    {
+        return this.selfTime / this.tree.totalTime * 100.0;
+    },
+
+    get totalPercent()
+    {
+        return this.totalTime / this.tree.totalTime * 100.0;
+    },
+
+    get _parent()
+    {
+        return this.parent !== this.dataGrid ? this.parent : this.tree;
+    },
+
+    _populate: function(event)
+    {
+        this._sharedPopulate();
+
+        if (this._parent) {
+            var currentComparator = this._parent.lastComparator;
+
+            if (currentComparator)
+                this.sort(currentComparator, true);
+        }
+
+        if (this.removeEventListener)
+            this.removeEventListener("populate", this._populate, this);
+    },
+
+    // When focusing and collapsing we modify lots of nodes in the tree.
+    // This allows us to restore them all to their original state when we revert.
+    _save: function()
+    {
+        if (this._savedChildren)
+            return;
+
+        this._savedSelfTime = this.selfTime;
+        this._savedTotalTime = this.totalTime;
+        this._savedNumberOfCalls = this.numberOfCalls;
+
+        this._savedChildren = this.children.slice();
+    },
+
+    // When focusing and collapsing we modify lots of nodes in the tree.
+    // This allows us to restore them all to their original state when we revert.
+    _restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.selfTime = this._savedSelfTime;
+        this.totalTime = this._savedTotalTime;
+        this.numberOfCalls = this._savedNumberOfCalls;
+
+        this.removeChildren();
+
+        var children = this._savedChildren;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            children[index]._restore();
+            this.appendChild(children[index]);
+        }
+    },
+
+    _merge: function(child, shouldAbsorb)
+    {
+        this.selfTime += child.selfTime;
+
+        if (!shouldAbsorb) {
+            this.totalTime += child.totalTime;
+            this.numberOfCalls += child.numberOfCalls;
+        }
+
+        var children = this.children.slice();
+
+        this.removeChildren();
+
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            if (!shouldAbsorb || children[index] !== child)
+                this.appendChild(children[index]);
+        }
+
+        children = child.children.slice();
+        count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            var orphanedChild = children[index],
+                existingChild = this.childrenByCallUID[orphanedChild.callUID];
+
+            if (existingChild)
+                existingChild._merge(orphanedChild, false);
+            else
+                this.appendChild(orphanedChild);
+        }
+    }
+}
+
+WebInspector.ProfileDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+WebInspector.ProfileDataGridTree = function(profileView, profileNode)
+{
+    this.tree = this;
+    this.children = [];
+
+    this.profileView = profileView;
+
+    this.totalTime = profileNode.totalTime;
+    this.lastComparator = null;
+
+    this.childrenByCallUID = {};
+}
+
+WebInspector.ProfileDataGridTree.prototype = {
+    get expanded()
+    {
+        return true;
+    },
+
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        this.children.splice(index, 0, child);
+        this.childrenByCallUID[child.callUID] = child;
+    },
+
+    removeChildren: function()
+    {
+        this.children = [];
+        this.childrenByCallUID = {};
+    },
+
+    findChild: WebInspector.ProfileDataGridNode.prototype.findChild,
+    sort: WebInspector.ProfileDataGridNode.prototype.sort,
+
+    _save: function()
+    {
+        if (this._savedChildren)
+            return;
+
+        this._savedTotalTime = this.totalTime;
+        this._savedChildren = this.children.slice();
+    },
+
+    restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.children = this._savedChildren;
+        this.totalTime = this._savedTotalTime;
+
+        var children = this.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            children[index]._restore();
+
+        this._savedChildren = null;
+    }
+}
+
+WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}];
+
+WebInspector.ProfileDataGridTree.propertyComparator = function(/*String*/ property, /*Boolean*/ isAscending)
+{
+    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];
+
+    if (!comparator) {
+        if (isAscending) {
+            comparator = function(lhs, rhs)
+            {
+                if (lhs[property] < rhs[property])
+                    return -1;
+
+                if (lhs[property] > rhs[property])
+                    return 1;
+
+                return 0;
+            }
+        } else {
+            comparator = function(lhs, rhs)
+            {
+                if (lhs[property] > rhs[property])
+                    return -1;
+
+                if (lhs[property] < rhs[property])
+                    return 1;
+
+                return 0;
+            }
+        }
+
+        this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;
+    }
+
+    return comparator;
+}
+
+/* BottomUpProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Bottom Up Profiling shows the entire callstack backwards:
+// The root node is a representation of each individual function called, and each child of that node represents
+// a reverse-callstack showing how many of those calls came from it. So, unlike top-down, the statistics in
+// each child still represent the root node. We have to be particularly careful of recursion with this mode
+// because a root node can represent itself AND an ancestor.
+
+WebInspector.BottomUpProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*BottomUpProfileDataGridTree*/ owningTree)
+{
+    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, this._willHaveChildren(profileNode));
+
+    this._remainingNodeInfos = [];
+}
+
+WebInspector.BottomUpProfileDataGridNode.prototype = {
+    _takePropertiesFromProfileDataGridNode: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        this._save();
+
+        this.selfTime = profileDataGridNode.selfTime;
+        this.totalTime = profileDataGridNode.totalTime;
+        this.numberOfCalls = profileDataGridNode.numberOfCalls;
+    },
+
+    // When focusing, we keep just the members of the callstack.
+    _keepOnlyChild: function(/*ProfileDataGridNode*/ child)
+    {
+        this._save();
+
+        this.removeChildren();
+        this.appendChild(child);
+    },
+
+    _exclude: function(aCallUID)
+    {
+        if (this._remainingNodeInfos)
+            this._populate();
+
+        this._save();
+
+        var children = this.children;
+        var index = this.children.length;
+
+        while (index--)
+            children[index]._exclude(aCallUID);
+
+        var child = this.childrenByCallUID[aCallUID];
+
+        if (child)
+            this._merge(child, true);
+    },
+
+    _restore: function()
+    {
+        WebInspector.ProfileDataGridNode.prototype._restore();
+
+        if (!this.children.length)
+            this.hasChildren = this._willHaveChildren();
+    },
+
+    _merge: function(/*ProfileDataGridNode*/ child, /*Boolean*/ shouldAbsorb)
+    {
+        this.selfTime -= child.selfTime;
+
+        WebInspector.ProfileDataGridNode.prototype._merge.call(this, child, shouldAbsorb);
+    },
+
+    _sharedPopulate: function()
+    {
+        var remainingNodeInfos = this._remainingNodeInfos;
+        var count = remainingNodeInfos.length;
+
+        for (var index = 0; index < count; ++index) {
+            var nodeInfo = remainingNodeInfos[index];
+            var ancestor = nodeInfo.ancestor;
+            var focusNode = nodeInfo.focusNode;
+            var child = this.findChild(ancestor);
+
+            // If we already have this child, then merge the data together.
+            if (child) {
+                var totalTimeAccountedFor = nodeInfo.totalTimeAccountedFor;
+
+                child.selfTime += focusNode.selfTime;
+                child.numberOfCalls += focusNode.numberOfCalls;
+
+                if (!totalTimeAccountedFor)
+                    child.totalTime += focusNode.totalTime;
+            } else {
+                // If not, add it as a true ancestor.
+                // In heavy mode, we take our visual identity from ancestor node...
+                var child = new WebInspector.BottomUpProfileDataGridNode(this.profileView, ancestor, this.tree);
+
+                if (ancestor !== focusNode) {
+                    // but the actual statistics from the "root" node (bottom of the callstack).
+                    child.selfTime = focusNode.selfTime;
+                    child.totalTime = focusNode.totalTime;
+                    child.numberOfCalls = focusNode.numberOfCalls;
+                }
+
+                this.appendChild(child);
+            }
+
+            var parent = ancestor.parent;
+            if (parent && parent.parent) {
+                nodeInfo.ancestor = parent;
+                child._remainingNodeInfos.push(nodeInfo);
+            }
+        }
+
+        delete this._remainingNodeInfos;
+    },
+
+    _willHaveChildren: function(profileNode)
+    {
+        profileNode = profileNode || this.profileNode;
+        // In bottom up mode, our parents are our children since we display an inverted tree.
+        // However, we don't want to show the very top parent since it is redundant.
+        return !!(profileNode.parent && profileNode.parent.parent);
+    }
+}
+
+WebInspector.BottomUpProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
+
+WebInspector.BottomUpProfileDataGridTree = function(/*ProfileView*/ aProfileView, /*ProfileNode*/ aProfileNode)
+{
+    WebInspector.ProfileDataGridTree.call(this, aProfileView, aProfileNode);
+
+    // Iterate each node in pre-order.
+    var profileNodeUIDs = 0;
+    var profileNodeGroups = [[], [aProfileNode]];
+    var visitedProfileNodesForCallUID = {};
+
+    this._remainingNodeInfos = [];
+
+    for (var profileNodeGroupIndex = 0; profileNodeGroupIndex < profileNodeGroups.length; ++profileNodeGroupIndex) {
+        var parentProfileNodes = profileNodeGroups[profileNodeGroupIndex];
+        var profileNodes = profileNodeGroups[++profileNodeGroupIndex];
+        var count = profileNodes.length;
+
+        for (var index = 0; index < count; ++index) {
+            var profileNode = profileNodes[index];
+
+            if (!profileNode.UID)
+                profileNode.UID = ++profileNodeUIDs;
+
+            if (profileNode.head && profileNode !== profileNode.head) {
+                // The total time of this ancestor is accounted for if we're in any form of recursive cycle.
+                var visitedNodes = visitedProfileNodesForCallUID[profileNode.callUID];
+                var totalTimeAccountedFor = false;
+
+                if (!visitedNodes) {
+                    visitedNodes = {}
+                    visitedProfileNodesForCallUID[profileNode.callUID] = visitedNodes;
+                } else {
+                    // The total time for this node has already been accounted for iff one of it's parents has already been visited.
+                    // We can do this check in this style because we are traversing the tree in pre-order.
+                    var parentCount = parentProfileNodes.length;
+                    for (var parentIndex = 0; parentIndex < parentCount; ++parentIndex) {
+                        if (visitedNodes[parentProfileNodes[parentIndex].UID]) {
+                            totalTimeAccountedFor = true;
+                            break;
+                        }
+                    }
+                }
+
+                visitedNodes[profileNode.UID] = true;
+
+                this._remainingNodeInfos.push({ ancestor:profileNode, focusNode:profileNode, totalTimeAccountedFor:totalTimeAccountedFor });
+            }
+
+            var children = profileNode.children;
+            if (children.length) {
+                profileNodeGroups.push(parentProfileNodes.concat([profileNode]))
+                profileNodeGroups.push(children);
+            }
+        }
+    }
+
+    // Populate the top level nodes.
+    WebInspector.BottomUpProfileDataGridNode.prototype._populate.call(this);
+
+    return this;
+}
+
+WebInspector.BottomUpProfileDataGridTree.prototype = {
+    // When focusing, we keep the entire callstack up to this ancestor.
+    focus: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        if (!profileDataGridNode)
+            return;
+
+        this._save();
+
+        var currentNode = profileDataGridNode;
+        var focusNode = profileDataGridNode;
+
+        while (currentNode.parent && (currentNode instanceof WebInspector.ProfileDataGridNode)) {
+            currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);
+
+            focusNode = currentNode;
+            currentNode = currentNode.parent;
+
+            if (currentNode instanceof WebInspector.ProfileDataGridNode)
+                currentNode._keepOnlyChild(focusNode);
+        }
+
+        this.children = [focusNode];
+        this.totalTime = profileDataGridNode.totalTime;
+    },
+
+    exclude: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        if (!profileDataGridNode)
+            return;
+
+        this._save();
+
+        var excludedCallUID = profileDataGridNode.callUID;
+        var excludedTopLevelChild = this.childrenByCallUID[excludedCallUID];
+
+        // If we have a top level node that is excluded, get rid of it completely (not keeping children),
+        // since bottom up data relies entirely on the root node.
+        if (excludedTopLevelChild)
+            this.children.remove(excludedTopLevelChild);
+
+        var children = this.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            children[index]._exclude(excludedCallUID);
+
+        if (this.lastComparator)
+            this.sort(this.lastComparator, true);
+    },
+
+    _sharedPopulate: WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate
+}
+
+WebInspector.BottomUpProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
+
+
+/* TopDownProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TopDownProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*TopDownProfileDataGridTree*/ owningTree)
+{
+    var hasChildren = (profileNode.children && profileNode.children.length);
+
+    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, hasChildren);
+
+    this._remainingChildren = profileNode.children;
+}
+
+WebInspector.TopDownProfileDataGridNode.prototype = {
+    _sharedPopulate: function()
+    {
+        var children = this._remainingChildren;
+        var childrenLength = children.length;
+
+        for (var i = 0; i < childrenLength; ++i)
+            this.appendChild(new WebInspector.TopDownProfileDataGridNode(this.profileView, children[i], this.tree));
+
+        this._remainingChildren = null;
+    },
+
+    _exclude: function(aCallUID)
+    {
+        if (this._remainingChildren)
+            this._populate();
+
+        this._save();
+
+        var children = this.children;
+        var index = this.children.length;
+
+        while (index--)
+            children[index]._exclude(aCallUID);
+
+        var child = this.childrenByCallUID[aCallUID];
+
+        if (child)
+            this._merge(child, true);
+    }
+}
+
+WebInspector.TopDownProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
+
+WebInspector.TopDownProfileDataGridTree = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode)
+{
+    WebInspector.ProfileDataGridTree.call(this, profileView, profileNode);
+
+    this._remainingChildren = profileNode.children;
+
+    WebInspector.TopDownProfileDataGridNode.prototype._populate.call(this);
+}
+
+WebInspector.TopDownProfileDataGridTree.prototype = {
+    focus: function(/*ProfileDataGridNode*/ profileDataGrideNode)
+    {
+        if (!profileDataGrideNode)
+            return;
+
+        this._save();
+        profileDataGrideNode.savePosition();
+
+        this.children = [profileDataGrideNode];
+        this.totalTime = profileDataGrideNode.totalTime;
+    },
+
+    exclude: function(/*ProfileDataGridNode*/ profileDataGrideNode)
+    {
+        if (!profileDataGrideNode)
+            return;
+
+        this._save();
+
+        var excludedCallUID = profileDataGrideNode.callUID;
+
+        WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(this, excludedCallUID);
+
+        if (this.lastComparator)
+            this.sort(this.lastComparator, true);
+    },
+
+    restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.children[0].restorePosition();
+
+        WebInspector.ProfileDataGridTree.prototype.restore.call(this);
+    },
+
+    _merge: WebInspector.TopDownProfileDataGridNode.prototype._merge,
+
+    _sharedPopulate: WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate
+}
+
+WebInspector.TopDownProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
+
+/* ProfileView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// FIXME: Rename the file.
+
+WebInspector.CPUProfileView = function(profile)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("profile-view");
+
+    this.showSelfTimeAsPercent = true;
+    this.showTotalTimeAsPercent = true;
+    this.showAverageTimeAsPercent = true;
+
+    var columns = { "self": { title: WebInspector.UIString("Self"), width: "72px", sort: "descending", sortable: true },
+                    "total": { title: WebInspector.UIString("Total"), width: "72px", sortable: true },
+                    "average": { title: WebInspector.UIString("Average"), width: "72px", sortable: true },
+                    "calls": { title: WebInspector.UIString("Calls"), width: "54px", sortable: true },
+                    "function": { title: WebInspector.UIString("Function"), disclosure: true, sortable: true } };
+
+    if (Preferences.samplingCPUProfiler) {
+        delete columns.average;
+        delete columns.calls;
+    }
+
+    this.dataGrid = new WebInspector.DataGrid(columns);
+    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
+    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
+    this.element.appendChild(this.dataGrid.element);
+
+    this.viewSelectElement = document.createElement("select");
+    this.viewSelectElement.className = "status-bar-item";
+    this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false);
+    this.view = "Heavy";
+
+    var heavyViewOption = document.createElement("option");
+    heavyViewOption.label = WebInspector.UIString("Heavy (Bottom Up)");
+    var treeViewOption = document.createElement("option");
+    treeViewOption.label = WebInspector.UIString("Tree (Top Down)");
+    this.viewSelectElement.appendChild(heavyViewOption);
+    this.viewSelectElement.appendChild(treeViewOption);
+
+    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item");
+    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
+
+    this.focusButton = new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."), "focus-profile-node-status-bar-item");
+    this.focusButton.disabled = true;
+    this.focusButton.addEventListener("click", this._focusClicked.bind(this), false);
+
+    this.excludeButton = new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."), "exclude-profile-node-status-bar-item");
+    this.excludeButton.disabled = true;
+    this.excludeButton.addEventListener("click", this._excludeClicked.bind(this), false);
+
+    this.resetButton = new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."), "reset-profile-status-bar-item");
+    this.resetButton.visible = false;
+    this.resetButton.addEventListener("click", this._resetClicked.bind(this), false);
+
+    this.profile = profile;
+
+    var self = this;
+    function profileCallback(profile)
+    {
+        self.profile = profile;
+        self._assignParentsInProfile();
+      
+        self.profileDataGridTree = self.bottomUpProfileDataGridTree;
+        self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
+     
+        self.refresh();
+     
+        self._updatePercentButton();
+    }
+
+    var callId = WebInspector.Callback.wrap(profileCallback);
+    InspectorBackend.getProfile(callId, this.profile.uid);
+}
+
+WebInspector.CPUProfileView.prototype = {
+    get statusBarItems()
+    {
+        return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];
+    },
+
+    get profile()
+    {
+        return this._profile;
+    },
+
+    set profile(profile)
+    {
+        this._profile = profile;
+    },
+
+    get bottomUpProfileDataGridTree()
+    {
+        if (!this._bottomUpProfileDataGridTree)
+            this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this, this.profile.head);
+        return this._bottomUpProfileDataGridTree;
+    },
+
+    get topDownProfileDataGridTree()
+    {
+        if (!this._topDownProfileDataGridTree)
+            this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this, this.profile.head);
+        return this._topDownProfileDataGridTree;
+    },
+
+    get currentTree()
+    {
+        return this._currentTree;
+    },
+
+    set currentTree(tree)
+    {
+        this._currentTree = tree;
+        this.refresh();
+    },
+
+    get topDownTree()
+    {
+        if (!this._topDownTree) {
+            this._topDownTree = WebInspector.TopDownTreeFactory.create(this.profile.head);
+            this._sortProfile(this._topDownTree);
+        }
+
+        return this._topDownTree;
+    },
+
+    get bottomUpTree()
+    {
+        if (!this._bottomUpTree) {
+            this._bottomUpTree = WebInspector.BottomUpTreeFactory.create(this.profile.head);
+            this._sortProfile(this._bottomUpTree);
+        }
+
+        return this._bottomUpTree;
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.dataGrid.updateWidths();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.dataGrid)
+            this.dataGrid.updateWidths();
+    },
+
+    refresh: function()
+    {
+        var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
+
+        this.dataGrid.removeChildren();
+
+        var children = this.profileDataGridTree.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            this.dataGrid.appendChild(children[index]);
+
+        if (selectedProfileNode)
+            selectedProfileNode.selected = true;
+    },
+
+    refreshVisibleData: function()
+    {
+        var child = this.dataGrid.children[0];
+        while (child) {
+            child.refresh();
+            child = child.traverseNextNode(false, null, true);
+        }
+    },
+
+    refreshShowAsPercents: function()
+    {
+        this._updatePercentButton();
+        this.refreshVisibleData();
+    },
+
+    searchCanceled: function()
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var profileNode = this._searchResults[i].profileNode;
+
+                delete profileNode._searchMatchedSelfColumn;
+                delete profileNode._searchMatchedTotalColumn;
+                delete profileNode._searchMatchedCallsColumn;
+                delete profileNode._searchMatchedFunctionColumn;
+
+                profileNode.refresh();
+            }
+        }
+
+        delete this._searchFinishedCallback;
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        query = query.trim();
+
+        if (!query.length)
+            return;
+
+        this._searchFinishedCallback = finishedCallback;
+
+        var greaterThan = (query.indexOf(">") === 0);
+        var lessThan = (query.indexOf("<") === 0);
+        var equalTo = (query.indexOf("=") === 0 || ((greaterThan || lessThan) && query.indexOf("=") === 1));
+        var percentUnits = (query.lastIndexOf("%") === (query.length - 1));
+        var millisecondsUnits = (query.length > 2 && query.lastIndexOf("ms") === (query.length - 2));
+        var secondsUnits = (!millisecondsUnits && query.lastIndexOf("s") === (query.length - 1));
+
+        var queryNumber = parseFloat(query);
+        if (greaterThan || lessThan || equalTo) {
+            if (equalTo && (greaterThan || lessThan))
+                queryNumber = parseFloat(query.substring(2));
+            else
+                queryNumber = parseFloat(query.substring(1));
+        }
+
+        var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber);
+
+        // Make equalTo implicitly true if it wasn't specified there is no other operator.
+        if (!isNaN(queryNumber) && !(greaterThan || lessThan))
+            equalTo = true;
+
+        function matchesQuery(/*ProfileDataGridNode*/ profileDataGridNode)
+        {
+            delete profileDataGridNode._searchMatchedSelfColumn;
+            delete profileDataGridNode._searchMatchedTotalColumn;
+            delete profileDataGridNode._searchMatchedAverageColumn;
+            delete profileDataGridNode._searchMatchedCallsColumn;
+            delete profileDataGridNode._searchMatchedFunctionColumn;
+
+            if (percentUnits) {
+                if (lessThan) {
+                    if (profileDataGridNode.selfPercent < queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent < queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                } else if (greaterThan) {
+                    if (profileDataGridNode.selfPercent > queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent > queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+
+                if (equalTo) {
+                    if (profileDataGridNode.selfPercent == queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent == queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+            } else if (millisecondsUnits || secondsUnits) {
+                if (lessThan) {
+                    if (profileDataGridNode.selfTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                } else if (greaterThan) {
+                    if (profileDataGridNode.selfTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+
+                if (equalTo) {
+                    if (profileDataGridNode.selfTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+            } else {
+                if (equalTo && profileDataGridNode.numberOfCalls == queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+                if (greaterThan && profileDataGridNode.numberOfCalls > queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+                if (lessThan && profileDataGridNode.numberOfCalls < queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+            }
+
+            if (profileDataGridNode.functionName.hasSubstring(query, true) || profileDataGridNode.url.hasSubstring(query, true))
+                profileDataGridNode._searchMatchedFunctionColumn = true;
+
+            if (profileDataGridNode._searchMatchedSelfColumn ||
+                profileDataGridNode._searchMatchedTotalColumn ||
+                profileDataGridNode._searchMatchedAverageColumn ||
+                profileDataGridNode._searchMatchedCallsColumn ||
+                profileDataGridNode._searchMatchedFunctionColumn)
+            {
+                profileDataGridNode.refresh();
+                return true;
+            }
+
+            return false;
+        }
+
+        var current = this.profileDataGridTree.children[0];
+
+        while (current) {
+            if (matchesQuery(current)) {
+                this._searchResults.push({ profileNode: current });
+            }
+
+            current = current.traverseNextNode(false, null, false);
+        }
+
+        finishedCallback(this, this._searchResults.length);
+    },
+
+    jumpToFirstSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToLastSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    showingFirstSearchResult: function()
+    {
+        return (this._currentSearchResultIndex === 0);
+    },
+
+    showingLastSearchResult: function()
+    {
+        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
+    },
+
+    _jumpToSearchResult: function(index)
+    {
+        var searchResult = this._searchResults[index];
+        if (!searchResult)
+            return;
+
+        var profileNode = searchResult.profileNode;
+        profileNode.reveal();
+        profileNode.select();
+    },
+
+    _changeView: function(event)
+    {
+        if (!event || !this.profile)
+            return;
+
+        if (event.target.selectedIndex == 1 && this.view == "Heavy") {
+            this.profileDataGridTree = this.topDownProfileDataGridTree;
+            this._sortProfile();
+            this.view = "Tree";
+        } else if (event.target.selectedIndex == 0 && this.view == "Tree") {
+            this.profileDataGridTree = this.bottomUpProfileDataGridTree;
+            this._sortProfile();
+            this.view = "Heavy";
+        }
+
+        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
+            return;
+
+        // The current search needs to be performed again. First negate out previous match
+        // count by calling the search finished callback with a negative number of matches.
+        // Then perform the search again the with same query and callback.
+        this._searchFinishedCallback(this, -this._searchResults.length);
+        this.performSearch(this.currentQuery, this._searchFinishedCallback);
+    },
+
+    _percentClicked: function(event)
+    {
+        var currentState = this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent;
+        this.showSelfTimeAsPercent = !currentState;
+        this.showTotalTimeAsPercent = !currentState;
+        this.showAverageTimeAsPercent = !currentState;
+        this.refreshShowAsPercents();
+    },
+
+    _updatePercentButton: function()
+    {
+        if (this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent) {
+            this.percentButton.title = WebInspector.UIString("Show absolute total and self times.");
+            this.percentButton.toggled = true;
+        } else {
+            this.percentButton.title = WebInspector.UIString("Show total and self times as percentages.");
+            this.percentButton.toggled = false;
+        }
+    },
+
+    _focusClicked: function(event)
+    {
+        if (!this.dataGrid.selectedNode)
+            return;
+
+        this.resetButton.visible = true;
+        this.profileDataGridTree.focus(this.dataGrid.selectedNode);
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _excludeClicked: function(event)
+    {
+        var selectedNode = this.dataGrid.selectedNode
+
+        if (!selectedNode)
+            return;
+
+        selectedNode.deselect();
+
+        this.resetButton.visible = true;
+        this.profileDataGridTree.exclude(selectedNode);
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _resetClicked: function(event)
+    {
+        this.resetButton.visible = false;
+        this.profileDataGridTree.restore();
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _dataGridNodeSelected: function(node)
+    {
+        this.focusButton.disabled = false;
+        this.excludeButton.disabled = false;
+    },
+
+    _dataGridNodeDeselected: function(node)
+    {
+        this.focusButton.disabled = true;
+        this.excludeButton.disabled = true;
+    },
+
+    _sortData: function(event)
+    {
+        this._sortProfile(this.profile);
+    },
+
+    _sortProfile: function()
+    {
+        var sortAscending = this.dataGrid.sortOrder === "ascending";
+        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
+        var sortProperty = {
+                "average": "averageTime",
+                "self": "selfTime",
+                "total": "totalTime",
+                "calls": "numberOfCalls",
+                "function": "functionName"
+            }[sortColumnIdentifier];
+
+        this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
+
+        this.refresh();
+    },
+
+    _mouseDownInDataGrid: function(event)
+    {
+        if (event.detail < 2)
+            return;
+
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell || (!cell.hasStyleClass("total-column") && !cell.hasStyleClass("self-column") && !cell.hasStyleClass("average-column")))
+            return;
+
+        if (cell.hasStyleClass("total-column"))
+            this.showTotalTimeAsPercent = !this.showTotalTimeAsPercent;
+        else if (cell.hasStyleClass("self-column"))
+            this.showSelfTimeAsPercent = !this.showSelfTimeAsPercent;
+        else if (cell.hasStyleClass("average-column"))
+            this.showAverageTimeAsPercent = !this.showAverageTimeAsPercent;
+
+        this.refreshShowAsPercents();
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    _assignParentsInProfile: function()
+    {
+        var head = this.profile.head;
+        head.parent = null;
+        head.head = null;
+        var nodesToTraverse = [ { parent: head, children: head.children } ];
+        while (nodesToTraverse.length > 0) {
+            var pair = nodesToTraverse.shift();
+            var parent = pair.parent;
+            var children = pair.children;
+            var length = children.length;
+            for (var i = 0; i < length; ++i) {
+                children[i].head = head;
+                children[i].parent = parent;
+                if (children[i].children.length > 0)
+                    nodesToTraverse.push({ parent: children[i], children: children[i].children });
+            }
+        }
+    }
+}
+
+WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.CPUProfileType = function()
+{
+    WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));
+    this._recording = false;
+}
+
+WebInspector.CPUProfileType.TypeId = "CPU";
+
+WebInspector.CPUProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");
+    },
+
+    get buttonStyle()
+    {
+        return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";
+    },
+
+    buttonClicked: function()
+    {
+        this._recording = !this._recording;
+
+        if (this._recording)
+            InspectorBackend.startProfiling();
+        else
+            InspectorBackend.stopProfiling();
+    },
+
+    get welcomeMessage()
+    {
+        return WebInspector.UIString("Start CPU profiling by pressing<br>the %s button on the status bar.");
+    },
+
+    setRecordingProfile: function(isProfiling)
+    {
+        this._recording = isProfiling;
+    },
+
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        return new WebInspector.ProfileSidebarTreeElement(profile);
+    },
+
+    createView: function(profile)
+    {
+        return new WebInspector.CPUProfileView(profile);
+    }
+}
+
+WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
+
+/* DOMAgent.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMNode = function(doc, payload) {
+    this.ownerDocument = doc;
+
+    this.id = payload.id;
+    // injectedScriptId is a node is for DOM nodes which should be converted
+    // to corresponding InjectedScript by the inspector backend. We indicate
+    // this by making injectedScriptId negative.
+    this.injectedScriptId = -payload.id;
+    this.nodeType = payload.nodeType;
+    this.nodeName = payload.nodeName;
+    this.localName = payload.localName;
+    this._nodeValue = payload.nodeValue;
+    this.textContent = this.nodeValue;
+
+    this.attributes = [];
+    this._attributesMap = {};
+    if (payload.attributes)
+        this._setAttributesPayload(payload.attributes);
+
+    this._childNodeCount = payload.childNodeCount;
+    this.children = null;
+
+    this.nextSibling = null;
+    this.prevSibling = null;
+    this.firstChild = null;
+    this.lastChild = null;
+    this.parentNode = null;
+
+    if (payload.children)
+        this._setChildrenPayload(payload.children);
+
+    this._computedStyle = null;
+    this.style = null;
+    this._matchedCSSRules = [];
+
+    if (this.nodeType === Node.ELEMENT_NODE) {
+        // HTML and BODY from internal iframes should not overwrite top-level ones.
+        if (!this.ownerDocument.documentElement && this.nodeName === "HTML")
+            this.ownerDocument.documentElement = this;
+        if (!this.ownerDocument.body && this.nodeName === "BODY")
+            this.ownerDocument.body = this;
+        if (payload.documentURL)
+            this.documentURL = payload.documentURL;
+    } else if (this.nodeType === Node.DOCUMENT_TYPE_NODE) {
+        this.publicId = payload.publicId;
+        this.systemId = payload.systemId;
+        this.internalSubset = payload.internalSubset;
+    } else if (this.nodeType === Node.DOCUMENT_NODE)
+        this.documentURL = payload.documentURL;
+}
+
+WebInspector.DOMNode.prototype = {
+    hasAttributes: function()
+    {
+        return this.attributes.length > 0;
+    },
+
+    hasChildNodes: function()  {
+        return this._childNodeCount > 0;
+    },
+
+    get nodeValue() {
+        return this._nodeValue;
+    },
+
+    set nodeValue(value) {
+        if (this.nodeType != Node.TEXT_NODE)
+            return;
+        var self = this;
+        var callback = function()
+        {
+            self._nodeValue = value;
+            self.textContent = value;
+        };
+        this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, callback);
+    },
+
+    getAttribute: function(name)
+    {
+        var attr = this._attributesMap[name];
+        return attr ? attr.value : undefined;
+    },
+
+    setAttribute: function(name, value)
+    {
+        var self = this;
+        var callback = function()
+        {
+            var attr = self._attributesMap[name];
+            if (attr)
+                attr.value = value;
+            else
+                attr = self._addAttribute(name, value);
+        };
+        this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback);
+    },
+
+    removeAttribute: function(name)
+    {
+        var self = this;
+        var callback = function()
+        {
+            delete self._attributesMap[name];
+            for (var i = 0;  i < self.attributes.length; ++i) {
+                if (self.attributes[i].name == name) {
+                    self.attributes.splice(i, 1);
+                    break;
+                }
+            }
+        };
+        this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback);
+    },
+
+    _setAttributesPayload: function(attrs)
+    {
+        this.attributes = [];
+        this._attributesMap = {};
+        for (var i = 0; i < attrs.length; i += 2)
+            this._addAttribute(attrs[i], attrs[i + 1]);
+    },
+
+    _insertChild: function(prev, payload)
+    {
+        var node = new WebInspector.DOMNode(this.ownerDocument, payload);
+        if (!prev) {
+            if (!this.children) {
+                // First node
+                this.children = [ node ];
+            } else
+                this.children.unshift(node);
+        } else
+            this.children.splice(this.children.indexOf(prev) + 1, 0, node);
+        this._renumber();
+        return node;
+    },
+
+    removeChild_: function(node)
+    {
+        this.children.splice(this.children.indexOf(node), 1);
+        node.parentNode = null;
+        this._renumber();
+    },
+
+    _setChildrenPayload: function(payloads)
+    {
+        this.children = [];
+        for (var i = 0; i < payloads.length; ++i) {
+            var payload = payloads[i];
+            var node = new WebInspector.DOMNode(this.ownerDocument, payload);
+            this.children.push(node);
+        }
+        this._renumber();
+    },
+
+    _renumber: function()
+    {
+        this._childNodeCount = this.children.length;
+        if (this._childNodeCount == 0) {
+            this.firstChild = null;
+            this.lastChild = null;
+            return;
+        }
+        this.firstChild = this.children[0];
+        this.lastChild = this.children[this._childNodeCount - 1];
+        for (var i = 0; i < this._childNodeCount; ++i) {
+            var child = this.children[i];
+            child.index = i;
+            child.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null;
+            child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null;
+            child.parentNode = this;
+        }
+    },
+
+    _addAttribute: function(name, value)
+    {
+        var attr = {
+            "name": name,
+            "value": value,
+            "_node": this
+        };
+        this._attributesMap[name] = attr;
+        this.attributes.push(attr);
+    },
+
+    _setStyles: function(computedStyle, inlineStyle, styleAttributes, matchedCSSRules)
+    {
+        this._computedStyle = new WebInspector.CSSStyleDeclaration(computedStyle);
+        this.style = new WebInspector.CSSStyleDeclaration(inlineStyle);
+
+        for (var name in styleAttributes) {
+            if (this._attributesMap[name])
+                this._attributesMap[name].style = new WebInspector.CSSStyleDeclaration(styleAttributes[name]);
+        }
+
+        this._matchedCSSRules = [];
+        for (var i = 0; i < matchedCSSRules.length; i++)
+            this._matchedCSSRules.push(WebInspector.CSSStyleDeclaration.parseRule(matchedCSSRules[i]));
+    },
+
+    _clearStyles: function()
+    {
+        this.computedStyle = null;
+        this.style = null;
+        for (var name in this._attributesMap)
+            this._attributesMap[name].style = null;
+        this._matchedCSSRules = null;
+    }
+}
+
+WebInspector.DOMDocument = function(domAgent, defaultView, payload)
+{
+    WebInspector.DOMNode.call(this, this, payload);
+    this._listeners = {};
+    this._domAgent = domAgent;
+    this.defaultView = defaultView;
+}
+
+WebInspector.DOMDocument.prototype = {
+
+    addEventListener: function(name, callback)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners) {
+            listeners = [];
+            this._listeners[name] = listeners;
+        }
+        listeners.push(callback);
+    },
+
+    removeEventListener: function(name, callback)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners)
+            return;
+
+        var index = listeners.indexOf(callback);
+        if (index != -1)
+            listeners.splice(index, 1);
+    },
+
+    _fireDomEvent: function(name, event)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners)
+            return;
+
+        for (var i = 0; i < listeners.length; ++i) {
+            var listener = listeners[i];
+            listener.call(this, event);
+        }
+    }
+}
+
+WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype;
+
+
+WebInspector.DOMWindow = function(domAgent)
+{
+    this._domAgent = domAgent;
+}
+
+WebInspector.DOMWindow.prototype = {
+    get document()
+    {
+        return this._domAgent.document;
+    },
+
+    get Node()
+    {
+        return WebInspector.DOMNode;
+    },
+
+    get Element()
+    {
+        return WebInspector.DOMNode;
+    },
+
+    Object: function()
+    {
+    },
+
+    getComputedStyle: function(node)
+    {
+        return node._computedStyle;
+    },
+
+    getMatchedCSSRules: function(node, pseudoElement, authorOnly)
+    {
+        return node._matchedCSSRules;
+    }
+}
+
+WebInspector.DOMAgent = function() {
+    this._window = new WebInspector.DOMWindow(this);
+    this._idToDOMNode = null;
+    this.document = null;
+}
+
+WebInspector.DOMAgent.prototype = {
+    get domWindow()
+    {
+        return this._window;
+    },
+
+    getChildNodesAsync: function(parent, callback)
+    {
+        var children = parent.children;
+        if (children) {
+            callback(children);
+            return;
+        }
+        function mycallback() {
+            callback(parent.children);
+        }
+        var callId = WebInspector.Callback.wrap(mycallback);
+        InspectorBackend.getChildNodes(callId, parent.id);
+    },
+
+    setAttributeAsync: function(node, name, value, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.setAttribute(WebInspector.Callback.wrap(mycallback), node.id, name, value);
+    },
+
+    removeAttributeAsync: function(node, name, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.removeAttribute(WebInspector.Callback.wrap(mycallback), node.id, name);
+    },
+
+    setTextNodeValueAsync: function(node, text, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.setTextNodeValue(WebInspector.Callback.wrap(mycallback), node.id, text);
+    },
+
+    _didApplyDomChange: function(node, callback, success)
+    {
+        if (!success)
+            return;
+        callback();
+        // TODO(pfeldman): Fix this hack.
+        var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node);
+        if (elem)
+            elem.updateTitle();
+    },
+
+    _attributesUpdated: function(nodeId, attrsArray)
+    {
+        var node = this._idToDOMNode[nodeId];
+        node._setAttributesPayload(attrsArray);
+        var event = {target: node};
+        this.document._fireDomEvent("DOMAttrModified", event);
+    },
+
+    nodeForId: function(nodeId) {
+        return this._idToDOMNode[nodeId];
+    },
+
+    _setDocument: function(payload)
+    {
+        this._idToDOMNode = {};
+        if (payload && "id" in payload) {
+            this.document = new WebInspector.DOMDocument(this, this._window, payload);
+            this._idToDOMNode[payload.id] = this.document;
+            this._bindNodes(this.document.children);
+        } else
+            this.document = null;
+        WebInspector.panels.elements.setDocument(this.document);
+    },
+
+    _setDetachedRoot: function(payload)
+    {
+        var root = new WebInspector.DOMNode(this.document, payload);
+        this._idToDOMNode[payload.id] = root;
+    },
+
+    _setChildNodes: function(parentId, payloads)
+    {
+        var parent = this._idToDOMNode[parentId];
+        parent._setChildrenPayload(payloads);
+        this._bindNodes(parent.children);
+    },
+
+    _bindNodes: function(children)
+    {
+        for (var i = 0; i < children.length; ++i) {
+            var child = children[i];
+            this._idToDOMNode[child.id] = child;
+            if (child.children)
+                this._bindNodes(child.children);
+        }
+    },
+
+    _childNodeCountUpdated: function(nodeId, newValue)
+    {
+        var node = this._idToDOMNode[nodeId];
+        node._childNodeCount = newValue;
+        var outline = WebInspector.panels.elements.treeOutline;
+        var treeElement = outline.findTreeElement(node);
+        if (treeElement)
+            treeElement.hasChildren = newValue;
+    },
+
+    _childNodeInserted: function(parentId, prevId, payload)
+    {
+        var parent = this._idToDOMNode[parentId];
+        var prev = this._idToDOMNode[prevId];
+        var node = parent._insertChild(prev, payload);
+        this._idToDOMNode[node.id] = node;
+        var event = { target : node, relatedNode : parent };
+        this.document._fireDomEvent("DOMNodeInserted", event);
+    },
+
+    _childNodeRemoved: function(parentId, nodeId)
+    {
+        var parent = this._idToDOMNode[parentId];
+        var node = this._idToDOMNode[nodeId];
+        parent.removeChild_(node);
+        var event = { target : node, relatedNode : parent };
+        this.document._fireDomEvent("DOMNodeRemoved", event);
+        delete this._idToDOMNode[nodeId];
+    }
+}
+
+WebInspector.Cookies = {}
+
+WebInspector.Cookies.getCookiesAsync = function(callback)
+{
+    function mycallback(cookies, cookiesString) {
+        if (cookiesString)
+            callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false);
+        else
+            callback(cookies, true);
+    }
+    var callId = WebInspector.Callback.wrap(mycallback);
+    InspectorBackend.getCookies(callId);
+}
+
+WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
+{
+    var rawCookies = rawCookieString.split(/;\s*/);
+    var cookies = [];
+
+    if (!(/^\s*$/.test(rawCookieString))) {
+        for (var i = 0; i < rawCookies.length; ++i) {
+            var cookie = rawCookies[i];
+            var delimIndex = cookie.indexOf("=");
+            var name = cookie.substring(0, delimIndex);
+            var value = cookie.substring(delimIndex + 1);
+            var size = name.length + value.length;
+            cookies.push({ name: name, value: value, size: size });
+        }
+    }
+
+    return cookies;
+}
+
+WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL)
+{
+    var match = resourceURL.match(WebInspector.URLRegExp);
+    if (!match)
+        return false;
+    // See WebInspector.URLRegExp for definitions of the group index constants.
+    if (!this.cookieDomainMatchesResourceDomain(cookie.domain, match[2]))
+        return false;
+    var resourcePort = match[3] ? match[3] : undefined;
+    var resourcePath = match[4] ? match[4] : '/';
+    return (resourcePath.indexOf(cookie.path) === 0
+        && (!cookie.port || resourcePort == cookie.port)
+        && (!cookie.secure || match[1].toLowerCase() === 'https'));
+}
+
+WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain)
+{
+    if (cookieDomain.charAt(0) !== '.')
+        return resourceDomain === cookieDomain;
+    return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)?" + cookieDomain.substring(1).escapeForRegExp() + "$"), "i");
+}
+
+WebInspector.EventListeners = {}
+
+WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback)
+{
+    if (!node)
+        return;
+
+    var callId = WebInspector.Callback.wrap(callback);
+    InspectorBackend.getEventListenersForNode(callId, node.id);
+}
+
+WebInspector.CSSStyleDeclaration = function(payload)
+{
+    this.id = payload.id;
+    this.injectedScriptId = payload.injectedScriptId;
+    this.width = payload.width;
+    this.height = payload.height;
+    this.__disabledProperties = payload.__disabledProperties;
+    this.__disabledPropertyValues = payload.__disabledPropertyValues;
+    this.__disabledPropertyPriorities = payload.__disabledPropertyPriorities;
+    this.uniqueStyleProperties = payload.uniqueStyleProperties;
+    this._shorthandValues = payload.shorthandValues;
+    this._propertyMap = {};
+    this._longhandProperties = {};
+    this.length = payload.properties.length;
+
+    for (var i = 0; i < this.length; ++i) {
+        var property = payload.properties[i];
+        var name = property.name;
+        this[i] = name;
+        this._propertyMap[name] = property;
+    }
+
+    // Index longhand properties.
+    for (var i = 0; i < this.uniqueStyleProperties.length; ++i) {
+        var name = this.uniqueStyleProperties[i];
+        var property = this._propertyMap[name];
+        if (property.shorthand) {
+            var longhands = this._longhandProperties[property.shorthand];
+            if (!longhands) {
+                longhands = [];
+                this._longhandProperties[property.shorthand] = longhands;
+            }
+            longhands.push(name);
+        }
+    }
+}
+
+WebInspector.CSSStyleDeclaration.parseStyle = function(payload)
+{
+    return new WebInspector.CSSStyleDeclaration(payload);
+}
+
+WebInspector.CSSStyleDeclaration.parseRule = function(payload)
+{
+    var rule = {};
+    rule.id = payload.id;
+    rule.injectedScriptId = payload.injectedScriptId;
+    rule.selectorText = payload.selectorText;
+    rule.style = new WebInspector.CSSStyleDeclaration(payload.style);
+    rule.style.parentRule = rule;
+    rule.isUserAgent = payload.isUserAgent;
+    rule.isUser = payload.isUser;
+    rule.isViaInspector = payload.isViaInspector;
+    if (payload.parentStyleSheet)
+        rule.parentStyleSheet = { href: payload.parentStyleSheet.href };
+
+    return rule;
+}
+
+WebInspector.CSSStyleDeclaration.prototype = {
+    getPropertyValue: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.value : "";
+    },
+
+    getPropertyPriority: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.priority : "";
+    },
+
+    getPropertyShorthand: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.shorthand : "";
+    },
+
+    isPropertyImplicit: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.implicit : "";
+    },
+
+    styleTextWithShorthands: function()
+    {
+        var cssText = "";
+        var foundProperties = {};
+        for (var i = 0; i < this.length; ++i) {
+            var individualProperty = this[i];
+            var shorthandProperty = this.getPropertyShorthand(individualProperty);
+            var propertyName = (shorthandProperty || individualProperty);
+
+            if (propertyName in foundProperties)
+                continue;
+
+            if (shorthandProperty) {
+                var value = this.getPropertyValue(shorthandProperty);
+                var priority = this.getShorthandPriority(shorthandProperty);
+            } else {
+                var value = this.getPropertyValue(individualProperty);
+                var priority = this.getPropertyPriority(individualProperty);
+            }
+
+            foundProperties[propertyName] = true;
+
+            cssText += propertyName + ": " + value;
+            if (priority)
+                cssText += " !" + priority;
+            cssText += "; ";
+        }
+
+        return cssText;
+    },
+
+    getLonghandProperties: function(name)
+    {
+        return this._longhandProperties[name] || [];
+    },
+
+    getShorthandValue: function(shorthandProperty)
+    {
+        return this._shorthandValues[shorthandProperty];
+    },
+
+    getShorthandPriority: function(shorthandProperty)
+    {
+        var priority = this.getPropertyPriority(shorthandProperty);
+        if (priority)
+            return priority;
+
+        var longhands = this._longhandProperties[shorthandProperty];
+        return longhands ? this.getPropertyPriority(longhands[0]) : null;
+    }
+}
+
+WebInspector.attributesUpdated = function()
+{
+    this.domAgent._attributesUpdated.apply(this.domAgent, arguments);
+}
+
+WebInspector.setDocument = function()
+{
+    this.domAgent._setDocument.apply(this.domAgent, arguments);
+}
+
+WebInspector.setDetachedRoot = function()
+{
+    this.domAgent._setDetachedRoot.apply(this.domAgent, arguments);
+}
+
+WebInspector.setChildNodes = function()
+{
+    this.domAgent._setChildNodes.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeCountUpdated = function()
+{
+    this.domAgent._childNodeCountUpdated.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeInserted = function()
+{
+    this.domAgent._childNodeInserted.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeRemoved = function()
+{
+    this.domAgent._childNodeRemoved.apply(this.domAgent, arguments);
+}
+
+WebInspector.didGetCookies = WebInspector.Callback.processCallback;
+WebInspector.didGetChildNodes = WebInspector.Callback.processCallback;
+WebInspector.didPerformSearch = WebInspector.Callback.processCallback;
+WebInspector.didApplyDomChange = WebInspector.Callback.processCallback;
+WebInspector.didRemoveAttribute = WebInspector.Callback.processCallback;
+WebInspector.didSetTextNodeValue = WebInspector.Callback.processCallback;
+WebInspector.didGetEventListenersForNode = WebInspector.Callback.processCallback;
+
+/* InjectedScript.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var injectedScriptConstructor = (function (InjectedScriptHost, inspectedWindow, injectedScriptId) {
+
+var InjectedScript = {};
+
+InjectedScript.lastBoundObjectId = 1;
+InjectedScript.idToWrappedObject = {};
+InjectedScript.objectGroups = {};
+InjectedScript.wrapObject = function(object, objectGroupName)
+{
+    var objectId;
+    if (typeof object === "object" || typeof object === "function" ||
+        (typeof object === "undefined" && object instanceof inspectedWindow.HTMLAllCollection)) { // FIXME(33716)
+        var id = InjectedScript.lastBoundObjectId++;
+        objectId = "object#" + id;
+        InjectedScript.idToWrappedObject[objectId] = object;
+
+        var group = InjectedScript.objectGroups[objectGroupName];
+        if (!group) {
+            group = [];
+            InjectedScript.objectGroups[objectGroupName] = group;
+        }
+        group.push(objectId);
+    }
+    return InjectedScript.createProxyObject(object, objectId);
+};
+
+InjectedScript.unwrapObject = function(objectId) {
+    return InjectedScript.idToWrappedObject[objectId];
+};
+
+InjectedScript.releaseWrapperObjectGroup = function(objectGroupName) {
+    var group = InjectedScript.objectGroups[objectGroupName];
+    if (!group)
+        return;
+    for (var i = 0; i < group.length; i++)
+        delete InjectedScript.idToWrappedObject[group[i]];
+    delete InjectedScript.objectGroups[objectGroupName];
+};
+
+// Called from within InspectorController on the 'inspected page' side.
+InjectedScript.reset = function()
+{
+    InjectedScript._styles = {};
+    InjectedScript._styleRules = {};
+    InjectedScript._lastStyleId = 0;
+    InjectedScript._lastStyleRuleId = 0;
+    InjectedScript._searchResults = [];
+    InjectedScript._includedInSearchResultsPropertyName = "__includedInInspectorSearchResults";
+}
+
+InjectedScript.reset();
+
+InjectedScript.dispatch = function(methodName, args, callId)
+{
+    var argsArray = eval("(" + args + ")");
+    if (callId)
+        argsArray.splice(0, 0, callId);  // Methods that run asynchronously have a call back id parameter.
+    var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
+    if (typeof result === "undefined") {
+        InjectedScript._window().console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
+        result = null;
+    }
+    return result;
+}
+
+InjectedScript.getStyles = function(nodeId, authorOnly)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    var defaultView = node.ownerDocument.defaultView;
+    var matchedRules = defaultView.getMatchedCSSRules(node, "", authorOnly);
+    var matchedCSSRules = [];
+    for (var i = 0; matchedRules && i < matchedRules.length; ++i)
+        matchedCSSRules.push(InjectedScript._serializeRule(matchedRules[i]));
+
+    var styleAttributes = {};
+    var attributes = node.attributes;
+    for (var i = 0; attributes && i < attributes.length; ++i) {
+        if (attributes[i].style)
+            styleAttributes[attributes[i].name] = InjectedScript._serializeStyle(attributes[i].style, true);
+    }
+    var result = {};
+    result.inlineStyle = InjectedScript._serializeStyle(node.style, true);
+    result.computedStyle = InjectedScript._serializeStyle(defaultView.getComputedStyle(node));
+    result.matchedCSSRules = matchedCSSRules;
+    result.styleAttributes = styleAttributes;
+    return result;
+}
+
+InjectedScript.getComputedStyle = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    return InjectedScript._serializeStyle(node.ownerDocument.defaultView.getComputedStyle(node));
+}
+
+InjectedScript.getInlineStyle = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    return InjectedScript._serializeStyle(node.style, true);
+}
+
+InjectedScript.applyStyleText = function(styleId, styleText, propertyName)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    var styleTextLength = styleText.length;
+
+    // Create a new element to parse the user input CSS.
+    var parseElement = document.createElement("span");
+    parseElement.setAttribute("style", styleText);
+
+    var tempStyle = parseElement.style;
+    if (tempStyle.length || !styleTextLength) {
+        // The input was parsable or the user deleted everything, so remove the
+        // original property from the real style declaration. If this represents
+        // a shorthand remove all the longhand properties.
+        if (style.getPropertyShorthand(propertyName)) {
+            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
+            for (var i = 0; i < longhandProperties.length; ++i)
+                style.removeProperty(longhandProperties[i]);
+        } else
+            style.removeProperty(propertyName);
+    }
+
+    // Notify caller that the property was successfully deleted.
+    if (!styleTextLength)
+        return [null, [propertyName]];
+
+    if (!tempStyle.length)
+        return false;
+
+    // Iterate of the properties on the test element's style declaration and
+    // add them to the real style declaration. We take care to move shorthands.
+    var foundShorthands = {};
+    var changedProperties = [];
+    var uniqueProperties = InjectedScript._getUniqueStyleProperties(tempStyle);
+    for (var i = 0; i < uniqueProperties.length; ++i) {
+        var name = uniqueProperties[i];
+        var shorthand = tempStyle.getPropertyShorthand(name);
+
+        if (shorthand && shorthand in foundShorthands)
+            continue;
+
+        if (shorthand) {
+            var value = InjectedScript._getShorthandValue(tempStyle, shorthand);
+            var priority = InjectedScript._getShorthandPriority(tempStyle, shorthand);
+            foundShorthands[shorthand] = true;
+        } else {
+            var value = tempStyle.getPropertyValue(name);
+            var priority = tempStyle.getPropertyPriority(name);
+        }
+
+        // Set the property on the real style declaration.
+        style.setProperty((shorthand || name), value, priority);
+        changedProperties.push(shorthand || name);
+    }
+    return [InjectedScript._serializeStyle(style, true), changedProperties];
+}
+
+InjectedScript.setStyleText = function(style, cssText)
+{
+    style.cssText = cssText;
+    return true;
+}
+
+InjectedScript.toggleStyleEnabled = function(styleId, propertyName, disabled)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    if (disabled) {
+        if (!style.__disabledPropertyValues || !style.__disabledPropertyPriorities) {
+            style.__disabledProperties = {};
+            style.__disabledPropertyValues = {};
+            style.__disabledPropertyPriorities = {};
+        }
+
+        style.__disabledPropertyValues[propertyName] = style.getPropertyValue(propertyName);
+        style.__disabledPropertyPriorities[propertyName] = style.getPropertyPriority(propertyName);
+
+        if (style.getPropertyShorthand(propertyName)) {
+            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
+            for (var i = 0; i < longhandProperties.length; ++i) {
+                style.__disabledProperties[longhandProperties[i]] = true;
+                style.removeProperty(longhandProperties[i]);
+            }
+        } else {
+            style.__disabledProperties[propertyName] = true;
+            style.removeProperty(propertyName);
+        }
+    } else if (style.__disabledProperties && style.__disabledProperties[propertyName]) {
+        var value = style.__disabledPropertyValues[propertyName];
+        var priority = style.__disabledPropertyPriorities[propertyName];
+
+        style.setProperty(propertyName, value, priority);
+        delete style.__disabledProperties[propertyName];
+        delete style.__disabledPropertyValues[propertyName];
+        delete style.__disabledPropertyPriorities[propertyName];
+    }
+    return InjectedScript._serializeStyle(style, true);
+}
+
+InjectedScript.applyStyleRuleText = function(ruleId, newContent, selectedNodeId)
+{
+    var rule = InjectedScript._styleRules[ruleId];
+    if (!rule)
+        return false;
+
+    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
+
+    try {
+        var stylesheet = rule.parentStyleSheet;
+        stylesheet.addRule(newContent);
+        var newRule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
+        newRule.style.cssText = rule.style.cssText;
+
+        var parentRules = stylesheet.cssRules;
+        for (var i = 0; i < parentRules.length; ++i) {
+            if (parentRules[i] === rule) {
+                rule.parentStyleSheet.removeRule(i);
+                break;
+            }
+        }
+
+        return [InjectedScript._serializeRule(newRule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode)];
+    } catch(e) {
+        // Report invalid syntax.
+        return false;
+    }
+}
+
+InjectedScript.addStyleSelector = function(newContent, selectedNodeId)
+{
+    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
+    if (!selectedNode)
+        return false;
+    var ownerDocument = selectedNode.ownerDocument;
+
+    var stylesheet = ownerDocument.__stylesheet;
+    if (!stylesheet) {
+        var head = ownerDocument.head;
+        var styleElement = ownerDocument.createElement("style");
+        styleElement.type = "text/css";
+        head.appendChild(styleElement);
+        stylesheet = ownerDocument.styleSheets[ownerDocument.styleSheets.length - 1];
+        ownerDocument.__stylesheet = stylesheet;
+    }
+
+    try {
+        stylesheet.addRule(newContent);
+    } catch (e) {
+        // Invalid Syntax for a Selector
+        return false;
+    }
+
+    var rule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
+    rule.__isViaInspector = true;
+
+    return [ InjectedScript._serializeRule(rule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode) ];
+}
+
+InjectedScript._doesSelectorAffectNode = function(selectorText, node)
+{
+    if (!node)
+        return false;
+    var nodes = node.ownerDocument.querySelectorAll(selectorText);
+    for (var i = 0; i < nodes.length; ++i) {
+        if (nodes[i] === node) {
+            return true;
+        }
+    }
+    return false;
+}
+
+InjectedScript.setStyleProperty = function(styleId, name, value)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    style.setProperty(name, value, "");
+    return true;
+}
+
+InjectedScript._serializeRule = function(rule)
+{
+    var parentStyleSheet = rule.parentStyleSheet;
+
+    var ruleValue = {};
+    ruleValue.selectorText = rule.selectorText;
+    if (parentStyleSheet) {
+        ruleValue.parentStyleSheet = {};
+        ruleValue.parentStyleSheet.href = parentStyleSheet.href;
+    }
+    ruleValue.isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode && !parentStyleSheet.href;
+    ruleValue.isUser = parentStyleSheet && parentStyleSheet.ownerNode && parentStyleSheet.ownerNode.nodeName == "#document";
+    ruleValue.isViaInspector = !!rule.__isViaInspector;
+
+    // Bind editable scripts only.
+    var doBind = !ruleValue.isUserAgent && !ruleValue.isUser;
+    ruleValue.style = InjectedScript._serializeStyle(rule.style, doBind);
+
+    if (doBind) {
+        if (!rule.id) {
+            rule.id = InjectedScript._lastStyleRuleId++;
+            InjectedScript._styleRules[rule.id] = rule;
+        }
+        ruleValue.id = rule.id;
+        ruleValue.injectedScriptId = injectedScriptId;
+    }
+    return ruleValue;
+}
+
+InjectedScript._serializeStyle = function(style, doBind)
+{
+    var result = {};
+    result.width = style.width;
+    result.height = style.height;
+    result.__disabledProperties = style.__disabledProperties;
+    result.__disabledPropertyValues = style.__disabledPropertyValues;
+    result.__disabledPropertyPriorities = style.__disabledPropertyPriorities;
+    result.properties = [];
+    result.shorthandValues = {};
+    var foundShorthands = {};
+    for (var i = 0; i < style.length; ++i) {
+        var property = {};
+        var name = style[i];
+        property.name = name;
+        property.priority = style.getPropertyPriority(name);
+        property.implicit = style.isPropertyImplicit(name);
+        var shorthand =  style.getPropertyShorthand(name);
+        property.shorthand = shorthand;
+        if (shorthand && !(shorthand in foundShorthands)) {
+            foundShorthands[shorthand] = true;
+            result.shorthandValues[shorthand] = InjectedScript._getShorthandValue(style, shorthand);
+        }
+        property.value = style.getPropertyValue(name);
+        result.properties.push(property);
+    }
+    result.uniqueStyleProperties = InjectedScript._getUniqueStyleProperties(style);
+
+    if (doBind) {
+        if (!style.id) {
+            style.id = InjectedScript._lastStyleId++;
+            InjectedScript._styles[style.id] = style;
+        }
+        result.id = style.id;
+        result.injectedScriptId = injectedScriptId;
+    }
+    return result;
+}
+
+InjectedScript._getUniqueStyleProperties = function(style)
+{
+    var properties = [];
+    var foundProperties = {};
+
+    for (var i = 0; i < style.length; ++i) {
+        var property = style[i];
+        if (property in foundProperties)
+            continue;
+        foundProperties[property] = true;
+        properties.push(property);
+    }
+
+    return properties;
+}
+
+
+InjectedScript._getLonghandProperties = function(style, shorthandProperty)
+{
+    var properties = [];
+    var foundProperties = {};
+
+    for (var i = 0; i < style.length; ++i) {
+        var individualProperty = style[i];
+        if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+            continue;
+        foundProperties[individualProperty] = true;
+        properties.push(individualProperty);
+    }
+
+    return properties;
+}
+
+InjectedScript._getShorthandValue = function(style, shorthandProperty)
+{
+    var value = style.getPropertyValue(shorthandProperty);
+    if (!value) {
+        // Some shorthands (like border) return a null value, so compute a shorthand value.
+        // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823 is fixed.
+
+        var foundProperties = {};
+        for (var i = 0; i < style.length; ++i) {
+            var individualProperty = style[i];
+            if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+                continue;
+
+            var individualValue = style.getPropertyValue(individualProperty);
+            if (style.isPropertyImplicit(individualProperty) || individualValue === "initial")
+                continue;
+
+            foundProperties[individualProperty] = true;
+
+            if (!value)
+                value = "";
+            else if (value.length)
+                value += " ";
+            value += individualValue;
+        }
+    }
+    return value;
+}
+
+InjectedScript._getShorthandPriority = function(style, shorthandProperty)
+{
+    var priority = style.getPropertyPriority(shorthandProperty);
+    if (!priority) {
+        for (var i = 0; i < style.length; ++i) {
+            var individualProperty = style[i];
+            if (style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+                continue;
+            priority = style.getPropertyPriority(individualProperty);
+            break;
+        }
+    }
+    return priority;
+}
+
+InjectedScript.getPrototypes = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    var result = [];
+    for (var prototype = node; prototype; prototype = prototype.__proto__) {
+        var title = InjectedScript._describe(prototype, true);
+        if (title.match(/Prototype$/)) {
+            title = title.replace(/Prototype$/, "");
+        }
+        result.push(title);
+    }
+    return result;
+}
+
+InjectedScript.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!InjectedScript._isDefined(object))
+        return false;
+    var properties = [];
+    var propertyNames = ignoreHasOwnProperty ? InjectedScript._getPropertyNames(object) : Object.getOwnPropertyNames(object);
+    if (!ignoreHasOwnProperty && object.__proto__)
+        propertyNames.push("__proto__");
+
+    // Go over properties, prepare results.
+    for (var i = 0; i < propertyNames.length; ++i) {
+        var propertyName = propertyNames[i];
+
+        var property = {};
+        property.name = propertyName + "";
+        property.parentObjectProxy = objectProxy;
+        var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
+        if (!property.isGetter) {
+            try {
+                var childObject = object[propertyName];
+                var childObjectProxy = new InjectedScript.createProxyObject(childObject, objectProxy.objectId, abbreviate);
+                childObjectProxy.path = objectProxy.path ? objectProxy.path.slice() : [];
+                childObjectProxy.path.push(propertyName);
+                property.value = childObjectProxy;
+            } catch(e) {
+                property.value = { description: e.toString() };
+                property.isError = true;
+            }
+        } else {
+            // FIXME: this should show something like "getter" (bug 16734).
+            property.value = { description: "\u2014" }; // em dash
+            property.isGetter = true;
+        }
+        properties.push(property);
+    }
+    return properties;
+}
+
+InjectedScript.setPropertyValue = function(objectProxy, propertyName, expression)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!InjectedScript._isDefined(object))
+        return false;
+
+    var expressionLength = expression.length;
+    if (!expressionLength) {
+        delete object[propertyName];
+        return !(propertyName in object);
+    }
+
+    try {
+        // Surround the expression in parenthesis so the result of the eval is the result
+        // of the whole expression not the last potential sub-expression.
+
+        // There is a regression introduced here: eval is now happening against global object,
+        // not call frame while on a breakpoint.
+        // TODO: bring evaluation against call frame back.
+        var result = InjectedScript._window().eval("(" + expression + ")");
+        // Store the result in the property.
+        object[propertyName] = result;
+        return true;
+    } catch(e) {
+        try {
+            var result = InjectedScript._window().eval("\"" + InjectedScript._escapeCharacters(expression, "\"") + "\"");
+            object[propertyName] = result;
+            return true;
+        } catch(e) {
+            return false;
+        }
+    }
+}
+
+InjectedScript.getNodePropertyValue = function(nodeId, propertyName)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    var result = node[propertyName];
+    return result !== undefined ? result : false;
+}
+
+InjectedScript.setOuterHTML = function(nodeId, value, expanded)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    var parent = node.parentNode;
+    var prevSibling = node.previousSibling;
+    node.outerHTML = value;
+    var newNode = prevSibling ? prevSibling.nextSibling : parent.firstChild;
+
+    return InjectedScriptHost.pushNodePathToFrontend(newNode, expanded, false);
+}
+
+InjectedScript._populatePropertyNames = function(object, resultSet)
+{
+    for (var o = object; o; o = o.__proto__) {
+        try {
+            var names = Object.getOwnPropertyNames(o);
+            for (var i = 0; i < names.length; ++i)
+                resultSet[names[i] + ""] = true;
+        } catch (e) {
+        }
+    }
+}
+
+InjectedScript._getPropertyNames = function(object, resultSet)
+{
+    var propertyNameSet = {};
+    InjectedScript._populatePropertyNames(object, propertyNameSet);
+    return Object.keys(propertyNameSet);
+}
+
+InjectedScript.getCompletions = function(expression, includeInspectorCommandLineAPI, callFrameId)
+{
+    var props = {};
+    try {
+        var expressionResult;
+        // Evaluate on call frame if call frame id is available.
+        if (typeof callFrameId === "number") {
+            var callFrame = InjectedScript._callFrameForId(callFrameId);
+            if (!callFrame)
+                return props;
+            if (expression)
+                expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
+            else {
+                // Evaluate into properties in scope of the selected call frame.
+                var scopeChain = callFrame.scopeChain;
+                for (var i = 0; i < scopeChain.length; ++i)
+                    InjectedScript._populatePropertyNames(scopeChain[i], props);
+            }
+        } else {
+            if (!expression)
+                expression = "this";
+            expressionResult = InjectedScript._evaluateOn(InjectedScript._window().eval, InjectedScript._window(), expression);
+        }
+        if (typeof expressionResult == "object")
+            InjectedScript._populatePropertyNames(expressionResult, props);
+        if (includeInspectorCommandLineAPI)
+            for (var prop in InjectedScript._window().console._inspectorCommandLineAPI)
+                if (prop.charAt(0) !== '_')
+                    props[prop] = true;
+    } catch(e) {
+    }
+    return props;
+}
+
+InjectedScript.evaluate = function(expression, objectGroup)
+{
+    return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression, objectGroup);
+}
+
+InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup)
+{
+    var result = {};
+    try {
+        result.value = InjectedScript.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression), objectGroup);
+
+        // Handle error that might have happened while describing result.
+        if (result.value.errorText) {
+            result.value = result.value.errorText;
+            result.isException = true;
+        }
+    } catch (e) {
+        result.value = e.toString();
+        result.isException = true;
+    }
+    return result;
+}
+
+InjectedScript._evaluateOn = function(evalFunction, object, expression)
+{
+    InjectedScript._ensureCommandLineAPIInstalled(evalFunction, object);
+    // Surround the expression in with statements to inject our command line API so that
+    // the window object properties still take more precedent than our API functions.
+    expression = "with (window.console._inspectorCommandLineAPI) { with (window) {\n" + expression + "\n} }";
+    var value = evalFunction.call(object, expression);
+
+    // When evaluating on call frame error is not thrown, but returned as a value.
+    if (InjectedScript._type(value) === "error")
+        throw value.toString();
+
+    return value;
+}
+
+InjectedScript.addInspectedNode = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    InjectedScript._ensureCommandLineAPIInstalled(InjectedScript._window().eval, InjectedScript._window());
+    var inspectedNodes = InjectedScript._window().console._inspectorCommandLineAPI._inspectedNodes;
+    inspectedNodes.unshift(node);
+    if (inspectedNodes.length >= 5)
+        inspectedNodes.pop();
+    return true;
+}
+
+InjectedScript.performSearch = function(whitespaceTrimmedQuery)
+{
+    // FIXME: Few things are missing here:
+    // 1) Search works with node granularity - number of matches within node is not calculated.
+    // 2) Search does not work outside main documents' domain - we need to use specific InjectedScript instances
+    //    for other domains.
+    // 3) There is no need to push all search results to the front-end at a time, pushing next / previous result
+    //    is sufficient.
+    var tagNameQuery = whitespaceTrimmedQuery;
+    var attributeNameQuery = whitespaceTrimmedQuery;
+    var startTagFound = (tagNameQuery.indexOf("<") === 0);
+    var endTagFound = (tagNameQuery.lastIndexOf(">") === (tagNameQuery.length - 1));
+
+    if (startTagFound || endTagFound) {
+        var tagNameQueryLength = tagNameQuery.length;
+        tagNameQuery = tagNameQuery.substring((startTagFound ? 1 : 0), (endTagFound ? (tagNameQueryLength - 1) : tagNameQueryLength));
+    }
+
+    // Check the tagNameQuery is it is a possibly valid tag name.
+    if (!/^[a-zA-Z0-9\-_:]+$/.test(tagNameQuery))
+        tagNameQuery = null;
+
+    // Check the attributeNameQuery is it is a possibly valid tag name.
+    if (!/^[a-zA-Z0-9\-_:]+$/.test(attributeNameQuery))
+        attributeNameQuery = null;
+
+    const escapedQuery = InjectedScript._escapeCharacters(whitespaceTrimmedQuery, "'");
+    const escapedTagNameQuery = (tagNameQuery ?  InjectedScript._escapeCharacters(tagNameQuery, "'") : null);
+    const escapedWhitespaceTrimmedQuery = InjectedScript._escapeCharacters(whitespaceTrimmedQuery, "'");
+    const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
+
+    function addNodesToResults(nodes, length, getItem)
+    {
+        if (!length)
+            return;
+
+        var nodeIds = [];
+        for (var i = 0; i < length; ++i) {
+            var node = getItem.call(nodes, i);
+            // Skip this node if it already has the property.
+            if (searchResultsProperty in node)
+                continue;
+
+            if (!InjectedScript._searchResults.length) {
+                InjectedScript._currentSearchResultIndex = 0;
+            }
+
+            node[searchResultsProperty] = true;
+            InjectedScript._searchResults.push(node);
+            var nodeId = InjectedScriptHost.pushNodePathToFrontend(node, false, false);
+            nodeIds.push(nodeId);
+        }
+        InjectedScriptHost.addNodesToSearchResult(nodeIds.join(","));
+    }
+
+    function matchExactItems(doc)
+    {
+        matchExactId.call(this, doc);
+        matchExactClassNames.call(this, doc);
+        matchExactTagNames.call(this, doc);
+        matchExactAttributeNames.call(this, doc);
+    }
+
+    function matchExactId(doc)
+    {
+        const result = doc.__proto__.getElementById.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, (result ? 1 : 0), function() { return this });
+    }
+
+    function matchExactClassNames(doc)
+    {
+        const result = doc.__proto__.getElementsByClassName.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchExactTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.getElementsByTagName.call(doc, tagNameQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchExactAttributeNames(doc)
+    {
+        if (!attributeNameQuery)
+            return;
+        const result = doc.__proto__.querySelectorAll.call(doc, "[" + attributeNameQuery + "]");
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchPartialTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchStartOfTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.evaluate.call(doc, "//*[starts-with(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchPartialTagNamesAndAttributeValues(doc)
+    {
+        if (!tagNameQuery) {
+            matchPartialAttributeValues.call(this, doc);
+            return;
+        }
+
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "') or contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchPartialAttributeValues(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchStyleSelector(doc)
+    {
+        const result = doc.__proto__.querySelectorAll.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchPlainText(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, "//text()[contains(., '" + escapedQuery + "')] | //comment()[contains(., '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchXPathQuery(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, whitespaceTrimmedQuery, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function finishedSearching()
+    {
+        // Remove the searchResultsProperty now that the search is finished.
+        for (var i = 0; i < InjectedScript._searchResults.length; ++i)
+            delete InjectedScript._searchResults[i][searchResultsProperty];
+    }
+
+    const mainFrameDocument = InjectedScript._window().document;
+    const searchDocuments = [mainFrameDocument];
+    var searchFunctions;
+    if (tagNameQuery && startTagFound && endTagFound)
+        searchFunctions = [matchExactTagNames, matchPlainText];
+    else if (tagNameQuery && startTagFound)
+        searchFunctions = [matchStartOfTagNames, matchPlainText];
+    else if (tagNameQuery && endTagFound) {
+        // FIXME: we should have a matchEndOfTagNames search function if endTagFound is true but not startTagFound.
+        // This requires ends-with() support in XPath, WebKit only supports starts-with() and contains().
+        searchFunctions = [matchPartialTagNames, matchPlainText];
+    } else if (whitespaceTrimmedQuery === "//*" || whitespaceTrimmedQuery === "*") {
+        // These queries will match every node. Matching everything isn't useful and can be slow for large pages,
+        // so limit the search functions list to plain text and attribute matching.
+        searchFunctions = [matchPartialAttributeValues, matchPlainText];
+    } else
+        searchFunctions = [matchExactItems, matchStyleSelector, matchPartialTagNamesAndAttributeValues, matchPlainText, matchXPathQuery];
+
+    // Find all frames, iframes and object elements to search their documents.
+    const querySelectorAllFunction = InjectedScript._window().Document.prototype.querySelectorAll;
+    const subdocumentResult = querySelectorAllFunction.call(mainFrameDocument, "iframe, frame, object");
+
+    for (var i = 0; i < subdocumentResult.length; ++i) {
+        var element = subdocumentResult.item(i);
+        if (element.contentDocument)
+            searchDocuments.push(element.contentDocument);
+    }
+
+    const panel = InjectedScript;
+    var documentIndex = 0;
+    var searchFunctionIndex = 0;
+    var chunkIntervalIdentifier = null;
+
+    // Split up the work into chunks so we don't block the UI thread while processing.
+
+    function processChunk()
+    {
+        var searchDocument = searchDocuments[documentIndex];
+        var searchFunction = searchFunctions[searchFunctionIndex];
+
+        if (++searchFunctionIndex > searchFunctions.length) {
+            searchFunction = searchFunctions[0];
+            searchFunctionIndex = 0;
+
+            if (++documentIndex > searchDocuments.length) {
+                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
+                    delete panel._currentSearchChunkIntervalIdentifier;
+                clearInterval(chunkIntervalIdentifier);
+                finishedSearching.call(panel);
+                return;
+            }
+
+            searchDocument = searchDocuments[documentIndex];
+        }
+
+        if (!searchDocument || !searchFunction)
+            return;
+
+        try {
+            searchFunction.call(panel, searchDocument);
+        } catch(err) {
+            // ignore any exceptions. the query might be malformed, but we allow that.
+        }
+    }
+
+    processChunk();
+
+    chunkIntervalIdentifier = setInterval(processChunk, 25);
+    InjectedScript._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
+    return true;
+}
+
+InjectedScript.searchCanceled = function()
+{
+    if (InjectedScript._searchResults) {
+        const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
+        for (var i = 0; i < this._searchResults.length; ++i) {
+            var node = this._searchResults[i];
+
+            // Remove the searchResultsProperty since there might be an unfinished search.
+            delete node[searchResultsProperty];
+        }
+    }
+
+    if (InjectedScript._currentSearchChunkIntervalIdentifier) {
+        clearInterval(InjectedScript._currentSearchChunkIntervalIdentifier);
+        delete InjectedScript._currentSearchChunkIntervalIdentifier;
+    }
+    InjectedScript._searchResults = [];
+    return true;
+}
+
+InjectedScript.openInInspectedWindow = function(url)
+{
+    // Don't call window.open on wrapper - popup blocker mutes it.
+    // URIs should have no double quotes.
+    InjectedScript._window().eval("window.open(\"" + url + "\")");
+    return true;
+}
+
+InjectedScript.callFrames = function()
+{
+    var callFrame = InjectedScriptHost.currentCallFrame();
+    if (!callFrame)
+        return false;
+
+    var result = [];
+    var depth = 0;
+    do {
+        result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
+        callFrame = callFrame.caller;
+    } while (callFrame);
+    return result;
+}
+
+InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
+{
+    var callFrame = InjectedScript._callFrameForId(callFrameId);
+    if (!callFrame)
+        return false;
+    return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
+}
+
+InjectedScript._callFrameForId = function(id)
+{
+    var callFrame = InjectedScriptHost.currentCallFrame();
+    while (--id >= 0 && callFrame)
+        callFrame = callFrame.caller;
+    return callFrame;
+}
+
+InjectedScript.clearConsoleMessages = function()
+{
+    InjectedScriptHost.clearConsoleMessages();
+    return true;
+}
+
+InjectedScript._inspectObject = function(o)
+{
+    if (arguments.length === 0)
+        return;
+
+    inspectedWindow.console.log(o);
+    if (InjectedScript._type(o) === "node") {
+        InjectedScriptHost.pushNodePathToFrontend(o, false, true);
+    } else {
+        switch (InjectedScript._describe(o)) {
+            case "Database":
+                InjectedScriptHost.selectDatabase(o);
+                break;
+            case "Storage":
+                InjectedScriptHost.selectDOMStorage(o);
+                break;
+        }
+    }
+}
+
+InjectedScript._copy = function(o)
+{
+    if (InjectedScript._type(o) === "node") {
+        var nodeId = InjectedScriptHost.pushNodePathToFrontend(o, false, false);
+        InjectedScriptHost.copyNode(nodeId);
+    } else {
+        InjectedScriptHost.copyText(o);
+    }
+}
+
+InjectedScript._ensureCommandLineAPIInstalled = function(evalFunction, evalObject)
+{
+    if (evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI"))
+        return;
+    var inspectorCommandLineAPI = evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI = { \n\
+        $: function() { return document.getElementById.apply(document, arguments) }, \n\
+        $$: function() { return document.querySelectorAll.apply(document, arguments) }, \n\
+        $x: function(xpath, context) \n\
+        { \n\
+            var nodes = []; \n\
+            try { \n\
+                var doc = context || document; \n\
+                var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); \n\
+                var node; \n\
+                while (node = results.iterateNext()) nodes.push(node); \n\
+            } catch (e) {} \n\
+            return nodes; \n\
+        }, \n\
+        dir: function() { return console.dir.apply(console, arguments) }, \n\
+        dirxml: function() { return console.dirxml.apply(console, arguments) }, \n\
+        keys: function(o) { var a = []; for (var k in o) a.push(k); return a; }, \n\
+        values: function(o) { var a = []; for (var k in o) a.push(o[k]); return a; }, \n\
+        profile: function() { return console.profile.apply(console, arguments) }, \n\
+        profileEnd: function() { return console.profileEnd.apply(console, arguments) }, \n\
+        _logEvent: function _inspectorCommandLineAPI_logEvent(e) { console.log(e.type, e); }, \n\
+        _allEventTypes: [\"mouse\", \"key\", \"load\", \"unload\", \"abort\", \"error\", \n\
+            \"select\", \"change\", \"submit\", \"reset\", \"focus\", \"blur\", \n\
+            \"resize\", \"scroll\"], \n\
+        _normalizeEventTypes: function(t) \n\
+        { \n\
+            if (typeof t === \"undefined\") \n\
+                t = console._inspectorCommandLineAPI._allEventTypes; \n\
+            else if (typeof t === \"string\") \n\
+                t = [t]; \n\
+            var i, te = []; \n\
+            for (i = 0; i < t.length; i++) { \n\
+                if (t[i] === \"mouse\") \n\
+                    te.splice(0, 0, \"mousedown\", \"mouseup\", \"click\", \"dblclick\", \n\
+                        \"mousemove\", \"mouseover\", \"mouseout\"); \n\
+                else if (t[i] === \"key\") \n\
+                    te.splice(0, 0, \"keydown\", \"keyup\", \"keypress\"); \n\
+                else \n\
+                    te.push(t[i]); \n\
+            } \n\
+            return te; \n\
+        }, \n\
+        monitorEvents: function(o, t) \n\
+        { \n\
+            if (!o || !o.addEventListener || !o.removeEventListener) \n\
+                return; \n\
+            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
+            for (i = 0; i < t.length; i++) { \n\
+                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+                o.addEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+            } \n\
+        }, \n\
+        unmonitorEvents: function(o, t) \n\
+        { \n\
+            if (!o || !o.removeEventListener) \n\
+                return; \n\
+            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
+            for (i = 0; i < t.length; i++) { \n\
+                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+            } \n\
+        }, \n\
+        _inspectedNodes: [], \n\
+        get $0() { return console._inspectorCommandLineAPI._inspectedNodes[0] }, \n\
+        get $1() { return console._inspectorCommandLineAPI._inspectedNodes[1] }, \n\
+        get $2() { return console._inspectorCommandLineAPI._inspectedNodes[2] }, \n\
+        get $3() { return console._inspectorCommandLineAPI._inspectedNodes[3] }, \n\
+        get $4() { return console._inspectorCommandLineAPI._inspectedNodes[4] }, \n\
+    };");
+
+    inspectorCommandLineAPI.clear = InjectedScript.clearConsoleMessages;
+    inspectorCommandLineAPI.inspect = InjectedScript._inspectObject;
+    inspectorCommandLineAPI.copy = InjectedScript._copy;
+}
+
+InjectedScript._resolveObject = function(objectProxy)
+{
+    var object = InjectedScript._objectForId(objectProxy.objectId);
+    var path = objectProxy.path;
+    var protoDepth = objectProxy.protoDepth;
+
+    // Follow the property path.
+    for (var i = 0; InjectedScript._isDefined(object) && path && i < path.length; ++i)
+        object = object[path[i]];
+
+    return object;
+}
+
+InjectedScript._window = function()
+{
+    // TODO: replace with 'return window;' once this script is injected into
+    // the page's context.
+    return inspectedWindow;
+}
+
+InjectedScript._nodeForId = function(nodeId)
+{
+    if (!nodeId)
+        return null;
+    return InjectedScriptHost.nodeForId(nodeId);
+}
+
+InjectedScript._objectForId = function(objectId)
+{
+    // There are three types of object ids used:
+    // - numbers point to DOM Node via the InspectorDOMAgent mapping
+    // - strings point to console objects cached in InspectorController for lazy evaluation upon them
+    // - objects contain complex ids and are currently used for scoped objects
+    if (typeof objectId === "number") {
+        return InjectedScript._nodeForId(objectId);
+    } else if (typeof objectId === "string") {
+        return InjectedScript.unwrapObject(objectId);
+    } else if (typeof objectId === "object") {
+        var callFrame = InjectedScript._callFrameForId(objectId.callFrame);
+        if (objectId.thisObject)
+            return callFrame.thisObject;
+        else
+            return callFrame.scopeChain[objectId.chainIndex];
+    }
+    return objectId;
+}
+
+InjectedScript.pushNodeToFrontend = function(objectProxy)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!object || InjectedScript._type(object) !== "node")
+        return false;
+    return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
+}
+
+InjectedScript.nodeByPath = function(path)
+{
+    // We make this call through the injected script only to get a nice
+    // callback for it.
+    return InjectedScriptHost.pushNodeByPathToFrontend(path.join(","));
+}
+
+// Called from within InspectorController on the 'inspected page' side.
+InjectedScript.createProxyObject = function(object, objectId, abbreviate)
+{
+    var result = {};
+    result.injectedScriptId = injectedScriptId;
+    result.objectId = objectId;
+    result.type = InjectedScript._type(object);
+    if (result.type === "array")
+        result.propertyLength = object.length;
+
+    var type = typeof object;
+    
+    result.hasChildren = (type === "object" && object !== null && (Object.getOwnPropertyNames(object).length || object.__proto__)) || type === "function";
+    try {
+        result.description = InjectedScript._describe(object, abbreviate);
+    } catch (e) {
+        result.errorText = e.toString();
+    }
+    return result;
+}
+
+InjectedScript.evaluateOnSelf = function(funcBody)
+{
+    return window.eval("(" + funcBody + ")();");
+}
+
+InjectedScript.CallFrameProxy = function(id, callFrame)
+{
+    this.id = id;
+    this.type = callFrame.type;
+    this.functionName = (this.type === "function" ? callFrame.functionName : "");
+    this.sourceID = callFrame.sourceID;
+    this.line = callFrame.line;
+    this.scopeChain = this._wrapScopeChain(callFrame);
+}
+
+InjectedScript.CallFrameProxy.prototype = {
+    _wrapScopeChain: function(callFrame)
+    {
+        var foundLocalScope = false;
+        var scopeChain = callFrame.scopeChain;
+        var scopeChainProxy = [];
+        for (var i = 0; i < scopeChain.length; ++i) {
+            var scopeObject = scopeChain[i];
+            var scopeObjectProxy = InjectedScript.createProxyObject(scopeObject, { callFrame: this.id, chainIndex: i }, true);
+
+            if (InjectedScriptHost.isActivation(scopeObject)) {
+                if (!foundLocalScope)
+                    scopeObjectProxy.thisObject = InjectedScript.createProxyObject(callFrame.thisObject, { callFrame: this.id, thisObject: true }, true);
+                else
+                    scopeObjectProxy.isClosure = true;
+                foundLocalScope = true;
+                scopeObjectProxy.isLocal = true;
+            } else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Element)
+                scopeObjectProxy.isElement = true;
+            else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Document)
+                scopeObjectProxy.isDocument = true;
+            else if (!foundLocalScope)
+                scopeObjectProxy.isWithBlock = true;
+            scopeChainProxy.push(scopeObjectProxy);
+        }
+        return scopeChainProxy;
+    }
+}
+
+InjectedScript.executeSql = function(callId, databaseId, query)
+{
+    function successCallback(tx, result)
+    {
+        var rows = result.rows;
+        var result = [];
+        var length = rows.length;
+        for (var i = 0; i < length; ++i) {
+            var data = {};
+            result.push(data);
+            var row = rows.item(i);
+            for (var columnIdentifier in row) {
+                // FIXME: (Bug 19439) We should specially format SQL NULL here
+                // (which is represented by JavaScript null here, and turned
+                // into the string "null" by the String() function).
+                var text = row[columnIdentifier];
+                data[columnIdentifier] = String(text);
+            }
+        }
+        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, result, false);
+    }
+
+    function errorCallback(tx, error)
+    {
+        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, error, false);
+    }
+
+    function queryTransaction(tx)
+    {
+        tx.executeSql(query, null, successCallback, errorCallback);
+    }
+
+    var database = InjectedScriptHost.databaseForId(databaseId);
+    if (!database)
+        errorCallback(null, { code : 2 });  // Return as unexpected version.
+    database.transaction(queryTransaction, errorCallback);
+    return true;
+}
+
+InjectedScript._isDefined = function(object)
+{
+    return object || object instanceof inspectedWindow.HTMLAllCollection;
+}
+
+InjectedScript._type = function(obj)
+{
+    if (obj === null)
+        return "null";
+
+    // FIXME(33716): typeof document.all is always 'undefined'.
+    if (obj instanceof inspectedWindow.HTMLAllCollection)
+        return "array";
+
+    var type = typeof obj;
+    if (type !== "object" && type !== "function")
+        return type;
+
+    var win = InjectedScript._window();
+
+    if (obj instanceof win.Node)
+        return (obj.nodeType === undefined ? type : "node");
+    if (obj instanceof win.String)
+        return "string";
+    if (obj instanceof win.Array)
+        return "array";
+    if (obj instanceof win.Boolean)
+        return "boolean";
+    if (obj instanceof win.Number)
+        return "number";
+    if (obj instanceof win.Date)
+        return "date";
+    if (obj instanceof win.RegExp)
+        return "regexp";
+    if (obj instanceof win.NodeList)
+        return "array";
+    if (obj instanceof win.HTMLCollection || obj instanceof win.HTMLAllCollection)
+        return "array";
+    if (obj instanceof win.Error)
+        return "error";
+    return type;
+}
+
+InjectedScript._describe = function(obj, abbreviated)
+{
+    var type1 = InjectedScript._type(obj);
+    var type2 = InjectedScript._className(obj);
+
+    switch (type1) {
+    case "object":
+    case "node":
+    case "array":
+        return type2;
+    case "string":
+        if (!abbreviated)
+            return obj;
+        if (obj.length > 100)
+            return "\"" + obj.substring(0, 100) + "\u2026\"";
+        return "\"" + obj + "\"";
+    case "function":
+        var objectText = String(obj);
+        if (!/^function /.test(objectText))
+            objectText = (type2 == "object") ? type1 : type2;
+        else if (abbreviated)
+            objectText = /.*/.exec(obj)[0].replace(/ +$/g, "");
+        return objectText;
+    default:
+        return String(obj);
+    }
+}
+
+InjectedScript._className = function(obj)
+{
+    return Object.prototype.toString.call(obj).replace(/^\[object (.*)\]$/i, "$1")
+}
+
+InjectedScript._escapeCharacters = function(str, chars)
+{
+    var foundChar = false;
+    for (var i = 0; i < chars.length; ++i) {
+        if (str.indexOf(chars.charAt(i)) !== -1) {
+            foundChar = true;
+            break;
+        }
+    }
+
+    if (!foundChar)
+        return str;
+
+    var result = "";
+    for (var i = 0; i < str.length; ++i) {
+        if (chars.indexOf(str.charAt(i)) !== -1)
+            result += "\\";
+        result += str.charAt(i);
+    }
+
+    return result;
+}
+
+return InjectedScript;
+});
+
+/* InjectedScriptAccess.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function InjectedScriptAccess(injectedScriptId) {
+    this._injectedScriptId = injectedScriptId;
+}
+
+InjectedScriptAccess.get = function(injectedScriptId)
+{
+    return new InjectedScriptAccess(injectedScriptId);
+}
+
+InjectedScriptAccess.getDefault = function()
+{
+    return InjectedScriptAccess.get(0);
+}
+
+InjectedScriptAccess.prototype = {};
+
+InjectedScriptAccess._installHandler = function(methodName, async)
+{
+    InjectedScriptAccess.prototype[methodName] = function()
+    {
+        var allArgs = Array.prototype.slice.call(arguments);
+        var callback = allArgs[allArgs.length - 1];
+        var argsString = JSON.stringify(Array.prototype.slice.call(allArgs, 0, allArgs.length - 1));
+        
+        function myCallback(result, isException)
+        {
+            if (!isException)
+                callback(result);
+            else
+                WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage("Error dispatching: " + methodName));
+        }
+        var callId = WebInspector.Callback.wrap(myCallback);
+
+        InspectorBackend.dispatchOnInjectedScript(callId, this._injectedScriptId, methodName, argsString, !!async);
+    };
+}
+
+// InjectedScriptAccess message forwarding puts some constraints on the way methods are implemented and called:
+// - Make sure corresponding methods in InjectedScript return non-null and non-undefined values,
+// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
+// We keep these sorted.
+InjectedScriptAccess._installHandler("addInspectedNode");
+InjectedScriptAccess._installHandler("addStyleSelector");
+InjectedScriptAccess._installHandler("applyStyleRuleText");
+InjectedScriptAccess._installHandler("applyStyleText");
+InjectedScriptAccess._installHandler("clearConsoleMessages");
+InjectedScriptAccess._installHandler("evaluate");
+InjectedScriptAccess._installHandler("evaluateInCallFrame");
+InjectedScriptAccess._installHandler("getCompletions");
+InjectedScriptAccess._installHandler("getComputedStyle");
+InjectedScriptAccess._installHandler("getInlineStyle");
+InjectedScriptAccess._installHandler("getNodePropertyValue");
+InjectedScriptAccess._installHandler("getProperties");
+InjectedScriptAccess._installHandler("getPrototypes");
+InjectedScriptAccess._installHandler("getStyles");
+InjectedScriptAccess._installHandler("openInInspectedWindow");
+InjectedScriptAccess._installHandler("performSearch");
+InjectedScriptAccess._installHandler("pushNodeToFrontend");
+InjectedScriptAccess._installHandler("nodeByPath");
+InjectedScriptAccess._installHandler("searchCanceled");
+InjectedScriptAccess._installHandler("setOuterHTML");
+InjectedScriptAccess._installHandler("setPropertyValue");
+InjectedScriptAccess._installHandler("setStyleProperty");
+InjectedScriptAccess._installHandler("setStyleText");
+InjectedScriptAccess._installHandler("toggleStyleEnabled");
+InjectedScriptAccess._installHandler("evaluateOnSelf");
+
+// Some methods can't run synchronously even on the injected script side (such as DB transactions).
+// Mark them as asynchronous here.
+InjectedScriptAccess._installHandler("executeSql", true);
+
+WebInspector.didDispatchOnInjectedScript = WebInspector.Callback.processCallback;
+
+/* TimelineAgent.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineAgent = function() {
+    // Not implemented.
+}
+
+// Must be kept in sync with TimelineItem.h
+WebInspector.TimelineAgent.RecordType = {
+    EventDispatch : 0,
+    Layout : 1,
+    RecalculateStyles : 2,
+    Paint : 3,
+    ParseHTML : 4,
+    TimerInstall : 5,
+    TimerRemove : 6,
+    TimerFire : 7,
+    XHRReadyStateChange : 8,
+    XHRLoad : 9,
+    EvaluateScript : 10,
+    MarkTimeline : 11,
+    ResourceSendRequest : 12,
+    ResourceReceiveResponse : 13,
+    ResourceFinish : 14,
+    FunctionCall : 15
+};
+
+WebInspector.addRecordToTimeline = function(record) {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.addRecordToTimeline(record);
+}
+
+WebInspector.timelineProfilerWasStarted = function() {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.timelineWasStarted();
+}
+
+WebInspector.timelineProfilerWasStopped = function() {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.timelineWasStopped();
+}
+
+/* TimelinePanel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelinePanel = function()
+{
+    WebInspector.Panel.call(this);
+    this.element.addStyleClass("timeline");
+
+    this._overviewPane = new WebInspector.TimelineOverviewPane(this.categories);
+    this._overviewPane.addEventListener("window changed", this._windowChanged, this);
+    this._overviewPane.addEventListener("filter changed", this._refresh, this);
+    this.element.appendChild(this._overviewPane.element);
+    this.element.tabIndex = 0;
+
+    this._sidebarBackgroundElement = document.createElement("div");
+    this._sidebarBackgroundElement.className = "sidebar timeline-sidebar-background";
+    this.element.appendChild(this._sidebarBackgroundElement);
+
+    this._containerElement = document.createElement("div");
+    this._containerElement.id = "timeline-container";
+    this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);
+    this.element.appendChild(this._containerElement);
+
+    this.createSidebar(this._containerElement, this._containerElement);
+    var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);
+    itemsTreeElement.expanded = true;
+    this.sidebarTree.appendChild(itemsTreeElement);
+
+    this._sidebarListElement = document.createElement("div");
+    this.sidebarElement.appendChild(this._sidebarListElement);
+
+    this._containerContentElement = document.createElement("div");
+    this._containerContentElement.id = "resources-container-content";
+    this._containerElement.appendChild(this._containerContentElement);
+
+    this._timelineGrid = new WebInspector.TimelineGrid();
+    this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
+    this._itemsGraphsElement.id = "timeline-graphs";
+    this._containerContentElement.appendChild(this._timelineGrid.element);
+
+    this._topGapElement = document.createElement("div");
+    this._topGapElement.className = "timeline-gap";
+    this._itemsGraphsElement.appendChild(this._topGapElement);
+
+    this._graphRowsElement = document.createElement("div");
+    this._itemsGraphsElement.appendChild(this._graphRowsElement);
+
+    this._bottomGapElement = document.createElement("div");
+    this._bottomGapElement.className = "timeline-gap";
+    this._itemsGraphsElement.appendChild(this._bottomGapElement);
+
+    this._createStatusbarButtons();
+
+    this._records = [];
+    this._sendRequestRecords = {};
+    this._timerRecords = {};
+
+    this._calculator = new WebInspector.TimelineCalculator();
+    this._boundariesAreValid = true;
+    this._scrollTop = 0;
+
+    this._popoverHelper = new WebInspector.PopoverHelper(this._containerElement, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);
+}
+
+WebInspector.TimelinePanel.prototype = {
+    toolbarItemClass: "timeline",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Timeline");
+    },
+
+    get statusBarItems()
+    {
+        return [this.toggleTimelineButton.element, this.clearButton.element];
+    },
+
+    get categories()
+    {
+        if (!this._categories) {
+            this._categories = {
+                loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), "rgb(47,102,236)"),
+                scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), "rgb(157,231,119)"),
+                rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), "rgb(164,60,255)")
+            };
+        }
+        return this._categories;
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.element;
+    },
+
+    get _recordStyles()
+    {
+        if (!this._recordStylesArray) {
+            var recordTypes = WebInspector.TimelineAgent.RecordType;
+            var recordStyles = {};
+            recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: this.categories.scripting };
+            recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: this.categories.rendering };
+            recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: this.categories.rendering };
+            recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: this.categories.rendering };
+            recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse"), category: this.categories.loading };
+            recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: this.categories.scripting };
+            recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: this.categories.scripting };
+            recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: this.categories.scripting };
+            recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: this.categories.scripting };
+            recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: this.categories.scripting };
+            recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: this.categories.scripting };
+            recordStyles[recordTypes.MarkTimeline] = { title: WebInspector.UIString("Mark"), category: this.categories.scripting };
+            recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: this.categories.loading };
+            recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: this.categories.loading };
+            recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: this.categories.loading };
+            recordStyles[recordTypes.FunctionCall] = { title: WebInspector.UIString("Function Call"), category: this.categories.scripting };
+            this._recordStylesArray = recordStyles;
+        }
+        return this._recordStylesArray;
+    },
+
+    _createStatusbarButtons: function()
+    {
+        this.toggleTimelineButton = new WebInspector.StatusBarButton("", "record-profile-status-bar-item");
+        this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked.bind(this), false);
+
+        this.clearButton = new WebInspector.StatusBarButton("", "timeline-clear-status-bar-item");
+        this.clearButton.addEventListener("click", this.reset.bind(this), false);
+    },
+
+    _toggleTimelineButtonClicked: function()
+    {
+        if (this.toggleTimelineButton.toggled)
+            InspectorBackend.stopTimelineProfiler();
+        else
+            InspectorBackend.startTimelineProfiler();
+    },
+
+    timelineWasStarted: function()
+    {
+        this.toggleTimelineButton.toggled = true;
+    },
+
+    timelineWasStopped: function()
+    {
+        this.toggleTimelineButton.toggled = false;
+    },
+
+    addRecordToTimeline: function(record)
+    {
+        this._innerAddRecordToTimeline(record, this._records);
+        this._scheduleRefresh();
+    },
+
+    _innerAddRecordToTimeline: function(record, collection)
+    {
+        var formattedRecord = new WebInspector.TimelinePanel.FormattedRecord(record, this._recordStyles, this._sendRequestRecords, this._timerRecords);
+
+        // Glue subsequent records with same category and title together if they are closer than 100ms to each other.
+        if (this._lastRecord && (!record.children || !record.children.length) &&
+                this._lastRecord.category == formattedRecord.category &&
+                this._lastRecord.title == formattedRecord.title &&
+                this._lastRecord.details == formattedRecord.details &&
+                this._lastRecord.callerScriptName == formattedRecord.callerScriptName &&
+                this._lastRecord.callerScriptLine == formattedRecord.callerScriptLine &&
+                formattedRecord.startTime - this._lastRecord.endTime < 0.1) {
+            this._lastRecord.endTime = formattedRecord.endTime;
+            this._lastRecord.count++;
+        } else {
+            collection.push(formattedRecord);
+            for (var i = 0; record.children && i < record.children.length; ++i) {
+                if (!formattedRecord.children)
+                    formattedRecord.children = [];
+                var formattedChild = this._innerAddRecordToTimeline(record.children[i], formattedRecord.children);
+                formattedChild.parent = formattedRecord;
+            }
+            this._lastRecord = record.children && record.children.length ? null : formattedRecord;
+        }
+        return formattedRecord;
+    },
+
+    setSidebarWidth: function(width)
+    {
+        WebInspector.Panel.prototype.setSidebarWidth.call(this, width);
+        this._sidebarBackgroundElement.style.width = width + "px";
+        this._overviewPane.setSidebarWidth(width);
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._containerContentElement.style.left = width + "px";
+        this._scheduleRefresh();
+        this._overviewPane.updateMainViewWidth(width);
+    },
+
+    resize: function() {
+        this._closeRecordDetails();
+        this._scheduleRefresh();
+    },
+
+    reset: function()
+    {
+        this._lastRecord = null;
+        this._sendRequestRecords = {};
+        this._timerRecords = {};
+        this._records = [];
+        this._boundariesAreValid = false;
+        this._overviewPane.reset();
+        this._adjustScrollPosition(0);
+        this._refresh();
+        this._closeRecordDetails();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        if (typeof this._scrollTop === "number")
+            this._containerElement.scrollTop = this._scrollTop;
+        else if (this._needsRefresh)
+            this._refresh();
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+        this._closeRecordDetails();
+    },
+
+    _onScroll: function(event)
+    {
+        this._closeRecordDetails();
+        var scrollTop = this._containerElement.scrollTop;
+        var dividersTop = Math.max(0, scrollTop);
+        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
+        this._scheduleRefresh(true);
+    },
+
+    _windowChanged: function()
+    {
+        this._closeRecordDetails();
+        this._scheduleRefresh();
+    },
+
+    _scheduleRefresh: function(preserveBoundaries)
+    {
+        if (preserveBoundaries)
+            this._closeRecordDetails();
+        this._boundariesAreValid &= preserveBoundaries;
+        if (this._needsRefresh)
+            return;
+        this._needsRefresh = true;
+
+        if (this.visible && !("_refreshTimeout" in this)) {
+            if (preserveBoundaries)
+                this._refresh();
+            else
+                this._refreshTimeout = setTimeout(this._refresh.bind(this), 100);
+        }
+    },
+
+    _refresh: function()
+    {
+        this._needsRefresh = false;
+        if ("_refreshTimeout" in this) {
+            clearTimeout(this._refreshTimeout);
+            delete this._refreshTimeout;
+        }
+
+        if (!this._boundariesAreValid)
+            this._overviewPane.update(this._records);
+        this._refreshRecords(!this._boundariesAreValid);
+        this._boundariesAreValid = true;
+    },
+
+    _refreshRecords: function(updateBoundaries)
+    {
+        if (updateBoundaries) {
+            this._calculator.reset();
+            this._calculator.windowLeft = this._overviewPane.windowLeft;
+            this._calculator.windowRight = this._overviewPane.windowRight;
+
+            for (var i = 0; i < this._records.length; ++i)
+                this._calculator.updateBoundaries(this._records[i]);
+
+            this._calculator.calculateWindow();
+        }
+
+        var recordsInWindow = [];
+        for (var i = 0; i < this._records.length; ++i) {
+            var record = this._records[i];
+            var percentages = this._calculator.computeBarGraphPercentages(record);
+            if (percentages.start < 100 && percentages.end >= 0 && !record.category.hidden)
+                this._addToRecordsWindow(record, recordsInWindow);
+        }
+
+        // Calculate the visible area.
+        this._scrollTop = this._containerElement.scrollTop;
+        var visibleTop = this._scrollTop;
+        var visibleBottom = visibleTop + this._containerElement.clientHeight;
+
+        // Define row height, should be in sync with styles for timeline graphs.
+        const rowHeight = 18;
+        const expandOffset = 15;
+
+        // Convert visible area to visible indexes. Always include top-level record for a visible nested record.
+        var startIndex = Math.max(0, Math.min(Math.floor(visibleTop / rowHeight) - 1, recordsInWindow.length - 1));
+        while (startIndex > 0 && recordsInWindow[startIndex].parent)
+            startIndex--;
+        var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
+        while (endIndex < recordsInWindow.length - 1 && recordsInWindow[endIndex].parent)
+            endIndex++;
+
+        // Resize gaps first.
+        const top = (startIndex * rowHeight) + "px";
+        this._topGapElement.style.height = top;
+        this.sidebarElement.style.top = top;
+        this.sidebarResizeElement.style.top = top;
+        this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";
+
+        // Update visible rows.
+        var listRowElement = this._sidebarListElement.firstChild;
+        var width = this._graphRowsElement.offsetWidth;
+        this._itemsGraphsElement.removeChild(this._graphRowsElement);
+        var graphRowElement = this._graphRowsElement.firstChild;
+        var scheduleRefreshCallback = this._scheduleRefresh.bind(this, true);
+
+        for (var i = startIndex; i < endIndex; ++i) {
+            var record = recordsInWindow[i];
+            var isEven = !(i % 2);
+
+            if (!listRowElement) {
+                listRowElement = new WebInspector.TimelineRecordListRow().element;
+                this._sidebarListElement.appendChild(listRowElement);
+            }
+            if (!graphRowElement) {
+                graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback, rowHeight).element;
+                this._graphRowsElement.appendChild(graphRowElement);
+            }
+
+            listRowElement.row.update(record, isEven, this._calculator, visibleTop);
+            graphRowElement.row.update(record, isEven, this._calculator, width, expandOffset, i);
+
+            listRowElement = listRowElement.nextSibling;
+            graphRowElement = graphRowElement.nextSibling;
+        }
+
+        // Remove extra rows.
+        while (listRowElement) {
+            var nextElement = listRowElement.nextSibling;
+            listRowElement.row.dispose();
+            listRowElement = nextElement;
+        }
+        while (graphRowElement) {
+            var nextElement = graphRowElement.nextSibling;
+            graphRowElement.row.dispose();
+            graphRowElement = nextElement;
+        }
+
+        this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bottomGapElement);
+        // Reserve some room for expand / collapse controls to the left for records that start at 0ms.
+        var timelinePaddingLeft = this._calculator.windowLeft === 0 ? expandOffset : 0;
+        if (updateBoundaries)
+            this._timelineGrid.updateDividers(true, this._calculator, timelinePaddingLeft);
+        this._adjustScrollPosition((recordsInWindow.length + 1) * rowHeight);
+    },
+
+    _addToRecordsWindow: function(record, recordsWindow)
+    {
+        recordsWindow.push(record);
+        if (!record.collapsed) {
+            var index = recordsWindow.length;
+            for (var i = 0; record.children && i < record.children.length; ++i)
+                this._addToRecordsWindow(record.children[i], recordsWindow);
+            record.visibleChildrenCount = recordsWindow.length - index;
+        }
+    },
+
+    _adjustScrollPosition: function(totalHeight)
+    {
+        // Prevent the container from being scrolled off the end.
+        if ((this._containerElement.scrollTop + this._containerElement.offsetHeight) > totalHeight + 1)
+            this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);
+    },
+
+    _getPopoverAnchor: function(element)
+    {
+        return element.enclosingNodeOrSelfWithClass("timeline-graph-bar") || element.enclosingNodeOrSelfWithClass("timeline-tree-item");
+    },
+
+    _showPopover: function(anchor)
+    {
+        var record = anchor.row._record;
+        var popover = new WebInspector.Popover(record._generatePopupContent(this._calculator));
+        popover.show(anchor);
+        return popover;
+    },
+
+    _closeRecordDetails: function()
+    {
+        this._popoverHelper.hidePopup();
+    }
+}
+
+WebInspector.TimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.TimelineCategory = function(name, title, color)
+{
+    this.name = name;
+    this.title = title;
+    this.color = color;
+}
+
+WebInspector.TimelineCalculator = function()
+{
+    this.reset();
+    this.windowLeft = 0.0;
+    this.windowRight = 1.0;
+    this._uiString = WebInspector.UIString.bind(WebInspector);
+}
+
+WebInspector.TimelineCalculator.prototype = {
+    computeBarGraphPercentages: function(record)
+    {
+        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
+        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
+        return {start: start, end: end};
+    },
+
+    calculateWindow: function()
+    {
+        this.minimumBoundary = this._absoluteMinimumBoundary + this.windowLeft * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
+        this.maximumBoundary = this._absoluteMinimumBoundary + this.windowRight * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
+        this.boundarySpan = this.maximumBoundary - this.minimumBoundary;
+    },
+
+    reset: function()
+    {
+        this._absoluteMinimumBoundary = -1;
+        this._absoluteMaximumBoundary = -1;
+    },
+
+    updateBoundaries: function(record)
+    {
+        var lowerBound = record.startTime;
+        if (this._absoluteMinimumBoundary === -1 || lowerBound < this._absoluteMinimumBoundary)
+            this._absoluteMinimumBoundary = lowerBound;
+
+        var upperBound = record.endTime;
+        if (this._absoluteMaximumBoundary === -1 || upperBound > this._absoluteMaximumBoundary)
+            this._absoluteMaximumBoundary = upperBound;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value + this.minimumBoundary - this._absoluteMinimumBoundary, this._uiString);
+    }
+}
+
+
+WebInspector.TimelineRecordListRow = function()
+{
+    this.element = document.createElement("div");
+    this.element.row = this;
+    this.element.style.cursor = "pointer";
+    var iconElement = document.createElement("span");
+    iconElement.className = "timeline-tree-icon";
+    this.element.appendChild(iconElement);
+
+    this._typeElement = document.createElement("span");
+    this._typeElement.className = "type";
+    this.element.appendChild(this._typeElement);
+
+    var separatorElement = document.createElement("span");
+    separatorElement.className = "separator";
+    separatorElement.textContent = " ";
+
+    this._dataElement = document.createElement("span");
+    this._dataElement.className = "data dimmed";
+
+    this._repeatCountElement = document.createElement("span");
+    this._repeatCountElement.className = "count";
+
+    this.element.appendChild(separatorElement);
+    this.element.appendChild(this._dataElement);
+    this.element.appendChild(this._repeatCountElement);
+}
+
+WebInspector.TimelineRecordListRow.prototype = {
+    update: function(record, isEven, calculator, offset)
+    {
+        this._record = record;
+        this._calculator = calculator;
+        this._offset = offset;
+
+        this.element.className = "timeline-tree-item timeline-category-" + record.category.name + (isEven ? " even" : "");
+        this._typeElement.textContent = record.title;
+
+        if (record.details)
+            this._dataElement.textContent = "(" + record.details + ")";
+        else
+            this._dataElement.textContent = "";
+
+        if (record.count > 1)
+            this._repeatCountElement.textContent = "\u2009\u00d7\u2009" + record.count;
+        else
+            this._repeatCountElement.textContent = "";
+    },
+
+    dispose: function()
+    {
+        this.element.parentElement.removeChild(this.element);
+    }
+}
+
+WebInspector.TimelineRecordGraphRow = function(graphContainer, scheduleRefresh, rowHeight)
+{
+    this.element = document.createElement("div");
+    this.element.row = this;
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "timeline-graph-bar-area";
+    this.element.appendChild(this._barAreaElement);
+
+    this._barElement = document.createElement("div");
+    this._barElement.className = "timeline-graph-bar";
+    this._barElement.row = this;
+    this._barAreaElement.appendChild(this._barElement);
+
+    this._expandElement = document.createElement("div");
+    this._expandElement.className = "timeline-expandable";
+    graphContainer.appendChild(this._expandElement);
+
+    var leftBorder = document.createElement("div");
+    leftBorder.className = "timeline-expandable-left";
+    this._expandElement.appendChild(leftBorder);
+
+    this._expandElement.addEventListener("click", this._onClick.bind(this));
+    this._rowHeight = rowHeight;
+
+    this._scheduleRefresh = scheduleRefresh;
+}
+
+WebInspector.TimelineRecordGraphRow.prototype = {
+    update: function(record, isEven, calculator, clientWidth, expandOffset, index)
+    {
+        this._record = record;
+        this.element.className = "timeline-graph-side timeline-category-" + record.category.name + (isEven ? " even" : "");
+        var percentages = calculator.computeBarGraphPercentages(record);
+        var left = percentages.start / 100 * clientWidth;
+        var width = (percentages.end - percentages.start) / 100 * clientWidth;
+        this._barElement.style.left = (left + expandOffset) + "px";
+        this._barElement.style.width = width + "px";
+
+        if (record.visibleChildrenCount) {
+            this._expandElement.style.top = index * this._rowHeight + "px";
+            this._expandElement.style.left = left + "px";
+            this._expandElement.style.width = Math.max(12, width + 25) + "px";
+            if (!record.collapsed) {
+                this._expandElement.style.height = (record.visibleChildrenCount + 1) * this._rowHeight + "px";
+                this._expandElement.addStyleClass("timeline-expandable-expanded");
+                this._expandElement.removeStyleClass("timeline-expandable-collapsed");
+            } else {
+                this._expandElement.style.height = this._rowHeight + "px";
+                this._expandElement.addStyleClass("timeline-expandable-collapsed");
+                this._expandElement.removeStyleClass("timeline-expandable-expanded");
+            }
+            this._expandElement.removeStyleClass("hidden");
+        } else {
+            this._expandElement.addStyleClass("hidden");
+        }
+    },
+
+    _onClick: function(event)
+    {
+        this._record.collapsed = !this._record.collapsed;
+        this._scheduleRefresh();
+    },
+
+    dispose: function()
+    {
+        this.element.parentElement.removeChild(this.element);
+        this._expandElement.parentElement.removeChild(this._expandElement);
+    }
+}
+
+WebInspector.TimelinePanel.FormattedRecord = function(record, recordStyles, sendRequestRecords, timerRecords)
+{
+    var recordTypes = WebInspector.TimelineAgent.RecordType;
+    var style = recordStyles[record.type];
+
+    this.category = style.category;
+    this.title = style.title;
+    this.startTime = record.startTime / 1000;
+    this.data = record.data;
+    this.count = 1;
+    this.type = record.type;
+    this.endTime = (typeof record.endTime !== "undefined") ? record.endTime / 1000 : this.startTime;
+    this.originalRecordForTests = record;
+    this.callerScriptName = record.callerScriptName;
+    this.callerScriptLine = record.callerScriptLine;
+
+    // Make resource receive record last since request was sent; make finish record last since response received.
+    if (record.type === recordTypes.ResourceSendRequest) {
+        sendRequestRecords[record.data.identifier] = this;
+    } else if (record.type === recordTypes.ResourceReceiveResponse) {
+        var sendRequestRecord = sendRequestRecords[record.data.identifier];
+        if (sendRequestRecord) { // False if we started instrumentation in the middle of request.
+            sendRequestRecord._responseReceivedFormattedTime = this.startTime;
+            record.data.url = sendRequestRecord.data.url;
+            this.startTime = sendRequestRecord.startTime;
+            this.details = this._getRecordDetails(sendRequestRecord, sendRequestRecords);
+            this.callerScriptName = sendRequestRecord.callerScriptName;
+            this.callerScriptLine = sendRequestRecord.callerScriptLine;
+        }
+    } else if (record.type === recordTypes.ResourceFinish) {
+        var sendRequestRecord = sendRequestRecords[record.data.identifier];
+        if (sendRequestRecord) {// False for main resource.
+            record.data.url = sendRequestRecord.data.url;
+            this.startTime = sendRequestRecord._responseReceivedFormattedTime;
+            this.callerScriptName = sendRequestRecord.callerScriptName;
+            this.callerScriptLine = sendRequestRecord.callerScriptLine;
+        }
+    } else if (record.type === recordTypes.TimerInstall) {
+        this.timeout = record.data.timeout;
+        this.singleShot = record.data.singleShot;
+        timerRecords[record.data.timerId] = this;
+    } else if (record.type === recordTypes.TimerFire) {
+        var timerInstalledRecord = timerRecords[record.data.timerId];
+        if (timerInstalledRecord) {
+            this.callSiteScriptName = timerInstalledRecord.callerScriptName;
+            this.callSiteScriptLine = timerInstalledRecord.callerScriptLine;
+            this.timeout = timerInstalledRecord.timeout;
+            this.singleShot = timerInstalledRecord.singleShot;
+        }
+    }
+    this.details = this._getRecordDetails(record, sendRequestRecords);
+}
+
+WebInspector.TimelinePanel.FormattedRecord.prototype = {
+    _createCell: function(content, styleName)
+    {
+        var text = document.createElement("label");
+        text.appendChild(document.createTextNode(content));
+        var cell = document.createElement("td");
+        cell.className = "timeline-details";
+        if (styleName)
+            cell.className += " " + styleName;
+        cell.textContent = content;
+        return cell;
+    },
+
+    _createRow: function(title, content)
+    {
+        var row = document.createElement("tr");
+        row.appendChild(this._createCell(title, "timeline-details-row-title"));
+        row.appendChild(this._createCell(content, "timeline-details-row-data"));
+        return row;
+    },
+
+    _createLinkRow: function(title, content)
+    {
+        var row = document.createElement("tr");
+        row.appendChild(this._createCell(title, "timeline-details-row-title"));
+        var cell = document.createElement("td");
+        cell.appendChild(content);
+        row.appendChild(cell);
+        return row;
+    },
+
+    _generatePopupContent: function(calculator)
+    {
+        var recordContentTable = document.createElement("table");
+        var titleCell = this._createCell(WebInspector.UIString("%s - Details", this.title), "timeline-details-title");
+        titleCell.colSpan = 2;
+        var titleRow = document.createElement("tr");
+        titleRow.appendChild(titleCell);
+        recordContentTable.appendChild(titleRow);
+        var text = Number.secondsToString(this.endTime - this.startTime) + " (@" +
+        calculator.formatValue(this.startTime - calculator.minimumBoundary) + ")";
+        recordContentTable.appendChild(this._createRow(WebInspector.UIString("Duration"), text));
+
+        const recordTypes = WebInspector.TimelineAgent.RecordType;
+        if (this.details) {
+            if (this.type === recordTypes.TimerInstall ||
+                this.type === recordTypes.TimerFire ||
+                this.type === recordTypes.TimerRemove) {
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Timer Id"), this.data.timerId));
+                if (this.timeout) {
+                    recordContentTable.appendChild(this._createRow(WebInspector.UIString("Timeout"), this.timeout));
+                    recordContentTable.appendChild(this._createRow(WebInspector.UIString("Repeats"), !this.singleShot));
+                }
+                if (this.callSiteScriptLine) {
+                    var link = WebInspector.linkifyResourceAsNode(this.callSiteScriptName, "scripts", this.callSiteScriptLine, "timeline-details");
+                    recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Call Site"), link));
+                }
+            } else if (this.type === recordTypes.FunctionCall) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.scriptName, "scripts", this.data.scriptLine, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Location"), link));
+            } else if (this.type === recordTypes.ResourceSendRequest || this.type === recordTypes.ResourceReceiveResponse || this.type === recordTypes.ResourceFinish) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.url, "resources", null, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Resource"), link));
+            } else if (this.type === recordTypes.EvaluateScript) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.url, "scripts", null, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Script"), link));
+            } else if (this.type === recordTypes.Paint) {
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Location"), this.data.x + "\u2009\u00d7\u2009" + this.data.y));
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Dimensions"), this.data.width + "\u2009\u00d7\u2009" + this.data.height));
+            } else
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Details"), this.details));
+        }
+
+        if (this.callerScriptName) {
+            var link = WebInspector.linkifyResourceAsNode(this.callerScriptName, "scripts", this.callerScriptLine);
+            recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Caller"), link));
+        }
+        return recordContentTable;
+    },
+
+    _getRecordDetails: function(record, sendRequestRecords)
+    {
+        switch (record.type) {
+            case WebInspector.TimelineAgent.RecordType.FunctionCall:
+                return WebInspector.displayNameForURL(record.data.scriptName + ":" + record.data.scriptLine);
+            case WebInspector.TimelineAgent.RecordType.EventDispatch:
+                return record.data ? record.data.type : "";
+            case WebInspector.TimelineAgent.RecordType.Paint:
+                return record.data.width + "\u2009\u00d7\u2009" + record.data.height;
+            case WebInspector.TimelineAgent.RecordType.TimerInstall:
+            case WebInspector.TimelineAgent.RecordType.TimerRemove:
+            case WebInspector.TimelineAgent.RecordType.TimerFire:
+                return record.data.timerId;
+            case WebInspector.TimelineAgent.RecordType.XHRReadyStateChange:
+            case WebInspector.TimelineAgent.RecordType.XHRLoad:
+            case WebInspector.TimelineAgent.RecordType.EvaluateScript:
+            case WebInspector.TimelineAgent.RecordType.ResourceSendRequest:
+            case WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse:
+            case WebInspector.TimelineAgent.RecordType.ResourceFinish:
+                return WebInspector.displayNameForURL(record.data.url);
+            case WebInspector.TimelineAgent.RecordType.MarkTimeline:
+                return record.data.message;
+            default:
+                return "";
+        }
+    }
+}
+
+
+/* TimelineOverviewPane.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineOverviewPane = function(categories)
+{
+    this.element = document.createElement("div");
+    this.element.id = "timeline-overview-panel";
+
+    this._categories = categories;
+    this._overviewSidebarElement = document.createElement("div");
+    this._overviewSidebarElement.id = "timeline-overview-sidebar";
+    this.element.appendChild(this._overviewSidebarElement);
+
+    var overviewTreeElement = document.createElement("ol");
+    overviewTreeElement.className = "sidebar-tree";
+    this._overviewSidebarElement.appendChild(overviewTreeElement);
+    var sidebarTree = new TreeOutline(overviewTreeElement);
+
+    var categoriesTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("TIMELINES"), {}, true);
+    categoriesTreeElement.expanded = true;
+    sidebarTree.appendChild(categoriesTreeElement);
+    for (var categoryName in this._categories) {
+        var category = this._categories[categoryName];
+        categoriesTreeElement.appendChild(new WebInspector.TimelineCategoryTreeElement(category, this._onCheckboxClicked.bind(this, category)));
+    }
+
+    this._overviewGrid = new WebInspector.TimelineGrid();
+    this._overviewGrid.element.id = "timeline-overview-grid";
+    this._overviewGrid.itemsGraphsElement.id = "timeline-overview-graphs";
+    this.element.appendChild(this._overviewGrid.element);
+
+    this._categoryGraphs = {};
+    var i = 0;
+    for (var category in this._categories) {
+        var categoryGraph = new WebInspector.TimelineCategoryGraph(this._categories[category], i++ % 2);
+        this._categoryGraphs[category] = categoryGraph;
+        this._overviewGrid.itemsGraphsElement.appendChild(categoryGraph.graphElement);
+    }
+    this._overviewGrid.setScrollAndDividerTop(0, 0);
+
+    this._overviewWindowElement = document.createElement("div");
+    this._overviewWindowElement.id = "timeline-overview-window";
+    this._overviewWindowElement.addEventListener("mousedown", this._dragWindow.bind(this), false);
+    this._overviewGrid.element.appendChild(this._overviewWindowElement);
+
+    this._leftResizeElement = document.createElement("div");
+    this._leftResizeElement.className = "timeline-window-resizer";
+    this._leftResizeElement.style.left = 0;
+    this._overviewGrid.element.appendChild(this._leftResizeElement);
+    this._leftResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._leftResizeElement), false);
+
+    this._rightResizeElement = document.createElement("div");
+    this._rightResizeElement.className = "timeline-window-resizer timeline-window-resizer-right";
+    this._rightResizeElement.style.right = 0;
+    this._overviewGrid.element.appendChild(this._rightResizeElement);
+    this._rightResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._rightResizeElement), false);
+
+    this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();
+
+    var separatorElement = document.createElement("div");
+    separatorElement.id = "timeline-overview-separator";
+    this.element.appendChild(separatorElement);
+
+    this.windowLeft = 0.0;
+    this.windowRight = 1.0;
+}
+
+
+WebInspector.TimelineOverviewPane.prototype = {
+    _onCheckboxClicked: function (category, event) {
+        if (event.target.checked)
+            category.hidden = false;
+        else
+            category.hidden = true;
+        this._categoryGraphs[category.name].dimmed = !event.target.checked;
+        this.dispatchEventToListeners("filter changed");
+    },
+
+    update: function(records)
+    {
+        // Clear summary bars.
+        var timelines = {};
+        for (var category in this._categories) {
+            timelines[category] = [];
+            this._categoryGraphs[category].clearChunks();
+        }
+
+        function forAllRecords(recordsArray, callback)
+        {
+            if (!recordsArray)
+                return;
+            for (var i = 0; i < recordsArray.length; ++i) {
+                callback(recordsArray[i]);
+                forAllRecords(recordsArray[i].children, callback);
+            }
+        }
+
+        // Create sparse arrays with 101 cells each to fill with chunks for a given category.
+        this._overviewCalculator.reset();
+        forAllRecords(records, this._overviewCalculator.updateBoundaries.bind(this._overviewCalculator));
+
+        function markTimeline(record)
+        {
+            var percentages = this._overviewCalculator.computeBarGraphPercentages(record);
+
+            var end = Math.round(percentages.end);
+            var categoryName = record.category.name;
+            for (var j = Math.round(percentages.start); j <= end; ++j)
+                timelines[categoryName][j] = true;
+        }
+        forAllRecords(records, markTimeline.bind(this));
+
+        // Convert sparse arrays to continuous segments, render graphs for each.
+        for (var category in this._categories) {
+            var timeline = timelines[category];
+            window.timelineSaved = timeline;
+            var chunkStart = -1;
+            for (var j = 0; j < 101; ++j) {
+                if (timeline[j]) {
+                    if (chunkStart === -1)
+                        chunkStart = j;
+                } else {
+                    if (chunkStart !== -1) {
+                        this._categoryGraphs[category].addChunk(chunkStart, j);
+                        chunkStart = -1;
+                    }
+                }
+            }
+            if (chunkStart !== -1) {
+                this._categoryGraphs[category].addChunk(chunkStart, 100);
+                chunkStart = -1;
+            }
+        }
+        this._overviewGrid.updateDividers(true, this._overviewCalculator);
+    },
+
+    setSidebarWidth: function(width)
+    {
+        this._overviewSidebarElement.style.width = width + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._overviewGrid.element.style.left = width + "px";
+    },
+
+    reset: function()
+    {
+        this.windowLeft = 0.0;
+        this.windowRight = 1.0;
+        this._overviewWindowElement.style.left = "0%";
+        this._overviewWindowElement.style.width = "100%";
+        this._leftResizeElement.style.left = "0%";
+        this._rightResizeElement.style.left = "100%";
+        this._overviewCalculator.reset();
+        this._overviewGrid.updateDividers(true, this._overviewCalculator);
+    },
+
+    _resizeWindow: function(resizeElement, event)
+    {
+        WebInspector.elementDragStart(resizeElement, this._windowResizeDragging.bind(this, resizeElement), this._endWindowDragging.bind(this), event, "col-resize");
+    },
+
+    _windowResizeDragging: function(resizeElement, event)
+    {
+        if (resizeElement === this._leftResizeElement)
+            this._resizeWindowLeft(event.pageX - this._overviewGrid.element.offsetLeft);
+        else
+            this._resizeWindowRight(event.pageX - this._overviewGrid.element.offsetLeft);
+        event.preventDefault();
+    },
+
+    _dragWindow: function(event)
+    {
+        WebInspector.elementDragStart(this._overviewWindowElement, this._windowDragging.bind(this, event.pageX,
+            this._leftResizeElement.offsetLeft, this._rightResizeElement.offsetLeft), this._endWindowDragging.bind(this), event, "ew-resize");
+    },
+
+    _windowDragging: function(startX, windowLeft, windowRight, event)
+    {
+        var delta = event.pageX - startX;
+        var start = windowLeft + delta;
+        var end = windowRight + delta;
+        var windowSize = windowRight - windowLeft;
+
+        if (start < 0) {
+            start = 0;
+            end = windowSize;
+        }
+
+        if (end > this._overviewGrid.element.clientWidth) {
+            end = this._overviewGrid.element.clientWidth;
+            start = end - windowSize;
+        }
+        this._setWindowPosition(start, end);
+
+        event.preventDefault();
+    },
+
+    _resizeWindowLeft: function(start)
+    {
+        // Glue to edge.
+        if (start < 10)
+            start = 0;
+        this._setWindowPosition(start, null);
+    },
+
+    _resizeWindowRight: function(end)
+    {
+        // Glue to edge.
+        if (end > this._overviewGrid.element.clientWidth - 10)
+            end = this._overviewGrid.element.clientWidth;
+        this._setWindowPosition(null, end);
+    },
+
+    _setWindowPosition: function(start, end)
+    {
+        if (typeof start === "number") {
+            if (start > this._rightResizeElement.offsetLeft - 4)
+                start = this._rightResizeElement.offsetLeft - 4;
+
+            this.windowLeft = start / this._overviewGrid.element.clientWidth;
+            this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
+            this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";
+        }
+        if (typeof end === "number") {
+            if (end < this._leftResizeElement.offsetLeft + 12)
+                end = this._leftResizeElement.offsetLeft + 12;
+
+            this.windowRight = end / this._overviewGrid.element.clientWidth;
+            this._rightResizeElement.style.left = this.windowRight * 100 + "%";
+        }
+        this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";
+        this.dispatchEventToListeners("window changed");
+    },
+
+    _endWindowDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    }
+}
+
+WebInspector.TimelineOverviewPane.prototype.__proto__ = WebInspector.Object.prototype;
+
+
+WebInspector.TimelineOverviewCalculator = function()
+{
+    this._uiString = WebInspector.UIString.bind(WebInspector);
+}
+
+WebInspector.TimelineOverviewCalculator.prototype = {
+    computeBarGraphPercentages: function(record)
+    {
+        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
+        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
+        return {start: start, end: end};
+    },
+
+    reset: function()
+    {
+        delete this.minimumBoundary;
+        delete this.maximumBoundary;
+    },
+
+    updateBoundaries: function(record)
+    {
+        if (typeof this.minimumBoundary === "undefined" || record.startTime < this.minimumBoundary) {
+            this.minimumBoundary = record.startTime;
+            return true;
+        }
+        if (typeof this.maximumBoundary === "undefined" || record.endTime > this.maximumBoundary) {
+            this.maximumBoundary = record.endTime;
+            return true;
+        }
+        return false;
+    },
+
+    get boundarySpan()
+    {
+        return this.maximumBoundary - this.minimumBoundary;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, this._uiString);
+    }
+}
+
+
+WebInspector.TimelineCategoryTreeElement = function(category, onCheckboxClicked)
+{
+    this._category = category;
+    this._onCheckboxClicked = onCheckboxClicked;
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, false);
+}
+
+WebInspector.TimelineCategoryTreeElement.prototype = {
+    onattach: function()
+    {
+        this.listItemElement.removeChildren();
+        this.listItemElement.addStyleClass("timeline-category-tree-item");
+        this.listItemElement.addStyleClass("timeline-category-" + this._category.name);
+
+        var label = document.createElement("label");
+
+        var checkElement = document.createElement("input");
+        checkElement.type = "checkbox";
+        checkElement.className = "timeline-category-checkbox";
+        checkElement.checked = true;
+        checkElement.addEventListener("click", this._onCheckboxClicked);
+        label.appendChild(checkElement);
+
+        var typeElement = document.createElement("span");
+        typeElement.className = "type";
+        typeElement.textContent = this._category.title;
+        label.appendChild(typeElement);
+
+        this.listItemElement.appendChild(label);
+    }
+}
+
+WebInspector.TimelineCategoryTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.TimelineCategoryGraph = function(category, isEven)
+{
+    this._category = category;
+
+    this._graphElement = document.createElement("div");
+    this._graphElement.className = "timeline-graph-side timeline-overview-graph-side" + (isEven ? " even" : "");
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "timeline-graph-bar-area timeline-category-" + category.name;
+    this._graphElement.appendChild(this._barAreaElement);
+}
+
+WebInspector.TimelineCategoryGraph.prototype = {
+    get graphElement()
+    {
+        return this._graphElement;
+    },
+
+    addChunk: function(start, end)
+    {
+        var chunk = document.createElement("div");
+        chunk.className = "timeline-graph-bar";
+        this._barAreaElement.appendChild(chunk);
+        chunk.style.setProperty("left", start + "%");
+        chunk.style.setProperty("width", (end - start) + "%");
+    },
+
+    clearChunks: function()
+    {
+        this._barAreaElement.removeChildren();
+    },
+
+    set dimmed(dimmed)
+    {
+        if (dimmed)
+            this._barAreaElement.removeStyleClass("timeline-category-" + this._category.name);
+        else
+            this._barAreaElement.addStyleClass("timeline-category-" + this._category.name);
+    }
+}
+
+/* TestController.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TestController = function(callId)
+{
+    this._callId = callId;
+    this._waitUntilDone = false;
+}
+
+WebInspector.TestController.prototype = {
+    waitUntilDone: function()
+    {
+        this._waitUntilDone = true;
+    },
+
+    notifyDone: function(result)
+    {
+        var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);
+        InspectorBackend.didEvaluateForTestInFrontend(this._callId, message);
+    },
+
+    runAfterPendingDispatches: function(callback)
+    {
+        if (WebInspector.pendingDispatches === 0) {
+            callback();
+            return;
+        }
+        setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);
+    }
+}
+
+WebInspector.evaluateForTestInFrontend = function(callId, script)
+{
+    var controller = new WebInspector.TestController(callId);
+    function invokeMethod()
+    {
+        try {
+            var result;
+            if (window[script] && typeof window[script] === "function")
+                result = window[script].call(WebInspector, controller);
+            else
+                result = window.eval(script);
+
+            if (!controller._waitUntilDone)
+                controller.notifyDone(result);
+        } catch (e) {
+            controller.notifyDone(e.toString());
+        }
+    }
+    controller.runAfterPendingDispatches(invokeMethod);
+}
+
+/* codemap.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Constructs a mapper that maps addresses into code entries.
+ *
+ * @constructor
+ */
+devtools.profiler.CodeMap = function() {
+  /**
+   * Dynamic code entries. Used for JIT compiled code.
+   */
+  this.dynamics_ = new goog.structs.SplayTree();
+
+  /**
+   * Name generator for entries having duplicate names.
+   */
+  this.dynamicsNameGen_ = new devtools.profiler.CodeMap.NameGenerator();
+
+  /**
+   * Static code entries. Used for statically compiled code.
+   */
+  this.statics_ = new goog.structs.SplayTree();
+
+  /**
+   * Libraries entries. Used for the whole static code libraries.
+   */
+  this.libraries_ = new goog.structs.SplayTree();
+
+  /**
+   * Map of memory pages occupied with static code.
+   */
+  this.pages_ = [];
+};
+
+
+/**
+ * The number of alignment bits in a page address.
+ */
+devtools.profiler.CodeMap.PAGE_ALIGNMENT = 12;
+
+
+/**
+ * Page size in bytes.
+ */
+devtools.profiler.CodeMap.PAGE_SIZE =
+    1 << devtools.profiler.CodeMap.PAGE_ALIGNMENT;
+
+
+/**
+ * Adds a dynamic (i.e. moveable and discardable) code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addCode = function(start, codeEntry) {
+  this.dynamics_.insert(start, codeEntry);
+};
+
+
+/**
+ * Moves a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} from The starting address of the entry being moved.
+ * @param {number} to The destination address.
+ */
+devtools.profiler.CodeMap.prototype.moveCode = function(from, to) {
+  var removedNode = this.dynamics_.remove(from);
+  this.dynamics_.insert(to, removedNode.value);
+};
+
+
+/**
+ * Discards a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} start The starting address of the entry being deleted.
+ */
+devtools.profiler.CodeMap.prototype.deleteCode = function(start) {
+  var removedNode = this.dynamics_.remove(start);
+};
+
+
+/**
+ * Adds a library entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addLibrary = function(
+    start, codeEntry) {
+  this.markPages_(start, start + codeEntry.size);
+  this.libraries_.insert(start, codeEntry);
+};
+
+
+/**
+ * Adds a static code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addStaticCode = function(
+    start, codeEntry) {
+  this.statics_.insert(start, codeEntry);
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.markPages_ = function(start, end) {
+  for (var addr = start; addr <= end;
+       addr += devtools.profiler.CodeMap.PAGE_SIZE) {
+    this.pages_[addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT] = 1;
+  }
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
+  return addr >= node.key && addr < (node.key + node.value.size);
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.findInTree_ = function(tree, addr) {
+  var node = tree.findGreatestLessThan(addr);
+  return node && this.isAddressBelongsTo_(addr, node) ? node.value : null;
+};
+
+
+/**
+ * Finds a code entry that contains the specified address. Both static and
+ * dynamic code entries are considered.
+ *
+ * @param {number} addr Address.
+ */
+devtools.profiler.CodeMap.prototype.findEntry = function(addr) {
+  var pageAddr = addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT;
+  if (pageAddr in this.pages_) {
+    // Static code entries can contain "holes" of unnamed code.
+    // In this case, the whole library is assigned to this address.
+    return this.findInTree_(this.statics_, addr) ||
+        this.findInTree_(this.libraries_, addr);
+  }
+  var min = this.dynamics_.findMin();
+  var max = this.dynamics_.findMax();
+  if (max != null && addr < (max.key + max.value.size) && addr >= min.key) {
+    var dynaEntry = this.findInTree_(this.dynamics_, addr);
+    if (dynaEntry == null) return null;
+    // Dedupe entry name.
+    if (!dynaEntry.nameUpdated_) {
+      dynaEntry.name = this.dynamicsNameGen_.getName(dynaEntry.name);
+      dynaEntry.nameUpdated_ = true;
+    }
+    return dynaEntry;
+  }
+  return null;
+};
+
+
+/**
+ * Returns a dynamic code entry using its starting address.
+ *
+ * @param {number} addr Address.
+ */
+devtools.profiler.CodeMap.prototype.findDynamicEntryByStartAddress =
+    function(addr) {
+  var node = this.dynamics_.find(addr);
+  return node ? node.value : null;
+};
+
+
+/**
+ * Returns an array of all dynamic code entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllDynamicEntries = function() {
+  return this.dynamics_.exportValues();
+};
+
+
+/**
+ * Returns an array of all static code entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllStaticEntries = function() {
+  return this.statics_.exportValues();
+};
+
+
+/**
+ * Returns an array of all libraries entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllLibrariesEntries = function() {
+  return this.libraries_.exportValues();
+};
+
+
+/**
+ * Creates a code entry object.
+ *
+ * @param {number} size Code entry size in bytes.
+ * @param {string} opt_name Code entry name.
+ * @constructor
+ */
+devtools.profiler.CodeMap.CodeEntry = function(size, opt_name) {
+  this.size = size;
+  this.name = opt_name || '';
+  this.nameUpdated_ = false;
+};
+
+
+devtools.profiler.CodeMap.CodeEntry.prototype.getName = function() {
+  return this.name;
+};
+
+
+devtools.profiler.CodeMap.CodeEntry.prototype.toString = function() {
+  return this.name + ': ' + this.size.toString(16);
+};
+
+
+devtools.profiler.CodeMap.NameGenerator = function() {
+  this.knownNames_ = {};
+};
+
+
+devtools.profiler.CodeMap.NameGenerator.prototype.getName = function(name) {
+  if (!(name in this.knownNames_)) {
+    this.knownNames_[name] = 0;
+    return name;
+  }
+  var count = ++this.knownNames_[name];
+  return name + ' {' + count + '}';
+};
+
+/* consarray.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/**
+ * Constructs a ConsArray object. It is used mainly for tree traversal.
+ * In this use case we have lots of arrays that we need to iterate
+ * sequentally. The internal Array implementation is horribly slow
+ * when concatenating on large (10K items) arrays due to memory copying.
+ * That's why we avoid copying memory and insead build a linked list
+ * of arrays to iterate through.
+ *
+ * @constructor
+ */
+function ConsArray() {
+  this.tail_ = new ConsArray.Cell(null, null);
+  this.currCell_ = this.tail_;
+  this.currCellPos_ = 0;
+};
+
+
+/**
+ * Concatenates another array for iterating. Empty arrays are ignored.
+ * This operation can be safely performed during ongoing ConsArray
+ * iteration.
+ *
+ * @param {Array} arr Array to concatenate.
+ */
+ConsArray.prototype.concat = function(arr) {
+  if (arr.length > 0) {
+    this.tail_.data = arr;
+    this.tail_ = this.tail_.next = new ConsArray.Cell(null, null);
+  }
+};
+
+
+/**
+ * Whether the end of iteration is reached.
+ */
+ConsArray.prototype.atEnd = function() {
+  return this.currCell_ === null ||
+      this.currCell_.data === null ||
+      this.currCellPos_ >= this.currCell_.data.length;
+};
+
+
+/**
+ * Returns the current item, moves to the next one.
+ */
+ConsArray.prototype.next = function() {
+  var result = this.currCell_.data[this.currCellPos_++];
+  if (this.currCellPos_ >= this.currCell_.data.length) {
+    this.currCell_ = this.currCell_.next;
+    this.currCellPos_ = 0;
+  }
+  return result;
+};
+
+
+/**
+ * A cell object used for constructing a list in ConsArray.
+ *
+ * @constructor
+ */
+ConsArray.Cell = function(data, next) {
+  this.data = data;
+  this.next = next;
+};
+
+
+/* csvparser.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces.
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a CSV lines parser.
+ */
+devtools.profiler.CsvParser = function() {
+};
+
+
+/**
+ * A regex for matching a CSV field.
+ * @private
+ */
+devtools.profiler.CsvParser.CSV_FIELD_RE_ = /^"((?:[^"]|"")*)"|([^,]*)/;
+
+
+/**
+ * A regex for matching a double quote.
+ * @private
+ */
+devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /""/g;
+
+
+/**
+ * Parses a line of CSV-encoded values. Returns an array of fields.
+ *
+ * @param {string} line Input line.
+ */
+devtools.profiler.CsvParser.prototype.parseLine = function(line) {
+  var fieldRe = devtools.profiler.CsvParser.CSV_FIELD_RE_;
+  var doubleQuoteRe = devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_;
+  var pos = 0;
+  var endPos = line.length;
+  var fields = [];
+  if (endPos > 0) {
+    do {
+      var fieldMatch = fieldRe.exec(line.substr(pos));
+      if (typeof fieldMatch[1] === "string") {
+        var field = fieldMatch[1];
+        pos += field.length + 3;  // Skip comma and quotes.
+        fields.push(field.replace(doubleQuoteRe, '"'));
+      } else {
+        // The second field pattern will match anything, thus
+        // in the worst case the match will be an empty string.
+        var field = fieldMatch[2];
+        pos += field.length + 1;  // Skip comma.
+        fields.push(field);
+      }
+    } while (pos <= endPos);
+  }
+  return fields;
+};
+
+/* logreader.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/**
+ * @fileoverview Log Reader is used to process log file produced by V8.
+ */
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Base class for processing log files.
+ *
+ * @param {Array.<Object>} dispatchTable A table used for parsing and processing
+ *     log records.
+ * @constructor
+ */
+devtools.profiler.LogReader = function(dispatchTable) {
+  /**
+   * @type {Array.<Object>}
+   */
+  this.dispatchTable_ = dispatchTable;
+  this.dispatchTable_['alias'] =
+      { parsers: [null, null], processor: this.processAlias_ };
+  this.dispatchTable_['repeat'] =
+      { parsers: [parseInt, 'var-args'], processor: this.processRepeat_,
+        backrefs: true };
+
+  /**
+   * A key-value map for aliases. Translates short name -> full name.
+   * @type {Object}
+   */
+  this.aliases_ = {};
+
+  /**
+   * A key-value map for previous address values.
+   * @type {Object}
+   */
+  this.prevAddresses_ = {};
+
+  /**
+   * A key-value map for events than can be backreference-compressed.
+   * @type {Object}
+   */
+  this.backRefsCommands_ = {};
+  this.initBackRefsCommands_();
+
+  /**
+   * Back references for decompression.
+   * @type {Array.<string>}
+   */
+  this.backRefs_ = [];
+
+  /**
+   * Current line.
+   * @type {number}
+   */
+  this.lineNum_ = 0;
+
+  /**
+   * CSV lines parser.
+   * @type {devtools.profiler.CsvParser}
+   */
+  this.csvParser_ = new devtools.profiler.CsvParser();
+};
+
+
+/**
+ * Creates a parser for an address entry.
+ *
+ * @param {string} addressTag Address tag to perform offset decoding.
+ * @return {function(string):number} Address parser.
+ */
+devtools.profiler.LogReader.prototype.createAddressParser = function(
+    addressTag) {
+  var self = this;
+  return (function (str) {
+    var value = parseInt(str, 16);
+    var firstChar = str.charAt(0);
+    if (firstChar == '+' || firstChar == '-') {
+      var addr = self.prevAddresses_[addressTag];
+      addr += value;
+      self.prevAddresses_[addressTag] = addr;
+      return addr;
+    } else if (firstChar != '0' || str.charAt(1) != 'x') {
+      self.prevAddresses_[addressTag] = value;
+    }
+    return value;
+  });
+};
+
+
+/**
+ * Expands an alias symbol, if applicable.
+ *
+ * @param {string} symbol Symbol to expand.
+ * @return {string} Expanded symbol, or the input symbol itself.
+ */
+devtools.profiler.LogReader.prototype.expandAlias = function(symbol) {
+  return symbol in this.aliases_ ? this.aliases_[symbol] : symbol;
+};
+
+
+/**
+ * Used for printing error messages.
+ *
+ * @param {string} str Error message.
+ */
+devtools.profiler.LogReader.prototype.printError = function(str) {
+  // Do nothing.
+};
+
+
+/**
+ * Processes a portion of V8 profiler event log.
+ *
+ * @param {string} chunk A portion of log.
+ */
+devtools.profiler.LogReader.prototype.processLogChunk = function(chunk) {
+  this.processLog_(chunk.split('\n'));
+};
+
+
+/**
+ * Processes a line of V8 profiler event log.
+ *
+ * @param {string} line A line of log.
+ */
+devtools.profiler.LogReader.prototype.processLogLine = function(line) {
+  this.processLog_([line]);
+};
+
+
+/**
+ * Processes stack record.
+ *
+ * @param {number} pc Program counter.
+ * @param {number} func JS Function.
+ * @param {Array.<string>} stack String representation of a stack.
+ * @return {Array.<number>} Processed stack.
+ */
+devtools.profiler.LogReader.prototype.processStack = function(pc, func, stack) {
+  var fullStack = func ? [pc, func] : [pc];
+  var prevFrame = pc;
+  for (var i = 0, n = stack.length; i < n; ++i) {
+    var frame = stack[i];
+    var firstChar = frame.charAt(0);
+    if (firstChar == '+' || firstChar == '-') {
+      // An offset from the previous frame.
+      prevFrame += parseInt(frame, 16);
+      fullStack.push(prevFrame);
+    // Filter out possible 'overflow' string.
+    } else if (firstChar != 'o') {
+      fullStack.push(parseInt(frame, 16));
+    }
+  }
+  return fullStack;
+};
+
+
+/**
+ * Returns whether a particular dispatch must be skipped.
+ *
+ * @param {!Object} dispatch Dispatch record.
+ * @return {boolean} True if dispatch must be skipped.
+ */
+devtools.profiler.LogReader.prototype.skipDispatch = function(dispatch) {
+  return false;
+};
+
+
+/**
+ * Does a dispatch of a log record.
+ *
+ * @param {Array.<string>} fields Log record.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.dispatchLogRow_ = function(fields) {
+  // Obtain the dispatch.
+  var command = fields[0];
+  if (!(command in this.dispatchTable_)) {
+    throw new Error('unknown command: ' + command);
+  }
+  var dispatch = this.dispatchTable_[command];
+
+  if (dispatch === null || this.skipDispatch(dispatch)) {
+    return;
+  }
+
+  // Parse fields.
+  var parsedFields = [];
+  for (var i = 0; i < dispatch.parsers.length; ++i) {
+    var parser = dispatch.parsers[i];
+    if (parser === null) {
+      parsedFields.push(fields[1 + i]);
+    } else if (typeof parser == 'function') {
+      parsedFields.push(parser(fields[1 + i]));
+    } else {
+      // var-args
+      parsedFields.push(fields.slice(1 + i));
+      break;
+    }
+  }
+
+  // Run the processor.
+  dispatch.processor.apply(this, parsedFields);
+};
+
+
+/**
+ * Decompresses a line if it was backreference-compressed.
+ *
+ * @param {string} line Possibly compressed line.
+ * @return {string} Decompressed line.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.expandBackRef_ = function(line) {
+  var backRefPos;
+  // Filter out case when a regexp is created containing '#'.
+  if (line.charAt(line.length - 1) != '"'
+      && (backRefPos = line.lastIndexOf('#')) != -1) {
+    var backRef = line.substr(backRefPos + 1);
+    var backRefIdx = parseInt(backRef, 10) - 1;
+    var colonPos = backRef.indexOf(':');
+    var backRefStart =
+        colonPos != -1 ? parseInt(backRef.substr(colonPos + 1), 10) : 0;
+    line = line.substr(0, backRefPos) +
+        this.backRefs_[backRefIdx].substr(backRefStart);
+  }
+  this.backRefs_.unshift(line);
+  if (this.backRefs_.length > 10) {
+    this.backRefs_.length = 10;
+  }
+  return line;
+};
+
+
+/**
+ * Initializes the map of backward reference compressible commands.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.initBackRefsCommands_ = function() {
+  for (var event in this.dispatchTable_) {
+    var dispatch = this.dispatchTable_[event];
+    if (dispatch && dispatch.backrefs) {
+      this.backRefsCommands_[event] = true;
+    }
+  }
+};
+
+
+/**
+ * Processes alias log record. Adds an alias to a corresponding map.
+ *
+ * @param {string} symbol Short name.
+ * @param {string} expansion Long name.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processAlias_ = function(
+    symbol, expansion) {
+  if (expansion in this.dispatchTable_) {
+    this.dispatchTable_[symbol] = this.dispatchTable_[expansion];
+    if (expansion in this.backRefsCommands_) {
+      this.backRefsCommands_[symbol] = true;
+    }
+  } else {
+    this.aliases_[symbol] = expansion;
+  }
+};
+
+
+/**
+ * Processes log lines.
+ *
+ * @param {Array.<string>} lines Log lines.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processLog_ = function(lines) {
+  for (var i = 0, n = lines.length; i < n; ++i, ++this.lineNum_) {
+    var line = lines[i];
+    if (!line) {
+      continue;
+    }
+    try {
+      if (line.charAt(0) == '#' ||
+          line.substr(0, line.indexOf(',')) in this.backRefsCommands_) {
+        line = this.expandBackRef_(line);
+      }
+      var fields = this.csvParser_.parseLine(line);
+      this.dispatchLogRow_(fields);
+    } catch (e) {
+      this.printError('line ' + (this.lineNum_ + 1) + ': ' + (e.message || e));
+    }
+  }
+};
+
+
+/**
+ * Processes repeat log record. Expands it according to calls count and
+ * invokes processing.
+ *
+ * @param {number} count Count.
+ * @param {Array.<string>} cmd Parsed command.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processRepeat_ = function(count, cmd) {
+  // Replace the repeat-prefixed command from backrefs list with a non-prefixed.
+  this.backRefs_[0] = cmd.join(',');
+  for (var i = 0; i < count; ++i) {
+    this.dispatchLogRow_(cmd);
+  }
+};
+
+/* profile.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a profile object for processing profiling-related events
+ * and calculating function execution times.
+ *
+ * @constructor
+ */
+devtools.profiler.Profile = function() {
+  this.codeMap_ = new devtools.profiler.CodeMap();
+  this.topDownTree_ = new devtools.profiler.CallTree();
+  this.bottomUpTree_ = new devtools.profiler.CallTree();
+};
+
+/**
+ * Version of profiler log.
+ */
+devtools.profiler.Profile.VERSION = 2;
+
+
+/**
+ * Returns whether a function with the specified name must be skipped.
+ * Should be overriden by subclasses.
+ *
+ * @param {string} name Function name.
+ */
+devtools.profiler.Profile.prototype.skipThisFunction = function(name) {
+  return false;
+};
+
+
+/**
+ * Enum for profiler operations that involve looking up existing
+ * code entries.
+ *
+ * @enum {number}
+ */
+devtools.profiler.Profile.Operation = {
+  MOVE: 0,
+  DELETE: 1,
+  TICK: 2
+};
+
+
+/**
+ * Called whenever the specified operation has failed finding a function
+ * containing the specified address. Should be overriden by subclasses.
+ * See the devtools.profiler.Profile.Operation enum for the list of
+ * possible operations.
+ *
+ * @param {number} operation Operation.
+ * @param {number} addr Address of the unknown code.
+ * @param {number} opt_stackPos If an unknown address is encountered
+ *     during stack strace processing, specifies a position of the frame
+ *     containing the address.
+ */
+devtools.profiler.Profile.prototype.handleUnknownCode = function(
+    operation, addr, opt_stackPos) {
+};
+
+
+/**
+ * Registers a library.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+devtools.profiler.Profile.prototype.addLibrary = function(
+    name, startAddr, endAddr) {
+  var entry = new devtools.profiler.CodeMap.CodeEntry(
+      endAddr - startAddr, name);
+  this.codeMap_.addLibrary(startAddr, entry);
+  return entry;
+};
+
+
+/**
+ * Registers statically compiled code entry.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+devtools.profiler.Profile.prototype.addStaticCode = function(
+    name, startAddr, endAddr) {
+  var entry = new devtools.profiler.CodeMap.CodeEntry(
+      endAddr - startAddr, name);
+  this.codeMap_.addStaticCode(startAddr, entry);
+  return entry;
+};
+
+
+/**
+ * Registers dynamic (JIT-compiled) code entry.
+ *
+ * @param {string} type Code entry type.
+ * @param {string} name Code entry name.
+ * @param {number} start Starting address.
+ * @param {number} size Code entry size.
+ */
+devtools.profiler.Profile.prototype.addCode = function(
+    type, name, start, size) {
+  var entry = new devtools.profiler.Profile.DynamicCodeEntry(size, type, name);
+  this.codeMap_.addCode(start, entry);
+  return entry;
+};
+
+
+/**
+ * Creates an alias entry for a code entry.
+ *
+ * @param {number} aliasAddr Alias address.
+ * @param {number} addr Code entry address.
+ */
+devtools.profiler.Profile.prototype.addCodeAlias = function(
+    aliasAddr, addr) {
+  var entry = this.codeMap_.findDynamicEntryByStartAddress(addr);
+  if (entry) {
+    this.codeMap_.addCode(aliasAddr, entry);
+  }
+};
+
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+devtools.profiler.Profile.prototype.moveCode = function(from, to) {
+  try {
+    this.codeMap_.moveCode(from, to);
+  } catch (e) {
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.MOVE, from);
+  }
+};
+
+
+/**
+ * Reports about deletion of a dynamic code entry.
+ *
+ * @param {number} start Starting address.
+ */
+devtools.profiler.Profile.prototype.deleteCode = function(start) {
+  try {
+    this.codeMap_.deleteCode(start);
+  } catch (e) {
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.DELETE, start);
+  }
+};
+
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+devtools.profiler.Profile.prototype.safeMoveDynamicCode = function(from, to) {
+  if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
+    this.codeMap_.moveCode(from, to);
+  }
+};
+
+
+/**
+ * Reports about deletion of a dynamic code entry.
+ *
+ * @param {number} start Starting address.
+ */
+devtools.profiler.Profile.prototype.safeDeleteDynamicCode = function(start) {
+  if (this.codeMap_.findDynamicEntryByStartAddress(start)) {
+    this.codeMap_.deleteCode(start);
+  }
+};
+
+
+/**
+ * Retrieves a code entry by an address.
+ *
+ * @param {number} addr Entry address.
+ */
+devtools.profiler.Profile.prototype.findEntry = function(addr) {
+  return this.codeMap_.findEntry(addr);
+};
+
+
+/**
+ * Records a tick event. Stack must contain a sequence of
+ * addresses starting with the program counter value.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+devtools.profiler.Profile.prototype.recordTick = function(stack) {
+  var processedStack = this.resolveAndFilterFuncs_(stack);
+  this.bottomUpTree_.addPath(processedStack);
+  processedStack.reverse();
+  this.topDownTree_.addPath(processedStack);
+};
+
+
+/**
+ * Translates addresses into function names and filters unneeded
+ * functions.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+devtools.profiler.Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
+  var result = [];
+  for (var i = 0; i < stack.length; ++i) {
+    var entry = this.codeMap_.findEntry(stack[i]);
+    if (entry) {
+      var name = entry.getName();
+      if (!this.skipThisFunction(name)) {
+        result.push(name);
+      }
+    } else {
+      this.handleUnknownCode(
+          devtools.profiler.Profile.Operation.TICK, stack[i], i);
+    }
+  }
+  return result;
+};
+
+
+/**
+ * Performs a BF traversal of the top down call graph.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.Profile.prototype.traverseTopDownTree = function(f) {
+  this.topDownTree_.traverse(f);
+};
+
+
+/**
+ * Performs a BF traversal of the bottom up call graph.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.Profile.prototype.traverseBottomUpTree = function(f) {
+  this.bottomUpTree_.traverse(f);
+};
+
+
+/**
+ * Calculates a top down profile for a node with the specified label.
+ * If no name specified, returns the whole top down calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getTopDownProfile = function(opt_label) {
+  return this.getTreeProfile_(this.topDownTree_, opt_label);
+};
+
+
+/**
+ * Calculates a bottom up profile for a node with the specified label.
+ * If no name specified, returns the whole bottom up calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getBottomUpProfile = function(opt_label) {
+  return this.getTreeProfile_(this.bottomUpTree_, opt_label);
+};
+
+
+/**
+ * Helper function for calculating a tree profile.
+ *
+ * @param {devtools.profiler.Profile.CallTree} tree Call tree.
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
+  if (!opt_label) {
+    tree.computeTotalWeights();
+    return tree;
+  } else {
+    var subTree = tree.cloneSubtree(opt_label);
+    subTree.computeTotalWeights();
+    return subTree;
+  }
+};
+
+
+/**
+ * Calculates a flat profile of callees starting from a node with
+ * the specified label. If no name specified, starts from the root.
+ *
+ * @param {string} opt_label Starting node label.
+ */
+devtools.profiler.Profile.prototype.getFlatProfile = function(opt_label) {
+  var counters = new devtools.profiler.CallTree();
+  var rootLabel = opt_label || devtools.profiler.CallTree.ROOT_NODE_LABEL;
+  var precs = {};
+  precs[rootLabel] = 0;
+  var root = counters.findOrAddChild(rootLabel);
+
+  this.topDownTree_.computeTotalWeights();
+  this.topDownTree_.traverseInDepth(
+    function onEnter(node) {
+      if (!(node.label in precs)) {
+        precs[node.label] = 0;
+      }
+      var nodeLabelIsRootLabel = node.label == rootLabel;
+      if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
+        if (precs[rootLabel] == 0) {
+          root.selfWeight += node.selfWeight;
+          root.totalWeight += node.totalWeight;
+        } else {
+          var rec = root.findOrAddChild(node.label);
+          rec.selfWeight += node.selfWeight;
+          if (nodeLabelIsRootLabel || precs[node.label] == 0) {
+            rec.totalWeight += node.totalWeight;
+          }
+        }
+        precs[node.label]++;
+      }
+    },
+    function onExit(node) {
+      if (node.label == rootLabel || precs[rootLabel] > 0) {
+        precs[node.label]--;
+      }
+    },
+    null);
+
+  if (!opt_label) {
+    // If we have created a flat profile for the whole program, we don't
+    // need an explicit root in it. Thus, replace the counters tree
+    // root with the node corresponding to the whole program.
+    counters.root_ = root;
+  } else {
+    // Propagate weights so percents can be calculated correctly.
+    counters.getRoot().selfWeight = root.selfWeight;
+    counters.getRoot().totalWeight = root.totalWeight;
+  }
+  return counters;
+};
+
+
+/**
+ * Creates a dynamic code entry.
+ *
+ * @param {number} size Code size.
+ * @param {string} type Code type.
+ * @param {string} name Function name.
+ * @constructor
+ */
+devtools.profiler.Profile.DynamicCodeEntry = function(size, type, name) {
+  devtools.profiler.CodeMap.CodeEntry.call(this, size, name);
+  this.type = type;
+};
+
+
+/**
+ * Returns node name.
+ */
+devtools.profiler.Profile.DynamicCodeEntry.prototype.getName = function() {
+  var name = this.name;
+  if (name.length == 0) {
+    name = '<anonymous>';
+  } else if (name.charAt(0) == ' ') {
+    // An anonymous function with location: " aaa.js:10".
+    name = '<anonymous>' + name;
+  }
+  return this.type + ': ' + name;
+};
+
+
+/**
+ * Returns raw node name (without type decoration).
+ */
+devtools.profiler.Profile.DynamicCodeEntry.prototype.getRawName = function() {
+  return this.name;
+};
+
+
+devtools.profiler.Profile.DynamicCodeEntry.prototype.isJSFunction = function() {
+  return this.type == "Function" ||
+    this.type == "LazyCompile" ||
+    this.type == "Script";
+};
+
+
+/**
+ * Constructs a call graph.
+ *
+ * @constructor
+ */
+devtools.profiler.CallTree = function() {
+  this.root_ = new devtools.profiler.CallTree.Node(
+      devtools.profiler.CallTree.ROOT_NODE_LABEL);
+};
+
+
+/**
+ * The label of the root node.
+ */
+devtools.profiler.CallTree.ROOT_NODE_LABEL = '';
+
+
+/**
+ * @private
+ */
+devtools.profiler.CallTree.prototype.totalsComputed_ = false;
+
+
+/**
+ * Returns the tree root.
+ */
+devtools.profiler.CallTree.prototype.getRoot = function() {
+  return this.root_;
+};
+
+
+/**
+ * Adds the specified call path, constructing nodes as necessary.
+ *
+ * @param {Array<string>} path Call path.
+ */
+devtools.profiler.CallTree.prototype.addPath = function(path) {
+  if (path.length == 0) {
+    return;
+  }
+  var curr = this.root_;
+  for (var i = 0; i < path.length; ++i) {
+    curr = curr.findOrAddChild(path[i]);
+  }
+  curr.selfWeight++;
+  this.totalsComputed_ = false;
+};
+
+
+/**
+ * Finds an immediate child of the specified parent with the specified
+ * label, creates a child node if necessary. If a parent node isn't
+ * specified, uses tree root.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.prototype.findOrAddChild = function(label) {
+  return this.root_.findOrAddChild(label);
+};
+
+
+/**
+ * Creates a subtree by cloning and merging all subtrees rooted at nodes
+ * with a given label. E.g. cloning the following call tree on label 'A'
+ * will give the following result:
+ *
+ *           <A>--<B>                                     <B>
+ *          /                                            /
+ *     <root>             == clone on 'A' ==>  <root>--<A>
+ *          \                                            \
+ *           <C>--<A>--<D>                                <D>
+ *
+ * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
+ * source call tree.
+ *
+ * @param {string} label The label of the new root node.
+ */
+devtools.profiler.CallTree.prototype.cloneSubtree = function(label) {
+  var subTree = new devtools.profiler.CallTree();
+  this.traverse(function(node, parent) {
+    if (!parent && node.label != label) {
+      return null;
+    }
+    var child = (parent ? parent : subTree).findOrAddChild(node.label);
+    child.selfWeight += node.selfWeight;
+    return child;
+  });
+  return subTree;
+};
+
+
+/**
+ * Computes total weights in the call graph.
+ */
+devtools.profiler.CallTree.prototype.computeTotalWeights = function() {
+  if (this.totalsComputed_) {
+    return;
+  }
+  this.root_.computeTotalWeight();
+  this.totalsComputed_ = true;
+};
+
+
+/**
+ * Traverses the call graph in preorder. This function can be used for
+ * building optionally modified tree clones. This is the boilerplate code
+ * for this scenario:
+ *
+ * callTree.traverse(function(node, parentClone) {
+ *   var nodeClone = cloneNode(node);
+ *   if (parentClone)
+ *     parentClone.addChild(nodeClone);
+ *   return nodeClone;
+ * });
+ *
+ * @param {function(devtools.profiler.CallTree.Node, *)} f Visitor function.
+ *    The second parameter is the result of calling 'f' on the parent node.
+ */
+devtools.profiler.CallTree.prototype.traverse = function(f) {
+  var pairsToProcess = new ConsArray();
+  pairsToProcess.concat([{node: this.root_, param: null}]);
+  while (!pairsToProcess.atEnd()) {
+    var pair = pairsToProcess.next();
+    var node = pair.node;
+    var newParam = f(node, pair.param);
+    var morePairsToProcess = [];
+    node.forEachChild(function (child) {
+        morePairsToProcess.push({node: child, param: newParam}); });
+    pairsToProcess.concat(morePairsToProcess);
+  }
+};
+
+
+/**
+ * Performs an indepth call graph traversal.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} enter A function called
+ *     prior to visiting node's children.
+ * @param {function(devtools.profiler.CallTree.Node)} exit A function called
+ *     after visiting node's children.
+ */
+devtools.profiler.CallTree.prototype.traverseInDepth = function(enter, exit) {
+  function traverse(node) {
+    enter(node);
+    node.forEachChild(traverse);
+    exit(node);
+  }
+  traverse(this.root_);
+};
+
+
+/**
+ * Constructs a call graph node.
+ *
+ * @param {string} label Node label.
+ * @param {devtools.profiler.CallTree.Node} opt_parent Node parent.
+ */
+devtools.profiler.CallTree.Node = function(label, opt_parent) {
+  this.label = label;
+  this.parent = opt_parent;
+  this.children = {};
+};
+
+
+/**
+ * Node self weight (how many times this node was the last node in
+ * a call path).
+ * @type {number}
+ */
+devtools.profiler.CallTree.Node.prototype.selfWeight = 0;
+
+
+/**
+ * Node total weight (includes weights of all children).
+ * @type {number}
+ */
+devtools.profiler.CallTree.Node.prototype.totalWeight = 0;
+
+
+/**
+ * Adds a child node.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.addChild = function(label) {
+  var child = new devtools.profiler.CallTree.Node(label, this);
+  this.children[label] = child;
+  return child;
+};
+
+
+/**
+ * Computes node's total weight.
+ */
+devtools.profiler.CallTree.Node.prototype.computeTotalWeight =
+    function() {
+  var totalWeight = this.selfWeight;
+  this.forEachChild(function(child) {
+      totalWeight += child.computeTotalWeight(); });
+  return this.totalWeight = totalWeight;
+};
+
+
+/**
+ * Returns all node's children as an array.
+ */
+devtools.profiler.CallTree.Node.prototype.exportChildren = function() {
+  var result = [];
+  this.forEachChild(function (node) { result.push(node); });
+  return result;
+};
+
+
+/**
+ * Finds an immediate child with the specified label.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.findChild = function(label) {
+  return this.children[label] || null;
+};
+
+
+/**
+ * Finds an immediate child with the specified label, creates a child
+ * node if necessary.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.findOrAddChild = function(label) {
+  return this.findChild(label) || this.addChild(label);
+};
+
+
+/**
+ * Calls the specified function for every child.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.forEachChild = function(f) {
+  for (var c in this.children) {
+    f(this.children[c]);
+  }
+};
+
+
+/**
+ * Walks up from the current node up to the call tree root.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.walkUpToRoot = function(f) {
+  for (var curr = this; curr != null; curr = curr.parent) {
+    f(curr);
+  }
+};
+
+
+/**
+ * Tries to find a node with the specified path.
+ *
+ * @param {Array<string>} labels The path.
+ * @param {function(devtools.profiler.CallTree.Node)} opt_f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.descendToChild = function(
+    labels, opt_f) {
+  for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
+    var child = curr.findChild(labels[pos]);
+    if (opt_f) {
+      opt_f(child, pos);
+    }
+    curr = child;
+  }
+  return curr;
+};
+
+/* profile_view.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a Profile View builder object.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+devtools.profiler.ViewBuilder = function(samplingRate) {
+  this.samplingRate = samplingRate;
+};
+
+
+/**
+ * Builds a profile view for the specified call tree.
+ *
+ * @param {devtools.profiler.CallTree} callTree A call tree.
+ * @param {boolean} opt_bottomUpViewWeights Whether remapping
+ *     of self weights for a bottom up view is needed.
+ */
+devtools.profiler.ViewBuilder.prototype.buildView = function(
+    callTree, opt_bottomUpViewWeights) {
+  var head;
+  var samplingRate = this.samplingRate;
+  var createViewNode = this.createViewNode;
+  callTree.traverse(function(node, viewParent) {
+    var totalWeight = node.totalWeight * samplingRate;
+    var selfWeight = node.selfWeight * samplingRate;
+    if (opt_bottomUpViewWeights === true) {
+      if (viewParent === head) {
+        selfWeight = totalWeight;
+      } else {
+        selfWeight = 0;
+      }
+    }
+    var viewNode = createViewNode(node.label, totalWeight, selfWeight, head);
+    if (viewParent) {
+      viewParent.addChild(viewNode);
+    } else {
+      head = viewNode;
+    }
+    return viewNode;
+  });
+  var view = this.createView(head);
+  return view;
+};
+
+
+/**
+ * Factory method for a profile view.
+ *
+ * @param {devtools.profiler.ProfileView.Node} head View head node.
+ * @return {devtools.profiler.ProfileView} Profile view.
+ */
+devtools.profiler.ViewBuilder.prototype.createView = function(head) {
+  return new devtools.profiler.ProfileView(head);
+};
+
+
+/**
+ * Factory method for a profile view node.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @return {devtools.profiler.ProfileView.Node} Profile view node.
+ */
+devtools.profiler.ViewBuilder.prototype.createViewNode = function(
+    funcName, totalTime, selfTime, head) {
+  return new devtools.profiler.ProfileView.Node(
+      funcName, totalTime, selfTime, head);
+};
+
+
+/**
+ * Creates a Profile View object. It allows to perform sorting
+ * and filtering actions on the profile.
+ *
+ * @param {devtools.profiler.ProfileView.Node} head Head (root) node.
+ * @constructor
+ */
+devtools.profiler.ProfileView = function(head) {
+  this.head = head;
+};
+
+
+/**
+ * Sorts the profile view using the specified sort function.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.prototype.sort = function(sortFunc) {
+  this.traverse(function (node) {
+    node.sortChildren(sortFunc);
+  });
+};
+
+
+/**
+ * Traverses profile view nodes in preorder.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function.
+ */
+devtools.profiler.ProfileView.prototype.traverse = function(f) {
+  var nodesToTraverse = new ConsArray();
+  nodesToTraverse.concat([this.head]);
+  while (!nodesToTraverse.atEnd()) {
+    var node = nodesToTraverse.next();
+    f(node);
+    nodesToTraverse.concat(node.children);
+  }
+};
+
+
+/**
+ * Constructs a Profile View node object. Each node object corresponds to
+ * a function call.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+devtools.profiler.ProfileView.Node = function(
+    internalFuncName, totalTime, selfTime, head) {
+  this.internalFuncName = internalFuncName;
+  this.totalTime = totalTime;
+  this.selfTime = selfTime;
+  this.head = head;
+  this.parent = null;
+  this.children = [];
+};
+
+
+/**
+ * Returns a share of the function's total time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'totalPercent',
+    function() { return this.totalTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's self time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'selfPercent',
+    function() { return this.selfTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's total time in its parent's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'parentTotalPercent',
+    function() { return this.totalTime /
+      (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Adds a child to the node.
+ *
+ * @param {devtools.profiler.ProfileView.Node} node Child node.
+ */
+devtools.profiler.ProfileView.Node.prototype.addChild = function(node) {
+  node.parent = this;
+  this.children.push(node);
+};
+
+
+/**
+ * Sorts all the node's children recursively.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.Node.prototype.sortChildren = function(
+    sortFunc) {
+  this.children.sort(sortFunc);
+};
+
+/* splaytree.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// A namespace stub. It will become more clear how to declare it properly
+// during integration of this script into Dev Tools.
+var goog = goog || {};
+goog.structs = goog.structs || {};
+
+
+/**
+ * Constructs a Splay tree.  A splay tree is a self-balancing binary
+ * search tree with the additional property that recently accessed
+ * elements are quick to access again. It performs basic operations
+ * such as insertion, look-up and removal in O(log(n)) amortized time.
+ *
+ * @constructor
+ */
+goog.structs.SplayTree = function() {
+};
+
+
+/**
+ * Pointer to the root node of the tree.
+ *
+ * @type {goog.structs.SplayTree.Node}
+ * @private
+ */
+goog.structs.SplayTree.prototype.root_ = null;
+
+
+/**
+ * @return {boolean} Whether the tree is empty.
+ */
+goog.structs.SplayTree.prototype.isEmpty = function() {
+  return !this.root_;
+};
+
+
+
+/**
+ * Inserts a node into the tree with the specified key and value if
+ * the tree does not already contain a node with the specified key. If
+ * the value is inserted, it becomes the root of the tree.
+ *
+ * @param {number} key Key to insert into the tree.
+ * @param {*} value Value to insert into the tree.
+ */
+goog.structs.SplayTree.prototype.insert = function(key, value) {
+  if (this.isEmpty()) {
+    this.root_ = new goog.structs.SplayTree.Node(key, value);
+    return;
+  }
+  // Splay on the key to move the last node on the search path for
+  // the key to the root of the tree.
+  this.splay_(key);
+  if (this.root_.key == key) {
+    return;
+  }
+  var node = new goog.structs.SplayTree.Node(key, value);
+  if (key > this.root_.key) {
+    node.left = this.root_;
+    node.right = this.root_.right;
+    this.root_.right = null;
+  } else {
+    node.right = this.root_;
+    node.left = this.root_.left;
+    this.root_.left = null;
+  }
+  this.root_ = node;
+};
+
+
+/**
+ * Removes a node with the specified key from the tree if the tree
+ * contains a node with this key. The removed node is returned. If the
+ * key is not found, an exception is thrown.
+ *
+ * @param {number} key Key to find and remove from the tree.
+ * @return {goog.structs.SplayTree.Node} The removed node.
+ */
+goog.structs.SplayTree.prototype.remove = function(key) {
+  if (this.isEmpty()) {
+    throw Error('Key not found: ' + key);
+  }
+  this.splay_(key);
+  if (this.root_.key != key) {
+    throw Error('Key not found: ' + key);
+  }
+  var removed = this.root_;
+  if (!this.root_.left) {
+    this.root_ = this.root_.right;
+  } else {
+    var right = this.root_.right;
+    this.root_ = this.root_.left;
+    // Splay to make sure that the new root has an empty right child.
+    this.splay_(key);
+    // Insert the original right child as the right child of the new
+    // root.
+    this.root_.right = right;
+  }
+  return removed;
+};
+
+
+/**
+ * Returns the node having the specified key or null if the tree doesn't contain
+ * a node with the specified key.
+ *
+ * @param {number} key Key to find in the tree.
+ * @return {goog.structs.SplayTree.Node} Node having the specified key.
+ */
+goog.structs.SplayTree.prototype.find = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  this.splay_(key);
+  return this.root_.key == key ? this.root_ : null;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the minimum key value.
+ */
+goog.structs.SplayTree.prototype.findMin = function() {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = this.root_;
+  while (current.left) {
+    current = current.left;
+  }
+  return current;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the maximum key value.
+ */
+goog.structs.SplayTree.prototype.findMax = function(opt_startNode) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = opt_startNode || this.root_;
+  while (current.right) {
+    current = current.right;
+  }
+  return current;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the maximum key value that
+ *     is less or equal to the specified key value.
+ */
+goog.structs.SplayTree.prototype.findGreatestLessThan = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  // Splay on the key to move the node with the given key or the last
+  // node on the search path to the top of the tree.
+  this.splay_(key);
+  // Now the result is either the root node or the greatest node in
+  // the left subtree.
+  if (this.root_.key <= key) {
+    return this.root_;
+  } else if (this.root_.left) {
+    return this.findMax(this.root_.left);
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @return {Array<*>} An array containing all the values of tree's nodes.
+ */
+goog.structs.SplayTree.prototype.exportValues = function() {
+  var result = [];
+  this.traverse_(function(node) { result.push(node.value); });
+  return result;
+};
+
+
+/**
+ * Perform the splay operation for the given key. Moves the node with
+ * the given key to the top of the tree.  If no node has the given
+ * key, the last node on the search path is moved to the top of the
+ * tree. This is the simplified top-down splaying algorithm from:
+ * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+ *
+ * @param {number} key Key to splay the tree on.
+ * @private
+ */
+goog.structs.SplayTree.prototype.splay_ = function(key) {
+  if (this.isEmpty()) {
+    return;
+  }
+  // Create a dummy node.  The use of the dummy node is a bit
+  // counter-intuitive: The right child of the dummy node will hold
+  // the L tree of the algorithm.  The left child of the dummy node
+  // will hold the R tree of the algorithm.  Using a dummy node, left
+  // and right will always be nodes and we avoid special cases.
+  var dummy, left, right;
+  dummy = left = right = new goog.structs.SplayTree.Node(null, null);
+  var current = this.root_;
+  while (true) {
+    if (key < current.key) {
+      if (!current.left) {
+        break;
+      }
+      if (key < current.left.key) {
+        // Rotate right.
+        var tmp = current.left;
+        current.left = tmp.right;
+        tmp.right = current;
+        current = tmp;
+        if (!current.left) {
+          break;
+        }
+      }
+      // Link right.
+      right.left = current;
+      right = current;
+      current = current.left;
+    } else if (key > current.key) {
+      if (!current.right) {
+        break;
+      }
+      if (key > current.right.key) {
+        // Rotate left.
+        var tmp = current.right;
+        current.right = tmp.left;
+        tmp.left = current;
+        current = tmp;
+        if (!current.right) {
+          break;
+        }
+      }
+      // Link left.
+      left.right = current;
+      left = current;
+      current = current.right;
+    } else {
+      break;
+    }
+  }
+  // Assemble.
+  left.right = current.left;
+  right.left = current.right;
+  current.left = dummy.right;
+  current.right = dummy.left;
+  this.root_ = current;
+};
+
+
+/**
+ * Performs a preorder traversal of the tree.
+ *
+ * @param {function(goog.structs.SplayTree.Node)} f Visitor function.
+ * @private
+ */
+goog.structs.SplayTree.prototype.traverse_ = function(f) {
+  var nodesToVisit = [this.root_];
+  while (nodesToVisit.length > 0) {
+    var node = nodesToVisit.shift();
+    if (node == null) {
+      continue;
+    }
+    f(node);
+    nodesToVisit.push(node.left);
+    nodesToVisit.push(node.right);
+  }
+};
+
+
+/**
+ * Constructs a Splay tree node.
+ *
+ * @param {number} key Key.
+ * @param {*} value Value.
+ */
+goog.structs.SplayTree.Node = function(key, value) {
+  this.key = key;
+  this.value = value;
+};
+
+
+/**
+ * @type {goog.structs.SplayTree.Node}
+ */
+goog.structs.SplayTree.Node.prototype.left = null;
+
+
+/**
+ * @type {goog.structs.SplayTree.Node}
+ */
+goog.structs.SplayTree.Node.prototype.right = null;
+
+/* InspectorControllerImpl.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview DevTools' implementation of the InspectorController API.
+ */
+
+if (!this.devtools)
+    devtools = {};
+
+devtools.InspectorBackendImpl = function()
+{
+    WebInspector.InspectorBackendStub.call(this);
+    this.installInspectorControllerDelegate_("clearMessages");
+    this.installInspectorControllerDelegate_("copyNode");
+    this.installInspectorControllerDelegate_("deleteCookie");
+    this.installInspectorControllerDelegate_("didEvaluateForTestInFrontend");
+    this.installInspectorControllerDelegate_("disableResourceTracking");
+    this.installInspectorControllerDelegate_("disableSearchingForNode");
+    this.installInspectorControllerDelegate_("disableTimeline");
+    this.installInspectorControllerDelegate_("enableResourceTracking");
+    this.installInspectorControllerDelegate_("enableSearchingForNode");
+    this.installInspectorControllerDelegate_("enableTimeline");
+    this.installInspectorControllerDelegate_("getChildNodes");
+    this.installInspectorControllerDelegate_("getCookies");
+    this.installInspectorControllerDelegate_("getDatabaseTableNames");
+    this.installInspectorControllerDelegate_("getDOMStorageEntries");
+    this.installInspectorControllerDelegate_("getEventListenersForNode");
+    this.installInspectorControllerDelegate_("getResourceContent");
+    this.installInspectorControllerDelegate_("highlightDOMNode");
+    this.installInspectorControllerDelegate_("hideDOMNodeHighlight");
+    this.installInspectorControllerDelegate_("releaseWrapperObjectGroup");
+    this.installInspectorControllerDelegate_("reloadPage");
+    this.installInspectorControllerDelegate_("removeAttribute");
+    this.installInspectorControllerDelegate_("removeDOMStorageItem");
+    this.installInspectorControllerDelegate_("removeNode");
+    this.installInspectorControllerDelegate_("saveFrontendSettings");
+    this.installInspectorControllerDelegate_("setAttribute");
+    this.installInspectorControllerDelegate_("setDOMStorageItem");
+    this.installInspectorControllerDelegate_("setInjectedScriptSource");
+    this.installInspectorControllerDelegate_("setTextNodeValue");
+    this.installInspectorControllerDelegate_("startTimelineProfiler");
+    this.installInspectorControllerDelegate_("stopTimelineProfiler");
+    this.installInspectorControllerDelegate_("storeLastActivePanel");
+};
+devtools.InspectorBackendImpl.prototype.__proto__ = WebInspector.InspectorBackendStub.prototype;
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.debuggerEnabled = function()
+{
+    return true;
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.profilerEnabled = function()
+{
+    return true;
+};
+
+
+devtools.InspectorBackendImpl.prototype.setBreakpoint = function(sourceID, line, enabled, condition)
+{
+    this.removeBreakpoint(sourceID, line);
+    if (enabled)
+        devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
+};
+
+
+devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(sourceID, line)
+{
+    devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
+};
+
+
+devtools.InspectorBackendImpl.prototype.activateBreakpoints = function()
+{
+    devtools.tools.getDebuggerAgent().setBreakpointsActivated(true);
+};
+
+
+devtools.InspectorBackendImpl.prototype.deactivateBreakpoints = function()
+{
+    devtools.tools.getDebuggerAgent().setBreakpointsActivated(false);
+};
+
+
+devtools.InspectorBackendImpl.prototype.pauseInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().pauseExecution();
+};
+
+
+devtools.InspectorBackendImpl.prototype.resumeDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().resumeExecution();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepIntoStatement();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepOutOfFunction();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepOverStatement();
+};
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.setPauseOnExceptionsState = function(state)
+{
+    this._setPauseOnExceptionsState = state;
+    // TODO(yurys): support all three states. See http://crbug.com/32877
+    var enabled = (state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
+    WebInspector.updatePauseOnExceptionsState(enabled ? WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions : WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
+    devtools.tools.getDebuggerAgent().setPauseOnExceptions(enabled);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function()
+{
+    return devtools.tools.getDebuggerAgent().pauseOnExceptions();
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(value)
+{
+    return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.startProfiling = function()
+{
+    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.stopProfiling = function()
+{
+    devtools.tools.getProfilerAgent().stopProfiling( devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId)
+{
+    WebInspector.didGetProfileHeaders(callId, []);
+};
+
+
+/**
+ * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
+ * and is able to retrieve them by uid using "getProfile".
+ */
+devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile)
+{
+    WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
+    WebInspector.__fullProfiles[profile.uid] = profile;
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid)
+{
+    if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
+        WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function()
+{
+    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
+        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
+        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript = function(callId, injectedScriptId, methodName, argsString, async)
+{
+    // Encode injectedScriptId into callId
+    if (typeof injectedScriptId !== "number")
+        injectedScriptId = 0;
+    RemoteToolsAgent.dispatchOnInjectedScript(callId, injectedScriptId, methodName, argsString, async);
+};
+
+
+/**
+ * Installs delegating handler into the inspector controller.
+ * @param {string} methodName Method to install delegating handler for.
+ */
+devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_ = function(methodName)
+{
+    this[methodName] = this.callInspectorController_.bind(this, methodName);
+};
+
+
+/**
+ * Bound function with the installInjectedScriptDelegate_ actual
+ * implementation.
+ */
+devtools.InspectorBackendImpl.prototype.callInspectorController_ = function(methodName, var_arg)
+{
+    var args = Array.prototype.slice.call(arguments, 1);
+    RemoteToolsAgent.dispatchOnInspectorController(WebInspector.Callback.wrap(function(){}), methodName, JSON.stringify(args));
+};
+
+
+InspectorBackend = new devtools.InspectorBackendImpl();
+
+/* DebuggerAgent.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Provides communication interface to remote v8 debugger. See
+ * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol
+ */
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @constructor
+ */
+devtools.DebuggerAgent = function()
+{
+    RemoteDebuggerAgent.debuggerOutput = this.handleDebuggerOutput_.bind(this);
+    RemoteDebuggerAgent.setContextId = this.setContextId_.bind(this);
+
+    /**
+     * Id of the inspected page global context. It is used for filtering scripts.
+     * @type {number}
+     */
+    this.contextId_ = null;
+
+    /**
+     * Mapping from script id to script info.
+     * @type {Object}
+     */
+    this.parsedScripts_ = null;
+
+    /**
+     * Mapping from the request id to the devtools.BreakpointInfo for the
+     * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for
+     * "setbreakpoint" responses to learn their ids in the v8 debugger.
+     * @see #handleSetBreakpointResponse_
+     * @type {Object}
+     */
+    this.requestNumberToBreakpointInfo_ = null;
+
+    /**
+     * Information on current stack frames.
+     * @type {Array.<devtools.CallFrame>}
+     */
+    this.callFrames_ = [];
+
+    /**
+     * Whether to stop in the debugger on the exceptions.
+     * @type {boolean}
+     */
+    this.pauseOnExceptions_ = false;
+
+    /**
+     * Mapping: request sequence number->callback.
+     * @type {Object}
+     */
+    this.requestSeqToCallback_ = null;
+
+    /**
+     * Whether the scripts panel has been shown and initialilzed.
+     * @type {boolean}
+     */
+    this.scriptsPanelInitialized_ = false;
+
+    /**
+     * Whether the scripts list should be requested next time when context id is
+     * set.
+     * @type {boolean}
+     */
+    this.requestScriptsWhenContextIdSet_ = false;
+
+    /**
+     * Whether the agent is waiting for initial scripts response.
+     * @type {boolean}
+     */
+    this.waitingForInitialScriptsResponse_ = false;
+
+    /**
+     * If backtrace response is received when initial scripts response
+     * is not yet processed the backtrace handling will be postponed until
+     * after the scripts response processing. The handler bound to its arguments
+     * and this agent will be stored in this field then.
+     * @type {?function()}
+     */
+    this.pendingBacktraceResponseHandler_ = null;
+
+    /**
+     * Container of all breakpoints set using resource URL. These breakpoints
+     * survive page reload. Breakpoints set by script id(for scripts that don't
+     * have URLs) are stored in ScriptInfo objects.
+     * @type {Object}
+     */
+    this.urlToBreakpoints_ = {};
+
+    /**
+     * Exception message that is shown to user while on exception break.
+     * @type {WebInspector.ConsoleMessage}
+     */
+    this.currentExceptionMessage_ = null;
+
+    /**
+     * Whether breakpoints should suspend execution.
+     * @type {boolean}
+     */
+    this.breakpointsActivated_ = true;
+};
+
+
+/**
+ * A copy of the scope types from v8/src/mirror-delay.js
+ * @enum {number}
+ */
+devtools.DebuggerAgent.ScopeType = {
+    Global: 0,
+    Local: 1,
+    With: 2,
+    Closure: 3,
+    Catch: 4
+};
+
+
+/**
+ * Resets debugger agent to its initial state.
+ */
+devtools.DebuggerAgent.prototype.reset = function()
+{
+    this.contextId_ = null;
+    // No need to request scripts since they all will be pushed in AfterCompile
+    // events.
+    this.requestScriptsWhenContextIdSet_ = false;
+    this.waitingForInitialScriptsResponse_ = false;
+
+    this.parsedScripts_ = {};
+    this.requestNumberToBreakpointInfo_ = {};
+    this.callFrames_ = [];
+    this.requestSeqToCallback_ = {};
+};
+
+
+/**
+ * Initializes scripts UI. This method is called every time Scripts panel
+ * is shown. It will send request for context id if it's not set yet.
+ */
+devtools.DebuggerAgent.prototype.initUI = function()
+{
+    // Initialize scripts cache when Scripts panel is shown first time.
+    if (this.scriptsPanelInitialized_)
+        return;
+    this.scriptsPanelInitialized_ = true;
+    if (this.contextId_) {
+        // We already have context id. This means that we are here from the
+        // very beginning of the page load cycle and hence will get all scripts
+        // via after-compile events. No need to request scripts for this session.
+        //
+        // There can be a number of scripts from after-compile events that are
+        // pending addition into the UI.
+        for (var scriptId in this.parsedScripts_) {
+          var script = this.parsedScripts_[scriptId];
+          WebInspector.parsedScriptSource(scriptId, script.getUrl(), undefined /* script source */, script.getLineOffset() + 1);
+        }
+        return;
+    }
+    this.waitingForInitialScriptsResponse_ = true;
+    // Script list should be requested only when current context id is known.
+    RemoteDebuggerAgent.getContextId();
+    this.requestScriptsWhenContextIdSet_ = true;
+};
+
+
+/**
+ * Asynchronously requests the debugger for the script source.
+ * @param {number} scriptId Id of the script whose source should be resolved.
+ * @param {function(source:?string):void} callback Function that will be called
+ *     when the source resolution is completed. "source" parameter will be null
+ *     if the resolution fails.
+ */
+devtools.DebuggerAgent.prototype.resolveScriptSource = function(scriptId, callback)
+{
+    var script = this.parsedScripts_[scriptId];
+    if (!script || script.isUnresolved()) {
+        callback(null);
+        return;
+    }
+
+    var cmd = new devtools.DebugCommand("scripts", {
+        "ids": [scriptId],
+        "includeSource": true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    // Force v8 execution so that it gets to processing the requested command.
+    RemoteDebuggerAgent.processDebugCommands();
+
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+        if (msg.isSuccess()) {
+            var scriptJson = msg.getBody()[0];
+            if (scriptJson)
+                callback(scriptJson.source);
+            else
+                callback(null);
+        } else
+            callback(null);
+    };
+};
+
+
+/**
+ * Tells the v8 debugger to stop on as soon as possible.
+ */
+devtools.DebuggerAgent.prototype.pauseExecution = function()
+{
+    RemoteDebuggerCommandExecutor.DebuggerPauseScript();
+};
+
+
+/**
+ * @param {number} sourceId Id of the script fot the breakpoint.
+ * @param {number} line Number of the line for the breakpoint.
+ * @param {?string} condition The breakpoint condition.
+ */
+devtools.DebuggerAgent.prototype.addBreakpoint = function(sourceId, line, condition)
+{
+    var script = this.parsedScripts_[sourceId];
+    if (!script)
+        return;
+
+    line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
+
+    var commandArguments;
+    if (script.getUrl()) {
+        var breakpoints = this.urlToBreakpoints_[script.getUrl()];
+        if (breakpoints && breakpoints[line])
+            return;
+        if (!breakpoints) {
+            breakpoints = {};
+            this.urlToBreakpoints_[script.getUrl()] = breakpoints;
+        }
+
+        var breakpointInfo = new devtools.BreakpointInfo(line);
+        breakpoints[line] = breakpointInfo;
+
+        commandArguments = {
+            "groupId": this.contextId_,
+            "type": "script",
+            "target": script.getUrl(),
+            "line": line,
+            "condition": condition
+        };
+    } else {
+        var breakpointInfo = script.getBreakpointInfo(line);
+        if (breakpointInfo)
+            return;
+
+        breakpointInfo = new devtools.BreakpointInfo(line);
+        script.addBreakpointInfo(breakpointInfo);
+
+        commandArguments = {
+            "groupId": this.contextId_,
+            "type": "scriptId",
+            "target": sourceId,
+            "line": line,
+            "condition": condition
+        };
+    }
+
+    var cmd = new devtools.DebugCommand("setbreakpoint", commandArguments);
+
+    this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo;
+
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    // Force v8 execution so that it gets to processing the requested command.
+    // It is necessary for being able to change a breakpoint just after it
+    // has been created (since we need an existing breakpoint id for that).
+    RemoteDebuggerAgent.processDebugCommands();
+};
+
+
+/**
+ * @param {number} sourceId Id of the script for the breakpoint.
+ * @param {number} line Number of the line for the breakpoint.
+ */
+devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line)
+{
+    var script = this.parsedScripts_[sourceId];
+    if (!script)
+        return;
+
+    line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
+
+    var breakpointInfo;
+    if (script.getUrl()) {
+        var breakpoints = this.urlToBreakpoints_[script.getUrl()];
+        if (!breakpoints)
+            return;
+        breakpointInfo = breakpoints[line];
+        delete breakpoints[line];
+    } else {
+        breakpointInfo = script.getBreakpointInfo(line);
+        if (breakpointInfo)
+            script.removeBreakpointInfo(breakpointInfo);
+    }
+
+    if (!breakpointInfo)
+        return;
+
+    breakpointInfo.markAsRemoved();
+
+    var id = breakpointInfo.getV8Id();
+
+    // If we don't know id of this breakpoint in the v8 debugger we cannot send
+    // "clearbreakpoint" request. In that case it will be removed in
+    // "setbreakpoint" response handler when we learn the id.
+    if (id !== -1) {
+        this.requestClearBreakpoint_(id);
+    }
+};
+
+
+/**
+ * @param {boolean} activated Whether breakpoints should be activated.
+ */
+devtools.DebuggerAgent.prototype.setBreakpointsActivated = function(activated)
+{
+    this.breakpointsActivated_ = activated;
+};
+
+
+/**
+ * Tells the v8 debugger to step into the next statement.
+ */
+devtools.DebuggerAgent.prototype.stepIntoStatement = function()
+{
+    this.stepCommand_("in");
+};
+
+
+/**
+ * Tells the v8 debugger to step out of current function.
+ */
+devtools.DebuggerAgent.prototype.stepOutOfFunction = function()
+{
+    this.stepCommand_("out");
+};
+
+
+/**
+ * Tells the v8 debugger to step over the next statement.
+ */
+devtools.DebuggerAgent.prototype.stepOverStatement = function()
+{
+    this.stepCommand_("next");
+};
+
+
+/**
+ * Tells the v8 debugger to continue execution after it has been stopped on a
+ * breakpoint or an exception.
+ */
+devtools.DebuggerAgent.prototype.resumeExecution = function()
+{
+    this.clearExceptionMessage_();
+    var cmd = new devtools.DebugCommand("continue");
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Creates exception message and schedules it for addition to the resource upon
+ * backtrace availability.
+ * @param {string} url Resource url.
+ * @param {number} line Resource line number.
+ * @param {string} message Exception text.
+ */
+devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(url, line, message)
+{
+    this.currentExceptionMessage_ = new WebInspector.ConsoleMessage(
+        WebInspector.ConsoleMessage.MessageSource.JS,
+        WebInspector.ConsoleMessage.MessageType.Log,
+        WebInspector.ConsoleMessage.MessageLevel.Error,
+        line,
+        url,
+        0 /* group level */,
+        1 /* repeat count */,
+        "[Exception] " + message);
+};
+
+
+/**
+ * Shows pending exception message that is created with createExceptionMessage_
+ * earlier.
+ */
+devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function()
+{
+    if (!this.currentExceptionMessage_)
+        return;
+    var msg = this.currentExceptionMessage_;
+    var resource = WebInspector.resourceURLMap[msg.url];
+    if (resource) {
+        msg.resource = resource;
+        WebInspector.panels.resources.addMessageToResource(resource, msg);
+    } else
+        this.currentExceptionMessage_ = null;
+};
+
+
+/**
+ * Clears exception message from the resource.
+ */
+devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function()
+{
+    if (this.currentExceptionMessage_) {
+        var messageElement = this.currentExceptionMessage_._resourceMessageLineElement;
+        var bubble = messageElement.parentElement;
+        bubble.removeChild(messageElement);
+        if (!bubble.firstChild) {
+            // Last message in bubble removed.
+            bubble.parentElement.removeChild(bubble);
+        }
+        this.currentExceptionMessage_ = null;
+    }
+};
+
+
+/**
+ * @return {boolean} True iff the debugger will pause execution on the
+ * exceptions.
+ */
+devtools.DebuggerAgent.prototype.pauseOnExceptions = function()
+{
+    return this.pauseOnExceptions_;
+};
+
+
+/**
+ * Tells whether to pause in the debugger on the exceptions or not.
+ * @param {boolean} value True iff execution should be stopped in the debugger
+ * on the exceptions.
+ */
+devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value)
+{
+    this.pauseOnExceptions_ = value;
+};
+
+
+/**
+ * Sends "evaluate" request to the debugger.
+ * @param {Object} arguments Request arguments map.
+ * @param {function(devtools.DebuggerMessage)} callback Callback to be called
+ *     when response is received.
+ */
+devtools.DebuggerAgent.prototype.requestEvaluate = function(arguments, callback)
+{
+    var cmd = new devtools.DebugCommand("evaluate", arguments);
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
+};
+
+
+/**
+ * Sends "lookup" request for each unresolved property of the object. When
+ * response is received the properties will be changed with their resolved
+ * values.
+ * @param {Object} object Object whose properties should be resolved.
+ * @param {function(devtools.DebuggerMessage)} Callback to be called when all
+ *     children are resolved.
+ * @param {boolean} noIntrinsic Whether intrinsic properties should be included.
+ */
+devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback, noIntrinsic)
+{
+    if ("handle" in object) {
+        var result = [];
+        devtools.DebuggerAgent.formatObjectProperties_(object, result, noIntrinsic);
+        callback(result);
+    } else {
+        this.requestLookup_([object.ref], function(msg) {
+            var result = [];
+            if (msg.isSuccess()) {
+                var handleToObject = msg.getBody();
+                var resolved = handleToObject[object.ref];
+                devtools.DebuggerAgent.formatObjectProperties_(resolved, result, noIntrinsic);
+                callback(result);
+            } else
+                callback([]);
+        });
+    }
+};
+
+
+/**
+ * Sends "scope" request for the scope object to resolve its variables.
+ * @param {Object} scope Scope to be resolved.
+ * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback
+ *     Callback to be called when all scope variables are resolved.
+ */
+devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback)
+{
+    var cmd = new devtools.DebugCommand("scope", {
+        "frameNumber": scope.frameNumber,
+        "number": scope.index,
+        "compactFormat": true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+        var result = [];
+        if (msg.isSuccess()) {
+            var scopeObjectJson = msg.getBody().object;
+            devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result, true /* no intrinsic */);
+        }
+        callback(result);
+    };
+};
+
+
+/**
+ * Sends "scopes" request for the frame object to resolve all variables
+ * available in the frame.
+ * @param {number} callFrameId Id of call frame whose variables need to
+ *     be resolved.
+ * @param {function(Object)} callback Callback to be called when all frame
+ *     variables are resolved.
+ */
+devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(callFrameId, callback)
+{
+    var result = {};
+
+    var frame = this.callFrames_[callFrameId];
+    if (!frame) {
+        callback(result);
+        return;
+    }
+
+    var waitingResponses = 0;
+    function scopeResponseHandler(msg) {
+        waitingResponses--;
+
+        if (msg.isSuccess()) {
+            var properties = msg.getBody().object.properties;
+            for (var j = 0; j < properties.length; j++)
+                result[properties[j].name] = true;
+        }
+
+        // When all scopes are resolved invoke the callback.
+        if (waitingResponses === 0)
+            callback(result);
+    };
+
+    for (var i = 0; i < frame.scopeChain.length; i++) {
+        var scope = frame.scopeChain[i].objectId;
+        if (scope.type === devtools.DebuggerAgent.ScopeType.Global) {
+            // Do not resolve global scope since it takes for too long.
+            // TODO(yurys): allow to send only property names in the response.
+            continue;
+        }
+        var cmd = new devtools.DebugCommand("scope", {
+            "frameNumber": scope.frameNumber,
+            "number": scope.index,
+            "compactFormat": true
+        });
+        devtools.DebuggerAgent.sendCommand_(cmd);
+        this.requestSeqToCallback_[cmd.getSequenceNumber()] = scopeResponseHandler;
+        waitingResponses++;
+    }
+};
+
+/**
+ * Evaluates the expressionString to an object in the call frame and reports
+ * all its properties.
+ * @param{string} expressionString Expression whose properties should be
+ *     collected.
+ * @param{number} callFrameId The frame id.
+ * @param{function(Object result,bool isException)} reportCompletions Callback
+ *     function.
+ */
+devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(expressionString, callFrameId, reportCompletions)
+{
+      if (expressionString) {
+          expressionString = "var obj = " + expressionString +
+              "; var names = {}; for (var n in obj) { names[n] = true; };" +
+              "names;";
+          this.evaluateInCallFrame(
+              callFrameId,
+              expressionString,
+              function(result) {
+                  var names = {};
+                  if (!result.isException) {
+                      var props = result.value.objectId.properties;
+                      // Put all object properties into the map.
+                      for (var i = 0; i < props.length; i++)
+                          names[props[i].name] = true;
+                  }
+                  reportCompletions(names, result.isException);
+              });
+      } else {
+          this.resolveFrameVariables_(callFrameId,
+              function(result) {
+                  reportCompletions(result, false /* isException */);
+              });
+      }
+};
+
+
+/**
+ * @param{number} scriptId
+ * @return {string} Type of the context of the script with specified id.
+ */
+devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId)
+{
+    return this.parsedScripts_[scriptId].getContextType();
+};
+
+
+/**
+ * Removes specified breakpoint from the v8 debugger.
+ * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
+ */
+devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(breakpointId)
+{
+    var cmd = new devtools.DebugCommand("clearbreakpoint", {
+        "breakpoint": breakpointId
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends "backtrace" request to v8.
+ */
+devtools.DebuggerAgent.prototype.requestBacktrace_ = function()
+{
+    var cmd = new devtools.DebugCommand("backtrace", {
+        "compactFormat":true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends command to v8 debugger.
+ * @param {devtools.DebugCommand} cmd Command to execute.
+ */
+devtools.DebuggerAgent.sendCommand_ = function(cmd)
+{
+    RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol());
+};
+
+
+/**
+ * Tells the v8 debugger to make the next execution step.
+ * @param {string} action "in", "out" or "next" action.
+ */
+devtools.DebuggerAgent.prototype.stepCommand_ = function(action)
+{
+    this.clearExceptionMessage_();
+    var cmd = new devtools.DebugCommand("continue", {
+        "stepaction": action,
+        "stepcount": 1
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends "lookup" request to v8.
+ * @param {number} handle Handle to the object to lookup.
+ */
+devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback)
+{
+    var cmd = new devtools.DebugCommand("lookup", {
+        "compactFormat":true,
+        "handles": handles
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
+};
+
+
+/**
+ * Sets debugger context id for scripts filtering.
+ * @param {number} contextId Id of the inspected page global context.
+ */
+devtools.DebuggerAgent.prototype.setContextId_ = function(contextId)
+{
+    this.contextId_ = contextId;
+
+    // If it's the first time context id is set request scripts list.
+    if (this.requestScriptsWhenContextIdSet_) {
+        this.requestScriptsWhenContextIdSet_ = false;
+        var cmd = new devtools.DebugCommand("scripts", {
+            "includeSource": false
+        });
+        devtools.DebuggerAgent.sendCommand_(cmd);
+        // Force v8 execution so that it gets to processing the requested command.
+        RemoteDebuggerAgent.processDebugCommands();
+
+        var debuggerAgent = this;
+        this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+            // Handle the response iff the context id hasn't changed since the request
+            // was issued. Otherwise if the context id did change all up-to-date
+            // scripts will be pushed in after compile events and there is no need to
+            // handle the response.
+            if (contextId === debuggerAgent.contextId_)
+                debuggerAgent.handleScriptsResponse_(msg);
+
+            // We received initial scripts response so flush the flag and
+            // see if there is an unhandled backtrace response.
+            debuggerAgent.waitingForInitialScriptsResponse_ = false;
+            if (debuggerAgent.pendingBacktraceResponseHandler_) {
+                debuggerAgent.pendingBacktraceResponseHandler_();
+                debuggerAgent.pendingBacktraceResponseHandler_ = null;
+            }
+        };
+    }
+};
+
+
+/**
+ * Handles output sent by v8 debugger. The output is either asynchronous event
+ * or response to a previously sent request.  See protocol definitioun for more
+ * details on the output format.
+ * @param {string} output
+ */
+devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output)
+{
+    var msg;
+    try {
+        msg = new devtools.DebuggerMessage(output);
+    } catch(e) {
+        debugPrint("Failed to handle debugger response:\n" + e);
+        throw e;
+    }
+
+    if (msg.getType() === "event") {
+        if (msg.getEvent() === "break")
+            this.handleBreakEvent_(msg);
+        else if (msg.getEvent() === "exception")
+            this.handleExceptionEvent_(msg);
+        else if (msg.getEvent() === "afterCompile")
+            this.handleAfterCompileEvent_(msg);
+    } else if (msg.getType() === "response") {
+        if (msg.getCommand() === "scripts")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "setbreakpoint")
+            this.handleSetBreakpointResponse_(msg);
+        else if (msg.getCommand() === "clearbreakpoint")
+            this.handleClearBreakpointResponse_(msg);
+        else if (msg.getCommand() === "backtrace")
+            this.handleBacktraceResponse_(msg);
+        else if (msg.getCommand() === "lookup")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "evaluate")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "scope")
+            this.invokeCallbackForResponse_(msg);
+    }
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg)
+{
+    if (!this.breakpointsActivated_) {
+        this.resumeExecution();
+        return;
+    }
+
+    // Force scripts panel to be shown first.
+    WebInspector.currentPanel = WebInspector.panels.scripts;
+
+    var body = msg.getBody();
+
+    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
+    this.requestBacktrace_();
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg)
+{
+    // Force scripts panel to be shown first.
+    WebInspector.currentPanel = WebInspector.panels.scripts;
+
+    var body = msg.getBody();
+    // No script field in the body means that v8 failed to parse the script. We
+    // resume execution on parser errors automatically.
+    if (this.pauseOnExceptions_ && body.script) {
+        var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
+        this.createExceptionMessage_(body.script.name, line, body.exception.text);
+        this.requestBacktrace_();
+    } else
+        this.resumeExecution();
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg)
+{
+    var scripts = msg.getBody();
+    for (var i = 0; i < scripts.length; i++) {
+        var script = scripts[i];
+
+        // Skip scripts from other tabs.
+        if (!this.isScriptFromInspectedContext_(script, msg))
+            continue;
+
+        // We may already have received the info in an afterCompile event.
+        if (script.id in this.parsedScripts_)
+            continue;
+        this.addScriptInfo_(script, msg);
+    }
+};
+
+
+/**
+ * @param {Object} script Json object representing script.
+ * @param {devtools.DebuggerMessage} msg Debugger response.
+ */
+devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(script, msg)
+{
+    if (!script.context) {
+        // Always ignore scripts from the utility context.
+        return false;
+    }
+    var context = msg.lookup(script.context.ref);
+    var scriptContextId = context.data;
+    if (typeof scriptContextId === "undefined")
+        return false; // Always ignore scripts from the utility context.
+    if (this.contextId_ === null)
+        return true;
+    // Find the id from context data. The context data has the format "type,id".
+    var comma = context.data.indexOf(",");
+    if (comma < 0)
+        return false;
+    return (context.data.substring(comma + 1) == this.contextId_);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg)
+{
+    var requestSeq = msg.getRequestSeq();
+    var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq];
+    if (!breakpointInfo) {
+        // TODO(yurys): handle this case
+        return;
+    }
+    delete this.requestNumberToBreakpointInfo_[requestSeq];
+    if (!msg.isSuccess()) {
+        // TODO(yurys): handle this case
+        return;
+    }
+    var idInV8 = msg.getBody().breakpoint;
+    breakpointInfo.setV8Id(idInV8);
+
+    if (breakpointInfo.isRemoved())
+        this.requestClearBreakpoint_(idInV8);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg)
+{
+    if (!this.contextId_) {
+        // Ignore scripts delta if main request has not been issued yet.
+        return;
+    }
+    var script = msg.getBody().script;
+
+    // Ignore scripts from other tabs.
+    if (!this.isScriptFromInspectedContext_(script, msg))
+        return;
+    this.addScriptInfo_(script, msg);
+};
+
+
+/**
+ * Adds the script info to the local cache. This method assumes that the script
+ * is not in the cache yet.
+ * @param {Object} script Script json object from the debugger message.
+ * @param {devtools.DebuggerMessage} msg Debugger message containing the script
+ *     data.
+ */
+devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg)
+{
+    var context = msg.lookup(script.context.ref);
+    var contextType;
+    // Find the type from context data. The context data has the format
+    // "type,id".
+    var comma = context.data.indexOf(",");
+    if (comma < 0)
+        return
+    contextType = context.data.substring(0, comma);
+    this.parsedScripts_[script.id] = new devtools.ScriptInfo(script.id, script.name, script.lineOffset, contextType);
+    if (this.scriptsPanelInitialized_) {
+        // Only report script as parsed after scripts panel has been shown.
+        WebInspector.parsedScriptSource(script.id, script.name, script.source, script.lineOffset + 1);
+    }
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(msg)
+{
+    // Do nothing.
+};
+
+
+/**
+ * Handles response to "backtrace" command.
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg)
+{
+    if (this.waitingForInitialScriptsResponse_)
+        this.pendingBacktraceResponseHandler_ = this.doHandleBacktraceResponse_.bind(this, msg);
+    else
+        this.doHandleBacktraceResponse_(msg);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg)
+{
+    var frames = msg.getBody().frames;
+    this.callFrames_ = [];
+    for (var i = 0; i <  frames.length; ++i)
+        this.callFrames_.push(this.formatCallFrame_(frames[i]));
+    WebInspector.pausedScript(this.callFrames_);
+    this.showPendingExceptionMessage_();
+    InspectorFrontendHost.activateWindow();
+};
+
+
+/**
+ * Evaluates code on given callframe.
+ */
+devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(callFrameId, code, callback)
+{
+    var callFrame = this.callFrames_[callFrameId];
+    callFrame.evaluate_(code, callback);
+};
+
+
+/**
+ * Handles response to a command by invoking its callback (if any).
+ * @param {devtools.DebuggerMessage} msg
+ * @return {boolean} Whether a callback for the given message was found and
+ *     excuted.
+ */
+devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg)
+{
+    var callback = this.requestSeqToCallback_[msg.getRequestSeq()];
+    if (!callback) {
+        // It may happend if reset was called.
+        return false;
+    }
+    delete this.requestSeqToCallback_[msg.getRequestSeq()];
+    callback(msg);
+    return true;
+};
+
+
+/**
+ * @param {Object} stackFrame Frame json object from "backtrace" response.
+ * @return {!devtools.CallFrame} Object containing information related to the
+ *     call frame in the format expected by ScriptsPanel and its panes.
+ */
+devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame)
+{
+    var func = stackFrame.func;
+    var sourceId = func.scriptId;
+
+    // Add service script if it does not exist.
+    var existingScript = this.parsedScripts_[sourceId];
+    if (!existingScript) {
+        this.parsedScripts_[sourceId] = new devtools.ScriptInfo(sourceId, null /* name */, 0 /* line */, "unknown" /* type */, true /* unresolved */);
+        WebInspector.parsedScriptSource(sourceId, null, null, 0);
+    }
+
+    var funcName = func.name || func.inferredName || "(anonymous function)";
+    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line);
+
+    // Add basic scope chain info with scope variables.
+    var scopeChain = [];
+    var ScopeType = devtools.DebuggerAgent.ScopeType;
+    for (var i = 0; i < stackFrame.scopes.length; i++) {
+        var scope = stackFrame.scopes[i];
+        scope.frameNumber = stackFrame.index;
+        var scopeObjectProxy = new WebInspector.ObjectProxy(0, scope, [], "", true);
+        scopeObjectProxy.isScope = true;
+        switch(scope.type) {
+            case ScopeType.Global:
+                scopeObjectProxy.isDocument = true;
+                break;
+            case ScopeType.Local:
+                scopeObjectProxy.isLocal = true;
+                scopeObjectProxy.thisObject = devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver);
+                break;
+            case ScopeType.With:
+            // Catch scope is treated as a regular with scope by WebKit so we
+            // also treat it this way.
+            case ScopeType.Catch:
+                scopeObjectProxy.isWithBlock = true;
+                break;
+            case ScopeType.Closure:
+                scopeObjectProxy.isClosure = true;
+                break;
+        }
+        scopeChain.push(scopeObjectProxy);
+    }
+    return new devtools.CallFrame(stackFrame.index, "function", funcName, sourceId, line, scopeChain);
+};
+
+
+/**
+ * Collects properties for an object from the debugger response.
+ * @param {Object} object An object from the debugger protocol response.
+ * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the
+ *     properties into.
+ * @param {boolean} noIntrinsic Whether intrinsic properties should be
+ *     included.
+ */
+devtools.DebuggerAgent.formatObjectProperties_ = function(object, result, noIntrinsic)
+{
+    devtools.DebuggerAgent.propertiesToProxies_(object.properties, result);
+    if (noIntrinsic)
+        return;
+
+    result.push(new WebInspector.ObjectPropertyProxy("__proto__", devtools.DebuggerAgent.formatObjectProxy_(object.protoObject)));
+    result.push(new WebInspector.ObjectPropertyProxy("constructor", devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction)));
+    // Don't add 'prototype' property since it is one of the regualar properties.
+};
+
+
+/**
+ * For each property in "properties" creates its proxy representative.
+ * @param {Array.<Object>} properties Receiver properties or locals array from
+ *     "backtrace" response.
+ * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder.
+ */
+devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result)
+{
+    var map = {};
+    for (var i = 0; i < properties.length; ++i) {
+        var property = properties[i];
+        var name = String(property.name);
+        if (name in map)
+            continue;
+        map[name] = true;
+        var value = devtools.DebuggerAgent.formatObjectProxy_(property.value);
+        var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value);
+        result.push(propertyProxy);
+    }
+};
+
+
+/**
+ * @param {Object} v An object reference from the debugger response.
+ * @return {*} The value representation expected by ScriptsPanel.
+ */
+devtools.DebuggerAgent.formatObjectProxy_ = function(v)
+{
+    var description;
+    var hasChildren = false;
+    if (v.type === "object") {
+        description = v.className;
+        hasChildren = true;
+    } else if (v.type === "function") {
+        if (v.source)
+            description = v.source;
+        else
+            description = "function " + v.name + "()";
+        hasChildren = true;
+    } else if (v.type === "undefined")
+        description = "undefined";
+    else if (v.type === "null")
+        description = "null";
+    else if (typeof v.value !== "undefined") {
+        // Check for undefined and null types before checking the value, otherwise
+        // null/undefined may have blank value.
+        description = v.value;
+    } else
+        description = "<unresolved ref: " + v.ref + ", type: " + v.type + ">";
+
+    var proxy = new WebInspector.ObjectProxy(0, v, [], description, hasChildren);
+    proxy.type = v.type;
+    proxy.isV8Ref = true;
+    return proxy;
+};
+
+
+/**
+ * Converts line number from Web Inspector UI(1-based) to v8(0-based).
+ * @param {number} line Resource line number in Web Inspector UI.
+ * @return {number} The line number in v8.
+ */
+devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line)
+{
+    return line - 1;
+};
+
+
+/**
+ * Converts line number from v8(0-based) to Web Inspector UI(1-based).
+ * @param {number} line Resource line number in v8.
+ * @return {number} The line number in Web Inspector.
+ */
+devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line)
+{
+    return line + 1;
+};
+
+
+/**
+ * @param {number} scriptId Id of the script.
+ * @param {?string} url Script resource URL if any.
+ * @param {number} lineOffset First line 0-based offset in the containing
+ *     document.
+ * @param {string} contextType Type of the script's context:
+ *     "page" - regular script from html page
+ *     "injected" - extension content script
+ * @param {bool} opt_isUnresolved If true, script will not be resolved.
+ * @constructor
+ */
+devtools.ScriptInfo = function(scriptId, url, lineOffset, contextType, opt_isUnresolved)
+{
+    this.scriptId_ = scriptId;
+    this.lineOffset_ = lineOffset;
+    this.contextType_ = contextType;
+    this.url_ = url;
+    this.isUnresolved_ = opt_isUnresolved;
+
+    this.lineToBreakpointInfo_ = {};
+};
+
+
+/**
+ * @return {number}
+ */
+devtools.ScriptInfo.prototype.getLineOffset = function()
+{
+    return this.lineOffset_;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.ScriptInfo.prototype.getContextType = function()
+{
+    return this.contextType_;
+};
+
+
+/**
+ * @return {?string}
+ */
+devtools.ScriptInfo.prototype.getUrl = function()
+{
+    return this.url_;
+};
+
+
+/**
+ * @return {?bool}
+ */
+devtools.ScriptInfo.prototype.isUnresolved = function()
+{
+    return this.isUnresolved_;
+};
+
+
+/**
+ * @param {number} line 0-based line number in the script.
+ * @return {?devtools.BreakpointInfo} Information on a breakpoint at the
+ *     specified line in the script or undefined if there is no breakpoint at
+ *     that line.
+ */
+devtools.ScriptInfo.prototype.getBreakpointInfo = function(line)
+{
+    return this.lineToBreakpointInfo_[line];
+};
+
+
+/**
+ * Adds breakpoint info to the script.
+ * @param {devtools.BreakpointInfo} breakpoint
+ */
+devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint)
+{
+    this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint;
+};
+
+
+/**
+ * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed.
+ */
+devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint)
+{
+    var line = breakpoint.getLine();
+    delete this.lineToBreakpointInfo_[line];
+};
+
+
+
+/**
+ * @param {number} line Breakpoint 0-based line number in the containing script.
+ * @constructor
+ */
+devtools.BreakpointInfo = function(line)
+{
+    this.line_ = line;
+    this.v8id_ = -1;
+    this.removed_ = false;
+};
+
+
+/**
+ * @return {number}
+ */
+devtools.BreakpointInfo.prototype.getLine = function(n)
+{
+    return this.line_;
+};
+
+
+/**
+ * @return {number} Unique identifier of this breakpoint in the v8 debugger.
+ */
+devtools.BreakpointInfo.prototype.getV8Id = function(n)
+{
+    return this.v8id_;
+};
+
+
+/**
+ * Sets id of this breakpoint in the v8 debugger.
+ * @param {number} id
+ */
+devtools.BreakpointInfo.prototype.setV8Id = function(id)
+{
+    this.v8id_ = id;
+};
+
+
+/**
+ * Marks this breakpoint as removed from the  front-end.
+ */
+devtools.BreakpointInfo.prototype.markAsRemoved = function()
+{
+    this.removed_ = true;
+};
+
+
+/**
+ * @return {boolean} Whether this breakpoint has been removed from the
+ *     front-end.
+ */
+devtools.BreakpointInfo.prototype.isRemoved = function()
+{
+    return this.removed_;
+};
+
+
+/**
+ * Call stack frame data.
+ * @param {string} id CallFrame id.
+ * @param {string} type CallFrame type.
+ * @param {string} functionName CallFrame type.
+ * @param {string} sourceID Source id.
+ * @param {number} line Source line.
+ * @param {Array.<Object>} scopeChain Array of scoped objects.
+ * @construnctor
+ */
+devtools.CallFrame = function(id, type, functionName, sourceID, line, scopeChain)
+{
+    this.id = id;
+    this.type = type;
+    this.functionName = functionName;
+    this.sourceID = sourceID;
+    this.line = line;
+    this.scopeChain = scopeChain;
+};
+
+
+/**
+ * This method issues asynchronous evaluate request, reports result to the
+ * callback.
+ * @param {string} expression An expression to be evaluated in the context of
+ *     this call frame.
+ * @param {function(Object):undefined} callback Callback to report result to.
+ */
+devtools.CallFrame.prototype.evaluate_ = function(expression, callback)
+{
+    devtools.tools.getDebuggerAgent().requestEvaluate({
+            "expression": expression,
+            "frame": this.id,
+            "global": false,
+            "disable_break": false,
+            "compactFormat": true,
+            "maxStringLength": -1
+        },
+        function(response) {
+            var result = {};
+            if (response.isSuccess())
+                result.value = devtools.DebuggerAgent.formatObjectProxy_(response.getBody());
+            else {
+                result.value = response.getMessage();
+                result.isException = true;
+            }
+            callback(result);
+        });
+};
+
+
+/**
+ * JSON based commands sent to v8 debugger.
+ * @param {string} command Name of the command to execute.
+ * @param {Object} opt_arguments Command-specific arguments map.
+ * @constructor
+ */
+devtools.DebugCommand = function(command, opt_arguments)
+{
+    this.command_ = command;
+    this.type_ = "request";
+    this.seq_ = ++devtools.DebugCommand.nextSeq_;
+    if (opt_arguments)
+        this.arguments_ = opt_arguments;
+};
+
+
+/**
+ * Next unique number to be used as debugger request sequence number.
+ * @type {number}
+ */
+devtools.DebugCommand.nextSeq_ = 1;
+
+
+/**
+ * @return {number}
+ */
+devtools.DebugCommand.prototype.getSequenceNumber = function()
+{
+    return this.seq_;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.DebugCommand.prototype.toJSONProtocol = function()
+{
+    var json = {
+        "seq": this.seq_,
+        "type": this.type_,
+        "command": this.command_
+    }
+    if (this.arguments_)
+        json.arguments = this.arguments_;
+    return JSON.stringify(json);
+};
+
+
+/**
+ * JSON messages sent from v8 debugger. See protocol definition for more
+ * details: http://code.google.com/p/v8/wiki/DebuggerProtocol
+ * @param {string} msg Raw protocol packet as JSON string.
+ * @constructor
+ */
+devtools.DebuggerMessage = function(msg)
+{
+    this.packet_ = JSON.parse(msg);
+    this.refs_ = [];
+    if (this.packet_.refs) {
+        for (var i = 0; i < this.packet_.refs.length; i++)
+            this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
+    }
+};
+
+
+/**
+ * @return {string} The packet type.
+ */
+devtools.DebuggerMessage.prototype.getType = function()
+{
+    return this.packet_.type;
+};
+
+
+/**
+ * @return {?string} The packet event if the message is an event.
+ */
+devtools.DebuggerMessage.prototype.getEvent = function()
+{
+    return this.packet_.event;
+};
+
+
+/**
+ * @return {?string} The packet command if the message is a response to a
+ *     command.
+ */
+devtools.DebuggerMessage.prototype.getCommand = function()
+{
+    return this.packet_.command;
+};
+
+
+/**
+ * @return {number} The packet request sequence.
+ */
+devtools.DebuggerMessage.prototype.getRequestSeq = function()
+{
+    return this.packet_.request_seq;
+};
+
+
+/**
+ * @return {number} Whether the v8 is running after processing the request.
+ */
+devtools.DebuggerMessage.prototype.isRunning = function()
+{
+    return this.packet_.running ? true : false;
+};
+
+
+/**
+ * @return {boolean} Whether the request succeeded.
+ */
+devtools.DebuggerMessage.prototype.isSuccess = function()
+{
+    return this.packet_.success ? true : false;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.DebuggerMessage.prototype.getMessage = function()
+{
+    return this.packet_.message;
+};
+
+
+/**
+ * @return {Object} Parsed message body json.
+ */
+devtools.DebuggerMessage.prototype.getBody = function()
+{
+    return this.packet_.body;
+};
+
+
+/**
+ * @param {number} handle Object handle.
+ * @return {?Object} Returns the object with the handle if it was sent in this
+ *    message(some objects referenced by handles may be missing in the message).
+ */
+devtools.DebuggerMessage.prototype.lookup = function(handle)
+{
+    return this.refs_[handle];
+};
+
+/* ProfilerAgent.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Provides communication interface to remote v8 profiler.
+ */
+
+/**
+ * @constructor
+ */
+devtools.ProfilerAgent = function()
+{
+    RemoteProfilerAgent.didGetActiveProfilerModules = this._didGetActiveProfilerModules.bind(this);
+    RemoteProfilerAgent.didGetLogLines = this._didGetLogLines.bind(this);
+
+    /**
+     * Active profiler modules flags.
+     * @type {number}
+     */
+    this._activeProfilerModules = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
+
+    /**
+     * Interval for polling profiler state.
+     * @type {number}
+     */
+    this._getActiveProfilerModulesInterval = null;
+
+    /**
+     * Profiler log position.
+     * @type {number}
+     */
+    this._logPosition = 0;
+
+    /**
+     * Last requested log position.
+     * @type {number}
+     */
+    this._lastRequestedLogPosition = -1;
+
+    /**
+     * Whether log contents retrieval must be forced next time.
+     * @type {boolean}
+     */
+    this._forceGetLogLines = false;
+
+    /**
+     * Profiler processor instance.
+     * @type {devtools.profiler.Processor}
+     */
+    this._profilerProcessor = new devtools.profiler.Processor();
+};
+
+
+/**
+ * A copy of enum from include/v8.h
+ * @enum {number}
+ */
+devtools.ProfilerAgent.ProfilerModules = {
+    PROFILER_MODULE_NONE: 0,
+    PROFILER_MODULE_CPU: 1,
+    PROFILER_MODULE_HEAP_STATS: 1 << 1,
+    PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2,
+    PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16
+};
+
+
+/**
+ * Sets up callbacks that deal with profiles processing.
+ */
+devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function()
+{
+    // A temporary icon indicating that the profile is being processed.
+    var processingIcon = new WebInspector.SidebarTreeElement(
+        "profile-sidebar-tree-item",
+        WebInspector.UIString("Processing..."),
+        '', null, false);
+    var profilesSidebar = WebInspector.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).treeElement;
+
+    this._profilerProcessor.setCallbacks(
+        function onProfileProcessingStarted() {
+            // Set visually empty string. Subtitle hiding is done via styles
+            // manipulation which doesn't play well with dynamic append / removal.
+            processingIcon.subtitle = " ";
+            profilesSidebar.appendChild(processingIcon);
+        },
+        function onProfileProcessingStatus(ticksCount) {
+            processingIcon.subtitle = WebInspector.UIString("%d ticks processed", ticksCount);
+        },
+        function onProfileProcessingFinished(profile) {
+            profilesSidebar.removeChild(processingIcon);
+            profile.typeId = WebInspector.CPUProfileType.TypeId;
+            InspectorBackend.addFullProfile(profile);
+            WebInspector.addProfileHeader(profile);
+            // If no profile is currently shown, show the new one.
+            var profilesPanel = WebInspector.panels.profiles;
+            if (!profilesPanel.visibleView) {
+                profilesPanel.showProfile(profile);
+            }
+        }
+    );
+};
+
+
+/**
+ * Initializes profiling state.
+ */
+devtools.ProfilerAgent.prototype.initializeProfiling = function()
+{
+    this.setupProfilerProcessorCallbacks();
+    this._forceGetLogLines = true;
+    this._getActiveProfilerModulesInterval = setInterval(function() { RemoteProfilerAgent.getActiveProfilerModules(); }, 1000);
+};
+
+
+/**
+ * Requests the next chunk of log lines.
+ * @param {boolean} immediately Do not postpone the request.
+ * @private
+ */
+devtools.ProfilerAgent.prototype._getNextLogLines = function(immediately)
+{
+    if (this._lastRequestedLogPosition == this._logPosition)
+        return;
+    var pos = this._lastRequestedLogPosition = this._logPosition;
+    if (immediately)
+        RemoteProfilerAgent.getLogLines(pos);
+    else
+        setTimeout(function() { RemoteProfilerAgent.getLogLines(pos); }, 500);
+};
+
+
+/**
+ * Starts profiling.
+ * @param {number} modules List of modules to enable.
+ */
+devtools.ProfilerAgent.prototype.startProfiling = function(modules)
+{
+    var cmd = new devtools.DebugCommand("profile", {
+        "modules": modules,
+        "command": "resume"});
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    RemoteDebuggerAgent.processDebugCommands();
+    if (modules & devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
+        // Active modules will not change, instead, a snapshot will be logged.
+        this._getNextLogLines();
+    }
+};
+
+
+/**
+ * Stops profiling.
+ */
+devtools.ProfilerAgent.prototype.stopProfiling = function(modules)
+{
+    var cmd = new devtools.DebugCommand("profile", {
+        "modules": modules,
+        "command": "pause"});
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    RemoteDebuggerAgent.processDebugCommands();
+};
+
+
+/**
+ * Handles current profiler status.
+ * @param {number} modules List of active (started) modules.
+ */
+devtools.ProfilerAgent.prototype._didGetActiveProfilerModules = function(modules)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    var profModuleNone = profModules.PROFILER_MODULE_NONE;
+    if (this._forceGetLogLines || (modules !== profModuleNone && this._activeProfilerModules === profModuleNone)) {
+        this._forceGetLogLines = false;
+        // Start to query log data.
+        this._getNextLogLines(true);
+    }
+    this._activeProfilerModules = modules;
+    // Update buttons.
+    WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * Handles a portion of a profiler log retrieved by getLogLines call.
+ * @param {number} pos Current position in log.
+ * @param {string} log A portion of profiler log.
+ */
+devtools.ProfilerAgent.prototype._didGetLogLines = function(pos, log)
+{
+    this._logPosition = pos;
+    if (log.length > 0)
+        this._profilerProcessor.processLogChunk(log);
+    else {
+        // Allow re-reading from the last position.
+        this._lastRequestedLogPosition = this._logPosition - 1;
+        if (this._activeProfilerModules === devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE)
+            // No new data and profiling is stopped---suspend log reading.
+            return;
+    }
+    this._getNextLogLines();
+};
+
+/* ProfilerProcessor.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Profiler processor is used to process log file produced
+ * by V8 and produce an internal profile representation which is used
+ * for building profile views in "Profiles" tab.
+ */
+
+
+/**
+ * Creates a Profile View builder object compatible with WebKit Profiler UI.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+devtools.profiler.WebKitViewBuilder = function(samplingRate)
+{
+    devtools.profiler.ViewBuilder.call(this, samplingRate);
+};
+devtools.profiler.WebKitViewBuilder.prototype.__proto__ = devtools.profiler.ViewBuilder.prototype;
+
+
+/**
+ * @override
+ */
+devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(funcName, totalTime, selfTime, head)
+{
+    return new devtools.profiler.WebKitViewNode(funcName, totalTime, selfTime, head);
+};
+
+
+/**
+ * Constructs a Profile View node object for displaying in WebKit Profiler UI.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+devtools.profiler.WebKitViewNode = function(internalFuncName, totalTime, selfTime, head)
+{
+    devtools.profiler.ProfileView.Node.call(this, internalFuncName, totalTime, selfTime, head);
+    this.initFuncInfo_();
+    this.callUID = internalFuncName;
+};
+devtools.profiler.WebKitViewNode.prototype.__proto__ = devtools.profiler.ProfileView.Node.prototype;
+
+
+/**
+ * RegEx for stripping V8's prefixes of compiled functions.
+ */
+devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE = /^(?:LazyCompile|Function|Callback): (.*)$/;
+
+
+/**
+ * RegEx for extracting script source URL and line number.
+ */
+devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE = /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/;
+
+
+/**
+ * Inits "functionName", "url", and "lineNumber" fields using "internalFuncName"
+ * field.
+ * @private
+ */
+devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function()
+{
+    var nodeAlias = devtools.profiler.WebKitViewNode;
+    this.functionName = this.internalFuncName;
+
+    var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName);
+    if (strippedName)
+        this.functionName = strippedName[1];
+
+    var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName);
+    if (parsedName) {
+        this.functionName = parsedName[1];
+        if (parsedName[4])
+            this.functionName += parsedName[4];
+        this.url = parsedName[2];
+        this.lineNumber = parsedName[3];
+    } else {
+        this.url = '';
+        this.lineNumber = 0;
+    }
+};
+
+
+/**
+ * Ancestor of a profile object that leaves out only JS-related functions.
+ * @constructor
+ */
+devtools.profiler.JsProfile = function()
+{
+    devtools.profiler.Profile.call(this);
+};
+devtools.profiler.JsProfile.prototype.__proto__ = devtools.profiler.Profile.prototype;
+
+
+/**
+ * RegExp that leaves only non-native JS functions.
+ * @type {RegExp}
+ */
+devtools.profiler.JsProfile.JS_NON_NATIVE_RE = new RegExp(
+      "^" +
+        "(?:Callback:)|" +
+        "(?:Script: (?!native))|" +
+        "(?:(?:LazyCompile|Function): [^ ]*(?: (?!native )[^ ]+:\\d+)?$)");
+
+
+/**
+ * @override
+ */
+devtools.profiler.JsProfile.prototype.skipThisFunction = function(name)
+{
+    return !devtools.profiler.JsProfile.JS_NON_NATIVE_RE.test(name);
+};
+
+
+/**
+ * Profiler processor. Consumes profiler log and builds profile views.
+ * FIXME: change field naming style to use trailing underscore.
+ *
+ * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
+ *     that receives a new processed profile.
+ * @constructor
+ */
+devtools.profiler.Processor = function()
+{
+    var dispatches = {
+        "code-creation": {
+            parsers: [null, this.createAddressParser("code"), parseInt, null],
+            processor: this.processCodeCreation_, backrefs: true,
+            needsProfile: true },
+        "code-move": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("code-move-to")],
+            processor: this.processCodeMove_, backrefs: true,
+            needsProfile: true },
+        "code-delete": { parsers: [this.createAddressParser("code")],
+            processor: this.processCodeDelete_, backrefs: true,
+            needsProfile: true },
+        "function-creation": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("function-obj")],
+            processor: this.processFunctionCreation_, backrefs: true },
+        "function-move": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("code-move-to")],
+            processor: this.processFunctionMove_, backrefs: true },
+        "function-delete": { parsers: [this.createAddressParser("code")],
+            processor: this.processFunctionDelete_, backrefs: true },
+        "tick": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("stack"), parseInt, "var-args"],
+            processor: this.processTick_, backrefs: true, needProfile: true },
+        "profiler": { parsers: [null, "var-args"],
+            processor: this.processProfiler_, needsProfile: false },
+        "heap-sample-begin": { parsers: [null, null, parseInt],
+            processor: this.processHeapSampleBegin_ },
+        "heap-sample-stats": { parsers: [null, null, parseInt, parseInt],
+            processor: this.processHeapSampleStats_ },
+        "heap-sample-item": { parsers: [null, parseInt, parseInt],
+            processor: this.processHeapSampleItem_ },
+        "heap-js-cons-item": { parsers: [null, parseInt, parseInt],
+            processor: this.processHeapJsConsItem_ },
+        "heap-js-ret-item": { parsers: [null, "var-args"],
+            processor: this.processHeapJsRetItem_ },
+        "heap-sample-end": { parsers: [null, null],
+            processor: this.processHeapSampleEnd_ },
+        // Not used in DevTools Profiler.
+        "shared-library": null,
+        // Obsolete row types.
+        "code-allocate": null,
+        "begin-code-region": null,
+        "end-code-region": null};
+
+    if (devtools.profiler.Profile.VERSION === 2) {
+        dispatches["tick"] =  { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("stack"),
+            this.createAddressParser("func"), parseInt, "var-args"],
+            processor: this.processTickV2_, backrefs: true };
+    }
+
+    devtools.profiler.LogReader.call(this, dispatches);
+
+    /**
+     * Callback that is called when a new profile is encountered in the log.
+     * @type {function()}
+     */
+    this.startedProfileProcessing_ = null;
+
+    /**
+     * Callback that is called periodically to display processing status.
+     * @type {function()}
+     */
+    this.profileProcessingStatus_ = null;
+
+    /**
+     * Callback that is called when a profile has been processed and is ready
+     * to be shown.
+     * @type {function(devtools.profiler.ProfileView)}
+     */
+    this.finishedProfileProcessing_ = null;
+
+    /**
+     * The current profile.
+     * @type {devtools.profiler.JsProfile}
+     */
+    this.currentProfile_ = null;
+
+    /**
+     * Builder of profile views. Created during "profiler,begin" event processing.
+     * @type {devtools.profiler.WebKitViewBuilder}
+     */
+    this.viewBuilder_ = null;
+
+    /**
+     * Next profile id.
+     * @type {number}
+     */
+    this.profileId_ = 1;
+
+    /**
+     * Counter for processed ticks.
+     * @type {number}
+     */
+    this.ticksCount_ = 0;
+
+    /**
+     * Interval id for updating processing status.
+     * @type {number}
+     */
+    this.processingInterval_ = null;
+
+    /**
+     * The current heap snapshot.
+     * @type {string}
+     */
+    this.currentHeapSnapshot_ = null;
+
+    /**
+     * Next heap snapshot id.
+     * @type {number}
+     */
+    this.heapSnapshotId_ = 1;
+};
+devtools.profiler.Processor.prototype.__proto__ = devtools.profiler.LogReader.prototype;
+
+
+/**
+ * @override
+ */
+devtools.profiler.Processor.prototype.printError = function(str)
+{
+    debugPrint(str);
+};
+
+
+/**
+ * @override
+ */
+devtools.profiler.Processor.prototype.skipDispatch = function(dispatch)
+{
+    return dispatch.needsProfile && this.currentProfile_ === null;
+};
+
+
+/**
+ * Sets profile processing callbacks.
+ *
+ * @param {function()} started Started processing callback.
+ * @param {function(devtools.profiler.ProfileView)} finished Finished
+ *     processing callback.
+ */
+devtools.profiler.Processor.prototype.setCallbacks = function(started, processing, finished)
+{
+    this.startedProfileProcessing_ = started;
+    this.profileProcessingStatus_ = processing;
+    this.finishedProfileProcessing_ = finished;
+};
+
+
+/**
+ * An address for the fake "(program)" entry. WebKit's visualisation
+ * has assumptions on how the top of the call tree should look like,
+ * and we need to add a fake entry as the topmost function. This
+ * address is chosen because it's the end address of the first memory
+ * page, which is never used for code or data, but only as a guard
+ * page for catching AV errors.
+ *
+ * @type {number}
+ */
+devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff;
+/**
+ * @type {string}
+ */
+devtools.profiler.Processor.PROGRAM_ENTRY_STR = "0xffff";
+
+
+/**
+ * Sets new profile callback.
+ * @param {function(devtools.profiler.ProfileView)} callback Callback function.
+ */
+devtools.profiler.Processor.prototype.setNewProfileCallback = function(callback)
+{
+    this.newProfileCallback_ = callback;
+};
+
+
+devtools.profiler.Processor.prototype.processProfiler_ = function(state, params)
+{
+    switch (state) {
+        case "resume":
+            if (this.currentProfile_ === null) {
+                this.currentProfile_ = new devtools.profiler.JsProfile();
+                // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+                this.currentProfile_.addCode("Function", "(program)", devtools.profiler.Processor.PROGRAM_ENTRY, 1);
+                if (this.startedProfileProcessing_)
+                    this.startedProfileProcessing_();
+                this.ticksCount_ = 0;
+                var self = this;
+                if (this.profileProcessingStatus_) {
+                    this.processingInterval_ = window.setInterval(
+                        function() { self.profileProcessingStatus_(self.ticksCount_); },
+                        1000);
+                }
+            }
+            break;
+        case "pause":
+            if (this.currentProfile_ !== null) {
+                window.clearInterval(this.processingInterval_);
+                this.processingInterval_ = null;
+                if (this.finishedProfileProcessing_)
+                    this.finishedProfileProcessing_(this.createProfileForView());
+                this.currentProfile_ = null;
+            }
+            break;
+        case "begin":
+            var samplingRate = NaN;
+            if (params.length > 0)
+                samplingRate = parseInt(params[0]);
+            if (isNaN(samplingRate))
+                samplingRate = 1;
+            this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate);
+            break;
+        // These events are valid but aren't used.
+        case "compression":
+        case "end": break;
+        default:
+            throw new Error("unknown profiler state: " + state);
+    }
+};
+
+
+devtools.profiler.Processor.prototype.processCodeCreation_ = function(type, start, size, name)
+{
+    this.currentProfile_.addCode(this.expandAlias(type), name, start, size);
+};
+
+
+devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to)
+{
+    this.currentProfile_.moveCode(from, to);
+};
+
+
+devtools.profiler.Processor.prototype.processCodeDelete_ = function(start)
+{
+    this.currentProfile_.deleteCode(start);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionCreation_ = function(functionAddr, codeAddr)
+{
+    this.currentProfile_.addCodeAlias(functionAddr, codeAddr);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionMove_ = function(from, to)
+{
+    this.currentProfile_.safeMoveDynamicCode(from, to);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionDelete_ = function(start)
+{
+    this.currentProfile_.safeDeleteDynamicCode(start);
+};
+
+
+// TODO(mnaganov): Remove after next V8 roll.
+devtools.profiler.Processor.prototype.processTick_ = function(pc, sp, vmState, stack)
+{
+    // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+    stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
+    this.currentProfile_.recordTick(this.processStack(pc, stack));
+    this.ticksCount_++;
+};
+
+
+devtools.profiler.Processor.prototype.processTickV2_ = function(pc, sp, func, vmState, stack)
+{
+    // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+    stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
+
+
+    if (func) {
+        var funcEntry = this.currentProfile_.findEntry(func);
+        if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction())
+            func = 0;
+        else {
+            var currEntry = this.currentProfile_.findEntry(pc);
+            if (!currEntry || !currEntry.isJSFunction || currEntry.isJSFunction()) {
+                func = 0;
+            }
+        }
+    }
+
+    this.currentProfile_.recordTick(this.processStack(pc, func, stack));
+    this.ticksCount_++;
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(space, state, ticks)
+{
+    if (space !== "Heap") return;
+    this.currentHeapSnapshot_ = {
+        number: this.heapSnapshotId_++,
+        entries: {},
+        clusters: {},
+        lowlevels: {},
+        ticks: ticks
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(space, state, capacity, used)
+{
+    if (space !== "Heap") return;
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(item, number, size)
+{
+    if (!this.currentHeapSnapshot_) return;
+    this.currentHeapSnapshot_.lowlevels[item] = {
+        type: item, count: number, size: size
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(item, number, size)
+{
+    if (!this.currentHeapSnapshot_) return;
+    this.currentHeapSnapshot_.entries[item] = {
+        cons: item, count: number, size: size, retainers: {}
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(item, retainersArray)
+{
+    if (!this.currentHeapSnapshot_) return;
+    var rawRetainers = {};
+    for (var i = 0, n = retainersArray.length; i < n; ++i) {
+        var entry = retainersArray[i].split(";");
+        rawRetainers[entry[0]] = parseInt(entry[1], 10);
+    }
+
+    function mergeRetainers(entry) {
+        for (var rawRetainer in rawRetainers) {
+            var consName = rawRetainer.indexOf(":") !== -1 ? rawRetainer.split(":")[0] : rawRetainer;
+            if (!(consName in entry.retainers))
+                entry.retainers[consName] = { cons: consName, count: 0, clusters: {} };
+            var retainer = entry.retainers[consName];
+            retainer.count += rawRetainers[rawRetainer];
+            if (consName !== rawRetainer)
+                retainer.clusters[rawRetainer] = true;
+        }
+    }
+
+    if (item.indexOf(":") !== -1) {
+      // Array, Function, or Object instances cluster case.
+      if (!(item in this.currentHeapSnapshot_.clusters)) {
+          this.currentHeapSnapshot_.clusters[item] = {
+              cons: item, retainers: {}
+          };
+      }
+      mergeRetainers(this.currentHeapSnapshot_.clusters[item]);
+      item = item.split(":")[0];
+    }
+    mergeRetainers(this.currentHeapSnapshot_.entries[item]);
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(space, state)
+{
+    if (space !== "Heap") return;
+    var snapshot = this.currentHeapSnapshot_;
+    this.currentHeapSnapshot_ = null;
+    WebInspector.panels.profiles.addSnapshot(snapshot);
+};
+
+
+/**
+ * Creates a profile for further displaying in ProfileView.
+ */
+devtools.profiler.Processor.prototype.createProfileForView = function()
+{
+    var profile = this.viewBuilder_.buildView(this.currentProfile_.getTopDownProfile());
+    profile.uid = this.profileId_++;
+    profile.title = UserInitiatedProfileName + "." + profile.uid;
+    return profile;
+};
+
+/* HeapProfilerPanel.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Heap profiler panel implementation.
+ */
+
+WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
+    snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
+    snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId;
+
+    var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
+    snapshots.push(snapshot);
+
+    snapshot.listIndex = snapshots.length - 1;
+
+    if (WebInspector.CPUProfile)
+        this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
+    else
+        this.addProfileHeader(snapshot);
+
+    this.dispatchEventToListeners("snapshot added");
+}
+
+
+WebInspector.HeapSnapshotView = function(parent, profile)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("heap-snapshot-view");
+
+    this.parent = parent;
+    this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
+
+    this.showCountAsPercent = false;
+    this.showSizeAsPercent = false;
+    this.showCountDeltaAsPercent = false;
+    this.showSizeDeltaAsPercent = false;
+
+    this.categories = {
+        code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),
+        data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects"), "rgb(47,102,236)")
+    };
+
+    var summaryContainer = document.createElement("div");
+    summaryContainer.id = "heap-snapshot-summary-container";
+
+    this.countsSummaryBar = new WebInspector.SummaryBar(this.categories);
+    this.countsSummaryBar.element.className = "heap-snapshot-summary";
+    this.countsSummaryBar.calculator = new WebInspector.HeapSummaryCountCalculator();
+    var countsLabel = document.createElement("div");
+    countsLabel.className = "heap-snapshot-summary-label";
+    countsLabel.textContent = WebInspector.UIString("Count");
+    this.countsSummaryBar.element.appendChild(countsLabel);
+    summaryContainer.appendChild(this.countsSummaryBar.element);
+
+    this.sizesSummaryBar = new WebInspector.SummaryBar(this.categories);
+    this.sizesSummaryBar.element.className = "heap-snapshot-summary";
+    this.sizesSummaryBar.calculator = new WebInspector.HeapSummarySizeCalculator();
+    var sizesLabel = document.createElement("label");
+    sizesLabel.className = "heap-snapshot-summary-label";
+    sizesLabel.textContent = WebInspector.UIString("Size");
+    this.sizesSummaryBar.element.appendChild(sizesLabel);
+    summaryContainer.appendChild(this.sizesSummaryBar.element);
+
+    this.element.appendChild(summaryContainer);
+
+    var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
+                    "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
+                    "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
+                    "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
+                    "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
+
+    this.dataGrid = new WebInspector.DataGrid(columns);
+    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
+    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
+    this.element.appendChild(this.dataGrid.element);
+
+    this.profile = profile;
+
+    this.baseSelectElement = document.createElement("select");
+    this.baseSelectElement.className = "status-bar-item";
+    this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
+    this._updateBaseOptions();
+    if (this.profile.listIndex > 0)
+        this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
+    else
+        this.baseSelectElement.selectedIndex = this.profile.listIndex;
+    this._resetDataGridList();
+
+    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
+    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
+
+    this.refresh();
+
+    this._updatePercentButton();
+};
+
+WebInspector.HeapSnapshotView.prototype = {
+
+    get statusBarItems()
+    {
+        return [this.baseSelectElement, this.percentButton.element];
+    },
+
+    get profile()
+    {
+        return this._profile;
+    },
+
+    set profile(profile)
+    {
+        this._profile = profile;
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.dataGrid.updateWidths();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.dataGrid)
+            this.dataGrid.updateWidths();
+    },
+
+    refresh: function()
+    {
+        this.dataGrid.removeChildren();
+
+        var children = this.snapshotDataGridList.children;
+        var count = children.length;
+        for (var index = 0; index < count; ++index)
+            this.dataGrid.appendChild(children[index]);
+
+        this._updateSummaryGraph();
+    },
+
+    refreshShowAsPercents: function()
+    {
+        this._updatePercentButton();
+        this.refreshVisibleData();
+    },
+
+    _deleteSearchMatchedFlags: function(node)
+    {
+        delete node._searchMatchedConsColumn;
+        delete node._searchMatchedCountColumn;
+        delete node._searchMatchedSizeColumn;
+        delete node._searchMatchedCountDeltaColumn;
+        delete node._searchMatchedSizeDeltaColumn;
+    },
+
+    searchCanceled: function()
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var profileNode = this._searchResults[i].profileNode;
+                this._deleteSearchMatchedFlags(profileNode);
+                profileNode.refresh();
+            }
+        }
+
+        delete this._searchFinishedCallback;
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        query = query.trimWhitespace();
+
+        if (!query.length)
+            return;
+
+        this._searchFinishedCallback = finishedCallback;
+
+        var helper = WebInspector.HeapSnapshotView.SearchHelper;
+
+        var operationAndNumber = helper.parseOperationAndNumber(query);
+        var operation = operationAndNumber[0];
+        var queryNumber = operationAndNumber[1];
+
+        var percentUnits = helper.percents.test(query);
+        var megaBytesUnits = helper.megaBytes.test(query);
+        var kiloBytesUnits = helper.kiloBytes.test(query);
+        var bytesUnits = helper.bytes.test(query);
+
+        var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));
+
+        function matchesQuery(heapSnapshotDataGridNode)
+        {
+            WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);
+
+            if (percentUnits) {
+                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);
+            } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {
+                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);
+            } else {
+                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);
+            }
+
+            if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))
+                heapSnapshotDataGridNode._searchMatchedConsColumn = true;
+
+            if (heapSnapshotDataGridNode._searchMatchedConsColumn ||
+                heapSnapshotDataGridNode._searchMatchedCountColumn ||
+                heapSnapshotDataGridNode._searchMatchedSizeColumn ||
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {
+                heapSnapshotDataGridNode.refresh();
+                return true;
+            }
+
+            return false;
+        }
+
+        var current = this.snapshotDataGridList.children[0];
+        var depth = 0;
+        var info = {};
+
+        // The second and subsequent levels of heap snapshot nodes represent retainers,
+        // so recursive expansion will be infinite, since a graph is being traversed.
+        // So default to a recursion cap of 2 levels.
+        var maxDepth = 2;
+
+        while (current) {
+            if (matchesQuery(current))
+                this._searchResults.push({ profileNode: current });
+            current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
+            depth += info.depthChange;
+        }
+
+        finishedCallback(this, this._searchResults.length);
+    },
+
+    jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,
+    jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,
+    jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,
+    jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,
+    showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,
+    showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,
+    _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,
+
+    refreshVisibleData: function()
+    {
+        var child = this.dataGrid.children[0];
+        while (child) {
+            child.refresh();
+            child = child.traverseNextNode(false, null, true);
+        }
+        this._updateSummaryGraph();
+    },
+
+    _changeBase: function() {
+        if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
+            return;
+
+        this._resetDataGridList();
+        this.refresh();
+
+        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
+            return;
+
+        // The current search needs to be performed again. First negate out previous match
+        // count by calling the search finished callback with a negative number of matches.
+        // Then perform the search again with the same query and callback.
+        this._searchFinishedCallback(this, -this._searchResults.length);
+        this.performSearch(this.currentQuery, this._searchFinishedCallback);
+    },
+
+    _createSnapshotDataGridList: function()
+    {
+        if (this._snapshotDataGridList)
+          delete this._snapshotDataGridList;
+
+        this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
+        return this._snapshotDataGridList;
+    },
+
+    _mouseDownInDataGrid: function(event)
+    {
+        if (event.detail < 2)
+            return;
+
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
+            return;
+
+        if (cell.hasStyleClass("count-column"))
+            this.showCountAsPercent = !this.showCountAsPercent;
+        else if (cell.hasStyleClass("size-column"))
+            this.showSizeAsPercent = !this.showSizeAsPercent;
+        else if (cell.hasStyleClass("countDelta-column"))
+            this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
+        else if (cell.hasStyleClass("sizeDelta-column"))
+            this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
+
+        this.refreshShowAsPercents();
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    get _isShowingAsPercent()
+    {
+        return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
+    },
+
+    _percentClicked: function(event)
+    {
+        var currentState = this._isShowingAsPercent;
+        this.showCountAsPercent = !currentState;
+        this.showSizeAsPercent = !currentState;
+        this.showCountDeltaAsPercent = !currentState;
+        this.showSizeDeltaAsPercent = !currentState;
+        this.refreshShowAsPercents();
+    },
+
+    _resetDataGridList: function()
+    {
+        this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
+        var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
+        if (this.snapshotDataGridList)
+            lastComparator = this.snapshotDataGridList.lastComparator;
+        this.snapshotDataGridList = this._createSnapshotDataGridList();
+        this.snapshotDataGridList.sort(lastComparator, true);
+    },
+
+    _sortData: function()
+    {
+        var sortAscending = this.dataGrid.sortOrder === "ascending";
+        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
+        var sortProperty = {
+                "cons": ["constructorName", null],
+                "count": ["count", null],
+                "size": ["size", "count"],
+                "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],
+                "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]
+        }[sortColumnIdentifier];
+
+        this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));
+
+        this.refresh();
+    },
+
+    _updateBaseOptions: function()
+    {
+        var list = WebInspector.HeapSnapshotProfileType.snapshots;
+        // We're assuming that snapshots can only be added.
+        if (this.baseSelectElement.length === list.length)
+            return;
+
+        for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
+            var baseOption = document.createElement("option");
+            baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
+            this.baseSelectElement.appendChild(baseOption);
+        }
+    },
+
+    _updatePercentButton: function()
+    {
+        if (this._isShowingAsPercent) {
+            this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
+            this.percentButton.toggled = true;
+        } else {
+            this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
+            this.percentButton.toggled = false;
+        }
+    },
+
+    _updateSummaryGraph: function()
+    {
+        this.countsSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
+        this.countsSummaryBar.update(this.profile.lowlevels);
+
+        this.sizesSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
+        this.sizesSummaryBar.update(this.profile.lowlevels);
+    }
+};
+
+WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.HeapSnapshotView.SearchHelper = {
+    // In comparators, we assume that a value from a node is passed as the first parameter.
+    operations: { LESS: function (a, b) { return a !== null && a < b; },
+                  LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },
+                  EQUAL: function (a, b) { return a !== null && a === b; },
+                  GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },
+                  GREATER: function (a, b) { return a !== null && a > b; } },
+
+    operationParsers: { LESS: /^<(\d+)/,
+                        LESS_OR_EQUAL: /^<=(\d+)/,
+                        GREATER_OR_EQUAL: /^>=(\d+)/,
+                        GREATER: /^>(\d+)/ },
+
+    parseOperationAndNumber: function(query)
+    {
+        var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;
+        var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;
+        for (var operation in parsers) {
+            var match = query.match(parsers[operation]);
+            if (match !== null)
+                return [operations[operation], parseFloat(match[1])];
+        }
+        return [operations.EQUAL, parseFloat(query)];
+    },
+
+    percents: /%$/,
+
+    megaBytes: /MB$/i,
+
+    kiloBytes: /KB$/i,
+
+    bytes: /B$/i
+}
+
+WebInspector.HeapSummaryCalculator = function(lowLevelField)
+{
+    this.total = 1;
+    this.lowLevelField = lowLevelField;
+}
+
+WebInspector.HeapSummaryCalculator.prototype = {
+    computeSummaryValues: function(lowLevels)
+    {
+        var highLevels = {data: 0, code: 0};
+        this.total = 0;
+        for (var item in lowLevels) {
+            var highItem = this._highFromLow(item);
+            if (highItem) {
+                var value = lowLevels[item][this.lowLevelField];
+                highLevels[highItem] += value;
+                this.total += value;
+            }
+        }
+        var result = {categoryValues: highLevels};
+        if (!this.showAsPercent)
+            result.total = this.total;
+        return result;
+    },
+
+    formatValue: function(value)
+    {
+        if (this.showAsPercent)
+            return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
+        else
+            return this._valueToString(value);
+    },
+
+    get showAsPercent()
+    {
+        return this._showAsPercent;
+    },
+
+    set showAsPercent(x)
+    {
+        this._showAsPercent = x;
+    }
+}
+
+WebInspector.HeapSummaryCountCalculator = function()
+{
+    WebInspector.HeapSummaryCalculator.call(this, "count");
+}
+
+WebInspector.HeapSummaryCountCalculator.prototype = {
+    _highFromLow: function(type) {
+        if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
+        if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/)) return "data";
+        return null;
+    },
+
+    _valueToString: function(value) {
+        return value.toString();
+    }
+}
+
+WebInspector.HeapSummaryCountCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
+
+WebInspector.HeapSummarySizeCalculator = function()
+{
+    WebInspector.HeapSummaryCalculator.call(this, "size");
+}
+
+WebInspector.HeapSummarySizeCalculator.prototype = {
+    _highFromLow: function(type) {
+        if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
+        if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
+        return null;
+    },
+
+    _valueToString: Number.bytesToString
+}
+
+WebInspector.HeapSummarySizeCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
+
+WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
+{
+    this.profile = snapshot;
+
+    WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
+
+    this.refreshTitles();
+};
+
+WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
+    get mainTitle()
+    {
+        if (this._mainTitle)
+            return this._mainTitle;
+        return this.profile.title;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    }
+};
+
+WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
+{
+    this.tree = owningTree;
+
+    WebInspector.DataGridNode.call(this, null, this._hasRetainers);
+
+    this.addEventListener("populate", this._populate, this);
+};
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
+    isEmptySet: function(set)
+    {
+        for (var x in set)
+            return false;
+        return true;
+    },
+
+    get _hasRetainers()
+    {
+        return !this.isEmptySet(this.retainers);
+    },
+
+    get _parent()
+    {
+        // For top-level nodes, return owning tree as a parent, not data grid.
+        return this.parent !== this.dataGrid ? this.parent : this.tree;
+    },
+
+    _populate: function(event)
+    {
+        var self = this;
+        this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
+            self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
+        });
+
+        if (this._parent) {
+            var currentComparator = this._parent.lastComparator;
+            if (currentComparator)
+                this.sort(currentComparator, true);
+        }
+
+        this.removeEventListener("populate", this._populate, this);
+    },
+
+    produceDiff: function(baseEntries, currentEntries, callback)
+    {
+        for (var item in currentEntries)
+            callback(baseEntries[item], currentEntries[item]);
+
+        for (item in baseEntries) {
+            if (!(item in currentEntries))
+                callback(baseEntries[item], null);
+        }
+    },
+
+    sort: function(comparator, force) {
+        if (!force && this.lastComparator === comparator)
+            return;
+
+        this.children.sort(comparator);
+        var childCount = this.children.length;
+        for (var childIndex = 0; childIndex < childCount; ++childIndex)
+            this.children[childIndex]._recalculateSiblings(childIndex);
+        for (var i = 0; i < this.children.length; ++i) {
+            var child = this.children[i];
+            if (!force && (!child.expanded || child.lastComparator === comparator))
+                continue;
+            child.sort(comparator, force);
+        }
+        this.lastComparator = comparator;
+    },
+
+    signForDelta: function(delta) {
+        if (delta === 0)
+            return "";
+        if (delta > 0)
+            return "+";
+        else
+            // Math minus sign, same width as plus.
+            return "\u2212";
+    },
+
+    showDeltaAsPercent: function(value) {
+        if (value === Number.POSITIVE_INFINITY)
+            return WebInspector.UIString("new");
+        else if (value === Number.NEGATIVE_INFINITY)
+            return WebInspector.UIString("deleted");
+        if (value > 1000.0)
+            return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
+        return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
+    },
+
+    getTotalCount: function() {
+        if (!this._count) {
+            this._count = 0;
+            for (var i = 0, n = this.children.length; i < n; ++i)
+                this._count += this.children[i].count;
+        }
+        return this._count;
+    },
+
+    getTotalSize: function() {
+        if (!this._size) {
+            this._size = 0;
+            for (var i = 0, n = this.children.length; i < n; ++i)
+                this._size += this.children[i].size;
+        }
+        return this._size;
+    },
+
+    get countPercent()
+    {
+        return this.count / this._parent.getTotalCount() * 100.0;
+    },
+
+    get sizePercent()
+    {
+        return this.size / this._parent.getTotalSize() * 100.0;
+    },
+
+    get countDeltaPercent()
+    {
+        if (this.baseCount > 0) {
+            if (this.count > 0)
+                return this.countDelta / this.baseCount * 100.0;
+            else
+                return Number.NEGATIVE_INFINITY;
+        } else
+            return Number.POSITIVE_INFINITY;
+    },
+
+    get sizeDeltaPercent()
+    {
+        if (this.baseSize > 0) {
+            if (this.size > 0)
+                return this.sizeDelta / this.baseSize * 100.0;
+            else
+                return Number.NEGATIVE_INFINITY;
+        } else
+            return Number.POSITIVE_INFINITY;
+    },
+
+    get data()
+    {
+        var data = {};
+
+        data["cons"] = this.constructorName;
+
+        if (this.snapshotView.showCountAsPercent)
+            data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
+        else
+            data["count"] = this.count;
+
+        if (this.size !== null) {
+            if (this.snapshotView.showSizeAsPercent)
+                data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
+            else
+                data["size"] = Number.bytesToString(this.size);
+        } else
+            data["size"] = "";
+
+        if (this.snapshotView.showCountDeltaAsPercent)
+            data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
+        else
+            data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
+
+        if (this.sizeDelta !== null) {
+            if (this.snapshotView.showSizeDeltaAsPercent)
+                data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
+            else
+                data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
+        } else
+            data["sizeDelta"] = "";
+
+        return data;
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
+
+        if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||
+            (columnIdentifier === "count" && this._searchMatchedCountColumn) ||
+            (columnIdentifier === "size" && this._searchMatchedSizeColumn) ||
+            (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||
+            (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))
+            cell.addStyleClass("highlight");
+
+        return cell;
+    }
+};
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
+{
+    this.snapshotView = snapshotView;
+
+    if (!snapshotEntry)
+        snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
+    this.constructorName = snapshotEntry.cons;
+    this.count = snapshotEntry.count;
+    this.size = snapshotEntry.size;
+    this.retainers = snapshotEntry.retainers;
+
+    if (!baseEntry)
+        baseEntry = { count: 0, size: 0, retainers: {} };
+    this.baseCount = baseEntry.count;
+    this.countDelta = this.count - this.baseCount;
+    this.baseSize = baseEntry.size;
+    this.sizeDelta = this.size - this.baseSize;
+    this.baseRetainers = baseEntry.retainers;
+
+    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
+};
+
+WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
+
+WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
+{
+    this.tree = this;
+    this.snapshotView = snapshotView;
+    this.children = [];
+    this.lastComparator = null;
+    this.populateChildren(baseEntries, snapshotEntries);
+};
+
+WebInspector.HeapSnapshotDataGridList.prototype = {
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        this.children.splice(index, 0, child);
+    },
+
+    removeChildren: function()
+    {
+        this.children = [];
+    },
+
+    populateChildren: function(baseEntries, snapshotEntries)
+    {
+        var self = this;
+        this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
+            self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
+        });
+    },
+
+    produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
+    sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
+    getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
+    getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
+};
+
+WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
+
+WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)
+{
+    var propertyHash = property + "#" + property2;
+    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];
+    if (!comparator) {
+        comparator = function(lhs, rhs) {
+            var l = lhs[property], r = rhs[property];
+            if ((l === null || r === null) && property2 !== null)
+                l = lhs[property2], r = rhs[property2];
+            var result = l < r ? -1 : (l > r ? 1 : 0);
+            return isAscending ? result : -result;
+        };
+        this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;
+    }
+    return comparator;
+};
+
+WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
+{
+    this.snapshotView = snapshotView;
+
+    if (!snapshotEntry)
+        snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
+    this.constructorName = snapshotEntry.cons;
+    this.count = snapshotEntry.count;
+    this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
+
+    if (!baseEntry)
+        baseEntry = { count: 0, clusters: {} };
+    this.baseCount = baseEntry.count;
+    this.countDelta = this.count - this.baseCount;
+    this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
+
+    this.size = null;
+    this.sizeDelta = null;
+
+    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
+}
+
+WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
+    get sizePercent()
+    {
+        return null;
+    },
+
+    get sizeDeltaPercent()
+    {
+        return null;
+    },
+
+    _calculateRetainers: function(snapshot, clusters) {
+        var retainers = {};
+        if (this.isEmptySet(clusters)) {
+            if (this.constructorName in snapshot.entries)
+                return snapshot.entries[this.constructorName].retainers;
+        } else {
+            // In case when an entry is retained by clusters, we need to gather up the list
+            // of retainers by merging retainers of every cluster.
+            // E.g. having such a tree:
+            //   A
+            //     Object:1  10
+            //       X       3
+            //       Y       4
+            //     Object:2  5
+            //       X       6
+            //
+            // will result in a following retainers list: X 9, Y 4.
+            for (var clusterName in clusters) {
+                if (clusterName in snapshot.clusters) {
+                    var clusterRetainers = snapshot.clusters[clusterName].retainers;
+                    for (var clusterRetainer in clusterRetainers) {
+                        var clusterRetainerEntry = clusterRetainers[clusterRetainer];
+                        if (!(clusterRetainer in retainers))
+                            retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
+                        retainers[clusterRetainer].count += clusterRetainerEntry.count;
+                        for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
+                            retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
+                    }
+                }
+            }
+        }
+        return retainers;
+    }
+};
+
+WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
+
+
+WebInspector.HeapSnapshotProfileType = function()
+{
+    WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
+}
+
+WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
+
+WebInspector.HeapSnapshotProfileType.snapshots = [];
+
+WebInspector.HeapSnapshotProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return WebInspector.UIString("Take heap snapshot.");
+    },
+
+    get buttonStyle()
+    {
+        return "heap-snapshot-status-bar-item status-bar-item";
+    },
+
+    buttonClicked: function()
+    {
+        InspectorBackend.takeHeapSnapshot();
+    },
+
+    get welcomeMessage()
+    {
+        return WebInspector.UIString("Get a heap snapshot by pressing<br>the %s button on the status bar.");
+    },
+
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
+        element.small = false;
+        return element;
+    },
+
+    createView: function(profile)
+    {
+        return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
+    }
+}
+
+WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
+
+
+(function() {
+    var originalCreatePanels = WebInspector._createPanels;
+    WebInspector._createPanels = function() {
+        originalCreatePanels.apply(this, arguments);
+        if (WebInspector.panels.profiles)
+            WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
+    }
+})();
+
+/* DevTools.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @fileoverview Tools is a main class that wires all components of the
+ * DevTools frontend together. It is also responsible for overriding existing
+ * WebInspector functionality while it is getting upstreamed into WebCore.
+ */
+
+/**
+ * Dispatches raw message from the host.
+ * @param {string} remoteName
+ * @prama {string} methodName
+ * @param {string} param1, param2, param3 Arguments to dispatch.
+ */
+devtools$$dispatch = function(remoteName, methodName, param1, param2, param3)
+{
+    remoteName = "Remote" + remoteName.substring(0, remoteName.length - 8);
+    var agent = window[remoteName];
+    if (!agent) {
+        debugPrint("No remote agent '" + remoteName + "' found.");
+        return;
+    }
+    var method = agent[methodName];
+    if (!method) {
+        debugPrint("No method '" + remoteName + "." + methodName + "' found.");
+        return;
+    }
+    method.call(this, param1, param2, param3);
+};
+
+
+devtools.ToolsAgent = function()
+{
+    RemoteToolsAgent.didDispatchOn = WebInspector.Callback.processCallback;
+    RemoteToolsAgent.frameNavigate = this.frameNavigate_.bind(this);
+    RemoteToolsAgent.dispatchOnClient = this.dispatchOnClient_.bind(this);
+    this.debuggerAgent_ = new devtools.DebuggerAgent();
+    this.profilerAgent_ = new devtools.ProfilerAgent();
+};
+
+
+/**
+ * Resets tools agent to its initial state.
+ */
+devtools.ToolsAgent.prototype.reset = function()
+{
+    this.debuggerAgent_.reset();
+};
+
+
+/**
+ * @param {string} script Script exression to be evaluated in the context of the
+ *     inspected page.
+ * @param {function(Object|string, boolean):undefined} opt_callback Function to
+ *     call with the result.
+ */
+devtools.ToolsAgent.prototype.evaluateJavaScript = function(script, opt_callback)
+{
+    InspectorBackend.evaluate(script, opt_callback || function() {});
+};
+
+
+/**
+ * @return {devtools.DebuggerAgent} Debugger agent instance.
+ */
+devtools.ToolsAgent.prototype.getDebuggerAgent = function()
+{
+    return this.debuggerAgent_;
+};
+
+
+/**
+ * @return {devtools.ProfilerAgent} Profiler agent instance.
+ */
+devtools.ToolsAgent.prototype.getProfilerAgent = function()
+{
+    return this.profilerAgent_;
+};
+
+
+/**
+ * @param {string} url Url frame navigated to.
+ * @see tools_agent.h
+ * @private
+ */
+devtools.ToolsAgent.prototype.frameNavigate_ = function(url)
+{
+    this.reset();
+    // Do not reset Profiles panel.
+    var profiles = null;
+    if ("profiles" in WebInspector.panels) {
+        profiles = WebInspector.panels["profiles"];
+        delete WebInspector.panels["profiles"];
+    }
+    WebInspector.reset();
+    if (profiles !== null)
+        WebInspector.panels["profiles"] = profiles;
+};
+
+
+/**
+ * @param {string} message Serialized call to be dispatched on WebInspector.
+ * @private
+ */
+devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message)
+{
+    var args = JSON.parse(message);
+    var methodName = args[0];
+    var parameters = args.slice(1);
+    WebInspector[methodName].apply(WebInspector, parameters);
+};
+
+
+/**
+ * Evaluates js expression.
+ * @param {string} expr
+ */
+devtools.ToolsAgent.prototype.evaluate = function(expr)
+{
+    RemoteToolsAgent.evaluate(expr);
+};
+
+
+/**
+ * Prints string  to the inspector console or shows alert if the console doesn't
+ * exist.
+ * @param {string} text
+ */
+function debugPrint(text) {
+    WebInspector.log(text);
+}
+
+
+/**
+ * Global instance of the tools agent.
+ * @type {devtools.ToolsAgent}
+ */
+devtools.tools = null;
+
+
+var context = {};  // Used by WebCore's inspector routines.
+
+///////////////////////////////////////////////////////////////////////////////
+// Here and below are overrides to existing WebInspector methods only.
+// TODO(pfeldman): Patch WebCore and upstream changes.
+var oldLoaded = WebInspector.loaded;
+WebInspector.loaded = function()
+{
+    devtools.tools = new devtools.ToolsAgent();
+    devtools.tools.reset();
+
+    Preferences.ignoreWhitespace = false;
+    Preferences.samplingCPUProfiler = true;
+    Preferences.heapProfilerPresent = true;
+    Preferences.debuggerAlwaysEnabled = true;
+    Preferences.profilerAlwaysEnabled = true;
+    oldLoaded.call(this);
+
+    InspectorFrontendHost.loaded();
+};
+
+
+/**
+ * This override is necessary for adding script source asynchronously.
+ * @override
+ */
+WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function()
+{
+    if (!this._frameNeedsSetup)
+        return;
+
+    this.attach();
+
+    if (this.script.source)
+        this.didResolveScriptSource_();
+    else {
+        var self = this;
+        devtools.tools.getDebuggerAgent().resolveScriptSource(
+            this.script.sourceID,
+            function(source) {
+                self.script.source = source || WebInspector.UIString("<source is not available>");
+                self.didResolveScriptSource_();
+            });
+    }
+};
+
+
+/**
+ * Performs source frame setup when script source is aready resolved.
+ */
+WebInspector.ScriptView.prototype.didResolveScriptSource_ = function()
+{
+    this.sourceFrame.setContent("text/javascript", this.script.source);
+    this._sourceFrameSetup = true;
+    delete this._frameNeedsSetup;
+};
+
+
+/**
+ * @param {string} type Type of the the property value("object" or "function").
+ * @param {string} className Class name of the property value.
+ * @constructor
+ */
+WebInspector.UnresolvedPropertyValue = function(type, className)
+{
+    this.type = type;
+    this.className = className;
+};
+
+
+(function()
+{
+    var oldShow = WebInspector.ScriptsPanel.prototype.show;
+    WebInspector.ScriptsPanel.prototype.show =  function()
+    {
+        devtools.tools.getDebuggerAgent().initUI();
+        this.enableToggleButton.visible = false;
+        oldShow.call(this);
+    };
+})();
+
+
+(function InterceptProfilesPanelEvents()
+{
+    var oldShow = WebInspector.ProfilesPanel.prototype.show;
+    WebInspector.ProfilesPanel.prototype.show = function()
+    {
+        devtools.tools.getProfilerAgent().initializeProfiling();
+        this.enableToggleButton.visible = false;
+        oldShow.call(this);
+        // Show is called on every show event of a panel, so
+        // we only need to intercept it once.
+        WebInspector.ProfilesPanel.prototype.show = oldShow;
+    };
+})();
+
+
+/*
+ * @override
+ * TODO(mnaganov): Restore l10n when it will be agreed that it is needed.
+ */
+WebInspector.UIString = function(string)
+{
+    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
+};
+
+// Activate window upon node search complete. This will go away once InspectorFrontendClient is landed.
+(function() {
+    var original = WebInspector.searchingForNodeWasDisabled;
+    WebInspector.searchingForNodeWasDisabled = function()
+    {
+        if (this.panels.elements._nodeSearchButton.toggled)
+            InspectorFrontendHost.activateWindow();
+        original.apply(this, arguments);
+    }
+})();
+
+
+// There is no clear way of setting frame title yet. So sniffing main resource
+// load.
+(function OverrideUpdateResource() {
+    var originalUpdateResource = WebInspector.updateResource;
+    WebInspector.updateResource = function(identifier, payload)
+    {
+        originalUpdateResource.call(this, identifier, payload);
+        var resource = this.resources[identifier];
+        if (resource && resource.mainResource && resource.finished)
+            document.title = WebInspector.UIString("Developer Tools - %s", resource.url);
+    };
+})();
+
+
+// Highlight extension content scripts in the scripts list.
+(function () {
+    var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu;
+    WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script)
+    {
+        var result = original.apply(this, arguments);
+        var debuggerAgent = devtools.tools.getDebuggerAgent();
+        var type = debuggerAgent.getScriptContextType(script.sourceID);
+        var option = script.filesSelectOption;
+        if (type === "injected" && option)
+            option.addStyleClass("injected");
+        return result;
+    };
+})();
+
+
+/** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */
+(function()
+{
+    var originalDragStart = WebInspector.elementDragStart;
+    WebInspector.elementDragStart = function(element)
+    {
+        if (element) {
+            var glassPane = document.createElement("div");
+            glassPane.style.cssText = "position:absolute;width:100%;height:100%;opacity:0;z-index:1";
+            glassPane.id = "glass-pane-for-drag";
+            element.parentElement.appendChild(glassPane);
+        }
+
+        originalDragStart.apply(this, arguments);
+    };
+
+    var originalDragEnd = WebInspector.elementDragEnd;
+    WebInspector.elementDragEnd = function()
+    {
+        originalDragEnd.apply(this, arguments);
+
+        var glassPane = document.getElementById("glass-pane-for-drag");
+        if (glassPane)
+            glassPane.parentElement.removeChild(glassPane);
+    };
+})();
+
+
+(function () {
+var orig = InjectedScriptAccess.prototype.getProperties;
+InjectedScriptAccess.prototype.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback)
+{
+    if (objectProxy.isScope)
+        devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId, callback);
+    else if (objectProxy.isV8Ref)
+        devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId, callback, false);
+    else
+        orig.apply(this, arguments);
+};
+})();
+
+
+(function()
+{
+InjectedScriptAccess.prototype.evaluateInCallFrame = function(callFrameId, code, objectGroup, callback)
+{
+    //TODO(pfeldman): remove once 49084 is rolled.
+    if (!callback)
+        callback = objectGroup;
+    devtools.tools.getDebuggerAgent().evaluateInCallFrame(callFrameId, code, callback);
+};
+})();
+
+
+(function()
+{
+var orig = InjectedScriptAccess.prototype.getCompletions;
+InjectedScriptAccess.prototype.getCompletions = function(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions)
+{
+    if (typeof callFrameId === "number")
+        devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(expressionString, callFrameId, reportCompletions);
+    else
+        return orig.apply(this, arguments);
+};
+})();
+
+
+// We need to have a place for postponed tasks
+// which should be executed when all the messages between agent and frontend
+// are processed.
+
+WebInspector.runAfterPendingDispatchesQueue = [];
+
+WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback)
+{
+    WebInspector.runAfterPendingDispatchesQueue.push(callback);
+};
+
+WebInspector.queuesAreEmpty = function()
+{
+    var copy = this.runAfterPendingDispatchesQueue.slice();
+    this.runAfterPendingDispatchesQueue = [];
+    for (var i = 0; i < copy.length; ++i)
+        copy[i].call(this);
+};
+
+(function()
+{
+var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame;
+InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element)
+{
+    var resource = WebInspector.resources[identifier];
+    if (!resource)
+        return;
+    originalAddToFrame.call(this, identifier, resource.mimeType, element);
+};
+})();
+
+WebInspector.pausedScript = function(callFrames)
+{
+    this.panels.scripts.debuggerPaused(callFrames);
+};
+
+/* DevToolsHostStub.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview These stubs emulate backend functionality and allows
+ * DevTools frontend to function as a standalone web app.
+ */
+
+if (!window["RemoteDebuggerAgent"]) {
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @constructor
+ */
+RemoteDebuggerAgentStub = function()
+{
+};
+
+
+RemoteDebuggerAgentStub.prototype.getContextId = function()
+{
+    RemoteDebuggerAgent.setContextId(3);
+};
+
+
+RemoteDebuggerAgentStub.prototype.processDebugCommands = function()
+{
+};
+
+
+/**
+ * @constructor
+ */
+RemoteProfilerAgentStub = function()
+{
+};
+
+
+RemoteProfilerAgentStub.prototype.getActiveProfilerModules = function()
+{
+    ProfilerStubHelper.GetInstance().getActiveProfilerModules();
+};
+
+
+RemoteProfilerAgentStub.prototype.getLogLines = function(pos)
+{
+    ProfilerStubHelper.GetInstance().getLogLines(pos);
+};
+
+
+/**
+ * @constructor
+ */
+RemoteToolsAgentStub = function()
+{
+};
+
+
+RemoteToolsAgentStub.prototype.dispatchOnInjectedScript = function()
+{
+};
+
+
+RemoteToolsAgentStub.prototype.dispatchOnInspectorController = function()
+{
+};
+
+
+/**
+ * @constructor
+ */
+ProfilerStubHelper = function()
+{
+    this.activeProfilerModules_ = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
+    this.heapProfSample_ = 0;
+    this.log_ = '';
+};
+
+
+ProfilerStubHelper.GetInstance = function()
+{
+    if (!ProfilerStubHelper.instance_)
+        ProfilerStubHelper.instance_ = new ProfilerStubHelper();
+    return ProfilerStubHelper.instance_;
+};
+
+
+ProfilerStubHelper.prototype.StopProfiling = function(modules)
+{
+    this.activeProfilerModules_ &= ~modules;
+};
+
+
+ProfilerStubHelper.prototype.StartProfiling = function(modules)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
+        if (modules & profModules.PROFILER_MODULE_HEAP_STATS) {
+            this.log_ +=
+                'heap-sample-begin,"Heap","allocated",' +
+                    (new Date()).getTime() + '\n' +
+                'heap-sample-stats,"Heap","allocated",10000,1000\n';
+            this.log_ +=
+                'heap-sample-item,STRING_TYPE,100,1000\n' +
+                'heap-sample-item,CODE_TYPE,10,200\n' +
+                'heap-sample-item,MAP_TYPE,20,350\n';
+            this.log_ += ProfilerStubHelper.HeapSamples[this.heapProfSample_++];
+            this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length;
+            this.log_ += 'heap-sample-end,"Heap","allocated"\n';
+        }
+    } else {
+        if (modules & profModules.PROFILER_MODULE_CPU)
+            this.log_ += ProfilerStubHelper.ProfilerLogBuffer;
+        this.activeProfilerModules_ |= modules;
+    }
+};
+
+
+ProfilerStubHelper.prototype.getActiveProfilerModules = function()
+{
+    var self = this;
+    setTimeout(function() {
+        RemoteProfilerAgent.didGetActiveProfilerModules(self.activeProfilerModules_);
+    }, 100);
+};
+
+
+ProfilerStubHelper.prototype.getLogLines = function(pos)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    var logLines = this.log_.substr(pos);
+    setTimeout(function() {
+        RemoteProfilerAgent.didGetLogLines(pos + logLines.length, logLines);
+    }, 100);
+};
+
+
+ProfilerStubHelper.ProfilerLogBuffer =
+    'profiler,begin,1\n' +
+    'profiler,resume\n' +
+    'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' +
+    'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' +
+    'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' +
+    'tick,0x1010,0x0,3\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x3010,0x0,3,0x2020, 0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x2030,0x0,3,0x2020, 0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x1010,0x0,3\n' +
+    'profiler,pause\n';
+
+
+ProfilerStubHelper.HeapSamples = [
+    'heap-js-cons-item,foo,1,100\n' +
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,Object,5,100\n' +
+    'heap-js-ret-item,foo,bar;3\n' +
+    'heap-js-ret-item,bar,foo;5\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1\n',
+
+    'heap-js-cons-item,foo,2000,200000\n' +
+    'heap-js-cons-item,bar,10,1000\n' +
+    'heap-js-cons-item,Object,6,120\n' +
+    'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' +
+    'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1\n',
+
+    'heap-js-cons-item,foo,15,1500\n' +
+    'heap-js-cons-item,bar,15,1500\n' +
+    'heap-js-cons-item,Object,5,100\n' +
+    'heap-js-cons-item,Array,3,1000\n' +
+    'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' +
+    'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' +
+    'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' +
+    'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n',
+
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,Object,6,120\n' +
+    'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' +
+    'heap-js-ret-item,Object:0x1234,(global property);3\n' +
+    'heap-js-ret-item,Object:0x1235,(global property);5\n',
+
+    'heap-js-cons-item,foo,15,1500\n' +
+    'heap-js-cons-item,bar,15,1500\n' +
+    'heap-js-cons-item,Array,10,1000\n' +
+    'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' +
+    'heap-js-ret-item,bar,foo;5\n' +
+    'heap-js-ret-item,Array:0x5678,(roots);3\n',
+
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,baz,15,1500\n' +
+    'heap-js-ret-item,bar,baz;3\n' +
+    'heap-js-ret-item,baz,bar;3\n'
+];
+
+
+/**
+ * @constructor
+ */
+RemoteDebuggerCommandExecutorStub = function()
+{
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd)
+{
+    if ('{"seq":2,"type":"request","command":"scripts","arguments":{"includeSource":false}}' === cmd) {
+        var response1 =
+            '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' +
+            'success":true,"body":[{"handle":61,"type":"script","name":"' +
+            'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
+            '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' +
+            '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' +
+            '"handle":60,"type":"context","data":"page,3"}],"running":false}';
+        this.sendResponse_(response1);
+    } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{"ids":[59],"includeSource":true}}' === cmd) {
+        this.sendResponse_(
+            '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' +
+            '"success":true,"body":[{"handle":1,"type":"script","name":' +
+            '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
+            '"lineCount":1,"source":"function fib(n) {return n+1;}",' +
+            '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' +
+            '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' +
+            '"running":false}');
+    } else if (cmd.indexOf('"command":"profile"') !== -1) {
+        var cmdObj = JSON.parse(cmd);
+        if (cmdObj.arguments.command === "resume")
+            ProfilerStubHelper.GetInstance().StartProfiling(parseInt(cmdObj.arguments.modules));
+        else if (cmdObj.arguments.command === "pause")
+            ProfilerStubHelper.GetInstance().StopProfiling(parseInt(cmdObj.arguments.modules));
+        else
+            debugPrint("Unexpected profile command: " + cmdObj.arguments.command);
+    } else
+        debugPrint("Unexpected command: " + cmd);
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function()
+{
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response)
+{
+    setTimeout(function() {
+        RemoteDebuggerAgent.debuggerOutput(response);
+    }, 0);
+};
+
+
+DevToolsHostStub = function()
+{
+    this.isStub = true;
+};
+DevToolsHostStub.prototype.__proto__ = WebInspector.InspectorFrontendHostStub.prototype;
+
+
+DevToolsHostStub.prototype.reset = function()
+{
+};
+
+
+DevToolsHostStub.prototype.setting = function()
+{
+};
+
+
+DevToolsHostStub.prototype.setSetting = function()
+{
+};
+
+
+window["RemoteDebuggerAgent"] = new RemoteDebuggerAgentStub();
+window["RemoteDebuggerCommandExecutor"] = new RemoteDebuggerCommandExecutorStub();
+window["RemoteProfilerAgent"] = new RemoteProfilerAgentStub();
+window["RemoteToolsAgent"] = new RemoteToolsAgentStub();
+InspectorFrontendHost = new DevToolsHostStub();
+
+}
+
+/* Tests.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/**
+ * @fileoverview This file contains small testing framework along with the
+ * test suite for the frontend. These tests are a part of the continues build
+ * and are executed by the devtools_sanity_unittest.cc as a part of the
+ * Interactive UI Test suite.
+ * FIXME: change field naming style to use trailing underscore.
+ */
+
+if (window.domAutomationController) {
+
+var ___interactiveUiTestsMode = true;
+
+/**
+ * Test suite for interactive UI tests.
+ * @constructor
+ */
+TestSuite = function()
+{
+    this.controlTaken_ = false;
+    this.timerId_ = -1;
+};
+
+
+/**
+ * Reports test failure.
+ * @param {string} message Failure description.
+ */
+TestSuite.prototype.fail = function(message)
+{
+    if (this.controlTaken_)
+        this.reportFailure_(message);
+    else
+        throw message;
+};
+
+
+/**
+ * Equals assertion tests that expected === actual.
+ * @param {Object} expected Expected object.
+ * @param {Object} actual Actual object.
+ * @param {string} opt_message User message to print if the test fails.
+ */
+TestSuite.prototype.assertEquals = function(expected, actual, opt_message)
+{
+    if (expected !== actual) {
+        var message = "Expected: '" + expected + "', but was '" + actual + "'";
+        if (opt_message)
+            message = opt_message + "(" + message + ")";
+        this.fail(message);
+    }
+};
+
+
+/**
+ * True assertion tests that value == true.
+ * @param {Object} value Actual object.
+ * @param {string} opt_message User message to print if the test fails.
+ */
+TestSuite.prototype.assertTrue = function(value, opt_message)
+{
+    this.assertEquals(true, !!value, opt_message);
+};
+
+
+/**
+ * Contains assertion tests that string contains substring.
+ * @param {string} string Outer.
+ * @param {string} substring Inner.
+ */
+TestSuite.prototype.assertContains = function(string, substring)
+{
+    if (string.indexOf(substring) === -1)
+        this.fail("Expected to: '" + string + "' to contain '" + substring + "'");
+};
+
+
+/**
+ * Takes control over execution.
+ */
+TestSuite.prototype.takeControl = function()
+{
+    this.controlTaken_ = true;
+    // Set up guard timer.
+    var self = this;
+    this.timerId_ = setTimeout(function() {
+        self.reportFailure_("Timeout exceeded: 20 sec");
+    }, 20000);
+};
+
+
+/**
+ * Releases control over execution.
+ */
+TestSuite.prototype.releaseControl = function()
+{
+    if (this.timerId_ !== -1) {
+        clearTimeout(this.timerId_);
+        this.timerId_ = -1;
+    }
+    this.reportOk_();
+};
+
+
+/**
+ * Async tests use this one to report that they are completed.
+ */
+TestSuite.prototype.reportOk_ = function()
+{
+    window.domAutomationController.send("[OK]");
+};
+
+
+/**
+ * Async tests use this one to report failures.
+ */
+TestSuite.prototype.reportFailure_ = function(error)
+{
+    if (this.timerId_ !== -1) {
+        clearTimeout(this.timerId_);
+        this.timerId_ = -1;
+    }
+    window.domAutomationController.send("[FAILED] " + error);
+};
+
+
+/**
+ * Runs all global functions starting with "test" as unit tests.
+ */
+TestSuite.prototype.runTest = function(testName)
+{
+    try {
+        this[testName]();
+        if (!this.controlTaken_)
+            this.reportOk_();
+    } catch (e) {
+        this.reportFailure_(e);
+    }
+};
+
+
+/**
+ * @param {string} panelName Name of the panel to show.
+ */
+TestSuite.prototype.showPanel = function(panelName)
+{
+    // Open Scripts panel.
+    var toolbar = document.getElementById("toolbar");
+    var button = toolbar.getElementsByClassName(panelName)[0];
+    button.click();
+    this.assertEquals(WebInspector.panels[panelName], WebInspector.currentPanel);
+};
+
+
+/**
+ * Overrides the method with specified name until it's called first time.
+ * @param {Object} receiver An object whose method to override.
+ * @param {string} methodName Name of the method to override.
+ * @param {Function} override A function that should be called right after the
+ *     overriden method returns.
+ * @param {boolean} opt_sticky Whether restore original method after first run
+ *     or not.
+ */
+TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_sticky)
+{
+    var orig = receiver[methodName];
+    if (typeof orig !== "function")
+        this.fail("Cannot find method to override: " + methodName);
+    var test = this;
+    receiver[methodName] = function(var_args) {
+        try {
+            var result = orig.apply(this, arguments);
+        } finally {
+            if (!opt_sticky)
+                receiver[methodName] = orig;
+        }
+        // In case of exception the override won't be called.
+        try {
+            override.apply(this, arguments);
+        } catch (e) {
+            test.fail("Exception in overriden method '" + methodName + "': " + e);
+        }
+        return result;
+    };
+};
+
+
+// UI Tests
+
+
+/**
+ * Tests that the real injected host is present in the context.
+ */
+TestSuite.prototype.testHostIsPresent = function()
+{
+    this.assertTrue(typeof InspectorFrontendHost === "object" && !InspectorFrontendHost.isStub);
+};
+
+
+/**
+ * Tests elements tree has an "HTML" root.
+ */
+TestSuite.prototype.testElementsTreeRoot = function()
+{
+    var doc = WebInspector.domAgent.document;
+    this.assertEquals("HTML", doc.documentElement.nodeName);
+    this.assertTrue(doc.documentElement.hasChildNodes());
+};
+
+
+/**
+ * Tests that main resource is present in the system and that it is
+ * the only resource.
+ */
+TestSuite.prototype.testMainResource = function()
+{
+    var tokens = [];
+    var resources = WebInspector.resources;
+    for (var id in resources)
+        tokens.push(resources[id].lastPathComponent);
+    this.assertEquals("simple_page.html", tokens.join(","));
+};
+
+
+/**
+ * Tests that resources tab is enabled when corresponding item is selected.
+ */
+TestSuite.prototype.testEnableResourcesTab = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            test.assertEquals("simple_page.html", payload.lastPathComponent);
+            WebInspector.panels.resources.refresh();
+            WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[identifier]);
+
+            test.releaseControl();
+        });
+
+    // Following call should lead to reload that we capture in the
+    // addResource override.
+    WebInspector.panels.resources._enableResourceTracking();
+
+    // We now have some time to report results to controller.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that correct content length is reported for resources.
+ */
+TestSuite.prototype.testResourceContentLength = function()
+{
+    this.showPanel("resources");
+    var test = this;
+
+    var png = false;
+    var html = false;
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            if (!payload.didLengthChange)
+                return;
+            var resource = WebInspector.resources[identifier];
+            if (!resource || !resource.url)
+                return;
+            if (resource.url.search("image.html") !== -1) {
+              var expectedLength = 87;
+              test.assertTrue(
+                  resource.resourceSize <= expectedLength,
+                  "image.html content length is greater thatn expected.");
+              if (expectedLength === resource.resourceSize)
+                  html = true;
+            } else if (resource.url.search("image.png") !== -1) {
+              var expectedLength = 257796;
+              test.assertTrue(
+                  resource.resourceSize <= expectedLength,
+                  "image.png content length is greater than expected.");
+              if (expectedLength === resource.resourceSize)
+                  png = true;
+            }
+            if (html && png) {
+              // Wait 1 second before releasing control to check that the content
+              // lengths are not updated anymore.
+              setTimeout(function() {
+                  test.releaseControl();
+              }, 1000);
+            }
+        }, true);
+
+    // Make sure resource tracking is on.
+    WebInspector.panels.resources._enableResourceTracking();
+    // Reload inspected page to update all resources.
+    test.evaluateInConsole_(
+        "window.location.reload(true);",
+         function(resultText) {
+             test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+         });
+
+    // We now have some time to report results to controller.
+    this.takeControl();
+};
+
+
+/**
+ * Tests resource headers.
+ */
+TestSuite.prototype.testResourceHeaders = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+
+    var responseOk = false;
+    var timingOk = false;
+
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            var resource = this.resources[identifier];
+            if (!resource || resource.mainResource) {
+                // We are only interested in secondary resources in this test.
+                return;
+            }
+
+            var requestHeaders = JSON.stringify(resource.requestHeaders);
+            test.assertContains(requestHeaders, "Accept");
+
+            if (payload.didResponseChange) {
+                var responseHeaders = JSON.stringify(resource.responseHeaders);
+                test.assertContains(responseHeaders, "Content-type");
+                test.assertContains(responseHeaders, "Content-Length");
+                test.assertTrue(typeof resource.responseReceivedTime !== "undefined");
+                responseOk = true;
+            }
+
+            if (payload.didTimingChange) {
+                test.assertTrue(typeof resource.startTime !== "undefined");
+                timingOk = true;
+            }
+
+            if (payload.didCompletionChange) {
+                test.assertTrue(responseOk);
+                test.assertTrue(timingOk);
+                test.assertTrue(typeof resource.endTime !== "undefined");
+                test.releaseControl();
+            }
+        }, true);
+
+    WebInspector.panels.resources._enableResourceTracking();
+    this.takeControl();
+};
+
+
+/**
+ * Tests the mime type of a cached (HTTP 304) resource.
+ */
+TestSuite.prototype.testCachedResourceMimeType = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+    var hasReloaded = false;
+
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            var resource = this.resources[identifier];
+            if (!resource || resource.mainResource) {
+                // We are only interested in secondary resources in this test.
+                return;
+            }
+
+            if (payload.didResponseChange) {
+                // Test server uses a default mime type for JavaScript files.
+                test.assertEquals("text/html", payload.mimeType);
+                if (!hasReloaded) {
+                    hasReloaded = true;
+                    // Reload inspected page to update all resources.
+                    test.evaluateInConsole_("window.location.reload(true);", function() {});
+                } else
+                    test.releaseControl();
+            }
+
+        }, true);
+
+    WebInspector.panels.resources._enableResourceTracking();
+    this.takeControl();
+};
+
+
+/**
+ * Tests that profiler works.
+ */
+TestSuite.prototype.testProfilerTab = function()
+{
+    this.showPanel("profiles");
+
+    var test = this;
+    this.addSniffer(WebInspector.panels.profiles, "addProfileHeader",
+        function(typeOrProfile, profile) {
+            if (!profile)
+                profile = typeOrProfile;
+            var panel = WebInspector.panels.profiles;
+            panel.showProfile(profile);
+            var node = panel.visibleView.profileDataGridTree.children[0];
+            // Iterate over displayed functions and search for a function
+            // that is called "fib" or "eternal_fib". If found, it will mean
+            // that we actually have profiled page's code.
+            while (node) {
+                if (node.functionName.indexOf("fib") !== -1)
+                    test.releaseControl();
+                node = node.traverseNextNode(true, null, true);
+            }
+
+            test.fail();
+        });
+    var ticksCount = 0;
+    var tickRecord = "\nt,";
+    this.addSniffer(RemoteProfilerAgent, "didGetLogLines",
+        function(posIgnored, log) {
+            var pos = 0;
+            while ((pos = log.indexOf(tickRecord, pos)) !== -1) {
+                pos += tickRecord.length;
+                ticksCount++;
+            }
+            if (ticksCount > 100)
+                InspectorBackend.stopProfiling();
+        }, true);
+
+    InspectorBackend.startProfiling();
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts tab can be open and populated with inspected scripts.
+ */
+TestSuite.prototype.testShowScriptsTab = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+    // There should be at least main page script.
+    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
+        function() {
+            test.releaseControl();
+        });
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts tab is populated with inspected scripts even if it
+ * hadn't been shown by the moment inspected paged refreshed.
+ * @see http://crbug.com/26312
+ */
+TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()
+{
+    var test = this;
+    this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one.");
+
+    this.addSniffer(devtools.DebuggerAgent.prototype, "reset", waitUntilScriptIsParsed);
+
+    // Reload inspected page. It will reset the debugger agent.
+    test.evaluateInConsole_(
+        "window.location.reload(true);",
+        function(resultText) {
+            test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+        });
+
+    function waitUntilScriptIsParsed() {
+        var parsed = devtools.tools.getDebuggerAgent().parsedScripts_;
+        for (var id in parsed) {
+            var url = parsed[id].getUrl();
+            if (url && url.search("debugger_test_page.html") !== -1) {
+                checkScriptsPanel();
+                return;
+            }
+        }
+        test.addSniffer(devtools.DebuggerAgent.prototype, "addScriptInfo_", waitUntilScriptIsParsed);
+    }
+
+    function checkScriptsPanel() {
+        test.showPanel("scripts");
+        test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Inspected script not found in the scripts list");
+        test.releaseControl();
+    }
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts list contains content scripts.
+ */
+TestSuite.prototype.testContentScriptIsPresent = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    test._waitUntilScriptsAreParsed(
+        ["page_with_content_script.html", "simple_content_script.js"],
+        function() {
+          test.releaseControl();
+        });
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts are not duplicaed on Scripts tab switch.
+ */
+TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
+{
+    var test = this;
+
+    // There should be two scripts: one for the main page and another
+    // one which is source of console API(see
+    // InjectedScript._ensureCommandLineAPIInstalled).
+    var expectedScriptsCount = 2;
+    var parsedScripts = [];
+
+    this.showPanel("scripts");
+
+
+    function switchToElementsTab() {
+        test.showPanel("elements");
+        setTimeout(switchToScriptsTab, 0);
+    }
+
+    function switchToScriptsTab() {
+        test.showPanel("scripts");
+        setTimeout(checkScriptsPanel, 0);
+    }
+
+    function checkScriptsPanel() {
+        test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view.");
+        test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing.");
+        checkNoDuplicates();
+        test.releaseControl();
+    }
+
+    function checkNoDuplicates() {
+        var scriptSelect = document.getElementById("scripts-files");
+        var options = scriptSelect.options;
+        for (var i = 0; i < options.length; i++) {
+            var scriptName = options[i].text;
+            for (var j = i + 1; j < options.length; j++)
+                test.assertTrue(scriptName !== options[j].text, "Found script duplicates: " + test.optionsToString_(options));
+        }
+    }
+
+    test._waitUntilScriptsAreParsed(
+        ["debugger_test_page.html"],
+        function() {
+            checkNoDuplicates();
+            setTimeout(switchToElementsTab, 0);
+        });
+
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that a breakpoint can be set.
+ */
+TestSuite.prototype.testSetBreakpoint = function()
+{
+    var test = this;
+    this.showPanel("scripts");
+
+    var breakpointLine = 12;
+
+    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
+        function() {
+          test.showMainPageScriptSource_(
+              "debugger_test_page.html",
+              function(view, url) {
+                view._addBreakpoint(breakpointLine);
+                // Force v8 execution.
+                RemoteDebuggerAgent.processDebugCommands();
+                test.waitForSetBreakpointResponse_(url, breakpointLine,
+                    function() {
+                        test.releaseControl();
+                    });
+              });
+        });
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that pause on exception works.
+ */
+TestSuite.prototype.testPauseOnException = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    // TODO(yurys): remove else branch once the states are supported.
+    if (WebInspector.ScriptsPanel.PauseOnExceptionsState) {
+        while (WebInspector.currentPanel._pauseOnExceptionButton.state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)
+            WebInspector.currentPanel._pauseOnExceptionButton.element.click();
+    } else {
+        // Make sure pause on exceptions is on.
+        if (!WebInspector.currentPanel._pauseOnExceptionButton.toggled)
+            WebInspector.currentPanel._pauseOnExceptionButton.element.click();
+    }
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["pause_on_exception.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["throwAnException", "handleClick", "(anonymous function)"],
+            lineNumber: 6,
+            lineText: "  return unknown_var;"
+        },
+        function() {
+            test.releaseControl();
+        });
+
+    this.takeControl();
+};
+
+
+// Tests that debugger works correctly if pause event occurs when DevTools
+// frontend is being loaded.
+TestSuite.prototype.testPauseWhenLoadingDevTools = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    var expectations = {
+            functionsOnStack: ["callDebugger"],
+            lineNumber: 8,
+            lineText: "  debugger;"
+        };
+
+
+    // Script execution can already be paused.
+    if (WebInspector.currentPanel.paused) {
+        var callFrame = WebInspector.currentPanel.sidebarPanes.callstack.selectedCallFrame;
+        this.assertEquals(expectations.functionsOnStack[0], callFrame.functionName);
+        var callbackInvoked = false;
+        this._checkSourceFrameWhenLoaded(expectations, function() {
+                callbackInvoked = true;
+                if (test.controlTaken_)
+                    test.releaseControl();
+            });
+        if (!callbackInvoked) {
+            test.takeControl();
+        }
+        return;
+    }
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["callDebugger"],
+            lineNumber: 8,
+            lineText: "  debugger;"
+        },
+        function() {
+            test.releaseControl();
+        });
+    this.takeControl();
+};
+
+
+// Tests that pressing "Pause" will pause script execution if the script
+// is already running.
+TestSuite.prototype.testPauseWhenScriptIsRunning = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    test.evaluateInConsole_(
+        'setTimeout("handleClick()" , 0)',
+        function(resultText) {
+          test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+          testScriptPauseAfterDelay();
+        });
+
+    // Wait for some time to make sure that inspected page is running the
+    // infinite loop.
+    function testScriptPauseAfterDelay() {
+        setTimeout(testScriptPause, 300);
+    }
+
+    function testScriptPause() {
+        // The script should be in infinite loop. Click "Pause" button to
+        // pause it and wait for the result.
+        WebInspector.panels.scripts.pauseButton.click();
+
+        test._waitForScriptPause(
+            {
+                functionsOnStack: ["handleClick", "(anonymous function)"],
+                lineNumber: 5,
+                lineText: "  while(true) {"
+            },
+            function() {
+                test.releaseControl();
+            });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Serializes options collection to string.
+ * @param {HTMLOptionsCollection} options
+ * @return {string}
+ */
+TestSuite.prototype.optionsToString_ = function(options)
+{
+    var names = [];
+    for (var i = 0; i < options.length; i++)
+        names.push('"' + options[i].text + '"');
+    return names.join(",");
+};
+
+
+/**
+ * Ensures that main HTML resource is selected in Scripts panel and that its
+ * source frame is setup. Invokes the callback when the condition is satisfied.
+ * @param {HTMLOptionsCollection} options
+ * @param {function(WebInspector.SourceView,string)} callback
+ */
+TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback)
+{
+    var test = this;
+
+    var scriptSelect = document.getElementById("scripts-files");
+    var options = scriptSelect.options;
+
+    test.assertTrue(options.length, "Scripts list is empty");
+
+    // Select page's script if it's not current option.
+    var scriptResource;
+    if (options[scriptSelect.selectedIndex].text === scriptName)
+        scriptResource = options[scriptSelect.selectedIndex].representedObject;
+    else {
+        var pageScriptIndex = -1;
+        for (var i = 0; i < options.length; i++) {
+            if (options[i].text === scriptName) {
+                pageScriptIndex = i;
+                break;
+            }
+        }
+        test.assertTrue(-1 !== pageScriptIndex, "Script with url " + scriptName + " not found among " + test.optionsToString_(options));
+        scriptResource = options[pageScriptIndex].representedObject;
+
+        // Current panel is "Scripts".
+        WebInspector.currentPanel._showScriptOrResource(scriptResource);
+        test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex, "Unexpected selected option index.");
+    }
+
+    test.assertTrue(scriptResource instanceof WebInspector.Resource,
+                    "Unexpected resource class.");
+    test.assertTrue(!!scriptResource.url, "Resource URL is null.");
+    test.assertTrue(scriptResource.url.search(scriptName + "$") !== -1, "Main HTML resource should be selected.");
+
+    var scriptsPanel = WebInspector.panels.scripts;
+
+    var view = scriptsPanel.visibleView;
+    test.assertTrue(view instanceof WebInspector.SourceView);
+
+    if (!view.sourceFrame._loaded) {
+        test.addSniffer(view, "_sourceFrameSetupFinished", function(event) {
+            callback(view, scriptResource.url);
+        });
+    } else
+        callback(view, scriptResource.url);
+};
+
+
+/*
+ * Evaluates the code in the console as if user typed it manually and invokes
+ * the callback when the result message is received and added to the console.
+ * @param {string} code
+ * @param {function(string)} callback
+ */
+TestSuite.prototype.evaluateInConsole_ = function(code, callback)
+{
+    WebInspector.console.visible = true;
+    WebInspector.console.prompt.text = code;
+    WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
+
+    this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
+        function(commandResult) {
+            callback(commandResult.toMessageElement().textContent);
+        });
+};
+
+
+/*
+ * Waits for "setbreakpoint" response, checks that corresponding breakpoint
+ * was successfully set and invokes the callback if it was.
+ * @param {string} scriptUrl
+ * @param {number} breakpointLine
+ * @param {function()} callback
+ */
+TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl, breakpointLine, callback)
+{
+    var test = this;
+    test.addSniffer(
+        devtools.DebuggerAgent.prototype,
+        "handleSetBreakpointResponse_",
+        function(msg) {
+            var bps = this.urlToBreakpoints_[scriptUrl];
+            test.assertTrue(!!bps, "No breakpoints for line " + breakpointLine);
+            var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine);
+            test.assertTrue(!!bps[line].getV8Id(), "Breakpoint id was not assigned.");
+            callback();
+        });
+};
+
+
+/**
+ * Tests eval on call frame.
+ */
+TestSuite.prototype.testEvalOnCallFrame = function()
+{
+    this.showPanel("scripts");
+
+    var breakpointLine = 16;
+
+    var test = this;
+    this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
+        function(msg) {
+          test.showMainPageScriptSource_(
+              "debugger_test_page.html",
+              function(view, url) {
+                  view._addBreakpoint(breakpointLine);
+                  // Force v8 execution.
+                  RemoteDebuggerAgent.processDebugCommands();
+                  test.waitForSetBreakpointResponse_(url, breakpointLine, setBreakpointCallback);
+              });
+        });
+
+    function setBreakpointCallback() {
+      // Since breakpoints are ignored in evals' calculate() function is
+      // execute after zero-timeout so that the breakpoint is hit.
+      test.evaluateInConsole_(
+          'setTimeout("calculate(123)" , 0)',
+          function(resultText) {
+              test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+              waitForBreakpointHit();
+          });
+    }
+
+    function waitForBreakpointHit() {
+      test.addSniffer(
+          devtools.DebuggerAgent.prototype,
+          "handleBacktraceResponse_",
+          function(msg) {
+            test.assertEquals(2, this.callFrames_.length, "Unexpected stack depth on the breakpoint. " + JSON.stringify(msg));
+            test.assertEquals("calculate", this.callFrames_[0].functionName, "Unexpected top frame function.");
+            // Evaluate "e+1" where "e" is an argument of "calculate" function.
+            test.evaluateInConsole_(
+                "e+1",
+                function(resultText) {
+                    test.assertEquals("124", resultText, 'Unexpected "e+1" value.');
+                    test.releaseControl();
+                });
+          });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that console auto completion works when script execution is paused.
+ */
+TestSuite.prototype.testCompletionOnPause = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
+            lineNumber: 9,
+            lineText: "    debugger;"
+        },
+        showConsole);
+
+    function showConsole() {
+        test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
+        WebInspector.showConsole();
+    }
+
+    function testLocalsCompletion() {
+        checkCompletions("th", ["parameter1", "closureLocal", "p", "createClosureLocal"], testThisCompletion);
+    }
+
+    function testThisCompletion() {
+        checkCompletions("this.", ["field1", "field2", "m"], testFieldCompletion);
+    }
+
+    function testFieldCompletion() {
+        checkCompletions("this.field1.", ["id", "name"], function() { test.releaseControl(); });
+    }
+
+    function checkCompletions(expression, expectedProperties, callback) {
+        test.addSniffer(WebInspector.console, "_reportCompletions",
+            function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
+                test.assertTrue(!isException, "Exception while collecting completions");
+                for (var i = 0; i < expectedProperties.length; i++) {
+                    var name = expectedProperties[i];
+                    test.assertTrue(result[name], "Name " + name + " not found among the completions: " + JSON.stringify(result));
+                }
+                setTimeout(callback, 0);
+            });
+      WebInspector.console.prompt.text = expression;
+      WebInspector.console.prompt.autoCompleteSoon();
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that inspected page doesn't hang on reload if it contains a syntax
+ * error and DevTools window is open.
+ */
+TestSuite.prototype.testAutoContinueOnSyntaxError = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    function checkScriptsList() {
+        var scriptSelect = document.getElementById("scripts-files");
+        var options = scriptSelect.options;
+        // There should be only console API source (see
+        // InjectedScript._ensureCommandLineAPIInstalled) since the page script
+        // contains a syntax error.
+        for (var i = 0 ; i < options.length; i++) {
+            if (options[i].text.search("script_syntax_error.html") !== -1)
+                test.fail("Script with syntax error should not be in the list of parsed scripts.");
+        }
+    }
+
+    this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
+        function(msg) {
+            checkScriptsList();
+
+            // Reload inspected page.
+            test.evaluateInConsole_(
+                "window.location.reload(true);",
+                function(resultText) {
+                    test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+                    waitForExceptionEvent();
+                });
+        });
+
+    function waitForExceptionEvent() {
+      var exceptionCount = 0;
+      test.addSniffer(
+          devtools.DebuggerAgent.prototype,
+          "handleExceptionEvent_",
+          function(msg) {
+              exceptionCount++;
+              test.assertEquals(1, exceptionCount, "Too many exceptions.");
+              test.assertEquals(undefined, msg.getBody().script, "Unexpected exception: " + JSON.stringify(msg));
+              test.releaseControl();
+          });
+
+      // Check that the script is not paused on parse error.
+      test.addSniffer(
+          WebInspector,
+          "pausedScript",
+          function(callFrames) {
+              test.fail("Script execution should not pause on syntax error.");
+          });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Checks current execution line against expectations.
+ * @param {WebInspector.SourceFrame} sourceFrame
+ * @param {number} lineNumber Expected line number
+ * @param {string} lineContent Expected line text
+ */
+TestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber, lineContent)
+{
+    this.assertEquals(lineNumber, sourceFrame.executionLine, "Unexpected execution line number.");
+    this.assertEquals(lineContent, sourceFrame._textModel.line(lineNumber - 1), "Unexpected execution line text.");
+}
+
+
+/**
+ * Checks that all expected scripts are present in the scripts list
+ * in the Scripts panel.
+ * @param {Array.<string>} expected Regular expressions describing
+ *     expected script names.
+ * @return {boolean} Whether all the scripts are in "scripts-files" select
+ *     box
+ */
+TestSuite.prototype._scriptsAreParsed = function(expected)
+{
+    var scriptSelect = document.getElementById("scripts-files");
+    var options = scriptSelect.options;
+
+    // Check that at least all the expected scripts are present.
+    var missing = expected.slice(0);
+    for (var i = 0 ; i < options.length; i++) {
+        for (var j = 0; j < missing.length; j++) {
+            if (options[i].text.search(missing[j]) !== -1) {
+                missing.splice(j, 1);
+                break;
+            }
+        }
+    }
+    return missing.length === 0;
+};
+
+
+/**
+ * Waits for script pause, checks expectations, and invokes the callback.
+ * @param {Object} expectations  Dictionary of expectations
+ * @param {function():void} callback
+ */
+TestSuite.prototype._waitForScriptPause = function(expectations, callback)
+{
+    var test = this;
+    // Wait until script is paused.
+    test.addSniffer(
+        WebInspector,
+        "pausedScript",
+        function(callFrames) {
+            var functionsOnStack = [];
+            for (var i = 0; i < callFrames.length; i++)
+                functionsOnStack.push(callFrames[i].functionName);
+
+            test.assertEquals(expectations.functionsOnStack.join(","), functionsOnStack.join(","), "Unexpected stack.");
+
+            // Check that execution line where the script is paused is
+            // expected one.
+            test._checkSourceFrameWhenLoaded(expectations, callback);
+        });
+};
+
+
+/**
+ * Waits for current source frame to load, checks expectations, and invokes
+ * the callback.
+ * @param {Object} expectations  Dictionary of expectations
+ * @param {function():void} callback
+ */
+TestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callback)
+{
+    var test = this;
+
+    var frame = WebInspector.currentPanel.visibleView.sourceFrame;
+    if (frame._loaded)
+        checkExecLine();
+    else {
+        setTimeout(function() {
+            test._checkSourceFrameWhenLoaded(expectations, callback);
+        }, 100);
+    }
+    function checkExecLine() {
+        test._checkExecutionLine(frame, expectations.lineNumber, expectations.lineText);
+        callback();
+    }
+};
+
+
+/**
+ * Performs sequence of steps.
+ * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2,
+ *     action2,...,actionN].
+ */
+TestSuite.prototype._performSteps = function(actions)
+{
+    var test = this;
+    var i = 0;
+    function doNextAction() {
+        if (i > 0)
+            actions[i++]();
+        if (i < actions.length - 1)
+            test._waitForScriptPause(actions[i++], doNextAction);
+    }
+    doNextAction();
+};
+
+
+/**
+ * Waits until all the scripts are parsed and asynchronously executes the code
+ * in the inspected page.
+ */
+TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedScripts)
+{
+    var test = this;
+
+    function executeFunctionInInspectedPage() {
+        // Since breakpoints are ignored in evals' calculate() function is
+        // execute after zero-timeout so that the breakpoint is hit.
+        test.evaluateInConsole_(
+            'setTimeout("' + code + '" , 0)',
+            function(resultText) {
+                test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+            });
+    }
+
+    test._waitUntilScriptsAreParsed(expectedScripts, executeFunctionInInspectedPage);
+};
+
+
+/**
+ * Waits until all the scripts are parsed and invokes the callback.
+ */
+TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback)
+{
+    var test = this;
+
+    function waitForAllScripts() {
+        if (test._scriptsAreParsed(expectedScripts))
+            callback();
+        else
+            test.addSniffer(WebInspector, "parsedScriptSource", waitForAllScripts);
+    }
+
+    waitForAllScripts();
+};
+
+
+/**
+ * Waits until all debugger scripts are parsed and executes "a()" in the
+ * inspected page.
+ */
+TestSuite.prototype._executeFunctionForStepTest = function()
+{
+    this._executeCodeWhenScriptsAreParsed("a()", ["debugger_step.html", "debugger_step.js"]);
+};
+
+
+/**
+ * Tests step over in the debugger.
+ */
+TestSuite.prototype.testStepOver = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 5,
+            lineText: "  var y = fact(10);"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 6,
+            lineText: "  return y;"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests step out in the debugger.
+ */
+TestSuite.prototype.testStepOut = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-out").click();
+        },
+        {
+            functionsOnStack: ["a","(anonymous function)"],
+            lineNumber: 8,
+            lineText: "  printResult(result);"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests step in in the debugger.
+ */
+TestSuite.prototype.testStepIn = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 5,
+            lineText: "  var y = fact(10);"
+        },
+        function() {
+            document.getElementById("scripts-step-into").click();
+        },
+        {
+            functionsOnStack: ["fact","d","a","(anonymous function)"],
+            lineNumber: 15,
+            lineText: "  return r;"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Gets a XPathResult matching given xpath.
+ * @param {string} xpath
+ * @param {number} resultType
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {XPathResult} Type of returned value is determined by "resultType" parameter
+ */
+
+TestSuite.prototype._evaluateXpath = function(xpath, resultType, opt_ancestor)
+{
+    if (!opt_ancestor)
+        opt_ancestor = document.documentElement;
+    try {
+        return document.evaluate(xpath, opt_ancestor, null, resultType, null);
+    } catch(e) {
+        this.fail('Error in expression: "' + xpath + '".' + e);
+    }
+};
+
+
+/**
+ * Gets first Node matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {?Node}
+ */
+TestSuite.prototype._findNode = function(xpath, opt_ancestor)
+{
+    var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE, opt_ancestor).singleNodeValue;
+    this.assertTrue(!!result, "Cannot find node on path: " + xpath);
+    return result;
+};
+
+
+/**
+ * Gets a text matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {?string}
+ */
+TestSuite.prototype._findText = function(xpath, opt_ancestor)
+{
+    var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE, opt_ancestor).stringValue;
+    this.assertTrue(!!result, "Cannot find text on path: " + xpath);
+    return result;
+};
+
+
+/**
+ * Gets an iterator over nodes matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified, documentElement
+ *     will be used
+ * @return {XPathResult} Iterator over the nodes
+ */
+TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor)
+{
+    return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE, opt_ancestor);
+};
+
+
+/**
+ * Checks the scopeSectionDiv against the expectations.
+ * @param {Node} scopeSectionDiv The section div
+ * @param {Object} expectations Expectations dictionary
+ */
+TestSuite.prototype._checkScopeSectionDiv = function(scopeSectionDiv, expectations)
+{
+    var scopeTitle = this._findText('./div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv);
+    this.assertEquals(expectations.title, scopeTitle, "Unexpected scope section title.");
+    if (!expectations.properties)
+        return;
+    this.assertTrue(scopeSectionDiv.hasStyleClass("expanded"), 'Section "' + scopeTitle + '" is collapsed.');
+
+    var propertyIt = this._nodeIterator("./ol/li", scopeSectionDiv);
+    var propertyLi;
+    var foundProps = [];
+    while (propertyLi = propertyIt.iterateNext()) {
+        var name = this._findText('./span[@class="name"]/text()', propertyLi);
+        var value = this._findText('./span[@class="value"]/text()', propertyLi);
+        this.assertTrue(!!name, 'Invalid variable name: "' + name + '"');
+        this.assertTrue(name in expectations.properties, "Unexpected property: " + name);
+        this.assertEquals(expectations.properties[name], value, 'Unexpected "' + name + '" property value.');
+        delete expectations.properties[name];
+        foundProps.push(name + " = " + value);
+    }
+
+    // Check that all expected properties were found.
+    for (var p in expectations.properties)
+        this.fail('Property "' + p + '" was not found in scope "' + scopeTitle + '". Found properties: "' + foundProps.join(",") + '"');
+};
+
+
+/**
+ * Expands scope sections matching the filter and invokes the callback on
+ * success.
+ * @param {function(WebInspector.ObjectPropertiesSection, number):boolean}
+ *     filter
+ * @param {Function} callback
+ */
+TestSuite.prototype._expandScopeSections = function(filter, callback)
+{
+    var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections;
+
+    var toBeUpdatedCount = 0;
+    function updateListener() {
+        --toBeUpdatedCount;
+        if (toBeUpdatedCount === 0) {
+            // Report when all scopes are expanded and populated.
+            callback();
+        }
+    }
+
+    // Global scope is always the last one.
+    for (var i = 0; i < sections.length - 1; i++) {
+        var section = sections[i];
+        if (!filter(sections, i))
+            continue;
+        ++toBeUpdatedCount;
+        var populated = section.populated;
+
+        this._hookGetPropertiesCallback(updateListener,
+            function() {
+                section.expand();
+                if (populated) {
+                    // Make sure "updateProperties" callback will be called at least once
+                    // after it was overridden.
+                    section.update();
+                }
+            });
+    }
+};
+
+
+/**
+ * Tests that scopes can be expanded and contain expected data.
+ */
+TestSuite.prototype.testExpandScope = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_closure.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
+            lineNumber: 8,
+            lineText: "    debugger;"
+        },
+        expandAllSectionsExceptGlobal);
+
+    // Expanding Global scope takes for too long so we skeep it.
+    function expandAllSectionsExceptGlobal() {
+        test._expandScopeSections(function(sections, i) {
+            return i < sections.length - 1;
+        },
+        examineScopes /* When all scopes are expanded and populated check them. */);
+    }
+
+    // Check scope sections contents.
+    function examineScopes() {
+        var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/div[div[@class="title"]/text()="Scope Variables"]');
+        var expectedScopes = [
+            {
+                title: "Local",
+                properties: {
+                    x:"2009",
+                    innerFunctionLocalVar:"2011",
+                    "this": "global",
+                }
+            },
+            {
+                title: "Closure",
+                properties: {
+                    n:"TextParam",
+                    makeClosureLocalVar:"local.TextParam",
+                }
+            },
+            {
+                title: "Global",
+            },
+        ];
+        var it = test._nodeIterator('./div[@class="body"]/div', scopeVariablesSection);
+        var scopeIndex = 0;
+        var scopeDiv;
+        while (scopeDiv = it.iterateNext()) {
+            test.assertTrue(scopeIndex < expectedScopes.length, "Too many scopes.");
+            test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]);
+            ++scopeIndex;
+        }
+        test.assertEquals(expectedScopes.length, scopeIndex, "Unexpected number of scopes.");
+
+        test.releaseControl();
+    }
+
+    test.takeControl();
+};
+
+
+/**
+ * Returns child tree element for a property with given name.
+ * @param {TreeElement} parent Parent tree element.
+ * @param {string} childName
+ * @param {string} objectPath Path to the object. Will be printed in the case
+ *     of failure.
+ * @return {TreeElement}
+ */
+TestSuite.prototype._findChildProperty = function(parent, childName, objectPath)
+{
+    var children = parent.children;
+    for (var i = 0; i < children.length; i++) {
+        var treeElement = children[i];
+        var property = treeElement.property;
+        if (property.name === childName)
+            return treeElement;
+    }
+    this.fail('Cannot find property "' + childName + '" in ' + objectPath);
+};
+
+
+/**
+ * Executes the 'code' with InjectedScriptAccess.getProperties overriden
+ * so that all callbacks passed to InjectedScriptAccess.getProperties are
+ * extended with the "hook".
+ * @param {Function} hook The hook function.
+ * @param {Function} code A code snippet to be executed.
+ */
+TestSuite.prototype._hookGetPropertiesCallback = function(hook, code)
+{
+    var accessor = InjectedScriptAccess.prototype;
+    var orig = accessor.getProperties;
+    accessor.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback) {
+        orig.call(this, objectProxy, ignoreHasOwnProperty, abbreviate,
+            function() {
+              callback.apply(this, arguments);
+              hook();
+            });
+    };
+    try {
+        code();
+    } finally {
+        accessor.getProperties = orig;
+    }
+};
+
+
+/**
+ * Tests that all elements in prototype chain of an object have expected
+ * intrinic proprties(__proto__, constructor, prototype).
+ */
+TestSuite.prototype.testDebugIntrinsicProperties = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_intrinsic_properties.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["callDebugger", "handleClick", "(anonymous function)"],
+            lineNumber: 29,
+            lineText: "  debugger;"
+        },
+        expandLocalScope);
+
+    var localScopeSection = null;
+    function expandLocalScope() {
+      test._expandScopeSections(function(sections, i) {
+              if (i === 0) {
+                  test.assertTrue(sections[i].object.isLocal, "Scope #0 is not Local.");
+                  localScopeSection = sections[i];
+                  return true;
+              }
+              return false;
+          },
+          examineLocalScope);
+    }
+
+    function examineLocalScope() {
+      var scopeExpectations = [
+          "a", "Object", [
+              "constructor", "function Child()", [
+                  "constructor", "function Function()", null,
+                  "name", "Child", null,
+                  "prototype", "Object", [
+                      "childProtoField", 21, null
+                  ]
+              ],
+
+            "__proto__", "Object", [
+                  "__proto__", "Object", [
+                      "__proto__", "Object", [
+                          "__proto__", "null", null,
+                          "constructor", "function Object()", null,
+                      ],
+                    "constructor", "function Parent()", [
+                        "name", "Parent", null,
+                        "prototype", "Object", [
+                            "parentProtoField", 11, null,
+                        ]
+                    ],
+                    "parentProtoField", 11, null,
+                ],
+                "constructor", "function Child()", null,
+                "childProtoField", 21, null,
+            ],
+
+            "parentField", 10, null,
+            "childField", 20, null,
+          ]
+      ];
+
+      checkProperty(localScopeSection.propertiesTreeOutline, "<Local Scope>", scopeExpectations);
+    }
+
+    var propQueue = [];
+    var index = 0;
+    var expectedFinalIndex = 8;
+
+    function expandAndCheckNextProperty() {
+        if (index === propQueue.length) {
+            test.assertEquals(expectedFinalIndex, index, "Unexpected number of expanded objects.");
+            test.releaseControl();
+            return;
+        }
+
+        // Read next property data from the queue.
+        var treeElement = propQueue[index].treeElement;
+        var path = propQueue[index].path;
+        var expectations = propQueue[index].expectations;
+        index++;
+
+        // Expand the property.
+        test._hookGetPropertiesCallback(function() {
+                checkProperty(treeElement, path, expectations);
+            },
+            function() {
+                treeElement.expand();
+            });
+    }
+
+    function checkProperty(treeElement, path, expectations) {
+        for (var i = 0; i < expectations.length; i += 3) {
+            var name = expectations[i];
+            var description = expectations[i+1];
+            var value = expectations[i+2];
+
+            var propertyPath = path + "." + name;
+            var propertyTreeElement = test._findChildProperty(treeElement, name, path);
+            test.assertTrue(propertyTreeElement, 'Property "' + propertyPath + '" not found.');
+            test.assertEquals(description, propertyTreeElement.property.value.description, 'Unexpected "' + propertyPath + '" description.');
+            if (value) {
+                // Schedule property content check.
+                propQueue.push({
+                    treeElement: propertyTreeElement,
+                    path: propertyPath,
+                    expectations: value,
+                });
+            }
+        }
+        // Check next property in the queue.
+        expandAndCheckNextProperty();
+    }
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests "Pause" button will pause debugger when a snippet is evaluated.
+ */
+TestSuite.prototype.testPauseInEval = function()
+{
+    this.showPanel("scripts");
+
+    var test = this;
+
+    var pauseButton = document.getElementById("scripts-pause");
+    pauseButton.click();
+
+    devtools.tools.evaluateJavaScript("fib(10)");
+
+    this.addSniffer(WebInspector, "pausedScript",
+        function() {
+            test.releaseControl();
+        });
+
+    test.takeControl();
+};
+
+
+/**
+ * Key event with given key identifier.
+ */
+TestSuite.createKeyEvent = function(keyIdentifier)
+{
+    var evt = document.createEvent("KeyboardEvent");
+    evt.initKeyboardEvent("keydown", true /* can bubble */, true /* can cancel */, null /* view */, keyIdentifier, "");
+    return evt;
+};
+
+
+/**
+ * Tests console eval.
+ */
+TestSuite.prototype.testConsoleEval = function()
+{
+    var test = this;
+    this.evaluateInConsole_("123",
+        function(resultText) {
+            test.assertEquals("123", resultText);
+            test.releaseControl();
+        });
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests console log.
+ */
+TestSuite.prototype.testConsoleLog = function()
+{
+    WebInspector.console.visible = true;
+    var messages = WebInspector.console.messages;
+    var index = 0;
+
+    var test = this;
+    var assertNext = function(line, message, opt_class, opt_count, opt_substr) {
+        var elem = messages[index++].toMessageElement();
+        var clazz = elem.getAttribute("class");
+        var expectation = (opt_count || '') + 'console_test_page.html:' + line + message;
+        if (opt_substr)
+            test.assertContains(elem.textContent, expectation);
+        else
+            test.assertEquals(expectation, elem.textContent);
+        if (opt_class)
+            test.assertContains(clazz, "console-" + opt_class);
+    };
+
+    assertNext("5", "log", "log-level");
+    assertNext("7", "debug", "log-level");
+    assertNext("9", "info", "log-level");
+    assertNext("11", "warn", "warning-level");
+    assertNext("13", "error", "error-level");
+    assertNext("15", "Message format number 1, 2 and 3.5");
+    assertNext("17", "Message format for string");
+    assertNext("19", "Object Object");
+    assertNext("22", "repeated", "log-level", 5);
+    assertNext("26", "count: 1");
+    assertNext("26", "count: 2");
+    assertNext("29", "group", "group-title");
+    index++;
+    assertNext("33", "timer:", "log-level", "", true);
+    assertNext("35", "1 2 3", "log-level");
+    assertNext("37", "HTMLDocument", "log-level");
+    assertNext("39", "<html>", "log-level", "", true);
+};
+
+
+/**
+ * Tests eval of global objects.
+ */
+TestSuite.prototype.testEvalGlobal = function()
+{
+    WebInspector.console.visible = true;
+
+    var inputs = ["foo", "foobar"];
+    var expectations = ["foo", "fooValue", "foobar", "ReferenceError: foobar is not defined"];
+
+    // Do not change code below - simply add inputs and expectations above.
+    var initEval = function(input) {
+        WebInspector.console.prompt.text = input;
+        WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
+    };
+    var test = this;
+    var messagesCount = 0;
+    var inputIndex = 0;
+    this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
+        function(commandResult) {
+            messagesCount++;
+            if (messagesCount === expectations.length) {
+                var messages = WebInspector.console.messages;
+                for (var i = 0; i < expectations; ++i) {
+                    var elem = messages[i++].toMessageElement();
+                    test.assertEquals(elem.textContent, expectations[i]);
+                }
+                test.releaseControl();
+            } else if (messagesCount % 2 === 0)
+                initEval(inputs[inputIndex++]);
+        }, true);
+
+    initEval(inputs[inputIndex++]);
+    this.takeControl();
+};
+
+
+/**
+ * Tests that Storage panel can be open and that local DOM storage is added
+ * to the panel.
+ */
+TestSuite.prototype.testShowStoragePanel = function()
+{
+    var test = this;
+    this.addSniffer(WebInspector.panels.storage, "addDOMStorage",
+        function(storage) {
+            var orig = storage.getEntries;
+            storage.getEntries = function(callback) {
+                orig.call(this, function(entries) {
+                    callback(entries);
+                    test.releaseControl();
+                });
+            };
+            try {
+                WebInspector.currentPanel.selectDOMStorage(storage.id);
+                storage.getEntries = orig;
+            } catch (e) {
+                test.fail("Exception in selectDOMStorage: " + e);
+            }
+        });
+    this.showPanel("storage");
+
+    // Access localStorage so that it's pushed to the frontend.
+    this.evaluateInConsole_(
+        'setTimeout("localStorage.x = 10" , 0)',
+        function(resultText) {
+            test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+        });
+
+    // Wait until DOM storage is added to the panel.
+    this.takeControl();
+};
+
+
+/**
+ * Test runner for the test suite.
+ */
+var uiTests = {};
+
+
+/**
+ * Run each test from the test suit on a fresh instance of the suite.
+ */
+uiTests.runAllTests = function()
+{
+    // For debugging purposes.
+    for (var name in TestSuite.prototype) {
+        if (name.substring(0, 4) === "test" && typeof TestSuite.prototype[name] === "function")
+            uiTests.runTest(name);
+    }
+};
+
+
+/**
+ * Run specified test on a fresh instance of the test suite.
+ * @param {string} name Name of a test method from TestSuite class.
+ */
+uiTests.runTest = function(name)
+{
+    new TestSuite().runTest(name);
+};
+
+
+}
+
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/back.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/back.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/back.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/back.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointBorder.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointBorder.png
new file mode 100644
index 0000000..0b1b550
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointBorder.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png
new file mode 100644
index 0000000..430e37e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png
new file mode 100644
index 0000000..b4a5030
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png
new file mode 100644
index 0000000..8b77b61
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png
new file mode 100644
index 0000000..ce49aac
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png
new file mode 100644
index 0000000..5c5fcf6
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/checker.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/checker.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/checker.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/checker.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/closeButtons.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/closeButtons.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/closeButtons.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/closeButtons.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/consoleIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/consoleIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/consoleIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/consoleIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/cookie.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/cookie.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/cookie.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/cookie.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/database.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/database.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/database.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/database.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/databaseTable.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/databaseTable.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/databaseTable.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/databaseTable.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerContinue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerContinue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerContinue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerContinue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerPause.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerPause.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerPause.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerPause.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepInto.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepInto.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepInto.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepInto.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOut.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOut.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOut.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOut.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOver.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOver.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOver.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/debuggerStepOver.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/dockButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/elementsIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/elementsIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/elementsIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/elementsIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorMediumIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorMediumIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorMediumIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorMediumIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorRedDot.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorRedDot.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/errorRedDot.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/errorRedDot.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/focusButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/forward.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/forward.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/forward.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/forward.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/gearButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/gearButtonGlyph.png
new file mode 100644
index 0000000..19659c9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/gearButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeader.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeader.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeader.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeader.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/goArrow.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/goArrow.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/goArrow.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/goArrow.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/grayConnectorPoint.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/localStorage.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/localStorage.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/localStorage.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/localStorage.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrow.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrow.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrow.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrow.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneSettingsButtons.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/percentButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverArrows.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverArrows.png
new file mode 100644
index 0000000..ccefa16
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverArrows.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverBackground.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverBackground.png
new file mode 100644
index 0000000..f20c988
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/popoverBackground.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileGroupIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileGroupIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileGroupIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileGroupIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileSmallIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileSmallIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profileSmallIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profileSmallIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profilesIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profilesIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profilesIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profilesIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profilesSilhouette.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profilesSilhouette.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/profilesSilhouette.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/profilesSilhouette.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/programCounterBorder.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/programCounterBorder.png
new file mode 100644
index 0000000..fed2f3e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/programCounterBorder.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/radioDot.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/radioDot.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/radioDot.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/radioDot.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/recordButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceCSSIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceJSIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceJSIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourceJSIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourceJSIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSilhouette.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/scriptsIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/scriptsIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/scriptsIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/scriptsIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/scriptsSilhouette.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBlue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBlue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBlue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBlue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallGray.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallGray.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallGray.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallGray.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/searchSmallWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segment.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segment.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segment.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segment.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentEnd.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentEnd.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentEnd.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentEnd.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHover.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHover.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHover.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHover.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEnd.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelected.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelected.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelected.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelected.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/sessionStorage.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/sessionStorage.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/sessionStorage.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/sessionStorage.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDimple.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDimple.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDimple.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDimple.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackground.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackground.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackground.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackground.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtons.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtons.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtons.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtons.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButton.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/storageIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/storageIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/storageIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/storageIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/successGreenDot.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/successGreenDot.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/successGreenDot.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/successGreenDot.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png
new file mode 100644
index 0000000..a6ee561
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveVert.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveVert.png
new file mode 100644
index 0000000..a3eabe8
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbActiveVert.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoriz.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoriz.png
new file mode 100644
index 0000000..c16559a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoriz.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png
new file mode 100644
index 0000000..0fe8d6a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverVert.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverVert.png
new file mode 100644
index 0000000..30e315a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbHoverVert.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbVert.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbVert.png
new file mode 100644
index 0000000..61fbc06
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/thumbVert.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarBlue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarBlue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarBlue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarBlue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGray.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGray.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGray.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGray.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGreen.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGreen.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGreen.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarGreen.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarOrange.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarOrange.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarOrange.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarOrange.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarPurple.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarPurple.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarPurple.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarPurple.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarRed.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarRed.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarRed.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarRed.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarYellow.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarYellow.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarYellow.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineBarYellow.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineCheckmarks.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineDots.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineDots.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineDots.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineDots.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelineIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelineIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillBlue.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillBlue.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillBlue.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillBlue.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGray.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGray.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGray.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGray.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGreen.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGreen.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGreen.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillGreen.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillOrange.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillOrange.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillOrange.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillOrange.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillPurple.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillPurple.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillPurple.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillPurple.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillRed.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillRed.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillRed.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillRed.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillYellow.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillYellow.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillYellow.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/timelinePillYellow.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/toolbarItemSelected.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackHoriz.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackHoriz.png
new file mode 100644
index 0000000..517d306
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackHoriz.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackVert.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackVert.png
new file mode 100644
index 0000000..d49620d
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/trackVert.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/undockButtonGlyph.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputResultIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputResultIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/userInputResultIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/userInputResultIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningMediumIcon.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningMediumIcon.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningMediumIcon.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningMediumIcon.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningOrangeDot.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningOrangeDot.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningOrangeDot.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningOrangeDot.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningsErrors.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningsErrors.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/warningsErrors.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/warningsErrors.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/audits.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/audits.css
new file mode 100644
index 0000000..31b2287
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/audits.css
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.audits-sidebar-tree-item .icon {
+    content: url(Images/resourcesTimeGraphIcon.png);
+}
+
+.audit-result-sidebar-tree-item .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+#audit-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+    overflow: auto;
+}
+
+button.clear-audit-results-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+.audit-launcher-view {
+    z-index: 1000;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: white;
+    font-size: 13px;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    display: none;
+}
+
+.audit-launcher-view.visible {
+    display: block;
+}
+
+.audit-launcher-view .audit-launcher-view-content {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: 0 0 0 16px;
+    white-space: nowrap;
+}
+
+.audit-launcher-view h1 {
+    color: rgb(110, 116, 128);
+    font-size: 16px;
+    line-height: 20px;
+    font-weight: normal;
+    padding-top: 15px;
+}
+
+.audit-launcher-view h1.no-audits {
+    text-align: center;
+    font-style: italic;
+    position: relative;
+    left: -8px;
+}
+
+.audit-launcher-view div.button-container {
+    position: absolute;
+    width: 100%;
+    bottom: 16px;
+    padding-top: 16px;
+}
+
+.audit-launcher-view div.audit-categories-container {
+    position: relative;
+    top: 11px;
+    left: 0;
+    width: 100%;
+    overflow-y: auto;
+}
+
+.audit-launcher-view button {
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+.audit-launcher-view button {
+    font-size: 13px;
+    padding: 3px 20px;
+    height: 24px;
+    margin: 0 5px 0 0;
+}
+
+.audit-launcher-view button:active {
+    background-color: rgb(215, 215, 215);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+body.inactive .audit-launcher-view button, .audit-launcher-view button:disabled {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
+}
+
+.audit-launcher-view label {
+    position: relative;
+    display: block;
+    text-align: left;
+    word-break: break-word;
+    padding: 0 0 5px 0;
+}
+
+.audit-launcher-view label.disabled {
+    color: rgb(130, 130, 130);
+}
+
+.audit-launcher-view input[type="checkbox"] {
+    margin-left: 0;
+}
+
+.audit-launcher-view input[type="radio"] {
+    height: 17px;
+    width: 17px;
+    border: 1px solid rgb(165, 165, 165);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 8px;
+    -webkit-appearance: none;
+    vertical-align: middle;
+    margin: 0 5px 5px 0;
+}
+
+.audit-launcher-view input[type="radio"]:active:not(:disabled) {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+.audit-launcher-view input[type="radio"]:checked:not(:disabled), .audit-launcher-view input[type="radio"]:checked:disabled {
+    background: url(Images/radioDot.png) center no-repeat,
+                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+}
+
+.audit-result-view {
+    overflow: auto;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    display: none;
+}
+
+.audit-result-view.visible {
+    display: block;
+}
+
+.audit-result-view .severity-severe {
+    content: url(Images/errorRedDot.png);
+}
+
+.audit-result-view .severity-warning {
+    content: url(Images/warningOrangeDot.png);
+}
+
+.audit-result-view .severity-info {
+    content: url(Images/successGreenDot.png);
+}
+
+.audit-result-tree li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+    padding-right: 2px;
+}
+
+.audit-result-tree {
+    font-size: 11px;
+    line-height: 14px;
+}
+
+.audit-result-tree > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    color: rgb(84, 84, 84);
+    cursor: default;
+    min-width: 100%;
+}
+
+.audit-result-tree, .audit-result-tree ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.audit-result-tree li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-bottom: 1px;
+    word-wrap: break-word;
+    text-indent: -2px;
+}
+
+.audit-result-tree li.parent {
+    text-indent: -12px
+}
+
+.audit-result-tree li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 0;
+    padding-right: 2px;
+}
+
+.audit-result-tree li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.audit-result-tree ol.children {
+    display: none;
+}
+
+.audit-result-tree ol.children.expanded {
+    display: block;
+}
+
+.audit-result {
+    font-weight: bold;
+    color: black;
+}
+
+.audit-result img {
+    float: left;
+    margin-left: -40px;
+    margin-top: -1px;
+}
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devTools.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devTools.css
new file mode 100755
index 0000000..bb33f72
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devTools.css
@@ -0,0 +1,238 @@
+#scripts-files option.injected {
+    color: rgb(70, 134, 240);
+}
+
+.data-grid table {
+    line-height: 120%;
+}
+
+body.attached #toolbar {
+    height: 34px;
+    border-top: 1px solid rgb(100, 100, 100);
+    cursor: default; /* overriden */
+    padding-left: 0;
+}
+
+/* Chrome theme overrides */
+
+body.platform-windows #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248)));
+}
+
+body.platform-windows.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237)));
+}
+
+body.detached.platform-mac-leopard #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(175, 175, 175)), to(rgb(151, 151, 151))) !important;
+}
+
+body.detached.platform-mac-leopard.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(221, 221, 221)), to(rgb(207, 207, 207))) !important;
+}
+
+body.detached.platform-mac-snowleopard #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(189, 189, 189)), to(rgb(151, 151, 151))) !important;
+}
+
+body.detached.platform-mac-snowleopard.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(215, 215, 215)), to(rgb(207, 207, 207))) !important;
+}
+
+/* Heap Profiler Styles */
+
+.heap-snapshot-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.heap-snapshot-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.heap-snapshot-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.heap-snapshot-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.heap-snapshot-view.visible {
+    display: block;
+}
+
+.heap-snapshot-view .data-grid {
+    border: none;
+    max-height: 100%;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 93px;
+}
+
+.heap-snapshot-view .data-grid th.count-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.count-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.size-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.size-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.countDelta-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.countDelta-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.sizeDelta-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.sizeDelta-column {
+    text-align: right;
+}
+
+#heap-snapshot-summary-container {
+    position: absolute;
+    padding-top: 20px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 93px;
+    margin-left: -1px;
+    border-left: 1px solid rgb(102, 102, 102);
+    background-color: rgb(101, 111, 130);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+    background-repeat: repeat-x;
+    background-position: top;
+    text-align: center;
+    text-shadow: black 0 1px 1px;
+    white-space: nowrap;
+    color: white;
+    -webkit-background-size: 1px 6px;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.heap-snapshot-summary {
+    display: inline-block;
+    width: 50%;
+    min-width: 300px;
+    position: relative;
+}
+
+.heap-snapshot-summary canvas.summary-graph {
+    width: 225px;
+}
+
+.heap-snapshot-summary-label {
+    font-size: 12px;
+    font-weight: bold;
+    position: absolute;
+    top: 1px;
+    width: 50%;
+    left: 25%;
+}
+
+body.platform-windows .section > .header {
+    border: 1px solid rgb(92, 116, 157);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157)));
+}
+
+body.platform-windows .console-group-messages .section > .header {
+    padding: 0 8px 0 0;
+    background-image: none;
+    border: none;
+    min-height: 0;
+}
+
+body.platform-windows #resources-filter {
+    background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));
+}
+
+body.platform-windows .crumbs .crumb {
+    -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.end {
+    -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows .crumbs .crumb.selected {
+    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
+    color: white;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;
+}
+
+body.platform-windows .crumbs .crumb.selected:hover {
+    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
+    -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows .crumbs .crumb:hover {
+    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.dimmed:hover {
+    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.end:hover {
+    -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows body.drawer-visible #main-status-bar {
+    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);
+}
+
+body.platform-windows .status-bar {
+    background-image: url(Images/statusbarBackgroundChromium.png);
+}
+
+body.platform-windows button.status-bar-item {
+    background-image: url(Images/statusbarButtonsChromium.png);
+}
+
+body.platform-windows select.status-bar-item:active {
+    -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;
+}
+
+body.platform-windows #drawer {
+    background-image: url(Images/statusbarBottomBackgroundChromium.png);
+}
+
+body.platform-windows select.status-bar-item {
+    -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;
+}
+
+.scope-bar li.selected {
+    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
+}
+
+.scope-bar li:active {
+    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
+}
+
+.timeline-category-tree-item input {
+    vertical-align: middle;
+}
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devtools.html b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devtools.html
new file mode 100644
index 0000000..6c8e28e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/devtools.html
@@ -0,0 +1,162 @@
+<!--
+Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1.  Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+2.  Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+    its contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <link rel="stylesheet" type="text/css" href="audits.css">
+    <link rel="stylesheet" type="text/css" href="inspector.css">
+    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
+    <link rel="stylesheet" type="text/css" href="popover.css">
+    <link rel="stylesheet" type="text/css" href="textViewer.css">
+    <script type="text/javascript" src="utilities.js"></script>
+    <script type="text/javascript" src="treeoutline.js"></script>
+    <script type="text/javascript" src="inspector.js"></script>
+    <script type="text/javascript" src="InspectorBackendStub.js"></script>
+    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
+    <script type="text/javascript" src="Object.js"></script>
+    <script type="text/javascript" src="Settings.js"></script>
+    <script type="text/javascript" src="ContextMenu.js"></script>
+    <script type="text/javascript" src="KeyboardShortcut.js"></script>
+    <script type="text/javascript" src="TextPrompt.js"></script>
+    <script type="text/javascript" src="Popover.js"></script>
+    <script type="text/javascript" src="Placard.js"></script>
+    <script type="text/javascript" src="View.js"></script>
+    <script type="text/javascript" src="Callback.js"></script>
+    <script type="text/javascript" src="Drawer.js"></script>
+    <script type="text/javascript" src="ChangesView.js"></script>
+    <script type="text/javascript" src="ConsoleView.js"></script>
+    <script type="text/javascript" src="Panel.js"></script>
+    <script type="text/javascript" src="TimelineGrid.js"></script>    
+    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
+    <script type="text/javascript" src="Resource.js"></script>
+    <script type="text/javascript" src="ResourceCategory.js"></script>
+    <script type="text/javascript" src="Database.js"></script>
+    <script type="text/javascript" src="DOMStorage.js"></script>
+    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
+    <script type="text/javascript" src="DataGrid.js"></script>
+    <script type="text/javascript" src="CookieItemsView.js"></script>
+    <script type="text/javascript" src="Script.js"></script>
+    <script type="text/javascript" src="Breakpoint.js"></script>
+    <script type="text/javascript" src="SidebarPane.js"></script>
+    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
+    <script type="text/javascript" src="SidebarTreeElement.js"></script>
+    <script type="text/javascript" src="Section.js"></script>
+    <script type="text/javascript" src="PropertiesSection.js"></script>
+    <script type="text/javascript" src="ObjectProxy.js"></script>
+    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
+    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
+    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
+    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
+    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
+    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
+    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
+    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
+    <script type="text/javascript" src="Color.js"></script>
+    <script type="text/javascript" src="StylesSidebarPane.js"></script>
+    <script type="text/javascript" src="PanelEnablerView.js"></script>
+    <script type="text/javascript" src="WelcomeView.js"></script>
+    <script type="text/javascript" src="StatusBarButton.js"></script>
+    <script type="text/javascript" src="SummaryBar.js"></script>
+    <script type="text/javascript" src="ElementsPanel.js"></script>
+    <script type="text/javascript" src="ResourcesPanel.js"></script>
+    <script type="text/javascript" src="InjectedFakeWorker.js"></script>
+    <script type="text/javascript" src="ScriptsPanel.js"></script>
+    <script type="text/javascript" src="StoragePanel.js"></script>
+    <script type="text/javascript" src="ProfilesPanel.js"></script>
+    <script type="text/javascript" src="ConsolePanel.js"></script>
+    <script type="text/javascript" src="AuditsPanel.js"></script>
+    <script type="text/javascript" src="AuditResultView.js"></script>
+    <script type="text/javascript" src="AuditLauncherView.js"></script>
+    <script type="text/javascript" src="AuditRules.js"></script>
+    <script type="text/javascript" src="AuditCategories.js"></script>
+    <script type="text/javascript" src="ResourceView.js"></script>
+    <script type="text/javascript" src="SourceFrame.js"></script>
+    <script type="text/javascript" src="DOMSyntaxHighlighter.js"></script>
+    <script type="text/javascript" src="TextEditorModel.js"></script>
+    <script type="text/javascript" src="TextEditorHighlighter.js"></script>
+    <script type="text/javascript" src="TextViewer.js"></script>
+    <script type="text/javascript" src="SourceTokenizer.js"></script>
+    <script type="text/javascript" src="SourceCSSTokenizer.js"></script>
+    <script type="text/javascript" src="SourceHTMLTokenizer.js"></script>
+    <script type="text/javascript" src="SourceJavaScriptTokenizer.js"></script>
+    <script type="text/javascript" src="SourceView.js"></script>
+    <script type="text/javascript" src="FontView.js"></script>
+    <script type="text/javascript" src="ImageView.js"></script>
+    <script type="text/javascript" src="DatabaseTableView.js"></script>
+    <script type="text/javascript" src="DatabaseQueryView.js"></script>
+    <script type="text/javascript" src="ScriptView.js"></script>
+    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="ProfileView.js"></script>
+    <script type="text/javascript" src="DOMAgent.js"></script>
+    <script type="text/javascript" src="InjectedScript.js"></script>
+    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
+    <script type="text/javascript" src="TimelineAgent.js"></script>
+    <script type="text/javascript" src="TimelinePanel.js"></script>
+    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
+    <script type="text/javascript" src="TestController.js"></script>
+
+    <!-- The following lines are added to include DevTools resources -->
+    <link rel="stylesheet" type="text/css" href="devTools.css">
+    <script type="text/javascript" src="codemap.js"></script>
+    <script type="text/javascript" src="consarray.js"></script>
+    <script type="text/javascript" src="csvparser.js"></script>
+    <script type="text/javascript" src="logreader.js"></script>
+    <script type="text/javascript" src="profile.js"></script>
+    <script type="text/javascript" src="profile_view.js"></script>
+    <script type="text/javascript" src="splaytree.js"></script>
+    <script type="text/javascript" src="InspectorControllerImpl.js"></script>
+    <script type="text/javascript" src="DebuggerAgent.js"></script>
+    <script type="text/javascript" src="ProfilerAgent.js"></script>
+    <script type="text/javascript" src="ProfilerProcessor.js"></script>
+    <script type="text/javascript" src="HeapProfilerPanel.js"></script>
+    <script type="text/javascript" src="DevTools.js"></script>
+    <script type="text/javascript" src="DevToolsHostStub.js"></script>
+    <script type="text/javascript" src="Tests.js"></script>
+    <!-- End of auto-added files list -->
+</head>
+<body class="detached">
+    <div id="toolbar">
+        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
+        <div class="toolbar-item flexable-space"></div>
+        <div class="toolbar-item hidden" id="search-results-matches"></div>
+        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
+        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
+    </div>
+    <div id="main">
+        <div id="main-panels" spellcheck="false"></div>
+        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
+    </div>
+    <div id="drawer">
+        <div id="console-view"><div id="console-messages" class="monospace"><div id="console-prompt" spellcheck="false"><br></div></div></div>
+        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
+    </div>
+</body>
+</html>
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.css
new file mode 100644
index 0000000..870e509
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.css
@@ -0,0 +1,3883 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+body {
+    cursor: default;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    overflow: hidden;
+    font-family: Lucida Grande, sans-serif;
+    font-size: 10px;
+    margin: 0;
+    -webkit-text-size-adjust: none;
+    -webkit-user-select: none;
+}
+
+* {
+    -webkit-box-sizing: border-box;
+}
+
+:focus {
+    outline: none;
+}
+
+input[type="search"]:focus, input[type="text"]:focus {
+    outline: auto 5px -webkit-focus-ring-color;
+}
+
+iframe, a img {
+    border: none;
+}
+
+img {
+    -webkit-user-drag: none;
+}
+
+.hidden {
+    display: none !important;
+}
+
+#toolbar {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 56px;
+    display: -webkit-box;
+    padding: 0 5px;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(191, 191, 191)), to(rgb(151, 151, 151)));
+    border-bottom: 1px solid rgb(80, 80, 80);
+    -webkit-box-orient: horizontal;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+body.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(207, 207, 207)));
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+}
+
+body.detached.platform-mac-leopard #toolbar,
+body.detached.platform-mac-snowleopard #toolbar {
+    background: transparent !important;
+}
+
+body.attached #toolbar {
+    height: 34px;
+    border-top: 1px solid rgb(100, 100, 100);
+    cursor: row-resize;
+    padding-left: 0;
+}
+
+body.attached.port-qt #toolbar {
+    cursor: auto;
+}
+
+body.attached.inactive #toolbar {
+    border-top: 1px solid rgb(64%, 64%, 64%);
+}
+
+.toolbar-item {
+    display: -webkit-box;
+    padding: 4px 6px;
+    margin: 0;
+    background-color: transparent;
+    border-style: none;
+    border-color: transparent;
+    -webkit-box-orient: vertical;
+    -webkit-box-align: center;
+    -webkit-box-pack: end;
+}
+
+.toolbar-item.toggleable.toggled-on {
+    border-width: 0 2px 0 2px;
+    padding: 4px 4px;
+    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;
+}
+
+.toolbar-item.flexable-space {
+    -webkit-box-flex: 1;
+    visibility: hidden;
+}
+
+.toolbar-item input {
+    margin-bottom: 8px;
+}
+
+.toolbar-icon {
+    display: inline-block;
+    width: 32px;
+    height: 32px;
+    -webkit-background-size: 100% auto;
+}
+
+body.attached .toolbar-icon {
+    width: 24px;
+    height: 24px;
+    vertical-align: middle;
+}
+
+.toolbar-item:active .toolbar-icon {
+    background-position: 0 32px;
+}
+
+body.attached .toolbar-item:active .toolbar-icon {
+    background-position: 0 24px;
+}
+
+.toolbar-label {
+    font-size: 11px;
+    font-family: Lucida Grande, sans-serif;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+}
+
+.toolbar-item.toggleable:active .toolbar-label {
+    text-shadow: none;
+}
+
+body.attached .toolbar-label {
+    display: inline-block;
+    vertical-align: middle;
+    margin-left: 3px;
+}
+
+body.attached #search-toolbar-label {
+    display: none;
+}
+
+#search {
+    width: 205px;
+    font-size: 16px;
+    margin-bottom: 5px;
+}
+
+body.attached #search {
+    font-size: 11px;
+    margin-bottom: 8px;
+}
+
+#search-results-matches {
+    font-size: 11px;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    margin-bottom: 22px;
+}
+
+body.attached #search-results-matches {
+    margin-bottom: 6px;
+}
+
+.toolbar-item.elements .toolbar-icon {
+    background-image: url(Images/elementsIcon.png);
+}
+
+.toolbar-item.resources .toolbar-icon {
+    background-image: url(Images/resourcesIcon.png);
+}
+
+.toolbar-item.scripts .toolbar-icon {
+    background-image: url(Images/scriptsIcon.png);
+}
+
+.toolbar-item.timeline .toolbar-icon {
+    background-image: url(Images/timelineIcon.png);
+}
+
+.toolbar-item.storage .toolbar-icon {
+    background-image: url(Images/storageIcon.png);
+}
+
+.toolbar-item.profiles .toolbar-icon {
+    background-image: url(Images/profilesIcon.png);
+}
+
+.toolbar-item.console .toolbar-icon {
+    background-image: url(Images/consoleIcon.png);
+}
+
+#close-button-left, #close-button-right {
+    width: 14px;
+    height: 14px;
+    background-image: url(Images/closeButtons.png);
+    background-position: 0 0;
+    background-color: transparent;
+    border: 0 none transparent;
+    margin: 5px 0;
+}
+
+#close-button-left:hover, #close-button-right:hover {
+    background-position: 14px 0;
+}
+
+#close-button-left:active, #close-button-right:active {
+    background-position: 28px 0;
+}
+
+body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {
+    display: none;
+}
+
+body.attached.port-qt .toolbar-item.close-left, body.attached.port-qt .toolbar-item.close-right {
+    display: none;
+}
+
+body.platform-mac .toolbar-item.close-right {
+    display: none;
+}
+
+body:not(.platform-mac) .toolbar-item.close-left {
+    display: none;
+}
+
+#main {
+    position: absolute;
+    z-index: 1;
+    top: 56px;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: hidden;
+    background-color: white;
+}
+
+body.attached #main {
+    top: 34px;
+}
+
+#main-panels {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 23px;
+    overflow: hidden;
+}
+
+#main-status-bar {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+body.drawer-visible #main-status-bar {
+    height: 24px;
+    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackground.png);
+    background-repeat: no-repeat, repeat-x;
+    background-position: right center, center;
+    cursor: row-resize;
+}
+
+body.drawer-visible #main-status-bar * {
+    cursor: default;
+}
+
+body.drawer-visible #main-panels {
+    bottom: 24px;
+}
+
+.status-bar {
+    background-color: rgb(235, 235, 235);
+    background-image: url(Images/statusbarBackground.png);
+    background-repeat: repeat-x;
+    white-space: nowrap;
+    height: 23px;
+    overflow: hidden;
+    z-index: 12;
+}
+
+.status-bar > div {
+    display: inline-block;
+    vertical-align: top;
+}
+
+.status-bar-item {
+    display: inline-block;
+    height: 24px;
+    padding: 0;
+    margin-left: -1px;
+    margin-right: 0;
+    vertical-align: top;
+    border: 0 transparent none;
+    background-color: transparent;
+}
+
+.status-bar-item:active {
+    position: relative;
+    z-index: 200;
+}
+
+.glyph {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.75);
+    z-index: 1;
+}
+
+.glyph.shadow {
+    top: 1px;
+    background-color: white !important;
+    z-index: 0;
+}
+
+button.status-bar-item {
+    position: relative;
+    width: 32px;
+    background-image: url(Images/statusbarButtons.png);
+    background-position: 0 0;
+}
+
+button.status-bar-item:active {
+    background-position: 32px 0 !important;
+}
+
+button.status-bar-item .glyph.shadow {
+    background-color: rgba(255, 255, 255, 0.33) !important;
+}
+
+button.status-bar-item.toggled-on .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+button.status-bar-item.toggled-1 .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+button.status-bar-item.toggled-2 .glyph {
+    background-color: purple;   
+}
+
+button.status-bar-item:disabled {
+    opacity: 0.5;
+    background-position: 0 0 !important;
+}
+
+select.status-bar-item {
+    min-width: 48px;
+    border-width: 0 17px 0 2px;
+    padding: 0 2px 0 6px;
+    font-weight: bold;
+    color: rgb(48, 48, 48);
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    -webkit-border-image: url(Images/statusbarMenuButton.png) 0 17 0 2;
+    -webkit-border-radius: 0;
+    -webkit-appearance: none;
+}
+
+select.status-bar-item:active {
+    color: black;
+    -webkit-border-image: url(Images/statusbarMenuButtonSelected.png) 0 17 0 2;
+}
+
+#dock-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/undockButtonGlyph.png);
+}
+
+body.detached #dock-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/dockButtonGlyph.png);
+}
+
+body.port-qt #dock-status-bar-item {
+    display: none
+}
+
+#console-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/consoleButtonGlyph.png);
+}
+
+#clear-console-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+#changes-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/consoleButtonGlyph.png); /* TODO: Needs Image for Changes Toggle Button */
+}
+
+#clear-changes-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+#count-items {
+    position: absolute;
+    right: 16px;
+    top: 0;
+    cursor: pointer;
+    padding: 6px 2px;
+    font-size: 10px;
+    height: 19px;
+}
+
+#changes-count, #error-warning-count {
+    display: inline;
+}
+
+#error-warning-count:hover, #changes-count:hover {
+    border-bottom: 1px solid rgb(96, 96, 96);
+}
+
+#style-changes-count::before {
+    content: url(Images/styleIcon.png); /* TODO: Needs Image for Style Changes Icon */
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+
+#error-count::before {
+    content: url(Images/errorIcon.png);
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+    
+#changes-count + #error-warning-count, #error-count + #warning-count {
+    margin-left: 6px;
+}
+
+#warning-count::before {
+    content: url(Images/warningIcon.png);
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+
+#drawer {
+    display: none;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 200px;
+    background-color: white;
+    background-image: url(Images/statusbarBottomBackground.png);
+    background-repeat: repeat-x;
+    background-position: bottom;
+}
+
+body.drawer-visible #drawer {
+    display: block;
+}
+
+#drawer-status-bar {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background: none;
+}
+
+.monospace {
+    font-size: 10px;
+    font-family: monospace;
+}
+
+body.platform-mac .monospace, body.platform-mac .source-code {
+    font-family: Monaco, monospace;
+}
+
+/* Keep .platform-mac to make the rule more specific than the general one above. */
+body.platform-mac.platform-mac-snowleopard .monospace,
+body.platform-mac.platform-mac-snowleopard .source-code {
+    font-size: 11px;
+    font-family: Menlo, monospace;
+}
+
+body.platform-windows .monospace, body.platform-windows .source-code {
+    font-size: 12px;
+    font-family: Consolas, Lucida Console, monospace;
+}
+
+body.platform-linux .monospace, body.platform-linux .source-code {
+    font-size: 11px;
+    font-family: dejavu sans mono, monospace;
+}
+
+#console-messages {
+    position: absolute;
+    z-index: 0;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 23px;
+    padding: 2px 0;
+    overflow-y: overlay;
+    word-wrap: break-word;
+    -webkit-user-select: text;
+    -webkit-text-size-adjust: auto;
+}
+
+#console-prompt {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+#console-prompt::before {
+    background-image: url(Images/userInputIcon.png);
+}
+
+.console-user-command-result.console-log-level::before {
+    background-image: url(Images/userInputResultIcon.png);
+}
+
+.console-message, .console-user-command {
+    position: relative;
+    border-bottom: 1px solid rgb(240, 240, 240);
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+}
+
+.console-adjacent-user-command-result {
+    border-bottom: none;
+}
+
+.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {
+    background-image: none;
+}
+
+.console-message::before, .console-user-command::before, #console-prompt::before, .console-group-title::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: 7px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -5px;
+    -webkit-user-select: none;
+}
+
+.console-message .bubble {
+    display: inline-block;
+    height: 14px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    margin-top: -2px;
+    margin-right: 4px;
+    text-align: left;
+    font-size: 11px;
+    line-height: normal;
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    -webkit-border-radius: 7px;
+}
+
+.console-message-text {
+    white-space: pre-wrap;
+}
+
+.repeated-message {
+    padding-left: 6px;
+}
+
+.repeated-message.console-error-level::before, .repeated-message.console-warning-level:before, .repeated-message.console-debug-level:before {
+    visibility: hidden;
+}
+
+.console-group .console-group > .console-group-messages {
+    margin-left: 16px;
+}
+
+.console-group-title {
+    font-weight: bold;
+}
+
+.console-group-title::before {
+    background-image: url(Images/disclosureTriangleSmallDown.png);
+    top: 0.6em;
+    width: 11px;
+    height: 12px;
+}
+
+.console-group.collapsed .console-group-title::before {
+    background-image: url(Images/disclosureTriangleSmallRight.png);
+}
+
+.console-group.collapsed > .console-group-messages {
+    display: none;
+}
+
+.console-error-level .console-message-text {
+    color: red;
+}
+
+.console-debug-level .console-message-text {
+    color: blue;
+}
+
+.console-debug-level::before {
+    background-image: url(Images/searchSmallBrightBlue.png);
+}
+
+.console-error-level::before {
+    background-image: url(Images/errorIcon.png);
+}
+
+.console-warning-level::before {
+    background-image: url(Images/warningIcon.png);
+}
+
+.console-user-command .console-message {
+    margin-left: -24px;
+    padding-right: 0;
+    border-bottom: none;
+}
+
+.console-user-command::before {
+    background-image: url(Images/userInputPreviousIcon.png);
+}
+
+.console-user-command > .console-message-text {
+    color: rgb(0, 128, 255);
+}
+
+#console-messages a {
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+}
+
+#console-messages a:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+.console-message-url {
+    float: right;
+}
+
+.console-group-messages .section {
+    margin: 0 0 0 12px !important;
+}
+
+.console-group-messages .section .header {
+    padding: 0 8px 0 0;
+    background-image: none;
+    border: none;
+    min-height: 0;
+}
+
+.console-group-messages .section .header::before {
+    position: absolute;
+    top: 1px;
+    left: 1px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.console-group-messages .section.expanded .header::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.console-group-messages .section .header .title {
+    color: black;
+    font-weight: normal;
+}
+
+.console-group-messages .section .properties li .info {
+    padding-top: 0;
+    padding-bottom: 0;
+    color: rgb(60%, 60%, 60%);
+}
+
+.console-group-messages .outline-disclosure {
+    padding-left: 0;
+}
+
+.console-group-messages .outline-disclosure > ol {
+    padding: 0 0 0 12px !important;
+}
+
+.console-group-messages .outline-disclosure, .console-group-messages .outline-disclosure ol {
+    font-size: inherit;
+    line-height: 12px;
+}
+
+.console-group-messages .outline-disclosure.single-node li {
+    padding-left: 2px;
+}
+
+.console-group-messages .outline-disclosure li .selection {
+    margin-left: -6px;
+    margin-right: -6px;
+}
+
+.console-group-messages .add-attribute {
+    display: none;
+}
+
+.console-formatted-object, .console-formatted-node {
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+}
+
+.console-formatted-object .section, .console-formatted-node .section {
+    position: static;
+}
+
+.console-formatted-object .properties, .console-formatted-node .properties {
+    padding-left: 0 !important;
+}
+
+.console-formatted-number {
+    color: rgb(28, 0, 207);
+}
+
+.console-formatted-string, .console-formatted-regexp {
+    color: rgb(196, 26, 22);
+}
+
+.console-formatted-null, .console-formatted-undefined {
+    color: rgb(128, 128, 128);
+}
+
+.error-message {
+    color: red;
+}
+
+.auto-complete-text {
+    color: rgb(128, 128, 128);
+    -webkit-user-select: none;
+    -webkit-user-modify: read-only;
+}
+
+.panel {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.panel.visible {
+    display: block;
+}
+
+.resource-view {
+    display: none;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.resource-view.visible {
+    display: block;
+}
+
+.resource-view .scope-bar {
+    display: none;
+    position: absolute;
+    height: 20px;
+    top: 0;
+    left: 0;
+    right: 0;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.resource-view.headers-visible .scope-bar {
+    display: block;
+}
+
+.resource-view .scope-bar li {
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 0;
+}
+
+.resource-view-headers {
+    padding: 6px;
+    -webkit-user-select: text;    
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: auto;
+}
+
+.resource-view.headers-visible .resource-view-headers {
+    top: 20px;
+}
+
+.resource-view-headers .outline-disclosure .parent {
+    -webkit-user-select: none;
+    font-weight: bold;
+}
+
+.resource-view-headers .outline-disclosure .children li {
+    white-space: nowrap;
+}
+
+.resource-view-headers .outline-disclosure li.expanded .header-count {
+    display: none;
+}
+
+.resource-view-headers .outline-disclosure .header-name {
+    color: rgb(33%, 33%, 33%);
+    display: inline-block;
+    margin-right: 0.5em;
+    font-weight: bold;
+    vertical-align: top;
+    white-space: pre-wrap;
+}
+
+.resource-view-headers .outline-disclosure .header-value {
+    display: inline;
+    margin-right: 100px;
+    white-space: pre-wrap;
+    word-break: break-all;
+    margin-top: 1px;
+}
+
+.resource-view-headers .outline-disclosure .raw-form-data {
+    white-space:pre-wrap;
+}
+
+.resource-view .resource-view-content {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+}
+
+.resource-view.headers-visible .resource-view-content {
+    top: 20px;
+}
+
+.webkit-line-gutter-backdrop {
+    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
+    width: 31px;
+    background-color: rgb(240, 240, 240);
+    border-right: 1px solid rgb(187, 187, 187);
+    position: absolute;
+    z-index: -1;
+    left: 0;
+    top: 0;
+    height: 100%
+}
+
+.resource-view.font .resource-view-content {
+    font-size: 60px;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    text-align: center;
+    padding: 15px;
+}
+
+.resource-view.image .resource-view-content > .image {
+    padding: 20px 20px 10px 20px;
+    text-align: center;
+}
+
+.resource-view.image .resource-view-content > .info {
+    padding-bottom: 10px;
+    font-size: 11px;
+    -webkit-user-select: text;
+}
+
+.resource-view.image img.resource-image-view {
+    max-width: 100%;
+    max-height: 1000px;
+    background-image: url(Images/checker.png);
+    -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
+    -webkit-user-select: text;
+    -webkit-user-drag: auto;
+}
+
+.resource-url {
+    vertical-align: middle;
+}
+
+.resource-status-image {
+    margin-top: -3px;
+    vertical-align: middle;
+}
+
+.resource-view.image .title {
+    text-align: center;
+    font-size: 13px;
+}
+
+.resource-view.image .infoList {
+    margin: 0;
+}
+
+.resource-view.image .infoList dt {
+    font-weight: bold;
+    display: inline-block;
+    width: 50%;
+    text-align: right;
+    color: rgb(76, 76, 76);
+}
+
+.resource-view.image .infoList dd {
+    display: inline-block;
+    padding-left: 8px;
+    width: 50%;
+    text-align: left;
+    margin: 0;
+}
+
+.resource-view.image .infoList dd::after {
+    white-space: pre;
+    content: "\A";
+}
+
+#elements-content {
+    display: block;
+    overflow: auto;
+    padding: 0;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 225px;
+    bottom: 0;
+}
+
+#elements-sidebar {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    width: 225px;
+    background-color: rgb(245, 245, 245);
+    border-left: 1px solid rgb(64%, 64%, 64%);
+    cursor: default;
+    overflow: auto;
+}
+
+.crumbs {
+    display: inline-block;
+    font-size: 11px;
+    line-height: 19px;
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    color: rgb(20, 20, 20);
+    margin-left: -1px;
+    padding-right: 12px;
+}
+
+.crumbs .crumb {
+    height: 24px;
+    border-width: 0 12px 0 2px;
+    -webkit-border-image: url(Images/segment.png) 0 12 0 2;
+    margin-right: -12px;
+    padding-left: 18px;
+    padding-right: 2px;
+    white-space: nowrap;
+    line-height: 23px;
+    float: right;
+}
+
+.crumbs .crumb.collapsed > * {
+    display: none;
+}
+
+.crumbs .crumb.collapsed::before {
+    content: "\2026";
+    font-weight: bold;
+}
+
+.crumbs .crumb.compact .extra {
+    display: none;
+}
+
+.crumbs .crumb.dimmed {
+    color: rgba(0, 0, 0, 0.45);
+}
+
+.crumbs .crumb.start {
+    padding-left: 7px;
+}
+
+.crumbs .crumb.end {
+    border-width: 0 2px 0 2px;
+    padding-right: 6px;
+    -webkit-border-image: url(Images/segmentEnd.png) 0 2 0 2;
+}
+
+.crumbs .crumb.selected {
+    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
+    color: black;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+}
+
+.crumbs .crumb.selected:hover {
+    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
+}
+
+.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
+    -webkit-border-image: url(Images/segmentSelectedEnd.png) 0 2 0 2;
+}
+
+.crumbs .crumb:hover {
+    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
+    color: black;
+}
+
+.crumbs .crumb.dimmed:hover {
+    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
+    color: rgba(0, 0, 0, 0.75);
+}
+
+.crumbs .crumb.end:hover {
+    -webkit-border-image: url(Images/segmentHoverEnd.png) 0 2 0 2;
+}
+
+.outline-disclosure li.hovered:not(.selected) .selection {
+    display: block;
+    left: 3px;
+    right: 3px;
+    background-color: rgba(56, 121, 217, 0.1);
+    -webkit-border-radius: 5px;
+}
+
+.outline-disclosure li.highlighted .highlight {
+    background-color: rgb(255, 230, 179);
+    -webkit-border-radius: 4px;
+    padding-bottom: 2px;
+    margin-bottom: -2px;
+}
+
+.outline-disclosure li.selected.highlighted .highlight {
+    background-color: transparent;
+    padding-bottom: 0;
+    margin-bottom: 0;
+}
+
+.outline-disclosure li .selection {
+    display: none;
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 15px;
+    z-index: -1;
+}
+
+.outline-disclosure li.selected .selection {
+    display: block;
+    background-color: rgb(212, 212, 212);
+}
+
+.outline-disclosure ol:focus li.selected .selection {
+    background-color: rgb(56, 121, 217);
+}
+
+.outline-disclosure {
+    font-size: 11px;
+}
+
+.outline-disclosure > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    color: black;
+    cursor: default;
+    min-width: 100%;
+}
+
+.outline-disclosure, .outline-disclosure ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.source-code {
+    font-family: monospace;
+    font-size: 10px;
+    white-space: pre-wrap;
+}
+
+.outline-disclosure li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-bottom: 1px;
+    word-wrap: break-word;
+    text-indent: -2px;
+}
+
+.resources .outline-disclosure li {
+    text-indent: -1px;
+}
+
+.outline-disclosure ol:focus li.selected {
+    color: white;
+}
+
+.outline-disclosure ol:focus li.selected * {
+    color: inherit;
+}
+
+.outline-disclosure li.parent {
+    text-indent: -12px
+}
+
+.outline-disclosure li .webkit-html-tag.close {
+    margin-left: -12px;
+}
+
+.outline-disclosure li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+    padding-right: 2px;
+}
+
+.outline-disclosure li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.outline-disclosure ol:focus li.parent.selected::before {
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.outline-disclosure li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.outline-disclosure ol:focus li.parent.expanded.selected::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.outline-disclosure ol.children {
+    display: none;
+}
+
+.outline-disclosure ol.children.expanded {
+    display: block;
+}
+
+.add-attribute {
+    margin-left: 1px;
+    margin-right: 1px;
+    white-space: nowrap;
+}
+
+.placard {
+    position: relative;
+    margin-top: 1px;
+    padding: 3px 8px 4px 18px;
+    min-height: 18px;
+    white-space: nowrap;
+}
+
+.placard:nth-of-type(2n) {
+    background-color: rgb(234, 243, 255);
+}
+
+.placard.selected {
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+:focus .placard.selected {
+    border-top: 1px solid rgb(68, 128, 200);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
+}
+
+body.inactive .placard.selected {
+    border-top: 1px solid rgb(151, 151, 151);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
+}
+
+.placard .title {
+    color: black;
+    font-weight: normal;
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.placard.selected .title {
+    color: white;
+    font-weight: bold;
+}
+
+.placard .subtitle {
+    float: right;
+    font-size: 10px;
+    margin-left: 5px;
+    max-width: 55%;
+    color: rgba(0, 0, 0, 0.7);
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.placard.selected .subtitle {
+    color: rgba(255, 255, 255, 0.7);
+}
+
+.placard .subtitle a {
+    color: inherit;
+}
+
+.section {
+    position: relative;
+    margin-top: 1px;
+}
+
+.section:nth-last-of-type(1), .event-bar:nth-last-of-type(1) {
+    margin-bottom: 1px;
+}
+
+.watch-expressions-buttons-container {
+    text-align: center;
+}
+
+.event-bar:first-child {
+    margin-top: 1px;
+}
+
+.event-bar:nth-last-of-type(1) .header {
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.section .header {
+    padding: 2px 8px 4px 18px;
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    min-height: 18px;
+    white-space: nowrap;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.section.no-affect .header {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(167, 167, 167)), to(rgb(123, 123, 123)))
+}
+
+.section .header::before {
+    position: absolute;
+    top: 4px;
+    left: 7px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.section.blank-section .header::before {
+    display: none;
+}
+
+.section.expanded .header::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.section .header .title, .event-bar .header .title {
+    color: white;
+    font-weight: bold;
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.section .header .title.blank-title {
+    font-style: italic;
+}
+
+.section .header label, .event-bar .header label {
+    display: none;
+}
+
+.section.expanded .header label, .event-bar.expanded .header label {
+    display: inline;
+}
+
+.section .header input[type=checkbox] {
+    height: 10px;
+    width: 10px;
+    margin-left: 0;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: 2px;
+}
+
+.section .header .subtitle, .event-bar .header .subtitle {
+    float: right;
+    font-size: 10px;
+    margin-left: 5px;
+    max-width: 55%;
+    color: rgba(255, 255, 255, 0.7);
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.section .header .subtitle a {
+    color: inherit;
+}
+
+.section .properties, .event-bar .event-properties {
+    display: none;
+    margin: 0;
+    padding: 2px 6px 3px;
+    list-style: none;
+    min-height: 18px;
+}
+
+.section.no-affect .properties li {
+    opacity: 0.5;
+}
+
+.section.no-affect .properties li.editing {
+    opacity: 1.0;
+}
+
+.section.expanded .properties, .event-bar.expanded .event-properties {
+    display: block;
+}
+
+.section .properties li, .event-properties li {
+    margin-left: 12px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-user-select: text;
+    cursor: auto;
+}
+
+.section .properties li.parent, .event-properties li.parent {
+    margin-left: 1px;
+}
+
+.section .properties ol, .event-properties ol {
+    display: none;
+    margin: 0;
+    -webkit-padding-start: 12px;
+    list-style: none;
+}
+
+.section .properties ol.expanded, .event-properties ol.expanded {
+    display: block;
+}
+
+.section .properties li.parent::before, .event-properties li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    opacity: 0.75;
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 0;
+    padding-right: 3px;
+    -webkit-user-select: none;
+    cursor: default;
+}
+
+.section .properties li.parent.expanded::before, .event-properties li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+    margin-top: 1px;
+}
+
+.section .properties li .info, .event-properties li .info {
+    padding-top: 4px;
+    padding-bottom: 3px;
+}
+
+.section .event-bars {
+    display: none;
+}
+
+.section.expanded .event-bars {
+    display: block;
+}
+
+.event-bar {
+    position: relative;
+}
+
+.event-bar-connector {
+    position: absolute;
+    left: 75%;
+    bottom: -7px;
+    margin-left: -7px;
+    content: url(Images/grayConnectorPoint.png);
+    z-index: 3;
+}
+
+.event-bar.expanded .event-bar-connector {
+    content: url(Images/whiteConnectorPoint.png);
+}
+
+.event-bars .event-bar .header {
+    padding: 2px 8px 4px 18px;
+    border-top: 1px solid rgb(163, 163, 163);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), to(rgb(207, 207, 207)));
+    min-height: 18px;
+    white-space: nowrap;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.event-bars .event-bar.expanded .header {
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.event-bars .event-bar .header .title {
+    font-weight: bold;
+    color: #333;
+    text-shadow: white 0 1px 0; 
+}
+
+.event-bars .event-bar .header .subtitle {
+    color: rgba(90, 90, 90, 0.75);
+}
+
+.event-bars .event-bar .header::before {
+    position: absolute;
+    top: 4px;
+    left: 7px;
+    width: 8px;
+    height: 8px;
+    opacity: 0.75;
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.event-bars .event-bar.expanded .header::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.editing {
+    -webkit-user-select: text;
+    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    outline: 1px solid rgb(66%, 66%, 66%) !important;
+    background-color: white;
+    -webkit-user-modify: read-write-plaintext-only;
+    text-overflow: clip;
+    padding-left: 2px;
+    margin-left: -2px;
+    padding-right: 2px;
+    margin-right: -2px;
+    margin-bottom: -1px;
+    padding-bottom: 1px;
+    opacity: 1.0 !important;
+}
+
+.editing, .editing * {
+    color: black !important;
+    text-decoration: none !important;
+}
+
+.elements-tree-editor {
+    -webkit-user-select: text;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+.section .properties li.editing {
+    margin-left: 10px;
+    text-overflow: clip;
+}
+
+li.editing .swatch, li.editing .enabled-button,  li.editing-sub-part .delete-button {
+    display: none !important;
+}
+
+.watch-expressions > li.editing-sub-part .name {
+    display: block; 
+    width: 100%;
+}
+
+.watch-expressions > li.editing-sub-part .value, .watch-expressions > li.editing-sub-part .separator  {
+    display: none;
+}
+
+.watch-expressions-error-level {
+    color: red;
+}
+
+.section .properties li.editing-sub-part {
+    padding: 3px 6px 8px 18px;
+    margin: -3px -6px -8px -6px;
+    text-overflow: clip;
+}
+
+.section .properties .overloaded, .section .properties .disabled {
+    text-decoration: line-through;
+}
+
+.section.computed-style .properties .disabled {
+    text-decoration: none;
+    opacity: 0.5;
+}
+
+.section .properties .implicit, .section .properties .inherited {
+    opacity: 0.5;
+}
+
+.section:not(.show-inherited) .properties .inherited {
+    display: none;
+}
+
+.section .properties .enabled-button {
+    display: none;
+    float: right;
+    font-size: 10px;
+    margin: 0 0 0 4px;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+}
+
+/* FIXME: need a better icon (comment in bug 27514) */
+.section .properties .delete-button {
+    width: 10px;
+    height: 10px;
+    background-image: url(Images/errorIcon.png);
+    background-position: 0 0;
+    background-color: transparent;
+    background-repeat: no-repeat;
+    border: 0 none transparent;
+}
+
+.section:hover .properties .enabled-button {
+    display: block;
+}
+
+.section .properties .name, .event-properties .name {
+    color: rgb(136, 19, 145);
+}
+
+.section .properties .value.dimmed {
+    color: rgb(100, 100, 100);
+}
+
+.section .properties .value.error {
+    color: red;
+}
+
+.section .properties .number, .event-properties .number {
+    color: blue;
+}
+
+.section .properties .priority {
+    color: rgb(128, 0, 0);
+}
+
+.section .properties .keyword, .event-properties .keyword {
+    color: rgb(136, 19, 79);
+}
+
+.section .properties .color, .event-properties .color {
+    color: rgb(118, 15, 21);
+}
+
+.swatch {
+    display: inline-block;
+    vertical-align: baseline;
+    margin-left: 1px;
+    margin-right: 2px;
+    margin-bottom: -1px;
+    width: 1em;
+    height: 1em;
+    border: 1px solid rgba(128, 128, 128, 0.6);
+}
+
+.swatch:hover {
+    border: 1px solid rgba(64, 64, 64, 0.8);
+}
+
+.pane:not(.expanded) + .pane, .pane:first-of-type {
+    margin-top: -1px;
+}
+
+.pane > .title {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));
+    height: 20px;
+    padding: 0 5px;
+    border-top: 1px solid rgb(189, 189, 189);
+    border-bottom: 1px solid rgb(189, 189, 189);
+    font-weight: bold;
+    font-size: 12px;
+    line-height: 18px;
+    color: rgb(110, 110, 110);
+    text-shadow: white 0 1px 0;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.pane > .title:active {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(231, 231, 231)), color-stop(0.05, rgb(231, 231, 231)), color-stop(0.05, rgb(207, 207, 207)), to(rgb(186, 186, 186)));
+    border-top: 1px solid rgb(178, 178, 178);
+    border-bottom: 1px solid rgb(178, 178, 178);
+}
+
+.pane > .title::before {
+    content: url(Images/disclosureTriangleSmallRightBlack.png);
+    float: left;
+    width: 11px;
+    height: 12px;
+    margin-right: 2px;
+    margin-top: 1px;
+}
+
+.pane.expanded > .title::before {
+    content: url(Images/disclosureTriangleSmallDownBlack.png);
+}
+
+.pane > .title > select {
+    display: none;
+    float: right;
+    width: 23px;
+    height: 17px;
+    color: transparent;
+    background-color: transparent;
+    border: none;
+    background-image: url(Images/paneSettingsButtons.png);
+    background-repeat: no-repeat;
+    margin: 1px 0 0 0;
+    padding: 0;
+    -webkit-border-radius: 0;
+    -webkit-appearance: none;
+}
+
+.pane.expanded:hover > .title > select {
+    display: inline-block;
+}
+
+.pane > .title > select:hover {
+    background-position: -23px 0px;
+}
+
+.pane > .title > select:active {
+    background-position: -46px 0px;
+}
+
+.pane > .title > select > option, .pane > .title > select > hr {
+    color: black;
+}
+
+.pane > .body {
+    position: relative;
+    display: none;
+    background-color: white;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+.pane > .body .info {
+    text-align: center;
+    font-style: italic;
+    font-size: 10px;
+    padding: 6px;
+    color: gray;
+}
+
+.pane.expanded > .body, .pane.expanded > .growbar {
+    display: block;
+}
+
+.pane.expanded:nth-last-of-type(1) {
+    border-bottom: 1px solid rgb(189, 189, 189);
+}
+
+.pane > .growbar {
+    display: none;
+    background-image: url(Images/paneGrowHandleLine.png), url(Images/paneBottomGrow.png);
+    background-repeat: no-repeat, repeat-x;
+    background-position: center center, bottom;
+    height: 5px;
+}
+
+.metrics {
+    padding: 8px;
+    font-size: 10px;
+    text-align: center;
+    white-space: nowrap;
+}
+
+.metrics .label {
+    position: absolute;
+    margin-top: -10px;
+    font-size: 9px;
+    color: grey;
+    background-color: white;
+    margin-left: 3px;
+    padding-left: 2px;
+    padding-right: 2px;
+}
+
+.metrics .position {
+    border: 1px rgb(66%, 66%, 66%) dotted;
+    display: inline-block;
+    text-align: center;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .margin {
+    border: 1px dashed;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .border {
+    border: 1px black solid;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .padding {
+    border: 1px grey dashed;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .content {
+    position: static;
+    border: 1px grey solid;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+    min-width: 80px;
+    text-align: center;
+    overflow: visible;
+}
+
+.metrics .content span {
+    display: inline-block;
+}
+
+.metrics .editing {
+    position: relative;
+    z-index: 100;
+}
+
+.metrics .left {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .right {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .top {
+    display: inline-block;
+}
+
+.metrics .bottom {
+    display: inline-block;
+}
+
+.sidebar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 200px;
+    overflow-y: auto;
+    overflow-x: hidden;
+    background-color: rgb(214, 221, 229);
+    border-right: 1px solid rgb(64%, 64%, 64%);
+}
+
+body.inactive .sidebar {
+    background-color: rgb(232, 232, 232);
+}
+
+.database-sidebar-tree-item .icon {
+    content: url(Images/database.png);
+}
+
+.database-table-sidebar-tree-item .icon {
+    content: url(Images/databaseTable.png);
+}
+
+.domstorage-sidebar-tree-item.local-storage .icon {
+    content: url(Images/localStorage.png);
+}
+
+.domstorage-sidebar-tree-item.session-storage .icon {
+    content: url(Images/sessionStorage.png);
+}
+
+.cookie-sidebar-tree-item .icon {
+    content: url(Images/cookie.png);
+}
+
+#storage-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+.storage-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.storage-view.visible {
+    display: block;
+}
+
+.storage-view.table {
+    overflow: hidden;
+}
+
+.storage-view.table .data-grid {
+    border: none;
+    height: 100%;
+}
+
+.storage-view.table .storage-table-empty, .storage-view.table .storage-table-error {
+    position: absolute;
+    top: 0;
+    bottom: 25%;
+    left: 0;
+    right: 0;
+    font-size: 24px;
+    color: rgb(75%, 75%, 75%);
+    margin-top: auto;
+    margin-bottom: auto;
+    height: 50px;
+    line-height: 26px;
+    text-align: center;
+    font-weight: bold;
+    padding: 10px;
+    white-space: pre-wrap;
+}
+
+.storage-view.table .storage-table-error {
+    color: rgb(66%, 33%, 33%);
+}
+
+.data-grid {
+    position: relative;
+    border: 1px solid #aaa;
+}
+
+.data-grid .highlight {
+    background-color: rgb(255, 230, 179);
+}
+
+.data-grid tr.selected .highlight {
+    background-color: transparent;
+}
+
+.data-grid table {
+    table-layout: fixed;
+    border-spacing: 0;
+    border-collapse: collapse;
+    width: 100%;
+    font-size: 10px;
+    font-family: Lucida Grande, sans-serif;
+}
+
+.data-grid .data-container {
+    position: absolute;
+    top: 16px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    padding-right: 14px;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
+    -webkit-background-size: 1px 32px;
+}
+
+.data-grid.inline .data-container {
+    position: static;
+}
+
+.data-grid th {
+    text-align: left;
+    background-image: url(Images/glossyHeader.png);
+    background-repeat: repeat-x;
+    border-right: 1px solid rgb(179, 179, 179);
+    border-bottom: 1px solid rgb(179, 179, 179);
+    height: 15px;
+    font-weight: normal;
+    vertical-align: middle;
+    padding: 0 4px;
+    white-space: nowrap;
+}
+
+.data-grid th.corner {
+    width: 15px;
+    border-right: 0 none transparent;
+}
+
+.data-grid tr.filler {
+    display: table-row !important;
+    height: auto !important;
+}
+
+.data-grid tr.filler td {
+    height: auto !important;
+    padding: 0 !important;
+}
+
+.data-grid table.data {
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 16px;
+    bottom: 0;
+    height: 100%;
+    border-top: 0 none transparent;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
+    -webkit-background-size: 1px 32px;
+}
+
+.data-grid.inline table.data {
+    position: static;
+}
+
+.data-grid table.data tr {
+    display: none;
+}
+
+.data-grid table.data tr.revealed {
+    display: table-row;
+}
+
+.data-grid td {
+    vertical-align: top;
+    height: 12px;
+    line-height: 12px;
+    padding: 2px 4px;
+    white-space: nowrap;
+    border-right: 1px solid #aaa;
+    -webkit-user-select: text;
+}
+
+.data-grid td > div, .data-grid th > div {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.data-grid .centered div {
+    text-align: center;
+}
+
+.data-grid .right div {
+    text-align: right;
+}
+
+.data-grid th.sortable div {
+    position: relative;
+}
+
+.data-grid th.sortable:active {
+    background-image: url(Images/glossyHeaderPressed.png);
+}
+
+.data-grid th.sort-ascending, .data-grid th.sort-descending {
+    border-right: 1px solid rgb(107, 140, 196);
+    border-bottom: 1px solid rgb(107, 140, 196);
+    background-image: url(Images/glossyHeaderSelected.png);
+    background-repeat: repeat-x;
+}
+
+.data-grid th.sortable.sort-ascending:active, .data-grid th.sortable.sort-descending:active {
+    background-image: url(Images/glossyHeaderSelectedPressed.png);
+}
+
+.data-grid th.sort-ascending div::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeUpTriangleBlack.png);
+}
+
+.data-grid th.sort-descending div::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    margin-top: 1px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+body.inactive .data-grid th.sort-ascending, body.inactive .data-grid th.sort-descending {
+    background-image: url(Images/glossyHeader.png);
+    border-right: 1px solid rgb(179, 179, 179);
+    border-bottom: 1px solid rgb(179, 179, 179);
+}
+
+.data-grid tr.parent td.disclosure::before {
+    float: left;
+    content: url(Images/treeRightTriangleBlack.png);
+    width: 8px;
+    height: 8px;
+    margin-right: 2px;
+    -webkit-user-select: none;
+}
+
+.data-grid tr.expanded td.disclosure::before {
+    content: url(Images/treeDownTriangleBlack.png);
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+}
+
+.data-grid tr.selected {
+    background-color: rgb(212, 212, 212);
+    color: inherit;
+}
+
+.data-grid:focus tr.selected {
+    background-color: rgb(56, 121, 217);
+    color: white;
+}
+
+.data-grid:focus tr.parent.selected td.disclosure::before {
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.data-grid:focus tr.expanded.selected td.disclosure::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.data-grid tr:not(.parent) td.disclosure {
+    text-indent: 10px;
+}
+
+.data-grid-resizer {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+    cursor: col-resize;
+}
+
+.storage-view.query {
+    padding: 2px 0;
+    overflow-y: overlay;
+    overflow-x: hidden;
+    -webkit-text-size-adjust: auto;
+}
+
+.database-query-prompt {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+    -webkit-user-select: text;
+}
+
+.database-user-query::before, .database-query-prompt::before, .database-query-result::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: 7px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -5px;
+    -webkit-user-select: none;
+}
+
+.database-query-prompt::before {
+    background-image: url(Images/userInputIcon.png);
+}
+
+.database-user-query {
+    position: relative;
+    border-bottom: 1px solid rgb(245, 245, 245);
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+}
+
+.database-user-query::before {
+    background-image: url(Images/userInputPreviousIcon.png);
+}
+
+.database-query-text {
+    color: rgb(0, 128, 255);
+    -webkit-user-select: text;
+}
+
+.database-query-result {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+    margin-left: -24px;
+    padding-right: 0;
+}
+
+.database-query-result.error {
+    color: red;
+    -webkit-user-select: text;
+}
+
+.database-query-result.error::before {
+    background-image: url(Images/errorIcon.png);
+}
+
+.panel-enabler-view {
+    z-index: 1000;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: white;
+    font-size: 13px;
+    text-align: center;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    display: none;
+}
+
+.panel-enabler-view.visible {
+    display: block;
+}
+
+.panel-enabler-view .panel-enabler-view-content {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    max-height: 390px;
+    margin: auto;
+    white-space: nowrap;
+}
+
+.panel-enabler-view h1 {
+    color: rgb(110, 116, 128);
+    font-size: 16px;
+    line-height: 20px;
+    font-weight: normal;
+    margin-top: 0;
+}
+
+.panel-enabler-disclaimer {
+    font-size: 10px;
+    color: rgb(110, 116, 128);
+    margin-bottom: 12px;
+    margin-left: 20px;
+}
+
+.panel-enabler-disclaimer:empty {
+    display: none;
+}
+
+.panel-enabler-view img, div.welcome-instructions-aligner {
+    height: 100%;
+    min-height: 200px;
+    max-width: 100%;
+    top: 0;
+    bottom: 0;
+    padding: 20px 0 20px 20px;
+    margin: auto;
+    vertical-align: middle;
+}
+
+.panel-enabler-view img.hidden {
+    display: initial !important;
+    width: 0;
+}
+
+.panel-enabler-view form {
+    display: inline-block;
+    vertical-align: middle;
+    width: 330px;
+    margin: 0;
+    padding: 15px;
+    white-space: normal;
+}
+
+.panel-enabler-view label {
+    position: relative;
+    display: block;
+    text-align: left;
+    word-break: break-word;
+    margin: 0 0 5px 20px;
+}
+
+.panel-enabler-view button:not(.status-bar-item), .pane button, button.show-all-nodes {
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+.panel-enabler-view button:not(.status-bar-item) {
+    font-size: 13px;
+    margin: 6px 0 0 0;
+    padding: 3px 20px;
+    height: 24px;
+}
+
+button.show-all-nodes {
+    font-size: 13px;
+    margin: 0;
+    padding: 0 20px;
+    height: 20px;
+}
+
+.panel-enabler-view.welcome {
+    z-index: auto;
+}
+
+.panel-enabler-view.welcome div.welcome-instructions-aligner {
+    display: inline-block;
+    width: 0;
+}
+
+.panel-enabler-view.welcome .instructions {
+    display: inline-block;
+    vertical-align: middle;
+    width: 330px;
+    margin: 0;
+    white-space: normal;
+    line-height: 175%;
+}
+
+.panel-enabler-view.welcome .message {
+    margin-bottom: 2ex;
+}
+
+.panel-enabler-view.welcome button.status-bar-item {
+    vertical-align: middle;
+}
+
+.pane button {
+    margin: 6px 0 6px 3px;
+    padding: 2px 9px;
+}
+
+.panel-enabler-view button:active:not(.status-bar-item), .pane button:active, button.show-all-nodes:active {
+    background-color: rgb(215, 215, 215);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+body.inactive .panel-enabler-view button:not(.status-bar-item), .panel-enabler-view button:disabled:not(.status-bar-item), body.inactive .pane button, .pane button:disabled, body.inactive button.show-all-nodes {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
+}
+
+.panel-enabler-view input {
+    height: 17px;
+    width: 17px;
+    border: 1px solid rgb(165, 165, 165);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 8px;
+    -webkit-appearance: none;
+    vertical-align: middle;
+    margin: 0 5px 5px 0;
+}
+
+.panel-enabler-view input:active {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+.panel-enabler-view input:checked {
+    background: url(Images/radioDot.png) center no-repeat,
+                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+}
+
+.panel-enabler-view.resources img {
+    content: url(Images/resourcesSilhouette.png);
+}
+
+.panel-enabler-view.scripts img {
+    content: url(Images/scriptsSilhouette.png);
+}
+
+.panel-enabler-view.profiles img {
+    content: url(Images/profilesSilhouette.png);
+}
+
+button.enable-toggle-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/enableOutlineButtonGlyph.png);
+}
+
+button.enable-toggle-status-bar-item.toggled-on .glyph {
+    -webkit-mask-image: url(Images/enableSolidButtonGlyph.png);
+}
+
+.scripts-pause-on-exceptions-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/pauseOnExceptionButtonGlyph.png);
+}
+
+#scripts-status-bar {
+    position: absolute;
+    top: -1px;
+    left: 0;
+    right: 0;
+    height: 24px;
+}
+
+#scripts-files {
+    max-width: 250px;
+}
+
+#scripts-functions {
+    max-width: 150px;
+}
+
+#scripts-status-bar .status-bar-item img {
+    margin-top: 2px;
+}
+
+#scripts-back img {
+    content: url(Images/back.png);
+}
+
+#scripts-forward img {
+    content: url(Images/forward.png);
+}
+
+#scripts-pause img {
+    content: url(Images/debuggerPause.png);
+}
+
+#scripts-pause.paused img {
+    content: url(Images/debuggerContinue.png);
+}
+
+#scripts-step-over img {
+    content: url(Images/debuggerStepOver.png);
+}
+
+#scripts-step-into img {
+    content: url(Images/debuggerStepInto.png);
+}
+
+#scripts-step-out img {
+    content: url(Images/debuggerStepOut.png);
+}
+
+.toggle-breakpoints .glyph {
+    -webkit-mask-image: url(Images/breakpointsActivateButtonGlyph.png);
+    background-color: rgb(96, 96, 96) !important;
+}
+
+.toggle-breakpoints.toggled-on .glyph {
+    -webkit-mask-image: url(Images/breakpointsDeactivateButtonGlyph.png);
+}
+
+#scripts-debugger-status {
+    position: absolute;
+    line-height: 24px;
+    top: 0;
+    right: 8px;
+}
+
+#scripts-sidebar-resizer-widget {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 225px;
+    width: 16px;
+    cursor: col-resize;
+    background-image: url(Images/statusbarResizerHorizontal.png);
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+#scripts-sidebar-buttons {
+    position: absolute;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    width: 225px;
+    overflow: hidden;
+    border-left: 1px solid rgb(64%, 64%, 64%);
+}
+
+#script-resource-views {
+    display: block;
+    padding: 0;
+    position: absolute;
+    top: 23px;
+    left: 0;
+    right: 225px;
+    bottom: 0;
+}
+
+.script-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.script-view.visible {
+    display: block;
+}
+
+#scripts-sidebar {
+    position: absolute;
+    top: 23px;
+    right: 0;
+    bottom: 0;
+    width: 225px;
+    background-color: rgb(245, 245, 245);
+    border-left: 1px solid rgb(64%, 64%, 64%);
+    cursor: default;
+    overflow: auto;
+}
+
+.resources-larger-resources-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);
+}
+
+#resources-filter, #console-filter.console-filter-top {
+    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+    width: 100%;
+}
+
+#console-messages.console-filter-top {
+    margin-top: 23px;
+}
+
+#console-filter {
+    margin-top: 1px;
+}
+
+.scope-bar {
+    height: 23px;
+    padding: 2px 10px 0;
+    overflow: hidden;
+}
+
+.scope-bar li {
+    display: inline-block;
+    margin: 1px 2px 0 0;
+    padding: 1px 7px 3px;
+    font-size: 11px;
+    line-height: 12px;
+    font-weight: bold;
+    color: rgb(46, 46, 46);
+    background: transparent;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    -webkit-border-radius: 8px;
+    vertical-align: middle;
+}
+
+.scope-bar .divider {
+    margin: 1px 9px 0 8px;
+    background-color: rgba(0, 0, 0, 0.4);
+    height: 16px;
+    width: 1px;
+    vertical-align: middle;
+    display: inline-block;
+}
+
+.scope-bar li.selected, .scope-bar li:hover, .scope-bar li:active {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
+}
+
+.scope-bar li:hover {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+.scope-bar li.selected {
+    background: rgba(0, 0, 0, 0.3);
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.scope-bar li:active {
+    background: rgba(0, 0, 0, 0.5);
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+#resources-container {
+    position: absolute;
+    top: 23px;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    border-right: 0 none transparent;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+#resources-container.viewing-resource {
+    right: auto;
+    width: 200px;
+    border-right: 1px solid rgb(64%, 64%, 64%);
+}
+
+#resources-container.viewing-resource #resources-sidebar {
+    width: 100%;
+    border-right: 0 none transparent;
+}
+
+#resources-sidebar {
+    min-height: 100%;
+    bottom: auto;
+    overflow: visible;
+}
+
+#resources-container-content {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    min-height: 100%;
+}
+
+#resources-container.viewing-resource #resources-container-content {
+    display: none;
+}
+
+#resources-summary {
+    position: absolute;
+    padding-top: 20px;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 93px;
+    margin-left: -1px;
+    border-left: 1px solid rgb(102, 102, 102);
+    background-color: rgb(101, 111, 130);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.5)));
+    background-repeat: repeat-x;
+    background-position: bottom;
+    text-align: center;
+    text-shadow: black 0 1px 1px;
+    white-space: nowrap;
+    color: white;
+    -webkit-background-size: 1px 6px;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+    z-index: 400;
+}
+
+.summary-graph-legend {
+    margin-top: -10px;
+    padding-left: 15px;
+}
+
+.summary-graph-legend-item {
+    display: inline-block;
+    font-weight: bold;
+    margin-right: 15px;
+    vertical-align: top;
+}
+
+.summary-graph-legend-item.total {
+    margin-left: 10px;
+}
+
+.summary-graph-legend-label {
+    display: inline-block;
+    text-align: left;
+}
+
+.summary-graph-legend-header {
+    font-size: 12px;
+}
+
+.summary-graph-legend-value {
+    font-size: 10px;
+}
+
+.summary-graph-legend-swatch {
+    vertical-align: top;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+#resources-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: -100;
+}
+
+#resources-event-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: 300;
+    pointer-events: none;
+}
+
+#resources-dividers-label-bar {
+    position: absolute;
+    top: 0;
+    left: 0px;
+    right: 0;
+    background-color: rgba(255, 255, 255, 0.8);
+    background-clip: padding;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
+    height: 20px;
+    z-index: 200;
+}
+
+.resources-divider {
+    position: absolute;
+    width: 1px;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.resources-event-divider-padding {
+    position: absolute;
+    width: 8px;
+    top: 0;
+    bottom: 0;
+    pointer-events: auto;
+}
+
+.resources-onload-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+    background-color: rgba(255, 0, 0, 0.5);
+}
+
+.resources-ondomcontent-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+    background-color: rgba(0, 0, 255, 0.5);
+}
+
+.resources-divider.last {
+    background-color: transparent;
+}
+
+.resources-divider-label {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    font-size: 9px;
+    color: rgb(50%, 50%, 50%);
+    white-space: nowrap;
+}
+
+.resources-graph-label {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    height: 13px;
+    line-height: 13px;
+    font-size: 9px;
+    color: rgba(0, 0, 0, 0.75);
+    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;
+    z-index: 150;
+    overflow: hidden;
+    text-align: center;
+    font-weight: bold;
+    opacity: 0;
+    -webkit-transition: opacity 250ms ease-in-out;
+}
+
+.resources-graph-side:hover .resources-graph-label {
+    opacity: 1;
+}
+
+.resources-graph-label:empty {
+    display: none;
+}
+
+.resources-graph-label.waiting {
+    margin-right: 5px;
+}
+
+.resources-graph-label.waiting-right {
+    margin-left: 5px;
+}
+
+.resources-graph-label.before {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: right;
+    margin-right: 2px;
+}
+
+.resources-graph-label.before::after {
+    padding-left: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutLeft.png);
+}
+
+.resources-graph-label.after {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: left;
+    margin-left: 2px;
+}
+
+.resources-graph-label.after::before {
+    padding-right: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutRight.png);
+}
+
+.resources-graph-bar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    border-width: 6px 7px;
+    height: 13px;
+    min-width: 14px;
+    opacity: 0.65;
+    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;
+}
+
+.resources-category-documents, .resources-category-stylesheets, .resources-category-images,
+.resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other {
+    display: none;
+}
+
+.filter-all .resources-category-documents, .filter-documents .resources-category-documents,
+.filter-all .resources-category-stylesheets, .filter-stylesheets .resources-category-stylesheets,
+.filter-all .resources-category-images, .filter-images .resources-category-images,
+.filter-all .resources-category-scripts, .filter-scripts .resources-category-scripts,
+.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,
+.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,
+.filter-all .resources-category-other, .filter-other .resources-category-other,
+.resource-sidebar-tree-item.selected {
+    display: list-item;
+}
+
+.console-warning-level, .console-error-level, .console-log-level {
+    display: none;
+}
+
+.filter-all .console-warning-level, .filter-warnings .console-warning-level,
+.filter-all .console-error-level, .filter-errors .console-error-level,
+.filter-all .console-log-level, .filter-logs .console-log-level {
+    display: block;
+}
+
+.console-user-command-result {
+    display: block;
+}
+
+.resources-graph-bar.waiting, .resources-graph-bar.waiting-right {
+    opacity: 0.35;
+}
+
+.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;
+}
+
+.resources-category-documents .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;
+}
+
+.resources-category-documents.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;
+}
+
+.resources-category-stylesheets .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;
+}
+
+.resources-category-stylesheets.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;
+}
+
+.resources-category-images .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;
+}
+
+.resources-category-images.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;
+}
+
+.resources-category-fonts .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;
+}
+
+.resources-category-fonts.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;
+}
+
+.resources-category-scripts .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;
+}
+
+.resources-category-scripts.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;
+}
+
+.resources-category-xhr .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;
+}
+
+.resources-category-xhr.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;
+}
+
+#resource-views {
+    position: absolute;
+    top: 23px;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+.source-view-frame {
+    width: 100%;
+    height: 100%;
+}
+
+.sidebar-resizer-vertical {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+    cursor: col-resize;
+}
+
+.resources .sidebar-resizer-vertical {
+    top: 23px;
+}
+
+.sidebar-tree, .sidebar-tree .children {
+    position: relative;
+    padding: 0;
+    margin: 0;
+    list-style: none;
+    font-size: 11px;
+}
+
+.sidebar-tree-section {
+    position: relative;
+    height: 18px;
+    padding: 4px 10px 6px 10px;
+    white-space: nowrap;
+    margin-top: 1px;
+    color: rgb(92, 110, 129);
+    font-weight: bold;
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+}
+
+.sidebar-tree-item {
+    position: relative;
+    height: 36px;
+    padding: 0 5px 0 5px;
+    white-space: nowrap;
+    margin-top: 1px;
+    line-height: 34px;
+    border-top: 1px solid transparent;
+}
+
+.sidebar-tree .children {
+    display: none;
+}
+
+.sidebar-tree .children.expanded {
+    display: block;
+}
+
+.sidebar-tree-section + .children > .sidebar-tree-item {
+    padding-left: 10px !important;
+}
+
+.sidebar-tree-section + .children.small > .sidebar-tree-item {
+    padding-left: 17px !important;
+}
+
+.sidebar-tree > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree > .children > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree > .children.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {
+    margin-left: 16px;
+}
+
+.sidebar-tree-item .disclosure-button {
+    float: left;
+    width: 16px;
+    height: 100%;
+    border: 0;
+    background-color: transparent;
+    background-image: url(Images/disclosureTriangleSmallRight.png);
+    background-repeat: no-repeat;
+    background-position: center;
+    -webkit-apearance: none;
+}
+
+.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {
+    display: none;
+}
+
+body.inactive .sidebar-tree-item .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
+}
+
+body.inactive .sidebar-tree-item.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
+}
+
+body.inactive .sidebar-tree-item .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDownBlack.png);
+}
+
+.sidebar-tree-item.selected .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallRightWhite.png) !important;
+}
+
+.sidebar-tree-item.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDown.png);
+}
+
+.sidebar-tree-item.selected.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDownWhite.png) !important;
+}
+
+.sidebar-tree-item.selected .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDownWhite.png) !important;
+}
+
+.sidebar-tree-item .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDown.png);
+}
+
+.sidebar-tree-item .icon {
+    float: left;
+    width: 32px;
+    height: 32px;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+.sidebar-tree-item .status {
+    float: right;
+    height: 16px;
+    margin-top: 9px;
+    margin-left: 4px;
+    line-height: 1em;
+}
+
+.sidebar-tree-item .status:empty {
+    display: none;
+}
+
+.sidebar-tree-item .status .bubble {
+    display: inline-block;
+    height: 14px;
+    min-width: 16px;
+    margin-top: 1px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    text-align: center;
+    font-size: 11px;
+    line-height: normal;
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    -webkit-border-radius: 7px;
+}
+
+.sidebar-tree-item .status .bubble:empty {
+    display: none;
+}
+
+.sidebar-tree-item.selected .status .bubble {
+    background-color: white !important;
+    color: rgb(132, 154, 190) !important;
+}
+
+:focus .sidebar-tree-item.selected .status .bubble {
+    color: rgb(36, 98, 172) !important;
+}
+
+body.inactive .sidebar-tree-item.selected .status .bubble {
+    color: rgb(159, 159, 159) !important;
+}
+
+.sidebar-tree.small .sidebar-tree-item, .sidebar-tree .children.small .sidebar-tree-item, .sidebar-tree-item.small, .small .resources-graph-side {
+    height: 20px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .icon, .sidebar-tree .children.small .sidebar-tree-item .icon, .sidebar-tree-item.small .icon {
+    width: 16px;
+    height: 16px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .status, .sidebar-tree .children.small .sidebar-tree-item .status, .sidebar-tree-item.small .status {
+    margin-top: 1px;
+}
+
+.sidebar-tree-item.selected {
+    color: white;
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;
+    font-weight: bold;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+:focus .sidebar-tree-item.selected {
+    border-top: 1px solid rgb(68, 128, 200);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
+}
+
+body.inactive .sidebar-tree-item.selected {
+    border-top: 1px solid rgb(151, 151, 151);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
+}
+
+.sidebar-tree-item .titles {
+    position: relative;
+    top: 5px;
+    line-height: 11px;
+    padding-bottom: 1px;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.sidebar-tree-item .titles.no-subtitle {
+    top: 10px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .titles, .sidebar-tree .children.small .sidebar-tree-item .titles, .sidebar-tree-item.small .titles {
+    top: 2px;
+    line-height: normal;
+}
+
+.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after, .sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {
+    content: "\A";
+    white-space: pre;
+}
+
+.sidebar-tree-item .subtitle {
+    font-size: 9px;
+    color: rgba(0, 0, 0, 0.7);
+}
+
+.sidebar-tree.small .sidebar-tree-item .subtitle, .sidebar-tree .children.small .sidebar-tree-item .subtitle, .sidebar-tree-item.small .subtitle {
+    display: none;
+}
+
+.sidebar-tree-item.selected .subtitle {
+    color: rgba(255, 255, 255, 0.9);
+}
+
+#resources-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 112px;
+}
+
+.resources-graph-side {
+    position: relative;
+    height: 36px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 1px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+}
+
+.resources-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 8px;
+    left: 9px;
+}
+
+#resources-container:not(.viewing-resource) .resource-sidebar-tree-item:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+#resources-container:not(.viewing-resource) .resources-graph-side:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.resources-time-graph-sidebar-item .icon {
+    content: url(Images/resourcesTimeGraphIcon.png);
+}
+
+.resources-size-graph-sidebar-item .icon {
+    content: url(Images/resourcesSizeGraphIcon.png);
+}
+
+.resources-size-graph-sidebar-item .icon {
+    content: url(Images/resourcesSizeGraphIcon.png);
+}
+
+.resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-documents .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-documents .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-stylesheets .icon {
+    content: url(Images/resourceCSSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-stylesheets .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-images .icon {
+    position: relative;
+    background-image: url(Images/resourcePlainIcon.png);
+    background-repeat: no-repeat;
+    content: "";
+}
+
+.resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
+    position: absolute;
+    margin: auto;
+    top: 3px;
+    bottom: 4px;
+    left: 5px;
+    right: 5px;
+    max-width: 18px;
+    max-height: 21px;
+    min-width: 1px;
+    min-height: 1px;
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-images .icon {
+    background-image: url(Images/resourcePlainIconSmall.png);
+    content: "";
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
+    top: 2px;
+    bottom: 1px;
+    left: 3px;
+    right: 3px;
+    max-width: 8px;
+    max-height: 11px;
+}
+
+.resource-sidebar-tree-item.resources-category-fonts .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-fonts .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-scripts .icon {
+    content: url(Images/resourceJSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-scripts .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-xhr .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-xhr .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.bubble.debug, .console-debug-level .bubble {
+    background-color: rgb(0, 0, 255) !important;
+}
+
+.bubble.warning, .console-warning-level .bubble {
+    background-color: rgb(232, 164, 0) !important;
+}
+
+.bubble.error, .console-error-level .bubble {
+    background-color: rgb(216, 35, 35) !important;
+}
+
+.bubble.search-matches {
+    background-image: url(Images/searchSmallWhite.png);
+    background-repeat: no-repeat;
+    background-position: 3px 2px;
+    padding-left: 13px !important;
+}
+
+.sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallBlue.png);
+}
+
+:focus .sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallBrightBlue.png);
+}
+
+body.inactive .sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallGray.png);
+}
+
+/* Timeline Style */
+
+#timeline-overview-panel {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 80px;
+}
+
+#timeline-overview-panel .timeline-graph-bar {
+    pointer-events: none;
+}
+
+.timeline-sidebar-background {
+    top: 90px;
+    bottom: 0;
+}
+
+.timeline .sidebar {
+    overflow-y: hidden;
+    z-index: 100;
+    min-height: 100%;
+    bottom: auto;
+}
+
+#timeline-overview-separator {
+    position: absolute;
+    top: 80px;
+    left: 0;
+    right: 0;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(253, 253, 253)), to(rgb(213, 213, 213)));
+    border-top: 1px solid rgb(140, 140, 140);
+    border-bottom: 1px solid rgb(115, 115, 115);
+    height: 10px;
+}
+
+#timeline-overview-sidebar {
+    position: absolute;
+    width: 200px;
+    top: 0px;
+    bottom: 0px;
+    left: 0px;
+    padding-top: 1px;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(242, 242, 242)), to(rgb(209, 209, 209)));
+    border-right: 1px solid rgb(163, 163, 163);
+}
+
+#timeline-overview-grid {
+    position: absolute;
+    top: 0px;
+    bottom: 0px;
+    left: 200px;
+    right: 0px;
+    background-color: rgb(224, 224, 224);
+}
+
+#timeline-overview-window {
+    background-color: white;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    z-index: 150;
+}
+
+.timeline-window-resizer {
+    position: absolute;
+    top: 35px;
+    bottom: 15px;
+    width: 5px;
+    margin-left: -3px;
+    margin-right: -2px;
+    background-color: rgb(153, 153, 153);
+    z-index: 500;
+    cursor: col-resize;
+    -webkit-border-radius: 2px;
+    -webkit-box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
+}
+
+#timeline-overview-grid #resources-graphs {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 80px;
+}
+
+#timeline-container {
+    position: absolute;
+    top: 90px;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    border-right: 0 none transparent;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+.timeline-clear-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+.timeline-category-tree-item {
+    height: 20px;
+    line-height: 20px;
+    padding-left: 6px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    font-weight: bold;
+}
+
+.timeline-category-tree-item .timeline-category-checkbox {
+    width: 10px;
+    height: 11px;
+    margin: 0 3px 0 5px;
+    padding: 0;
+    background-image: url(Images/timelineCheckmarks.png);
+    background-repeat: no-repeat;
+    background-position: 0 -66px;
+    vertical-align: -1px;
+    -webkit-appearance: none;
+}
+
+.timeline-category-tree-item .timeline-category-checkbox:checked {
+    background-position-x: -10px;
+}
+
+.timeline-category-tree-item.timeline-category-loading .timeline-category-checkbox {
+    background-position-y: 0;
+}
+
+.timeline-category-tree-item.timeline-category-scripting .timeline-category-checkbox {
+    background-position-y: -33px;
+}
+
+.timeline-category-tree-item.timeline-category-rendering .timeline-category-checkbox {
+    background-position-y: -11px;
+}
+
+.timeline-category-tree-item:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-tree-item {
+    height: 18px;
+    line-height: 15px;
+    padding-right: 5px;
+    padding-left: 10px;
+    padding-top: 2px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.timeline-expandable {
+    position: absolute;
+    border-left: 1px solid rgb(163, 163, 163);
+}
+
+.timeline-expandable-left {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 3px;
+    border-top: 1px solid rgb(163, 163, 163);
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.timeline-expandable-collapsed {
+    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
+    background-position-x: 1px;
+    background-position-y: 2px;
+    background-repeat: no-repeat;
+}
+
+.timeline-expandable-expanded {
+    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
+    background-position-x: 1px;
+    background-position-y: 3px;
+    background-repeat: no-repeat;
+}
+
+.timeline-tree-item .type {
+    padding-left: 14px;
+}
+
+.timeline-tree-item .count {
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+}
+
+.timeline-tree-item .timeline-tree-icon {
+    background-image: url(Images/timelineDots.png);
+    margin-top: 2px;
+    width: 12px;
+    height: 12px;
+    position: absolute;
+}
+
+.timeline-tree-item.even {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-tree-item .data.dimmed {
+    color: rgba(0, 0, 0, 0.7);
+}
+
+#timeline-overview-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 20px;
+}
+
+#timeline-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 19px;
+}
+
+.timeline-graph-side {
+    position: relative;
+    height: 18px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 0px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+    pointer-events: none;
+}
+
+.timeline-overview-graph-side {
+    height: 20px;
+    z-index: 170;
+    pointer-events: none;
+}
+
+.timeline-overview-graph-side .timeline-graph-bar {
+    height: 13px;
+}
+
+.timeline-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    left: 3px;
+    pointer-events: none;
+}
+
+.timeline-graph-bar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -2px;
+    border-width: 4px 4px 5px;
+    height: 9px;
+    min-width: 5px;
+    opacity: 0.8;
+    -webkit-border-image: url(Images/timelineBarGray.png) 4 4 5 4;
+    z-index: 180;
+    pointer-events: visibleFill;
+}
+
+.timeline-graph-side.even {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-category-loading .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;
+}
+
+.timeline-category-scripting .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;
+}
+
+.timeline-category-rendering .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;
+}
+
+.timeline-category-loading .timeline-tree-icon {
+    background-position-y: 0px;
+}
+
+.timeline-category-scripting .timeline-tree-icon {
+    background-position-y: 48px;
+}
+
+.timeline-category-rendering .timeline-tree-icon {
+    background-position-y: 72px;
+}
+
+/* Profiler Style */
+
+#profile-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+#profile-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+.profile-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.profile-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.profile-group-sidebar-tree-item .icon {
+    content: url(Images/profileGroupIcon.png);
+}
+
+.profile-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.profile-view.visible {
+    display: block;
+}
+
+.profile-view .data-grid {
+    border: none;
+    height: 100%;
+}
+
+.profile-view .data-grid th.average-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.average-column {
+    text-align: right;
+}
+
+.profile-view .data-grid th.self-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.self-column {
+    text-align: right;
+}
+
+.profile-view .data-grid th.total-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.total-column {
+    text-align: right;
+}
+
+.profile-view .data-grid .calls-column {
+    text-align: center;
+}
+
+.profile-node-file {
+    float: right;
+    color: gray;
+    margin-top: -1px;
+}
+
+.data-grid tr.selected .profile-node-file {
+    color: rgb(33%, 33%, 33%);
+}
+
+.data-grid:focus tr.selected .profile-node-file {
+    color: white;
+}
+
+button.enable-toggle-status-bar-item .glyph {
+}
+
+.record-profile-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/recordButtonGlyph.png);
+}
+
+.record-profile-status-bar-item.toggled-on .glyph {
+    -webkit-mask-image: url(Images/recordToggledButtonGlyph.png);
+    background-color: rgb(216, 0, 0) !important;
+}
+
+/* FIXME: should have its own glyph. */
+.heap-snapshot-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.node-search-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/nodeSearchButtonGlyph.png);
+}
+
+.percent-time-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/percentButtonGlyph.png);
+}
+
+.focus-profile-node-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.exclude-profile-node-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
+}
+
+.reset-profile-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
+}
+
+.delete-storage-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
+}
+
+#storage-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+.refresh-storage-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
+}
+
+#storage-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+ol.breakpoint-list {
+    -webkit-padding-start: 2px;
+    list-style: none;
+    margin: 0;
+}
+
+.breakpoint-list li {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    margin: 4px 0;
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+}
+
+.breakpoint-list li:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+.breakpoint-list .checkbox-elem {
+    font-size: 10px;
+    margin: 0 4px;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+}
+
+.breakpoint-list .source-text {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    margin: 2px 0 0px 20px;
+}
+
+.webkit-html-js-node, .webkit-html-css-node {
+    white-space: pre;
+}
+
+.source-frame-breakpoint-condition {
+    z-index: 30;
+    padding: 4px;
+    background-color: rgb(203, 226, 255);
+    -webkit-border-radius: 7px;
+    border: 2px solid rgb(169, 172, 203); 
+    width: 90%; 
+}
+
+.source-frame-breakpoint-message {
+    background-color: transparent;
+    font-family: Lucida Grande, sans-serif; 
+    font-weight: normal;
+    font-size: 11px;
+    text-align: left;
+    text-shadow: none;
+    color: rgb(85, 85, 85);
+    cursor: default;
+    margin: 0 0 2px 0; 
+}
+
+#source-frame-breakpoint-condition {
+    margin: 0;
+    border: 1px inset rgb(190, 190, 190) !important;
+    width: 100%;
+    box-shadow: none !important;
+    outline: none !important;
+    -webkit-user-modify: read-write;
+}
+
+.source-frame-popover-title {
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+    font-weight: bold;
+    padding-left: 18px;
+}
+
+.source-frame-popover-tree {
+    border-top: 1px solid rgb(194, 194, 147);
+    overflow: auto;
+    position: absolute;
+    top: 15px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.source-frame-eval-expression {
+    border: 1px solid rgb(163, 41, 34);
+    margin: -1px;
+    background-color: rgb(255, 255, 194);
+}
+
+.timeline-details {
+    -webkit-user-select: text;
+}
+
+.timeline-details-row-title {
+    font-weight: bold;
+    text-align: right;
+    white-space: nowrap;
+}
+
+.timeline-details-row-data {
+    white-space: nowrap;
+}
+
+.timeline-details-title {
+    font-weight: bold;
+    white-space: nowrap;
+}
+
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.html b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.html
new file mode 100644
index 0000000..e5295f2
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspector.html
@@ -0,0 +1,143 @@
+<!--
+Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1.  Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+2.  Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+    its contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <link rel="stylesheet" type="text/css" href="audits.css">
+    <link rel="stylesheet" type="text/css" href="inspector.css">
+    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
+    <link rel="stylesheet" type="text/css" href="popover.css">
+    <link rel="stylesheet" type="text/css" href="textViewer.css">
+    <script type="text/javascript" src="utilities.js"></script>
+    <script type="text/javascript" src="treeoutline.js"></script>
+    <script type="text/javascript" src="inspector.js"></script>
+    <script type="text/javascript" src="InspectorBackendStub.js"></script>
+    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
+    <script type="text/javascript" src="Object.js"></script>
+    <script type="text/javascript" src="Settings.js"></script>
+    <script type="text/javascript" src="ContextMenu.js"></script>
+    <script type="text/javascript" src="KeyboardShortcut.js"></script>
+    <script type="text/javascript" src="TextPrompt.js"></script>
+    <script type="text/javascript" src="Popover.js"></script>
+    <script type="text/javascript" src="Placard.js"></script>
+    <script type="text/javascript" src="View.js"></script>
+    <script type="text/javascript" src="Callback.js"></script>
+    <script type="text/javascript" src="Drawer.js"></script>
+    <script type="text/javascript" src="ChangesView.js"></script>
+    <script type="text/javascript" src="ConsoleView.js"></script>
+    <script type="text/javascript" src="Panel.js"></script>
+    <script type="text/javascript" src="TimelineGrid.js"></script>    
+    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
+    <script type="text/javascript" src="Resource.js"></script>
+    <script type="text/javascript" src="ResourceCategory.js"></script>
+    <script type="text/javascript" src="Database.js"></script>
+    <script type="text/javascript" src="DOMStorage.js"></script>
+    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
+    <script type="text/javascript" src="DataGrid.js"></script>
+    <script type="text/javascript" src="CookieItemsView.js"></script>
+    <script type="text/javascript" src="Script.js"></script>
+    <script type="text/javascript" src="Breakpoint.js"></script>
+    <script type="text/javascript" src="SidebarPane.js"></script>
+    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
+    <script type="text/javascript" src="SidebarTreeElement.js"></script>
+    <script type="text/javascript" src="Section.js"></script>
+    <script type="text/javascript" src="PropertiesSection.js"></script>
+    <script type="text/javascript" src="ObjectProxy.js"></script>
+    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
+    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
+    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
+    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
+    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
+    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
+    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
+    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
+    <script type="text/javascript" src="Color.js"></script>
+    <script type="text/javascript" src="StylesSidebarPane.js"></script>
+    <script type="text/javascript" src="PanelEnablerView.js"></script>
+    <script type="text/javascript" src="WelcomeView.js"></script>
+    <script type="text/javascript" src="StatusBarButton.js"></script>
+    <script type="text/javascript" src="SummaryBar.js"></script>
+    <script type="text/javascript" src="ElementsPanel.js"></script>
+    <script type="text/javascript" src="ResourcesPanel.js"></script>
+    <script type="text/javascript" src="InjectedFakeWorker.js"></script>
+    <script type="text/javascript" src="ScriptsPanel.js"></script>
+    <script type="text/javascript" src="StoragePanel.js"></script>
+    <script type="text/javascript" src="ProfilesPanel.js"></script>
+    <script type="text/javascript" src="ConsolePanel.js"></script>
+    <script type="text/javascript" src="AuditsPanel.js"></script>
+    <script type="text/javascript" src="AuditResultView.js"></script>
+    <script type="text/javascript" src="AuditLauncherView.js"></script>
+    <script type="text/javascript" src="AuditRules.js"></script>
+    <script type="text/javascript" src="AuditCategories.js"></script>
+    <script type="text/javascript" src="ResourceView.js"></script>
+    <script type="text/javascript" src="SourceFrame.js"></script>
+    <script type="text/javascript" src="DOMSyntaxHighlighter.js"></script>
+    <script type="text/javascript" src="TextEditorModel.js"></script>
+    <script type="text/javascript" src="TextEditorHighlighter.js"></script>
+    <script type="text/javascript" src="TextViewer.js"></script>
+    <script type="text/javascript" src="SourceTokenizer.js"></script>
+    <script type="text/javascript" src="SourceCSSTokenizer.js"></script>
+    <script type="text/javascript" src="SourceHTMLTokenizer.js"></script>
+    <script type="text/javascript" src="SourceJavaScriptTokenizer.js"></script>
+    <script type="text/javascript" src="SourceView.js"></script>
+    <script type="text/javascript" src="FontView.js"></script>
+    <script type="text/javascript" src="ImageView.js"></script>
+    <script type="text/javascript" src="DatabaseTableView.js"></script>
+    <script type="text/javascript" src="DatabaseQueryView.js"></script>
+    <script type="text/javascript" src="ScriptView.js"></script>
+    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="ProfileView.js"></script>
+    <script type="text/javascript" src="DOMAgent.js"></script>
+    <script type="text/javascript" src="InjectedScript.js"></script>
+    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
+    <script type="text/javascript" src="TimelineAgent.js"></script>
+    <script type="text/javascript" src="TimelinePanel.js"></script>
+    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
+    <script type="text/javascript" src="TestController.js"></script>
+</head>
+<body class="detached">
+    <div id="toolbar">
+        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
+        <div class="toolbar-item flexable-space"></div>
+        <div class="toolbar-item hidden" id="search-results-matches"></div>
+        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
+        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
+    </div>
+    <div id="main">
+        <div id="main-panels" spellcheck="false"></div>
+        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
+    </div>
+    <div id="drawer">
+        <div id="console-view"><div id="console-messages" class="monospace"><div id="console-prompt" spellcheck="false"><br></div></div></div>
+        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
+    </div>
+</body>
+</html>
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
new file mode 100644
index 0000000..0965a5c
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.webkit-css-comment { 
+    color: rgb(0, 116, 0);
+}
+
+.webkit-css-url, .webkit-css-color, .webkit-css-string, .webkit-css-keyword {
+    color: rgb(7, 144, 154);
+ }
+
+.webkit-css-number {
+    color: rgb(50, 0, 255);
+}
+
+.webkit-css-property, .webkit-css-at-rule {
+    color: rgb(200, 0, 0);
+}
+
+.webkit-css-selector {
+    color: black;
+}
+
+.webkit-css-important {
+    color: rgb(200, 0, 180);
+}
+
+.webkit-javascript-comment {
+    color: rgb(0, 116, 0);
+}
+
+.webkit-javascript-keyword {
+    color: rgb(170, 13, 145);
+}
+
+.webkit-javascript-number {
+    color: rgb(28, 0, 207);
+}
+
+.webkit-javascript-string, .webkit-javascript-regexp {
+    color: rgb(196, 26, 22);
+}
+
+.webkit-javascript-ident {
+    color: black;
+}
+
+.webkit-html-comment {
+    /* Keep this in sync with view-source.css (.webkit-html-comment) */
+    color: rgb(35, 110, 37);
+}
+
+.webkit-html-tag {
+    /* Keep this in sync with view-source.css (.webkit-html-tag) */
+    color: rgb(136, 18, 128);
+}
+
+.webkit-html-doctype {
+    /* Keep this in sync with view-source.css (.webkit-html-doctype) */
+    color: rgb(192, 192, 192);
+}
+
+.webkit-html-attribute-name {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
+    color: rgb(153, 69, 0);
+}
+
+.webkit-html-attribute-value {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
+    color: rgb(26, 26, 166);
+}
+
+.webkit-html-external-link, .webkit-html-resource-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */
+    color: #00e;
+}
+
+.webkit-html-external-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link) */
+    text-decoration: none;
+}
+
+.webkit-html-external-link:hover {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */
+    text-decoration: underline;
+}
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/popover.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/popover.css
new file mode 100644
index 0000000..ae6f610
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/popover.css
@@ -0,0 +1,200 @@
+.popover {
+    position: absolute;
+    -webkit-border-image: url(Images/popoverBackground.png) 25 25 25 25;
+    border-width: 25px;
+    z-index: 100;
+    pointer-events: none;
+}
+
+.popover .content {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    pointer-events: auto;
+    overflow: auto;
+}
+
+.popover .arrow {
+    position: absolute;
+    background-image: url(Images/popoverArrows.png);
+    width: 19px;
+    height: 19px;
+    margin-left: 15px;
+    margin-top: -25px;
+    top: 0;
+    left: 0;
+}
+
+.popover.top-left-arrow .arrow {
+    /* The default is top-left, no styles needed. */
+}
+
+.popover.top-right-arrow .arrow {
+    right: 25px;
+    left: auto;
+}
+
+.popover.bottom-left-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.bottom-right-arrow .arrow {
+    right: 15px;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.left-top-arrow .arrow {
+    top: 0;
+    margin-top: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.left-bottom-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.right-top-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: 0;
+    margin-top: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
+.popover.right-bottom-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
+.popover ::-webkit-scrollbar {
+    width: 11px;
+    height: 11px;
+}
+
+.popover ::-webkit-scrollbar-corner {
+    display: none;
+}
+
+.popover ::-webkit-resizer {
+    display: none;
+}
+
+/* Horizontal Scrollbar Styles */
+
+.popover ::-webkit-scrollbar:horizontal:corner-present {
+    border-right-width: 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal {
+    -webkit-border-image: url(Images/thumbHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px;
+    min-width: 20px;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal:hover {
+    -webkit-border-image: url(Images/thumbHoverHoriz.png) 0 11 0 11;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal:active {
+    -webkit-border-image: url(Images/thumbActiveHoriz.png) 0 11 0 11;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:start {
+    margin-left: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:end {
+    margin-right: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:end:corner-present {
+    margin-right: 4px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:decrement {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 0 0 11px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:increment {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px 0 0;
+}
+
+/* Vertical Scrollbar Styles */
+
+
+.popover ::-webkit-scrollbar:vertical:corner-present {
+    border-bottom-width: 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical {
+    -webkit-border-image: url(Images/thumbVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0;
+    min-height: 20px;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical:hover {
+    -webkit-border-image: url(Images/thumbHoverVert.png) 11 0 11 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical:active {
+    -webkit-border-image: url(Images/thumbActiveVert.png) 11 0 11 0;
+}
+
+
+.popover ::-webkit-scrollbar-track-piece:vertical:start {
+    margin-top: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:end {
+    margin-bottom: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:end:corner-present {
+    margin-bottom: 4px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:decrement {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0 0 0;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:increment {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 0 0 11px 0;
+}
+
+/* Forced Scrollbar Mode Styles */
+
+.popover ::-webkit-scrollbar-button {
+    display: none;
+}
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/textViewer.css b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/textViewer.css
new file mode 100644
index 0000000..b69545f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/inspector/textViewer.css
@@ -0,0 +1,162 @@
+.text-editor {
+    position: absolute;
+    top:0;
+    left:0;
+    right:0;
+    bottom:0;
+    white-space: pre;
+    overflow: auto;
+}
+
+.text-editor-lines {
+    border: 0;
+    -webkit-border-horizontal-spacing: 0;
+    -webkit-border-vertical-spacing: 0;
+    -webkit-user-select: text;
+}
+
+.webkit-html-message-bubble {
+    -webkit-box-shadow: black 0px 2px 5px;
+    -webkit-border-radius: 9px;
+    -webkit-border-fit: lines;
+    font-size: 10px;
+    font-family: Lucida Grande, sans-serif;
+    font-weight: bold;
+    margin: 6px 25px;
+    padding: 0 7px 1px;
+    z-index:20;
+    max-width: 80%;
+    
+}
+
+.webkit-html-warning-message {
+    background-color: rgb(100%, 62%, 42%);
+    border: 2px solid rgb(100%, 52%, 21%);
+}
+
+.webkit-html-error-message {
+    background-color: rgb(100%, 42%, 42%);
+    border: 2px solid rgb(100%, 31%, 31%);
+}
+
+.webkit-html-message-line {
+    padding-left: 23px;
+    text-indent: -20px;
+}
+
+.webkit-html-message-line-hover {
+    padding-left: 23px;
+    text-indent: -20px;
+    white-space: auto;
+    text-overflow: auto;
+    overflow: auto;
+}
+
+.webkit-html-message-icon {
+    position: relative;
+    top: 2px;
+    margin: 0 4px;
+}
+
+.webkit-line-number {
+    color: rgb(128, 128, 128);
+    background-color: rgb(240, 240, 240);
+    border-right: 1px solid rgb(187, 187, 187);
+    text-align: right;
+    word-break: normal;
+    -webkit-user-select: none;
+	padding-right: 4px;
+	padding-left: 6px;
+}
+
+.webkit-line-number-outer {
+    margin-right: -4px;
+    margin-left: -4px;
+    border-color: transparent;
+    border-style: solid;
+    border-width: 0 0 0px 2px;
+    vertical-align: top;
+}
+
+.webkit-line-number-inner {
+    margin-right: 4px;
+}
+
+.webkit-breakpoint .webkit-line-number-inner, .webkit-breakpoint-conditional .webkit-line-number-inner, .webkit-execution-line .webkit-line-number-inner {
+    margin-right: -10px;
+}
+
+.webkit-line-content {
+    width: 100%;
+    padding-left: 2px;
+    vertical-align: top;
+}
+
+.webkit-breakpoint .webkit-line-number-outer {
+    color: white;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/breakpointBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-conditional .webkit-line-number-outer {
+    color: white;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/breakpointConditionalBorder.png) 0 14 0 2;
+}
+
+.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/programCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {
+    color: white;
+    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    -webkit-border-image: url(Images/breakpointConditionalCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-disabled .webkit-line-number-outer {
+    opacity: 0.5;
+}
+
+.breakpoints-deactivated .webkit-breakpoint .webkit-line-number-outer {
+    opacity: 0.5;
+}
+
+.breakpoints-deactivated .webkit-breakpoint-disabled .webkit-line-number-outer {
+    opacity: 0.3;
+}
+
+.webkit-execution-line .webkit-line-content {
+    background-color: rgb(171, 191, 254);
+    outline: 1px solid rgb(64, 115, 244);
+}
+
+.webkit-search-result {
+    -webkit-border-radius: 4px;
+    padding: 2px 2px 2px 3px;
+    margin: -2px -2px -2px -3px;
+    opacity: 0.8;
+    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    background-color: rgb(241, 234, 0);
+    color: black;
+}
+
+.webkit-highlighted-line .webkit-line-content {
+    -webkit-animation: "fadeout" 2s 0s;
+}
+
+@-webkit-keyframes fadeout {
+    from {background-color: rgb(255, 255, 120); }
+    to { background-color: white; }
+}
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/it.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/it.lproj/locale.pak
new file mode 100644
index 0000000..a30deae
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/it.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak
new file mode 100644
index 0000000..a7c7af4
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ja.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak
new file mode 100644
index 0000000..8b48497
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/kn.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak
new file mode 100644
index 0000000..17e5cf1
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ko.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/linkCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/linkCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/linkCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/linkCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak
new file mode 100644
index 0000000..07f21a3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lt.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak
new file mode 100644
index 0000000..8b6d05e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/lv.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf
new file mode 100644
index 0000000..2bd9de0
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf
new file mode 100644
index 0000000..4b00f1c
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_chrome_rtl_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_Template.pdf
new file mode 100644
index 0000000..b15f717
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf
new file mode 100644
index 0000000..763d6e6
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/menu_page_rtl_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/missingImage.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/missingImage.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/missingImage.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/missingImage.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak
new file mode 100644
index 0000000..707ade6
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ml.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/moveCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/moveCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/moveCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/moveCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak
new file mode 100644
index 0000000..63c46bc
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/mr.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nav.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nav.pdf
new file mode 100644
index 0000000..d7fd448
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nav.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak
new file mode 100644
index 0000000..f85a2b5
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nb.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab.pdf
new file mode 100644
index 0000000..9e8091a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_h.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_h.pdf
new file mode 100644
index 0000000..ffa505f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_h.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_p.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_p.pdf
new file mode 100644
index 0000000..11e71ed
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/newtab_p.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak
new file mode 100644
index 0000000..4bf4c97
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/nl.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/noDropCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/noDropCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/noDropCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/noDropCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/noneCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/noneCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/noneCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/noneCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northEastResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northEastResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northEastResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northEastResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northEastSouthWestResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northEastSouthWestResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northEastSouthWestResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northEastSouthWestResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northSouthResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northSouthResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northSouthResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northSouthResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northWestResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northWestResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northWestResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northWestResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northWestSouthEastResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northWestSouthEastResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/northWestSouthEastResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/northWestSouthEastResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/notAllowedCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/notAllowedCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/notAllowedCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/notAllowedCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/or.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/or.lproj/locale.pak
new file mode 100644
index 0000000..efbfffd
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/or.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/otr_icon.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/otr_icon.pdf
new file mode 100644
index 0000000..555d982
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/otr_icon.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak
new file mode 100644
index 0000000..8cb3fbf
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pl.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/progressCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/progressCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/progressCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/progressCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak
new file mode 100644
index 0000000..99a461a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_BR.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak
new file mode 100644
index 0000000..f52baed
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/pt_PT.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/reload_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/reload_Template.pdf
new file mode 100644
index 0000000..dc0d206
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/reload_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/renderer.sb b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/renderer.sb
new file mode 100644
index 0000000..27b2a90
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/renderer.sb
@@ -0,0 +1,39 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for Fonts.
+(allow file-read-data (regex #"^/System/Library/Fonts($|/)"))  ; 10.5.6
+;10.6_ONLY (allow file-read-data (regex #"^/Library/Fonts($|/)"))  ; 10.6
+(allow mach-lookup (global-name "com.apple.FontObjectsServer"))  ; 10.5.6
+;10.6_ONLY (allow mach-lookup (global-name "com.apple.FontServer"))  ; 10.6
+
+; USER_HOMEDIR is substitued at runtime - http://crbug.com/11269 
+;10.6_ONLY (allow file-read-data (subpath "USER_HOMEDIR/Library/Fonts"))  ; 10.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak
new file mode 100644
index 0000000..8278edf
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ro.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak
new file mode 100644
index 0000000..f32d006
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ru.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak
new file mode 100644
index 0000000..edb6bdc
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sk.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak
new file mode 100644
index 0000000..73b3c52
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sl.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southEastResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southEastResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southEastResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southEastResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southWestResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southWestResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/southWestResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/southWestResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak
new file mode 100644
index 0000000..0ab1d7f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sr.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/star_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/star_Template.pdf
new file mode 100644
index 0000000..554e58a
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/star_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/starred.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/starred.pdf
new file mode 100644
index 0000000..965cd7b
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/starred.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/stop_Template.pdf b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/stop_Template.pdf
new file mode 100644
index 0000000..5a8a7e1
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/stop_Template.pdf
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak
new file mode 100644
index 0000000..ed168f3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sv.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak
new file mode 100644
index 0000000..825d153
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/sw.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak
new file mode 100644
index 0000000..d595b7f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/ta.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/te.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/te.lproj/locale.pak
new file mode 100644
index 0000000..204541f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/te.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/th.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/th.lproj/locale.pak
new file mode 100644
index 0000000..d368676
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/th.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak
new file mode 100644
index 0000000..2520871
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/tr.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak
new file mode 100644
index 0000000..97c70f9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/uk.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/utility.sb b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/utility.sb
new file mode 100644
index 0000000..a4bd16b
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/utility.sb
@@ -0,0 +1,40 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+; This is the Sandbox configuration file used for safeguarding the utility
+; process which is used for performing sandboxed operations that need to touch
+; the filesystem like decoding theme images and unpacking extensions.
+;
+; This configuration locks everything down, except access to one configurable
+; directory.  This is different from other sandbox configuration files where
+; file system access is entireley restricted.
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
+
+; Enable full access to given directory if needed.
+;ENABLE_DIRECTORY_ACCESS (allow file-read* file-write* (regex #"DIR_TO_ALLOW_ACCESS"))
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/verticalTextCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/verticalTextCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/verticalTextCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/verticalTextCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak
new file mode 100644
index 0000000..bef957f
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/vi.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/waitCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/waitCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/waitCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/waitCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/westResizeCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/westResizeCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/westResizeCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/westResizeCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/worker.sb b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/worker.sb
new file mode 100644
index 0000000..6d3907b
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/worker.sb
@@ -0,0 +1,35 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+; This is the Sandbox configuration file used for safeguarding the worker
+; process which is used to run web workers in a sandboxed environment.
+;
+; This is the most restrictive sandbox profile and only enables just enough
+; to allow basic use of Cocoa.
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak
new file mode 100644
index 0000000..2060313
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_CN.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak
new file mode 100644
index 0000000..3b08725
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zh_TW.lproj/locale.pak
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zoomInCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zoomInCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zoomInCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zoomInCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zoomOutCursor.png b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zoomOutCursor.png
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Framework.framework/Resources/zoomOutCursor.png
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Framework.framework/Resources/zoomOutCursor.png
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Info.plist b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Info.plist
new file mode 100644
index 0000000..ccef0d3
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Info.plist
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>Chromium Helper</string>
+	<key>CFBundleExecutable</key>
+	<string>Chromium Helper</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.chromium.Chromium.helper</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>Chromium Helper</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>5.0.350.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>350.0</string>
+	<key>LSFileQuarantineEnabled</key>
+	<true/>
+	<key>LSHasLocalizedDisplayName</key>
+	<string>1</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>10.5.0</string>
+	<key>LSUIElement</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/Chromium Helper b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/Chromium Helper
new file mode 100755
index 0000000..dec1cd9
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/Chromium Helper
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
new file mode 100755
index 0000000..69a53e1
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
Binary files differ
diff --git a/Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/PkgInfo b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/PkgInfo
similarity index 100%
rename from Chromium.app/Contents/Versions/4.0.287.0/Chromium Helper.app/Contents/PkgInfo
rename to Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/PkgInfo
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
Binary files differ
diff --git a/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
new file mode 100644
index 0000000..97c319e
--- /dev/null
+++ b/Chromium.app/Contents/Versions/5.0.350.0/Chromium Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Info.plist b/Google Chrome.app/Contents/Info.plist
index b211b56..5815c86 100644
--- a/Google Chrome.app/Contents/Info.plist
+++ b/Google Chrome.app/Contents/Info.plist
@@ -149,7 +149,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
+	<string>5.0.350.0</string>
 	<key>CFBundleSignature</key>
 	<string>rimZ</string>
 	<key>CFBundleURLTypes</key>
@@ -181,7 +181,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>287.0</string>
+	<string>350.0</string>
 	<key>LSFileQuarantineEnabled</key>
 	<true/>
 	<key>LSHasLocalizedDisplayName</key>
@@ -193,7 +193,7 @@
 	<key>SVNPath</key>
 	<string>/trunk/src</string>
 	<key>SVNRevision</key>
-	<string>35417</string>
+	<string>41134</string>
 	<key>UTExportedTypeDeclarations</key>
 	<array>
 		<dict>
diff --git a/Google Chrome.app/Contents/MacOS/Google Chrome b/Google Chrome.app/Contents/MacOS/Google Chrome
index 91d6d4c..8f147c5 100755
--- a/Google Chrome.app/Contents/MacOS/Google Chrome
+++ b/Google Chrome.app/Contents/MacOS/Google Chrome
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/am.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/am.lproj/InfoPlist.strings
index 47698c0..42344f2 100644
--- a/Google Chrome.app/Contents/Resources/am.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/am.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ar.lproj/InfoPlist.strings
index 1a03166..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ar.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ar.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/bg.lproj/InfoPlist.strings
index 2a7112f..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/bg.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/bg.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/bn.lproj/InfoPlist.strings
index 1d820e1..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/bn.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/bn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ca.lproj/InfoPlist.strings
index c242442..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ca.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ca.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/cs.lproj/InfoPlist.strings
index e46b05d..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/cs.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/cs.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/da.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/da.lproj/InfoPlist.strings
index a6d6bc9..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/da.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/da.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/de.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/de.lproj/InfoPlist.strings
index d9d40ae..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/de.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/de.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/el.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/el.lproj/InfoPlist.strings
index 377c080..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/el.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/el.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/en.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/en.lproj/InfoPlist.strings
index 1c3dc2e..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/en.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/en.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
index 1c3dc2e..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/es.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/es.lproj/InfoPlist.strings
index 040fc75..23ae733 100644
--- a/Google Chrome.app/Contents/Resources/es.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/es.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/es_419.lproj/InfoPlist.strings
index 2ffa7d4..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/es_419.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/es_419.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/et.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/et.lproj/InfoPlist.strings
index 19e0923..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/et.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/et.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/fi.lproj/InfoPlist.strings
index 65555dd..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/fi.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/fi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/fil.lproj/InfoPlist.strings
index a1f90a1..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/fil.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/fil.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/fr.lproj/InfoPlist.strings
index 0cbe0b2..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/fr.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/fr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/gu.lproj/InfoPlist.strings
index 5fc4816..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/gu.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/gu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/he.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/he.lproj/InfoPlist.strings
index 84ecf3f..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/he.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/he.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/hi.lproj/InfoPlist.strings
index 877acc1..f6d8edb 100644
--- a/Google Chrome.app/Contents/Resources/hi.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/hi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/hr.lproj/InfoPlist.strings
index 6d24430..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/hr.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/hr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/hu.lproj/InfoPlist.strings
index bd5c2ff..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/hu.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/hu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/id.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/id.lproj/InfoPlist.strings
index b05b0a6..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/id.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/id.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/it.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/it.lproj/InfoPlist.strings
index 21e0e53..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/it.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/it.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ja.lproj/InfoPlist.strings
index 1c3dc2e..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ja.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ja.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/kn.lproj/InfoPlist.strings
index 4f24dc7..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/kn.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/kn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ko.lproj/InfoPlist.strings
index 305ca02..3ff4846 100644
--- a/Google Chrome.app/Contents/Resources/ko.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ko.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/lt.lproj/InfoPlist.strings
index a702976..c8d3eea 100644
--- a/Google Chrome.app/Contents/Resources/lt.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/lt.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/lv.lproj/InfoPlist.strings
index 57080d9..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/lv.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/lv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ml.lproj/InfoPlist.strings
index a6517c8..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ml.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ml.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/mr.lproj/InfoPlist.strings
index b755247..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/mr.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/mr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/nb.lproj/InfoPlist.strings
index 41429b9..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/nb.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/nb.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/nl.lproj/InfoPlist.strings
index f831098..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/nl.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/nl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/or.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/or.lproj/InfoPlist.strings
index 28948cf..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/or.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/or.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/pl.lproj/InfoPlist.strings
index f3af086..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/pl.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/pl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
index a2e844b..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
index a2e844b..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ro.lproj/InfoPlist.strings
index 898b983..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ro.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ro.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ru.lproj/InfoPlist.strings
index 0d24e6d..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ru.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ru.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/sk.lproj/InfoPlist.strings
index 9e6b0af..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/sk.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/sk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/sl.lproj/InfoPlist.strings
index 13f154f..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/sl.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/sl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/sr.lproj/InfoPlist.strings
index ad8b0b7..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/sr.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/sr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/sv.lproj/InfoPlist.strings
index e74795f..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/sv.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/sv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/sw.lproj/InfoPlist.strings
index 605e8bd..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/sw.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/sw.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/ta.lproj/InfoPlist.strings
index 390fa6c..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/ta.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/ta.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/te.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/te.lproj/InfoPlist.strings
index 354c894..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/te.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/te.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/th.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/th.lproj/InfoPlist.strings
index 66b6b09..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/th.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/th.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/tr.lproj/InfoPlist.strings
index 5a516a0..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/tr.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/tr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/uk.lproj/InfoPlist.strings
index 1d09bbf..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/uk.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/uk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/vi.lproj/InfoPlist.strings
index 8e6bf7e..ba9fab5 100644
--- a/Google Chrome.app/Contents/Resources/vi.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/vi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
index 5b165c8..0033da6 100644
--- a/Google Chrome.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
index fc52f68..9798f6c 100644
--- a/Google Chrome.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
+++ b/Google Chrome.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Google Chrome Framework b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Google Chrome Framework
deleted file mode 100755
index 407e259..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Google Chrome Framework
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib
deleted file mode 100755
index 1964f79..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/About.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/About.nib
deleted file mode 100644
index 9965b06..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/About.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/AboutIPC.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/AboutIPC.nib
deleted file mode 100644
index 2c5f882..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/AboutIPC.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib
deleted file mode 100644
index ecba124..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib
deleted file mode 100644
index c208565..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib
deleted file mode 100644
index d5a067b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib
deleted file mode 100644
index 5651468..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib
deleted file mode 100644
index 56d3e91..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib
deleted file mode 100644
index 49b8a71..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib
deleted file mode 100644
index 8be5c2d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadItem.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadItem.nib
deleted file mode 100644
index 02fd3e9..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadItem.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib
deleted file mode 100644
index 92631c0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib
deleted file mode 100644
index 46db0ad..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ExtensionShelf.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ExtensionShelf.nib
deleted file mode 100644
index 31a8e3d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ExtensionShelf.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FindBar.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FindBar.nib
deleted file mode 100644
index e621e1b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FindBar.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib
deleted file mode 100644
index c225e8a..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib
deleted file mode 100644
index fc15332..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib
deleted file mode 100644
index ebd4032..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib
deleted file mode 100644
index f55c347..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib
deleted file mode 100644
index a00d149..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib
deleted file mode 100644
index 9f8c334..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Info.plist b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Info.plist
deleted file mode 100644
index 3347891..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Info.plist
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>BreakpadProduct</key>
-	<string>Chrome_Mac</string>
-	<key>BreakpadProductDisplay</key>
-	<string>Chrome</string>
-	<key>BreakpadReportInterval</key>
-	<string>3600</string>
-	<key>BreakpadSendAndExit</key>
-	<string>YES</string>
-	<key>BreakpadSkipConfirm</key>
-	<string>YES</string>
-	<key>BreakpadURL</key>
-	<string>https://clients2.google.com/cr/report</string>
-	<key>BreakpadVersion</key>
-	<string>4.0.287.0</string>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>Google Chrome Framework</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.google.Chrome.framework</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>287.0</string>
-	<key>SVNPath</key>
-	<string>/trunk/src</string>
-	<key>SVNRevision</key>
-	<string>35417</string>
-</dict>
-</plist>
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBar.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBar.nib
deleted file mode 100644
index 66a0b20..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBar.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib
deleted file mode 100644
index bd8006a..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib
deleted file mode 100644
index bcdd4c1..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/MainMenu.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/MainMenu.nib
deleted file mode 100644
index 529e0a1..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/MainMenu.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/PageInfo.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/PageInfo.nib
deleted file mode 100644
index 07b0759..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/PageInfo.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Preferences.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Preferences.nib
deleted file mode 100644
index c527acd..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Preferences.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ReportBug.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ReportBug.nib
deleted file mode 100644
index fc6d349..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ReportBug.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SadTab.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SadTab.nib
deleted file mode 100644
index f665e75..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SadTab.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib
deleted file mode 100644
index e3b2bb3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabContents.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabContents.nib
deleted file mode 100644
index a4a36e4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabContents.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabView.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabView.nib
deleted file mode 100644
index 62c9440..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TabView.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TaskManager.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TaskManager.nib
deleted file mode 100644
index d3d7944..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/TaskManager.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Toolbar.nib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Toolbar.nib
deleted file mode 100644
index e6954b2..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/Toolbar.nib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak
deleted file mode 100644
index 720796d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak
deleted file mode 100644
index 64a4a8d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/back_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/back_Template.pdf
deleted file mode 100644
index 104be1f..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/back_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak
deleted file mode 100644
index 0ec340a..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak
deleted file mode 100644
index 025e26d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak
deleted file mode 100644
index 0b5da5d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/chrome.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/chrome.pak
deleted file mode 100644
index f7477d3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/chrome.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar.pdf
deleted file mode 100644
index b0edb6d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf
deleted file mode 100644
index 4a3ea98..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf
deleted file mode 100644
index 33df9cf..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_inspector b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_inspector
deleted file mode 100755
index 09ccc05..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_inspector
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender
deleted file mode 100755
index 55ea828..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak
deleted file mode 100644
index 9051d4d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak
deleted file mode 100644
index 03d0f76..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak
deleted file mode 100644
index 6974556..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak
deleted file mode 100644
index c28f25c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak
deleted file mode 100644
index 7147546..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak
deleted file mode 100644
index 5b06a32..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak
deleted file mode 100644
index e234a2c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak
deleted file mode 100644
index 2de0d30..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak
deleted file mode 100644
index d1a8b7b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak
deleted file mode 100644
index fb2180b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak
deleted file mode 100644
index e31faee..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf
deleted file mode 100644
index 40a6fde..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf
deleted file mode 100644
index 2c1f1c1..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/forward_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/forward_Template.pdf
deleted file mode 100644
index d8cc36c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/forward_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak
deleted file mode 100644
index 06e5a07..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/go_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/go_Template.pdf
deleted file mode 100644
index 4aca27e..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/go_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak
deleted file mode 100644
index 024209e..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak
deleted file mode 100644
index 6c55764..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak
deleted file mode 100644
index 684b55b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/home_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/home_Template.pdf
deleted file mode 100644
index 82d150a..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/home_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak
deleted file mode 100644
index 6d7743d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak
deleted file mode 100644
index bc5966e..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak
deleted file mode 100644
index c6040b0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/audits.css b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/audits.css
deleted file mode 100644
index 35db76b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/audits.css
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-.audits-sidebar-tree-item .icon {
-    content: url(Images/resourcesTimeGraphIcon.png);
-}
-
-.audit-result-sidebar-tree-item .icon {
-    content: url(Images/resourceDocumentIcon.png);
-}
-
-#audit-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-    overflow: auto;
-}
-
-button.clear-audit-results-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#audit-result-view {
-    display: none;
-    overflow: auto;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgb(245, 245, 245);
-    cursor: default;
-    overflow: auto;
-}
-
-#audit-result-view.visible {
-    display: block;
-}
-
-#audit-result-view > .pane img.score {
-    float: left;
-    margin-top: 2px;
-    position: relative;
-    height: 16px;
-    width: 16px;
-    z-index: 100;
-}
-
-#audit-result-view > .pane img.score.red {
-    content: url(Images/errorRedDot.png);
-}
-
-#audit-result-view > .pane img.score.green {
-    content: url(Images/successGreenDot.png);
-}
-
-#audit-result-view > .pane.expanded:nth-last-of-type(1) {
-    border-bottom: 1px solid rgb(189, 189, 189) !important;
-}
-
-#audit-result-view .pane.expanded:nth-last-of-type(1) {
-    border-bottom: 0px transparent none;
-}
-
-#audit-result-view > .pane > .body > .pane > .title {
-    padding-left: 16px;
-    background-image: none;
-    border-bottom: none;
-}
-
-#audit-result-view > .pane > .body > .pane > .body {
-    background-color: transparent;
-}
-
-#audit-result-view > .pane > .body > .pane .section {
-    margin-left: 16px;
-}
-
-#audit-result-view .section .header {
-    border: 0;
-    background-image: none;
-    background-color: transparent;
-}
-
-#audit-result-view .section .header > .title {
-    color: rgb(0, 0, 0);
-}
-
-#audit-result-view .section .section-content {
-    width: 100%;
-    padding-left: 18px;
-    display: none;
-}
-
-#audit-result-view .section.expanded .section-content {
-    display: block;
-}
-
-#audit-result-view .section.expanded .section-content > p:nth-of-type(1) {
-    margin-top: 0;
-}
-
-#audit-result-view .section.expanded .section-content > p:nth-of-type(1) > *:nth-child(1) {
-    margin-top: 0;
-}
-
-#audit-result-view .section .header::before {
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-#audit-result-view .section.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-div.panel.audits .sidebar > ol.sidebar-tree > li:nth-child(1) {
-    height: 0px;
-    padding-top: 0;
-    padding-bottom: 0;
-}
-
-.audit-launcher-view {
-    z-index: 1000;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: white;
-    font-size: 13px;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    display: none;
-}
-
-.audit-launcher-view.visible {
-    display: block;
-}
-
-.audit-launcher-view .audit-launcher-view-content {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    padding: 0 0 0 16px;
-    white-space: nowrap;
-}
-
-.audit-launcher-view h1 {
-    color: rgb(110, 116, 128);
-    font-size: 16px;
-    line-height: 20px;
-    font-weight: normal;
-    padding-top: 15px;
-}
-
-.audit-launcher-view h1.no-audits {
-    text-align: center;
-    font-style: italic;
-    position: relative;
-    left: -8px;
-}
-
-.audit-launcher-view div.button-container {
-    position: absolute;
-    width: 100%;
-    bottom: 16px;
-    padding-top: 16px;
-}
-
-.audit-launcher-view div.audit-categories-container {
-    position: relative;
-    top: 11px;
-    left: 0;
-    width: 100%;
-    overflow-y: auto;
-}
-
-.audit-launcher-view button {
-    color: rgb(6, 6, 6);
-    background-color: transparent;
-    border: 1px solid rgb(165, 165, 165);
-    background-color: rgb(237, 237, 237);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 12px;
-    -webkit-appearance: none;
-}
-
-.audit-launcher-view button {
-    font-size: 13px;
-    padding: 3px 20px;
-    height: 24px;
-    margin: 0 5px 0 0;
-}
-
-.audit-launcher-view button:active {
-    background-color: rgb(215, 215, 215);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-body.inactive .audit-launcher-view button, .audit-launcher-view button:disabled {
-    color: rgb(130, 130, 130);
-    border-color: rgb(212, 212, 212);
-    background-color: rgb(239, 239, 239);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
-}
-
-.audit-launcher-view label {
-    position: relative;
-    display: block;
-    text-align: left;
-    word-break: break-word;
-    padding: 0 0 5px 0;
-}
-
-.audit-launcher-view label.disabled {
-    color: rgb(130, 130, 130);
-}
-
-.audit-launcher-view input[type="checkbox"] {
-    margin-left: 0;
-}
-
-.audit-launcher-view input[type="radio"] {
-    height: 17px;
-    width: 17px;
-    border: 1px solid rgb(165, 165, 165);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 8px;
-    -webkit-appearance: none;
-    vertical-align: middle;
-    margin: 0 5px 5px 0;
-}
-
-.audit-launcher-view input[type="radio"]:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-.audit-launcher-view input[type="radio"]:checked {
-    background: url(Images/radioDot.png) center no-repeat,
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-}
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.css b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.css
deleted file mode 100644
index be00ce4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.css
+++ /dev/null
@@ -1,203 +0,0 @@
-#scripts-files option.injected {
-    color: rgb(70, 134, 240);
-}
-
-.data-grid table {
-    line-height: 120%;
-}
-
-body.attached #toolbar {
-    height: 34px;
-    border-top: 1px solid rgb(100, 100, 100);
-    cursor: default; /* overriden */
-    padding-left: 0;
-}
-
-
-/* Chrome theme overrides */
-body.platform-windows #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248)));
-}
-
-body.platform-windows.inactive #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237)));
-}
-
-
-/* Heap Profiler Styles */
-
-.heap-snapshot-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.heap-snapshot-sidebar-tree-item .icon {
-    content: url(Images/profileIcon.png);
-}
-
-.heap-snapshot-sidebar-tree-item.small .icon {
-    content: url(Images/profileSmallIcon.png);
-}
-
-.heap-snapshot-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.heap-snapshot-view.visible {
-    display: block;
-}
-
-.heap-snapshot-view .data-grid {
-    border: none;
-    max-height: 100%;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 93px;
-}
-
-.heap-snapshot-view .data-grid th.count-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.count-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.size-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.size-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.countDelta-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.countDelta-column {
-    text-align: right;
-}
-
-.heap-snapshot-view .data-grid th.sizeDelta-column {
-    text-align: center;
-}
-
-.heap-snapshot-view .data-grid td.sizeDelta-column {
-    text-align: right;
-}
-
-#heap-snapshot-summary {
-    position: absolute;
-    padding-top: 20px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: 93px;
-    margin-left: -1px;
-    border-left: 1px solid rgb(102, 102, 102);
-    background-color: rgb(101, 111, 130);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
-    background-repeat: repeat-x;
-    background-position: top;
-    text-align: center;
-    text-shadow: black 0 1px 1px;
-    white-space: nowrap;
-    color: white;
-    -webkit-background-size: 1px 6px;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-body.platform-windows .section > .header {
-    border: 1px solid rgb(92, 116, 157);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157)));
-}
-
-body.platform-windows .console-group-messages .section > .header {
-    padding: 0 8px 0 0;
-    background-image: none;
-    border: none;
-    min-height: 0;
-}
-
-body.platform-windows #resources-filter {
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));
-}
-
-body.platform-windows .crumbs .crumb {
-    -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.end {
-    -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows .crumbs .crumb.selected {
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
-    color: white;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;
-}
-
-body.platform-windows .crumbs .crumb.selected:hover {
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
-    -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows .crumbs .crumb:hover {
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.dimmed:hover {
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
-}
-
-body.platform-windows .crumbs .crumb.end:hover {
-    -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;
-}
-
-body.platform-windows body.drawer-visible #main-status-bar {
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);
-}
-
-body.platform-windows .status-bar {
-    background-image: url(Images/statusbarBackgroundChromium.png);
-}
-
-body.platform-windows button.status-bar-item {
-    background-image: url(Images/statusbarButtonsChromium.png);
-}
-
-body.platform-windows select.status-bar-item:active {
-    -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;
-}
-
-body.platform-windows #drawer {
-    background-image: url(Images/statusbarBottomBackgroundChromium.png);
-}
-
-body.platform-windows select.status-bar-item {
-    -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;
-}
-
-.scope-bar li.selected {
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
-}
-
-.scope-bar li:active {
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
-}
-
-.timeline-category-tree-item input {
-    vertical-align: middle;
-}
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.html b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.html
deleted file mode 100644
index 45b5f05..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!--
-Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1.  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-2.  Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-    its contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-    <link rel="stylesheet" type="text/css" href="audits.css">
-    <link rel="stylesheet" type="text/css" href="inspector.css">
-    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
-    <script type="text/javascript" src="utilities.js"></script>
-    <script type="text/javascript" src="treeoutline.js"></script>
-    <script type="text/javascript" src="inspector.js"></script>
-    <script type="text/javascript" src="InspectorBackendStub.js"></script>
-    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
-    <script type="text/javascript" src="Object.js"></script>
-    <script type="text/javascript" src="Settings.js"></script>
-    <script type="text/javascript" src="ContextMenu.js"></script>
-    <script type="text/javascript" src="KeyboardShortcut.js"></script>
-    <script type="text/javascript" src="TextPrompt.js"></script>
-    <script type="text/javascript" src="Popup.js"></script>
-    <script type="text/javascript" src="Placard.js"></script>
-    <script type="text/javascript" src="View.js"></script>
-    <script type="text/javascript" src="Callback.js"></script>
-    <script type="text/javascript" src="Drawer.js"></script>
-    <script type="text/javascript" src="ChangesView.js"></script>
-    <script type="text/javascript" src="ConsoleView.js"></script>
-    <script type="text/javascript" src="Panel.js"></script>
-    <script type="text/javascript" src="TimelineGrid.js"></script>    
-    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
-    <script type="text/javascript" src="Resource.js"></script>
-    <script type="text/javascript" src="ResourceCategory.js"></script>
-    <script type="text/javascript" src="Database.js"></script>
-    <script type="text/javascript" src="DOMStorage.js"></script>
-    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
-    <script type="text/javascript" src="DataGrid.js"></script>
-    <script type="text/javascript" src="CookieItemsView.js"></script>
-    <script type="text/javascript" src="Script.js"></script>
-    <script type="text/javascript" src="Breakpoint.js"></script>
-    <script type="text/javascript" src="SidebarPane.js"></script>
-    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
-    <script type="text/javascript" src="SidebarTreeElement.js"></script>
-    <script type="text/javascript" src="Section.js"></script>
-    <script type="text/javascript" src="PropertiesSection.js"></script>
-    <script type="text/javascript" src="ObjectProxy.js"></script>
-    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
-    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
-    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
-    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
-    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
-    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
-    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
-    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
-    <script type="text/javascript" src="Color.js"></script>
-    <script type="text/javascript" src="StylesSidebarPane.js"></script>
-    <script type="text/javascript" src="PanelEnablerView.js"></script>
-    <script type="text/javascript" src="StatusBarButton.js"></script>
-    <script type="text/javascript" src="SummaryBar.js"></script>
-    <script type="text/javascript" src="ElementsPanel.js"></script>
-    <script type="text/javascript" src="ResourcesPanel.js"></script>
-    <script type="text/javascript" src="ScriptsPanel.js"></script>
-    <script type="text/javascript" src="StoragePanel.js"></script>
-    <script type="text/javascript" src="ProfilesPanel.js"></script>
-    <script type="text/javascript" src="ConsolePanel.js"></script>
-    <script type="text/javascript" src="AuditsPanel.js"></script>
-    <script type="text/javascript" src="AuditResultView.js"></script>
-    <script type="text/javascript" src="AuditLauncherView.js"></script>
-    <script type="text/javascript" src="ResourceView.js"></script>
-    <script type="text/javascript" src="SourceFrame.js"></script>
-    <script type="text/javascript" src="SourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="CSSSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="JavaScriptSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="SourceView.js"></script>
-    <script type="text/javascript" src="FontView.js"></script>
-    <script type="text/javascript" src="ImageView.js"></script>
-    <script type="text/javascript" src="DatabaseTableView.js"></script>
-    <script type="text/javascript" src="DatabaseQueryView.js"></script>
-    <script type="text/javascript" src="ScriptView.js"></script>
-    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="ProfileView.js"></script>
-    <script type="text/javascript" src="DOMAgent.js"></script>
-    <script type="text/javascript" src="InjectedScript.js"></script>
-    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
-    <script type="text/javascript" src="TimelineAgent.js"></script>
-    <script type="text/javascript" src="TimelinePanel.js"></script>
-    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
-    <script type="text/javascript" src="TestController.js"></script>
-
-    <!-- The following lines are added to include DevTools resources -->
-    <link rel="stylesheet" type="text/css" href="devtools.css">
-    <script type="text/javascript" src="base.js"></script>
-    <script type="text/javascript" src="inspector_controller_impl.js"></script>
-    <script type="text/javascript" src="debugger_agent.js"></script>
-    <script type="text/javascript" src="codemap.js"></script>
-    <script type="text/javascript" src="consarray.js"></script>
-    <script type="text/javascript" src="csvparser.js"></script>
-    <script type="text/javascript" src="logreader.js"></script>
-    <script type="text/javascript" src="profile.js"></script>
-    <script type="text/javascript" src="profile_view.js"></script>
-    <script type="text/javascript" src="splaytree.js"></script>
-    <script type="text/javascript" src="profiler_agent.js"></script>
-    <script type="text/javascript" src="profiler_processor.js"></script>
-    <script type="text/javascript" src="heap_profiler_panel.js"></script>
-    <script type="text/javascript" src="devtools.js"></script>
-    <script type="text/javascript" src="devtools_host_stub.js"></script>
-    <script type="text/javascript" src="tests.js"></script>
-    <!-- End of auto-added files list -->
-</head>
-<body class="detached">
-    <div id="toolbar">
-        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
-        <div class="toolbar-item flexable-space"></div>
-        <div class="toolbar-item hidden" id="search-results-matches"></div>
-        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
-        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
-    </div>
-    <div id="main">
-        <div id="main-panels" spellcheck="false"></div>
-        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
-    </div>
-    <div id="drawer">
-        <div id="console-view"><div id="console-messages"><div id="console-prompt" spellcheck="false"><br></div></div></div>
-        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
-    </div>
-</body>
-</html>
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.js b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.js
deleted file mode 100644
index 1a3bc26..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/devtools.js
+++ /dev/null
@@ -1,37815 +0,0 @@
-/* utilities.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-Object.proxyType = function(objectProxy)
-{
-    if (objectProxy === null)
-        return "null";
-
-    var type = typeof objectProxy;
-    if (type !== "object" && type !== "function")
-        return type;
-
-    return objectProxy.type;
-}
-
-Object.properties = function(obj)
-{
-    var properties = [];
-    for (var prop in obj)
-        properties.push(prop);
-    return properties;
-}
-
-Object.sortedProperties = function(obj, sortFunc)
-{
-    return Object.properties(obj).sort(sortFunc);
-}
-
-Function.prototype.bind = function(thisObject)
-{
-    var func = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
-}
-
-Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)
-{
-    var startNode;
-    var startOffset = 0;
-    var endNode;
-    var endOffset = 0;
-
-    if (!stayWithinNode)
-        stayWithinNode = this;
-
-    if (!direction || direction === "backward" || direction === "both") {
-        var node = this;
-        while (node) {
-            if (node === stayWithinNode) {
-                if (!startNode)
-                    startNode = stayWithinNode;
-                break;
-            }
-
-            if (node.nodeType === Node.TEXT_NODE) {
-                var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));
-                for (var i = start; i >= 0; --i) {
-                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
-                        startNode = node;
-                        startOffset = i + 1;
-                        break;
-                    }
-                }
-            }
-
-            if (startNode)
-                break;
-
-            node = node.traversePreviousNode(stayWithinNode);
-        }
-
-        if (!startNode) {
-            startNode = stayWithinNode;
-            startOffset = 0;
-        }
-    } else {
-        startNode = this;
-        startOffset = offset;
-    }
-
-    if (!direction || direction === "forward" || direction === "both") {
-        node = this;
-        while (node) {
-            if (node === stayWithinNode) {
-                if (!endNode)
-                    endNode = stayWithinNode;
-                break;
-            }
-
-            if (node.nodeType === Node.TEXT_NODE) {
-                var start = (node === this ? offset : 0);
-                for (var i = start; i < node.nodeValue.length; ++i) {
-                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
-                        endNode = node;
-                        endOffset = i;
-                        break;
-                    }
-                }
-            }
-
-            if (endNode)
-                break;
-
-            node = node.traverseNextNode(stayWithinNode);
-        }
-
-        if (!endNode) {
-            endNode = stayWithinNode;
-            endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;
-        }
-    } else {
-        endNode = this;
-        endOffset = offset;
-    }
-
-    var result = this.ownerDocument.createRange();
-    result.setStart(startNode, startOffset);
-    result.setEnd(endNode, endOffset);
-
-    return result;
-}
-
-Element.prototype.removeStyleClass = function(className) 
-{
-    // Test for the simple case first.
-    if (this.className === className) {
-        this.className = "";
-        return;
-    }
-
-    var index = this.className.indexOf(className);
-    if (index === -1)
-        return;
-
-    var newClassName = " " + this.className + " ";
-    this.className = newClassName.replace(" " + className + " ", " ");
-}
-
-Element.prototype.removeMatchingStyleClasses = function(classNameRegex)
-{
-    var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");
-    if (regex.test(this.className))
-        this.className = this.className.replace(regex, " ");
-}
-
-Element.prototype.addStyleClass = function(className) 
-{
-    if (className && !this.hasStyleClass(className))
-        this.className += (this.className.length ? " " + className : className);
-}
-
-Element.prototype.hasStyleClass = function(className) 
-{
-    if (!className)
-        return false;
-    // Test for the simple case
-    if (this.className === className)
-        return true;
-
-    var index = this.className.indexOf(className);
-    if (index === -1)
-        return false;
-    var toTest = " " + this.className + " ";
-    return toTest.indexOf(" " + className + " ", index) !== -1;
-}
-
-Element.prototype.positionAt = function(x, y)
-{
-    this.style.left = x + "px";
-    this.style.top = y + "px";
-}
-
-Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
-{
-    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
-        for (var i = 0; i < nameArray.length; ++i)
-            if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
-                return node;
-    return null;
-}
-
-Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
-{
-    return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);
-}
-
-Node.prototype.enclosingNodeOrSelfWithClass = function(className)
-{
-    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
-        if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))
-            return node;
-    return null;
-}
-
-Node.prototype.enclosingNodeWithClass = function(className)
-{
-    if (!this.parentNode)
-        return null;
-    return this.parentNode.enclosingNodeOrSelfWithClass(className);
-}
-
-Element.prototype.query = function(query) 
-{
-    return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
-}
-
-Element.prototype.removeChildren = function()
-{
-    this.innerHTML = "";
-}
-
-Element.prototype.isInsertionCaretInside = function()
-{
-    var selection = window.getSelection();
-    if (!selection.rangeCount || !selection.isCollapsed)
-        return false;
-    var selectionRange = selection.getRangeAt(0);
-    return selectionRange.startContainer === this || selectionRange.startContainer.isDescendant(this);
-}
-
-Element.prototype.__defineGetter__("totalOffsetLeft", function()
-{
-    var total = 0;
-    for (var element = this; element; element = element.offsetParent)
-        total += element.offsetLeft;
-    return total;
-});
-
-Element.prototype.__defineGetter__("totalOffsetTop", function()
-{
-    var total = 0;
-    for (var element = this; element; element = element.offsetParent)
-        total += element.offsetTop;
-    return total;
-});
-
-Element.prototype.offsetRelativeToWindow = function(targetWindow)
-{
-    var elementOffset = {x: 0, y: 0};
-    var curElement = this;
-    var curWindow = this.ownerDocument.defaultView;
-    while (curWindow && curElement) {
-        elementOffset.x += curElement.totalOffsetLeft;
-        elementOffset.y += curElement.totalOffsetTop;
-        if (curWindow === targetWindow)
-            break;
-
-        curElement = curWindow.frameElement;
-        curWindow = curWindow.parent;
-    }
-
-    return elementOffset;
-}
-
-Node.prototype.isWhitespace = isNodeWhitespace;
-Node.prototype.displayName = nodeDisplayName;
-Node.prototype.isAncestor = function(node)
-{
-    return isAncestorNode(this, node);
-};
-Node.prototype.isDescendant = isDescendantNode;
-Node.prototype.traverseNextNode = traverseNextNode;
-Node.prototype.traversePreviousNode = traversePreviousNode;
-Node.prototype.onlyTextChild = onlyTextChild;
-
-String.prototype.hasSubstring = function(string, caseInsensitive)
-{
-    if (!caseInsensitive)
-        return this.indexOf(string) !== -1;
-    return this.match(new RegExp(string.escapeForRegExp(), "i"));
-}
-
-String.prototype.escapeCharacters = function(chars)
-{
-    var foundChar = false;
-    for (var i = 0; i < chars.length; ++i) {
-        if (this.indexOf(chars.charAt(i)) !== -1) {
-            foundChar = true;
-            break;
-        }
-    }
-
-    if (!foundChar)
-        return this;
-
-    var result = "";
-    for (var i = 0; i < this.length; ++i) {
-        if (chars.indexOf(this.charAt(i)) !== -1)
-            result += "\\";
-        result += this.charAt(i);
-    }
-
-    return result;
-}
-
-String.prototype.escapeForRegExp = function()
-{
-    return this.escapeCharacters("^[]{}()\\.$*+?|");
-}
-
-String.prototype.escapeHTML = function()
-{
-    return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
-}
-
-String.prototype.collapseWhitespace = function()
-{
-    return this.replace(/[\s\xA0]+/g, " ");
-}
-
-String.prototype.trimLeadingWhitespace = function()
-{
-    return this.replace(/^[\s\xA0]+/g, "");
-}
-
-String.prototype.trimTrailingWhitespace = function()
-{
-    return this.replace(/[\s\xA0]+$/g, "");
-}
-
-String.prototype.trimWhitespace = function()
-{
-    return this.replace(/^[\s\xA0]+|[\s\xA0]+$/g, "");
-}
-
-String.prototype.trimURL = function(baseURLDomain)
-{
-    var result = this.replace(/^https?:\/\//i, "");
-    if (baseURLDomain)
-        result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");
-    return result;
-}
-
-function isNodeWhitespace()
-{
-    if (!this || this.nodeType !== Node.TEXT_NODE)
-        return false;
-    if (!this.nodeValue.length)
-        return true;
-    return this.nodeValue.match(/^[\s\xA0]+$/);
-}
-
-function nodeDisplayName()
-{
-    if (!this)
-        return "";
-
-    switch (this.nodeType) {
-        case Node.DOCUMENT_NODE:
-            return "Document";
-
-        case Node.ELEMENT_NODE:
-            var name = "<" + this.nodeName.toLowerCase();
-
-            if (this.hasAttributes()) {
-                var value = this.getAttribute("id");
-                if (value)
-                    name += " id=\"" + value + "\"";
-                value = this.getAttribute("class");
-                if (value)
-                    name += " class=\"" + value + "\"";
-                if (this.nodeName.toLowerCase() === "a") {
-                    value = this.getAttribute("name");
-                    if (value)
-                        name += " name=\"" + value + "\"";
-                    value = this.getAttribute("href");
-                    if (value)
-                        name += " href=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "img") {
-                    value = this.getAttribute("src");
-                    if (value)
-                        name += " src=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "iframe") {
-                    value = this.getAttribute("src");
-                    if (value)
-                        name += " src=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "input") {
-                    value = this.getAttribute("name");
-                    if (value)
-                        name += " name=\"" + value + "\"";
-                    value = this.getAttribute("type");
-                    if (value)
-                        name += " type=\"" + value + "\"";
-                } else if (this.nodeName.toLowerCase() === "form") {
-                    value = this.getAttribute("action");
-                    if (value)
-                        name += " action=\"" + value + "\"";
-                }
-            }
-
-            return name + ">";
-
-        case Node.TEXT_NODE:
-            if (isNodeWhitespace.call(this))
-                return "(whitespace)";
-            return "\"" + this.nodeValue + "\"";
-
-        case Node.COMMENT_NODE:
-            return "<!--" + this.nodeValue + "-->";
-            
-        case Node.DOCUMENT_TYPE_NODE:
-            var docType = "<!DOCTYPE " + this.nodeName;
-            if (this.publicId) {
-                docType += " PUBLIC \"" + this.publicId + "\"";
-                if (this.systemId)
-                    docType += " \"" + this.systemId + "\"";
-            } else if (this.systemId)
-                docType += " SYSTEM \"" + this.systemId + "\"";
-            if (this.internalSubset)
-                docType += " [" + this.internalSubset + "]";
-            return docType + ">";
-    }
-
-    return this.nodeName.toLowerCase().collapseWhitespace();
-}
-
-function isAncestorNode(ancestor, node)
-{
-    if (!node || !ancestor)
-        return false;
-
-    var currentNode = node.parentNode;
-    while (currentNode) {
-        if (ancestor === currentNode)
-            return true;
-        currentNode = currentNode.parentNode;
-    }
-    return false;
-}
-
-function isDescendantNode(descendant)
-{
-    return isAncestorNode(descendant, this);
-}
-
-function traverseNextNode(stayWithin)
-{
-    if (!this)
-        return;
-
-    var node = this.firstChild;
-    if (node)
-        return node;
-
-    if (stayWithin && this === stayWithin)
-        return null;
-
-    node = this.nextSibling;
-    if (node)
-        return node;
-
-    node = this;
-    while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
-        node = node.parentNode;
-    if (!node)
-        return null;
-
-    return node.nextSibling;
-}
-
-function traversePreviousNode(stayWithin)
-{
-    if (!this)
-        return;
-    if (stayWithin && this === stayWithin)
-        return null;
-    var node = this.previousSibling;
-    while (node && node.lastChild)
-        node = node.lastChild;
-    if (node)
-        return node;
-    return this.parentNode;
-}
-
-function onlyTextChild()
-{
-    if (!this)
-        return null;
-
-    var firstChild = this.firstChild;
-    if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)
-        return null;
-
-    var sibling = firstChild.nextSibling;
-    return sibling ? null : firstChild;
-}
-
-function appropriateSelectorForNode(node, justSelector)
-{
-    if (!node)
-        return "";
-
-    var lowerCaseName = node.localName || node.nodeName.toLowerCase();
-
-    var id = node.getAttribute("id");
-    if (id) {
-        var selector = "#" + id;
-        return (justSelector ? selector : lowerCaseName + selector);
-    }
-
-    var className = node.getAttribute("class");
-    if (className) {
-        var selector = "." + className.replace(/\s+/, ".");
-        return (justSelector ? selector : lowerCaseName + selector);
-    }
-
-    if (lowerCaseName === "input" && node.getAttribute("type"))
-        return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";
-
-    return lowerCaseName;
-}
-
-function getDocumentForNode(node)
-{
-    return node.nodeType == Node.DOCUMENT_NODE ? node : node.ownerDocument;
-}
-
-function parentNode(node)
-{
-    return node.parentNode;
-}
-
-Number.secondsToString = function(seconds, formatterFunction, higherResolution)
-{
-    if (!formatterFunction)
-        formatterFunction = String.sprintf;
-
-    if (seconds === 0)
-        return "0";
-
-    var ms = seconds * 1000;
-    if (higherResolution && ms < 1000)
-        return formatterFunction("%.3fms", ms);
-    else if (ms < 1000)
-        return formatterFunction("%.0fms", ms);
-
-    if (seconds < 60)
-        return formatterFunction("%.2fs", seconds);
-
-    var minutes = seconds / 60;
-    if (minutes < 60)
-        return formatterFunction("%.1fmin", minutes);
-
-    var hours = minutes / 60;
-    if (hours < 24)
-        return formatterFunction("%.1fhrs", hours);
-
-    var days = hours / 24;
-    return formatterFunction("%.1f days", days);
-}
-
-Number.bytesToString = function(bytes, formatterFunction, higherResolution)
-{
-    if (!formatterFunction)
-        formatterFunction = String.sprintf;
-    if (typeof higherResolution === "undefined")
-        higherResolution = true;
-
-    if (bytes < 1024)
-        return formatterFunction("%.0fB", bytes);
-
-    var kilobytes = bytes / 1024;
-    if (higherResolution && kilobytes < 1024)
-        return formatterFunction("%.2fKB", kilobytes);
-    else if (kilobytes < 1024)
-        return formatterFunction("%.0fKB", kilobytes);
-
-    var megabytes = kilobytes / 1024;
-    if (higherResolution)
-        return formatterFunction("%.3fMB", megabytes);
-    else
-        return formatterFunction("%.0fMB", megabytes);
-}
-
-Number.constrain = function(num, min, max)
-{
-    if (num < min)
-        num = min;
-    else if (num > max)
-        num = max;
-    return num;
-}
-
-HTMLTextAreaElement.prototype.moveCursorToEnd = function()
-{
-    var length = this.value.length;
-    this.setSelectionRange(length, length);
-}
-
-Array.prototype.remove = function(value, onlyFirst)
-{
-    if (onlyFirst) {
-        var index = this.indexOf(value);
-        if (index !== -1)
-            this.splice(index, 1);
-        return;
-    }
-
-    var length = this.length;
-    for (var i = 0; i < length; ++i) {
-        if (this[i] === value)
-            this.splice(i, 1);
-    }
-}
-
-Array.prototype.keySet = function()
-{
-    var keys = {};
-    for (var i = 0; i < this.length; ++i)
-        keys[this[i]] = true;
-    return keys;
-}
-
-function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)
-{
-    // indexOf returns (-lowerBound - 1). Taking (-result - 1) works out to lowerBound.
-    return (-indexOfObjectInListSortedByFunction(anObject, aList, aFunction) - 1);
-}
-
-function indexOfObjectInListSortedByFunction(anObject, aList, aFunction)
-{
-    var first = 0;
-    var last = aList.length - 1;
-    var floor = Math.floor;
-    var mid, c;
-
-    while (first <= last) {
-        mid = floor((first + last) / 2);
-        c = aFunction(anObject, aList[mid]);
-
-        if (c > 0)
-            first = mid + 1;
-        else if (c < 0)
-            last = mid - 1;
-        else {
-            // Return the first occurance of an item in the list.
-            while (mid > 0 && aFunction(anObject, aList[mid - 1]) === 0)
-                mid--;
-            first = mid;
-            break;
-        }
-    }
-
-    // By returning 1 less than the negative lower search bound, we can reuse this function
-    // for both indexOf and insertionIndexFor, with some simple arithmetic.
-    return (-first - 1);
-}
-
-String.sprintf = function(format)
-{
-    return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));
-}
-
-String.tokenizeFormatString = function(format)
-{
-    var tokens = [];
-    var substitutionIndex = 0;
-
-    function addStringToken(str)
-    {
-        tokens.push({ type: "string", value: str });
-    }
-
-    function addSpecifierToken(specifier, precision, substitutionIndex)
-    {
-        tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });
-    }
-
-    var index = 0;
-    for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {
-        addStringToken(format.substring(index, precentIndex));
-        index = precentIndex + 1;
-
-        if (format[index] === "%") {
-            addStringToken("%");
-            ++index;
-            continue;
-        }
-
-        if (!isNaN(format[index])) {
-            // The first character is a number, it might be a substitution index.
-            var number = parseInt(format.substring(index));
-            while (!isNaN(format[index]))
-                ++index;
-            // If the number is greater than zero and ends with a "$",
-            // then this is a substitution index.
-            if (number > 0 && format[index] === "$") {
-                substitutionIndex = (number - 1);
-                ++index;
-            }
-        }
-
-        var precision = -1;
-        if (format[index] === ".") {
-            // This is a precision specifier. If no digit follows the ".",
-            // then the precision should be zero.
-            ++index;
-            precision = parseInt(format.substring(index));
-            if (isNaN(precision))
-                precision = 0;
-            while (!isNaN(format[index]))
-                ++index;
-        }
-
-        addSpecifierToken(format[index], precision, substitutionIndex);
-
-        ++substitutionIndex;
-        ++index;
-    }
-
-    addStringToken(format.substring(index));
-
-    return tokens;
-}
-
-String.standardFormatters = {
-    d: function(substitution)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
-            substitution = substitution.description;
-        substitution = parseInt(substitution);
-        return !isNaN(substitution) ? substitution : 0;
-    },
-
-    f: function(substitution, token)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
-            substitution = substitution.description;
-        substitution = parseFloat(substitution);
-        if (substitution && token.precision > -1)
-            substitution = substitution.toFixed(token.precision);
-        return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);
-    },
-
-    s: function(substitution)
-    {
-        if (typeof substitution == "object" && Object.proxyType(substitution) !== "null")
-            substitution = substitution.description;
-        return substitution;
-    },
-};
-
-String.vsprintf = function(format, substitutions)
-{
-    return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;
-}
-
-String.format = function(format, substitutions, formatters, initialValue, append)
-{
-    if (!format || !substitutions || !substitutions.length)
-        return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };
-
-    function prettyFunctionName()
-    {
-        return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";
-    }
-
-    function warn(msg)
-    {
-        console.warn(prettyFunctionName() + ": " + msg);
-    }
-
-    function error(msg)
-    {
-        console.error(prettyFunctionName() + ": " + msg);
-    }
-
-    var result = initialValue;
-    var tokens = String.tokenizeFormatString(format);
-    var usedSubstitutionIndexes = {};
-
-    for (var i = 0; i < tokens.length; ++i) {
-        var token = tokens[i];
-
-        if (token.type === "string") {
-            result = append(result, token.value);
-            continue;
-        }
-
-        if (token.type !== "specifier") {
-            error("Unknown token type \"" + token.type + "\" found.");
-            continue;
-        }
-
-        if (token.substitutionIndex >= substitutions.length) {
-            // If there are not enough substitutions for the current substitutionIndex
-            // just output the format specifier literally and move on.
-            error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");
-            result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);
-            continue;
-        }
-
-        usedSubstitutionIndexes[token.substitutionIndex] = true;
-
-        if (!(token.specifier in formatters)) {
-            // Encountered an unsupported format character, treat as a string.
-            warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");
-            result = append(result, substitutions[token.substitutionIndex]);
-            continue;
-        }
-
-        result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
-    }
-
-    var unusedSubstitutions = [];
-    for (var i = 0; i < substitutions.length; ++i) {
-        if (i in usedSubstitutionIndexes)
-            continue;
-        unusedSubstitutions.push(substitutions[i]);
-    }
-
-    return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
-}
-
-function isEnterKey(event) {
-    // Check if in IME.
-    return event.keyCode !== 229 && event.keyIdentifier === "Enter";
-}
-
-/* treeoutline.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-function TreeOutline(listNode)
-{
-    this.children = [];
-    this.selectedTreeElement = null;
-    this._childrenListNode = listNode;
-    this._childrenListNode.removeChildren();
-    this._knownTreeElements = [];
-    this._treeElementsExpandedState = [];
-    this.expandTreeElementsWhenArrowing = false;
-    this.root = true;
-    this.hasChildren = false;
-    this.expanded = true;
-    this.selected = false;
-    this.treeOutline = this;
-
-    this._childrenListNode.tabIndex = 0;
-    this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
-}
-
-TreeOutline._knownTreeElementNextIdentifier = 1;
-
-TreeOutline._appendChild = function(child)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var lastChild = this.children[this.children.length - 1];
-    if (lastChild) {
-        lastChild.nextSibling = child;
-        child.previousSibling = lastChild;
-    } else {
-        child.previousSibling = null;
-        child.nextSibling = null;
-    }
-
-    this.children.push(child);
-    this.hasChildren = true;
-    child.parent = this;
-    child.treeOutline = this.treeOutline;
-    child.treeOutline._rememberTreeElement(child);
-
-    var current = child.children[0];
-    while (current) {
-        current.treeOutline = this.treeOutline;
-        current.treeOutline._rememberTreeElement(current);
-        current = current.traverseNextTreeElement(false, child, true);
-    }
-
-    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
-        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
-
-    if (!this._childrenListNode) {
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-    }
-
-    child._attach();
-}
-
-TreeOutline._insertChild = function(child, index)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var previousChild = (index > 0 ? this.children[index - 1] : null);
-    if (previousChild) {
-        previousChild.nextSibling = child;
-        child.previousSibling = previousChild;
-    } else {
-        child.previousSibling = null;
-    }
-
-    var nextChild = this.children[index];
-    if (nextChild) {
-        nextChild.previousSibling = child;
-        child.nextSibling = nextChild;
-    } else {
-        child.nextSibling = null;
-    }
-
-    this.children.splice(index, 0, child);
-    this.hasChildren = true;
-    child.parent = this;
-    child.treeOutline = this.treeOutline;
-    child.treeOutline._rememberTreeElement(child);
-
-    var current = child.children[0];
-    while (current) {
-        current.treeOutline = this.treeOutline;
-        current.treeOutline._rememberTreeElement(current);
-        current = current.traverseNextTreeElement(false, child, true);
-    }
-
-    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
-        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
-
-    if (!this._childrenListNode) {
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-    }
-
-    child._attach();
-}
-
-TreeOutline._removeChildAtIndex = function(childIndex)
-{
-    if (childIndex < 0 || childIndex >= this.children.length)
-        throw("childIndex out of range");
-
-    var child = this.children[childIndex];
-    this.children.splice(childIndex, 1);
-
-    var parent = child.parent;
-    if (child.deselect()) {
-        if (child.previousSibling)
-            child.previousSibling.select();
-        else if (child.nextSibling)
-            child.nextSibling.select();
-        else
-            parent.select();
-    }
-
-    if (child.previousSibling)
-        child.previousSibling.nextSibling = child.nextSibling;
-    if (child.nextSibling)
-        child.nextSibling.previousSibling = child.previousSibling;
-
-    if (child.treeOutline) {
-        child.treeOutline._forgetTreeElement(child);
-        child.treeOutline._forgetChildrenRecursive(child);
-    }
-
-    child._detach();
-    child.treeOutline = null;
-    child.parent = null;
-    child.nextSibling = null;
-    child.previousSibling = null;
-}
-
-TreeOutline._removeChild = function(child)
-{
-    if (!child)
-        throw("child can't be undefined or null");
-
-    var childIndex = this.children.indexOf(child);
-    if (childIndex === -1)
-        throw("child not found in this node's children");
-
-    TreeOutline._removeChildAtIndex.call(this, childIndex);
-}
-
-TreeOutline._removeChildren = function()
-{
-    for (var i = 0; i < this.children.length; ++i) {
-        var child = this.children[i];
-        child.deselect();
-
-        if (child.treeOutline) {
-            child.treeOutline._forgetTreeElement(child);
-            child.treeOutline._forgetChildrenRecursive(child);
-        }
-
-        child._detach();
-        child.treeOutline = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-    }
-
-    this.children = [];
-}
-
-TreeOutline._removeChildrenRecursive = function()
-{
-    var childrenToRemove = this.children;
-
-    var child = this.children[0];
-    while (child) {
-        if (child.children.length)
-            childrenToRemove = childrenToRemove.concat(child.children);
-        child = child.traverseNextTreeElement(false, this, true);
-    }
-
-    for (var i = 0; i < childrenToRemove.length; ++i) {
-        var child = childrenToRemove[i];
-        child.deselect();
-        if (child.treeOutline)
-            child.treeOutline._forgetTreeElement(child);
-        child._detach();
-        child.children = [];
-        child.treeOutline = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-    }
-
-    this.children = [];
-}
-
-TreeOutline.prototype._rememberTreeElement = function(element)
-{
-    if (!this._knownTreeElements[element.identifier])
-        this._knownTreeElements[element.identifier] = [];
-
-    // check if the element is already known
-    var elements = this._knownTreeElements[element.identifier];
-    if (elements.indexOf(element) !== -1)
-        return;
-
-    // add the element
-    elements.push(element);
-}
-
-TreeOutline.prototype._forgetTreeElement = function(element)
-{
-    if (this._knownTreeElements[element.identifier])
-        this._knownTreeElements[element.identifier].remove(element, true);
-}
-
-TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)
-{
-    var child = parentElement.children[0];
-    while (child) {
-        this._forgetTreeElement(child);
-        child = child.traverseNextTreeElement(false, this, true);
-    }
-}
-
-TreeOutline.prototype.getCachedTreeElement = function(representedObject)
-{
-    if (!representedObject)
-        return null;
-
-    if ("__treeElementIdentifier" in representedObject) {
-        // If this representedObject has a tree element identifier, and it is a known TreeElement
-        // in our tree we can just return that tree element.
-        var elements = this._knownTreeElements[representedObject.__treeElementIdentifier];
-        if (elements) {
-            for (var i = 0; i < elements.length; ++i)
-                if (elements[i].representedObject === representedObject)
-                    return elements[i];
-        }
-    }
-    return null;
-}
-
-TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)
-{
-    if (!representedObject)
-        return null;
-
-    var cachedElement = this.getCachedTreeElement(representedObject);
-    if (cachedElement)
-        return cachedElement;
-
-    // The representedObject isn't know, so we start at the top of the tree and work down to find the first
-    // tree element that represents representedObject or one of its ancestors.
-    var item;
-    var found = false;
-    for (var i = 0; i < this.children.length; ++i) {
-        item = this.children[i];
-        if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
-            found = true;
-            break;
-        }
-    }
-
-    if (!found)
-        return null;
-
-    // Make sure the item that we found is connected to the root of the tree.
-    // Build up a list of representedObject's ancestors that aren't already in our tree.
-    var ancestors = [];
-    var currentObject = representedObject;
-    while (currentObject) {
-        ancestors.unshift(currentObject);
-        if (currentObject === item.representedObject)
-            break;
-        currentObject = getParent(currentObject);
-    }
-
-    // For each of those ancestors we populate them to fill in the tree.
-    for (var i = 0; i < ancestors.length; ++i) {
-        // Make sure we don't call findTreeElement with the same representedObject
-        // again, to prevent infinite recursion.
-        if (ancestors[i] === representedObject)
-            continue;
-        // FIXME: we could do something faster than findTreeElement since we will know the next
-        // ancestor exists in the tree.
-        item = this.findTreeElement(ancestors[i], isAncestor, getParent);
-        if (item && item.onpopulate)
-            item.onpopulate(item);
-    }
-
-    return this.getCachedTreeElement(representedObject);
-}
-
-TreeOutline.prototype.treeElementFromPoint = function(x, y)
-{
-    var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);
-    var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);
-    if (listNode)
-        return listNode.parentTreeElement || listNode.treeElement;
-    return null;
-}
-
-TreeOutline.prototype._treeKeyDown = function(event)
-{
-    if (event.target !== this._childrenListNode)
-        return;
-
-    if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
-        return;
-
-    var handled = false;
-    var nextSelectedElement;
-    if (event.keyIdentifier === "Up" && !event.altKey) {
-        nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
-        while (nextSelectedElement && !nextSelectedElement.selectable)
-            nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
-        handled = nextSelectedElement ? true : false;
-    } else if (event.keyIdentifier === "Down" && !event.altKey) {
-        nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
-        while (nextSelectedElement && !nextSelectedElement.selectable)
-            nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
-        handled = nextSelectedElement ? true : false;
-    } else if (event.keyIdentifier === "Left") {
-        if (this.selectedTreeElement.expanded) {
-            if (event.altKey)
-                this.selectedTreeElement.collapseRecursively();
-            else
-                this.selectedTreeElement.collapse();
-            handled = true;
-        } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {
-            handled = true;
-            if (this.selectedTreeElement.parent.selectable) {
-                nextSelectedElement = this.selectedTreeElement.parent;
-                handled = nextSelectedElement ? true : false;
-            } else if (this.selectedTreeElement.parent)
-                this.selectedTreeElement.parent.collapse();
-        }
-    } else if (event.keyIdentifier === "Right") {
-        if (!this.selectedTreeElement.revealed()) {
-            this.selectedTreeElement.reveal();
-            handled = true;
-        } else if (this.selectedTreeElement.hasChildren) {
-            handled = true;
-            if (this.selectedTreeElement.expanded) {
-                nextSelectedElement = this.selectedTreeElement.children[0];
-                handled = nextSelectedElement ? true : false;
-            } else {
-                if (event.altKey)
-                    this.selectedTreeElement.expandRecursively();
-                else
-                    this.selectedTreeElement.expand();
-            }
-        }
-    }
-
-    if (nextSelectedElement) {
-        nextSelectedElement.reveal();
-        nextSelectedElement.select();
-    }
-
-    if (handled) {
-        event.preventDefault();
-        event.stopPropagation();
-    }
-}
-
-TreeOutline.prototype.expand = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.collapse = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.revealed = function()
-{
-    return true;
-}
-
-TreeOutline.prototype.reveal = function()
-{
-    // this is the root, do nothing
-}
-
-TreeOutline.prototype.appendChild = TreeOutline._appendChild;
-TreeOutline.prototype.insertChild = TreeOutline._insertChild;
-TreeOutline.prototype.removeChild = TreeOutline._removeChild;
-TreeOutline.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
-TreeOutline.prototype.removeChildren = TreeOutline._removeChildren;
-TreeOutline.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
-
-function TreeElement(title, representedObject, hasChildren)
-{
-    this._title = title;
-    this.representedObject = (representedObject || {});
-
-    if (this.representedObject.__treeElementIdentifier)
-        this.identifier = this.representedObject.__treeElementIdentifier;
-    else {
-        this.identifier = TreeOutline._knownTreeElementNextIdentifier++;
-        this.representedObject.__treeElementIdentifier = this.identifier;
-    }
-
-    this._hidden = false;
-    this.expanded = false;
-    this.selected = false;
-    this.hasChildren = hasChildren;
-    this.children = [];
-    this.treeOutline = null;
-    this.parent = null;
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this._listItemNode = null;
-}
-
-TreeElement.prototype = {
-    selectable: true,
-    arrowToggleWidth: 10,
-
-    get listItemElement() {
-        return this._listItemNode;
-    },
-
-    get childrenListElement() {
-        return this._childrenListNode;
-    },
-
-    get title() {
-        return this._title;
-    },
-
-    set title(x) {
-        this._title = x;
-        if (this._listItemNode)
-            this._listItemNode.innerHTML = x;
-    },
-
-    get tooltip() {
-        return this._tooltip;
-    },
-
-    set tooltip(x) {
-        this._tooltip = x;
-        if (this._listItemNode)
-            this._listItemNode.title = x ? x : "";
-    },
-
-    get hasChildren() {
-        return this._hasChildren;
-    },
-
-    set hasChildren(x) {
-        if (this._hasChildren === x)
-            return;
-
-        this._hasChildren = x;
-
-        if (!this._listItemNode)
-            return;
-
-        if (x)
-            this._listItemNode.addStyleClass("parent");
-        else {
-            this._listItemNode.removeStyleClass("parent");
-            this.collapse();
-        }
-    },
-
-    get hidden() {
-        return this._hidden;
-    },
-
-    set hidden(x) {
-        if (this._hidden === x)
-            return;
-
-        this._hidden = x;
-
-        if (x) {
-            if (this._listItemNode)
-                this._listItemNode.addStyleClass("hidden");
-            if (this._childrenListNode)
-                this._childrenListNode.addStyleClass("hidden");
-        } else {
-            if (this._listItemNode)
-                this._listItemNode.removeStyleClass("hidden");
-            if (this._childrenListNode)
-                this._childrenListNode.removeStyleClass("hidden");
-        }
-    },
-
-    get shouldRefreshChildren() {
-        return this._shouldRefreshChildren;
-    },
-
-    set shouldRefreshChildren(x) {
-        this._shouldRefreshChildren = x;
-        if (x && this.expanded)
-            this.expand();
-    }
-}
-
-TreeElement.prototype.appendChild = TreeOutline._appendChild;
-TreeElement.prototype.insertChild = TreeOutline._insertChild;
-TreeElement.prototype.removeChild = TreeOutline._removeChild;
-TreeElement.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
-TreeElement.prototype.removeChildren = TreeOutline._removeChildren;
-TreeElement.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
-
-TreeElement.prototype._attach = function()
-{
-    if (!this._listItemNode || this.parent._shouldRefreshChildren) {
-        if (this._listItemNode && this._listItemNode.parentNode)
-            this._listItemNode.parentNode.removeChild(this._listItemNode);
-
-        this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");
-        this._listItemNode.treeElement = this;
-        this._listItemNode.innerHTML = this._title;
-        this._listItemNode.title = this._tooltip ? this._tooltip : "";
-
-        if (this.hidden)
-            this._listItemNode.addStyleClass("hidden");
-        if (this.hasChildren)
-            this._listItemNode.addStyleClass("parent");
-        if (this.expanded)
-            this._listItemNode.addStyleClass("expanded");
-        if (this.selected)
-            this._listItemNode.addStyleClass("selected");
-
-        this._listItemNode.addEventListener("mousedown", TreeElement.treeElementSelected, false);
-        this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);
-        this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);
-
-        if (this.onattach)
-            this.onattach(this);
-    }
-
-    var nextSibling = null;
-    if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)
-        nextSibling = this.nextSibling._listItemNode;
-    this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);
-    if (this._childrenListNode)
-        this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
-    if (this.selected)
-        this.select();
-    if (this.expanded)
-        this.expand();
-}
-
-TreeElement.prototype._detach = function()
-{
-    if (this._listItemNode && this._listItemNode.parentNode)
-        this._listItemNode.parentNode.removeChild(this._listItemNode);
-    if (this._childrenListNode && this._childrenListNode.parentNode)
-        this._childrenListNode.parentNode.removeChild(this._childrenListNode);
-}
-
-TreeElement.treeElementSelected = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement || !element.treeElement.selectable)
-        return;
-
-    if (element.treeElement.isEventWithinDisclosureTriangle(event))
-        return;
-
-    element.treeElement.select();
-}
-
-TreeElement.treeElementToggled = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement)
-        return;
-
-    if (!element.treeElement.isEventWithinDisclosureTriangle(event))
-        return;
-
-    if (element.treeElement.expanded) {
-        if (event.altKey)
-            element.treeElement.collapseRecursively();
-        else
-            element.treeElement.collapse();
-    } else {
-        if (event.altKey)
-            element.treeElement.expandRecursively();
-        else
-            element.treeElement.expand();
-    }
-}
-
-TreeElement.treeElementDoubleClicked = function(event)
-{
-    var element = event.currentTarget;
-    if (!element || !element.treeElement)
-        return;
-
-    if (element.treeElement.ondblclick)
-        element.treeElement.ondblclick.call(element.treeElement, event);
-    else if (element.treeElement.hasChildren && !element.treeElement.expanded)
-        element.treeElement.expand();
-}
-
-TreeElement.prototype.collapse = function()
-{
-    if (this._listItemNode)
-        this._listItemNode.removeStyleClass("expanded");
-    if (this._childrenListNode)
-        this._childrenListNode.removeStyleClass("expanded");
-
-    this.expanded = false;
-    if (this.treeOutline)
-        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
-
-    if (this.oncollapse)
-        this.oncollapse(this);
-}
-
-TreeElement.prototype.collapseRecursively = function()
-{
-    var item = this;
-    while (item) {
-        if (item.expanded)
-            item.collapse();
-        item = item.traverseNextTreeElement(false, this, true);
-    }
-}
-
-TreeElement.prototype.expand = function()
-{
-    if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))
-        return;
-
-    if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {
-        if (this._childrenListNode && this._childrenListNode.parentNode)
-            this._childrenListNode.parentNode.removeChild(this._childrenListNode);
-
-        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
-        this._childrenListNode.parentTreeElement = this;
-        this._childrenListNode.addStyleClass("children");
-
-        if (this.hidden)
-            this._childrenListNode.addStyleClass("hidden");
-
-        if (this.onpopulate)
-            this.onpopulate(this);
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i]._attach();
-
-        delete this._shouldRefreshChildren;
-    }
-
-    if (this._listItemNode) {
-        this._listItemNode.addStyleClass("expanded");
-        if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)
-            this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
-    }
-
-    if (this._childrenListNode)
-        this._childrenListNode.addStyleClass("expanded");
-
-    this.expanded = true;
-    if (this.treeOutline)
-        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
-
-    if (this.onexpand)
-        this.onexpand(this);
-}
-
-TreeElement.prototype.expandRecursively = function(maxDepth)
-{
-    var item = this;
-    var info = {};
-    var depth = 0;
-
-    // The Inspector uses TreeOutlines to represents object properties, so recursive expansion
-    // in some case can be infinite, since JavaScript objects can hold circular references.
-    // So default to a recursion cap of 3 levels, since that gives fairly good results.
-    if (typeof maxDepth === "undefined" || typeof maxDepth === "null")
-        maxDepth = 3;
-
-    while (item) {
-        if (depth < maxDepth)
-            item.expand();
-        item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);
-        depth += info.depthChange;
-    }
-}
-
-TreeElement.prototype.hasAncestor = function(ancestor) {
-    if (!ancestor)
-        return false;
-
-    var currentNode = this.parent;
-    while (currentNode) {
-        if (ancestor === currentNode)
-            return true;
-        currentNode = currentNode.parent;
-    }
-
-    return false;
-}
-
-TreeElement.prototype.reveal = function()
-{
-    var currentAncestor = this.parent;
-    while (currentAncestor && !currentAncestor.root) {
-        if (!currentAncestor.expanded)
-            currentAncestor.expand();
-        currentAncestor = currentAncestor.parent;
-    }
-
-    if (this.onreveal)
-        this.onreveal(this);
-}
-
-TreeElement.prototype.revealed = function()
-{
-    var currentAncestor = this.parent;
-    while (currentAncestor && !currentAncestor.root) {
-        if (!currentAncestor.expanded)
-            return false;
-        currentAncestor = currentAncestor.parent;
-    }
-
-    return true;
-}
-
-TreeElement.prototype.select = function(supressOnSelect)
-{
-    if (!this.treeOutline || !this.selectable || this.selected)
-        return;
-
-    if (this.treeOutline.selectedTreeElement)
-        this.treeOutline.selectedTreeElement.deselect();
-
-    this.selected = true;
-    this.treeOutline.selectedTreeElement = this;
-    if (this._listItemNode)
-        this._listItemNode.addStyleClass("selected");
-
-    if (this.onselect && !supressOnSelect)
-        this.onselect(this);
-}
-
-TreeElement.prototype.deselect = function(supressOnDeselect)
-{
-    if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
-        return false;
-
-    this.selected = false;
-    this.treeOutline.selectedTreeElement = null;
-    if (this._listItemNode)
-        this._listItemNode.removeStyleClass("selected");
-
-    if (this.ondeselect && !supressOnDeselect)
-        this.ondeselect(this);
-    return true;
-}
-
-TreeElement.prototype.traverseNextTreeElement = function(skipHidden, stayWithin, dontPopulate, info)
-{
-    if (!dontPopulate && this.hasChildren && this.onpopulate)
-        this.onpopulate(this);
-
-    if (info)
-        info.depthChange = 0;
-
-    var element = skipHidden ? (this.revealed() ? this.children[0] : null) : this.children[0];
-    if (element && (!skipHidden || (skipHidden && this.expanded))) {
-        if (info)
-            info.depthChange = 1;
-        return element;
-    }
-
-    if (this === stayWithin)
-        return null;
-
-    element = skipHidden ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;
-    if (element)
-        return element;
-
-    element = this;
-    while (element && !element.root && !(skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {
-        if (info)
-            info.depthChange -= 1;
-        element = element.parent;
-    }
-
-    if (!element)
-        return null;
-
-    return (skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);
-}
-
-TreeElement.prototype.traversePreviousTreeElement = function(skipHidden, dontPopulate)
-{
-    var element = skipHidden ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;
-    if (!dontPopulate && element && element.hasChildren && element.onpopulate)
-        element.onpopulate(element);
-
-    while (element && (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {
-        if (!dontPopulate && element.hasChildren && element.onpopulate)
-            element.onpopulate(element);
-        element = (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);
-    }
-
-    if (element)
-        return element;
-
-    if (!this.parent || this.parent.root)
-        return null;
-
-    return this.parent;
-}
-
-TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
-{
-    var left = this._listItemNode.totalOffsetLeft;
-    return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
-}
-
-/* inspector.js */
-
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2007 Matt Lilek ([email protected]).
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-function preloadImages()
-{
-    (new Image()).src = "Images/clearConsoleButtonGlyph.png";
-    (new Image()).src = "Images/consoleButtonGlyph.png";
-    (new Image()).src = "Images/dockButtonGlyph.png";
-    (new Image()).src = "Images/enableOutlineButtonGlyph.png";
-    (new Image()).src = "Images/enableSolidButtonGlyph.png";
-    (new Image()).src = "Images/excludeButtonGlyph.png";
-    (new Image()).src = "Images/focusButtonGlyph.png";
-    (new Image()).src = "Images/largerResourcesButtonGlyph.png";
-    (new Image()).src = "Images/nodeSearchButtonGlyph.png";
-    (new Image()).src = "Images/pauseOnExceptionButtonGlyph.png";
-    (new Image()).src = "Images/percentButtonGlyph.png";
-    (new Image()).src = "Images/recordButtonGlyph.png";
-    (new Image()).src = "Images/recordToggledButtonGlyph.png";
-    (new Image()).src = "Images/reloadButtonGlyph.png";
-    (new Image()).src = "Images/undockButtonGlyph.png";
-}
-
-preloadImages();
-
-var WebInspector = {
-    resources: {},
-    resourceURLMap: {},
-    cookieDomains: {},
-    missingLocalizedStrings: {},
-    pendingDispatches: 0,
-
-    // RegExp groups:
-    // 1 - scheme
-    // 2 - hostname
-    // 3 - ?port
-    // 4 - ?path
-    // 5 - ?fragment
-    URLRegExp: /^(http[s]?|file):\/\/([^\/:]+)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
-
-    get platform()
-    {
-        if (!("_platform" in this))
-            this._platform = InspectorFrontendHost.platform();
-
-        return this._platform;
-    },
-
-    get port()
-    {
-        if (!("_port" in this))
-            this._port = InspectorFrontendHost.port();
-
-        return this._port;
-    },
-
-    get previousFocusElement()
-    {
-        return this._previousFocusElement;
-    },
-
-    get currentFocusElement()
-    {
-        return this._currentFocusElement;
-    },
-
-    set currentFocusElement(x)
-    {
-        if (this._currentFocusElement !== x)
-            this._previousFocusElement = this._currentFocusElement;
-        this._currentFocusElement = x;
-
-        if (this._currentFocusElement) {
-            this._currentFocusElement.focus();
-
-            // Make a caret selection inside the new element if there isn't a range selection and
-            // there isn't already a caret selection inside.
-            var selection = window.getSelection();
-            if (selection.isCollapsed && !this._currentFocusElement.isInsertionCaretInside()) {
-                var selectionRange = this._currentFocusElement.ownerDocument.createRange();
-                selectionRange.setStart(this._currentFocusElement, 0);
-                selectionRange.setEnd(this._currentFocusElement, 0);
-
-                selection.removeAllRanges();
-                selection.addRange(selectionRange);
-            }
-        } else if (this._previousFocusElement)
-            this._previousFocusElement.blur();
-    },
-
-    get currentPanel()
-    {
-        return this._currentPanel;
-    },
-
-    set currentPanel(x)
-    {
-        if (this._currentPanel === x)
-            return;
-
-        if (this._currentPanel)
-            this._currentPanel.hide();
-
-        this._currentPanel = x;
-
-        this.updateSearchLabel();
-
-        if (x) {
-            x.show();
-
-            if (this.currentQuery) {
-                if (x.performSearch) {
-                    function performPanelSearch()
-                    {
-                        this.updateSearchMatchesCount();
-
-                        x.currentQuery = this.currentQuery;
-                        x.performSearch(this.currentQuery);
-                    }
-
-                    // Perform the search on a timeout so the panel switches fast.
-                    setTimeout(performPanelSearch.bind(this), 0);
-                } else {
-                    // Update to show Not found for panels that can't be searched.
-                    this.updateSearchMatchesCount();
-                }
-            }
-        }
-
-        for (var panelName in WebInspector.panels) {
-            if (WebInspector.panels[panelName] == x)
-                InspectorBackend.storeLastActivePanel(panelName);
-        }
-    },
-
-    _createPanels: function()
-    {
-        var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');
-        if (hiddenPanels.indexOf("elements") === -1)
-            this.panels.elements = new WebInspector.ElementsPanel();
-        if (hiddenPanels.indexOf("resources") === -1)
-            this.panels.resources = new WebInspector.ResourcesPanel();
-        if (hiddenPanels.indexOf("scripts") === -1)
-            this.panels.scripts = new WebInspector.ScriptsPanel();
-        if (hiddenPanels.indexOf("timeline") === -1)
-            this.panels.timeline = new WebInspector.TimelinePanel();
-        if (hiddenPanels.indexOf("profiles") === -1) {
-            this.panels.profiles = new WebInspector.ProfilesPanel();
-            this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());
-        }
-
-        if (hiddenPanels.indexOf("storage") === -1 && hiddenPanels.indexOf("databases") === -1)
-            this.panels.storage = new WebInspector.StoragePanel();
-
-        // FIXME: Uncomment when ready.
-        // if (hiddenPanels.indexOf("audits") === -1)
-        //    this.panels.audits = new WebInspector.AuditsPanel();
-
-        if (hiddenPanels.indexOf("console") === -1)
-            this.panels.console = new WebInspector.ConsolePanel();
-    },
-
-    get attached()
-    {
-        return this._attached;
-    },
-
-    set attached(x)
-    {
-        if (this._attached === x)
-            return;
-
-        this._attached = x;
-
-        this.updateSearchLabel();
-
-        var dockToggleButton = document.getElementById("dock-status-bar-item");
-        var body = document.body;
-
-        if (x) {
-            InspectorFrontendHost.attach();
-            body.removeStyleClass("detached");
-            body.addStyleClass("attached");
-            dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
-        } else {
-            InspectorFrontendHost.detach();
-            body.removeStyleClass("attached");
-            body.addStyleClass("detached");
-            dockToggleButton.title = WebInspector.UIString("Dock to main window.");
-        }
-    },
-
-    get errors()
-    {
-        return this._errors || 0;
-    },
-
-    set errors(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._errors === x)
-            return;
-        this._errors = x;
-        this._updateErrorAndWarningCounts();
-    },
-
-    get warnings()
-    {
-        return this._warnings || 0;
-    },
-
-    set warnings(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._warnings === x)
-            return;
-        this._warnings = x;
-        this._updateErrorAndWarningCounts();
-    },
-
-    _updateErrorAndWarningCounts: function()
-    {
-        var errorWarningElement = document.getElementById("error-warning-count");
-        if (!errorWarningElement)
-            return;
-
-        if (!this.errors && !this.warnings) {
-            errorWarningElement.addStyleClass("hidden");
-            return;
-        }
-
-        errorWarningElement.removeStyleClass("hidden");
-
-        errorWarningElement.removeChildren();
-
-        if (this.errors) {
-            var errorElement = document.createElement("span");
-            errorElement.id = "error-count";
-            errorElement.textContent = this.errors;
-            errorWarningElement.appendChild(errorElement);
-        }
-
-        if (this.warnings) {
-            var warningsElement = document.createElement("span");
-            warningsElement.id = "warning-count";
-            warningsElement.textContent = this.warnings;
-            errorWarningElement.appendChild(warningsElement);
-        }
-
-        if (this.errors) {
-            if (this.warnings) {
-                if (this.errors == 1) {
-                    if (this.warnings == 1)
-                        errorWarningElement.title = WebInspector.UIString("%d error, %d warning", this.errors, this.warnings);
-                    else
-                        errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", this.errors, this.warnings);
-                } else if (this.warnings == 1)
-                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", this.errors, this.warnings);
-                else
-                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", this.errors, this.warnings);
-            } else if (this.errors == 1)
-                errorWarningElement.title = WebInspector.UIString("%d error", this.errors);
-            else
-                errorWarningElement.title = WebInspector.UIString("%d errors", this.errors);
-        } else if (this.warnings == 1)
-            errorWarningElement.title = WebInspector.UIString("%d warning", this.warnings);
-        else if (this.warnings)
-            errorWarningElement.title = WebInspector.UIString("%d warnings", this.warnings);
-        else
-            errorWarningElement.title = null;
-    },
-
-    get styleChanges()
-    {
-        return this._styleChanges;
-    },
-
-    set styleChanges(x)
-    {
-        x = Math.max(x, 0);
-
-        if (this._styleChanges === x)
-            return;
-        this._styleChanges = x;
-        this._updateChangesCount();
-    },
-
-    _updateChangesCount: function()
-    {
-        // TODO: Remove immediate return when enabling the Changes Panel
-        return;
-
-        var changesElement = document.getElementById("changes-count");
-        if (!changesElement)
-            return;
-
-        if (!this.styleChanges) {
-            changesElement.addStyleClass("hidden");
-            return;
-        }
-
-        changesElement.removeStyleClass("hidden");
-        changesElement.removeChildren();
-
-        if (this.styleChanges) {
-            var styleChangesElement = document.createElement("span");
-            styleChangesElement.id = "style-changes-count";
-            styleChangesElement.textContent = this.styleChanges;
-            changesElement.appendChild(styleChangesElement);
-        }
-
-        if (this.styleChanges) {
-            if (this.styleChanges === 1)
-                changesElement.title = WebInspector.UIString("%d style change", this.styleChanges);
-            else
-                changesElement.title = WebInspector.UIString("%d style changes", this.styleChanges);
-        }
-    },
-
-    get hoveredDOMNode()
-    {
-        return this._hoveredDOMNode;
-    },
-
-    set hoveredDOMNode(x)
-    {
-        if (this._hoveredDOMNode === x)
-            return;
-
-        this._hoveredDOMNode = x;
-
-        if (this._hoveredDOMNode)
-            this._updateHoverHighlightSoon(this.showingDOMNodeHighlight ? 50 : 500);
-        else
-            this._updateHoverHighlight();
-    },
-
-    _updateHoverHighlightSoon: function(delay)
-    {
-        if ("_updateHoverHighlightTimeout" in this)
-            clearTimeout(this._updateHoverHighlightTimeout);
-        this._updateHoverHighlightTimeout = setTimeout(this._updateHoverHighlight.bind(this), delay);
-    },
-
-    _updateHoverHighlight: function()
-    {
-        if ("_updateHoverHighlightTimeout" in this) {
-            clearTimeout(this._updateHoverHighlightTimeout);
-            delete this._updateHoverHighlightTimeout;
-        }
-
-        if (this._hoveredDOMNode) {
-            InspectorBackend.highlightDOMNode(this._hoveredDOMNode.id);
-            this.showingDOMNodeHighlight = true;
-        } else {
-            InspectorBackend.hideDOMNodeHighlight();
-            this.showingDOMNodeHighlight = false;
-        }
-    }
-}
-
-WebInspector.loaded = function()
-{
-    var platform = WebInspector.platform;
-    document.body.addStyleClass("platform-" + platform);
-    var port = WebInspector.port;
-    document.body.addStyleClass("port-" + port);
-
-    this.settings = new WebInspector.Settings();
-
-    this.drawer = new WebInspector.Drawer();
-    this.console = new WebInspector.ConsoleView(this.drawer);
-    // TODO: Uncomment when enabling the Changes Panel
-    // this.changes = new WebInspector.ChangesView(this.drawer);
-    // TODO: Remove class="hidden" from inspector.html on button#changes-status-bar-item
-    this.drawer.visibleView = this.console;
-    this.domAgent = new WebInspector.DOMAgent();
-
-    this.resourceCategories = {
-        documents: new WebInspector.ResourceCategory("documents", WebInspector.UIString("Documents"), "rgb(47,102,236)"),
-        stylesheets: new WebInspector.ResourceCategory("stylesheets", WebInspector.UIString("Stylesheets"), "rgb(157,231,119)"),
-        images: new WebInspector.ResourceCategory("images", WebInspector.UIString("Images"), "rgb(164,60,255)"),
-        scripts: new WebInspector.ResourceCategory("scripts", WebInspector.UIString("Scripts"), "rgb(255,121,0)"),
-        xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),
-        fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),
-        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
-    };
-
-    this.panels = {};
-    this._createPanels();
-
-    var toolbarElement = document.getElementById("toolbar");
-    var previousToolbarItem = toolbarElement.children[0];
-
-    this.panelOrder = [];
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        var panelToolbarItem = panel.toolbarItem;
-        this.panelOrder.push(panel);
-        panelToolbarItem.addEventListener("click", this._toolbarItemClicked.bind(this));
-        if (previousToolbarItem)
-            toolbarElement.insertBefore(panelToolbarItem, previousToolbarItem.nextSibling);
-        else
-            toolbarElement.insertBefore(panelToolbarItem, toolbarElement.firstChild);
-        previousToolbarItem = panelToolbarItem;
-    }
-
-    this.Tips = {
-        ResourceNotCompressed: {id: 0, message: WebInspector.UIString("You could save bandwidth by having your web server compress this transfer with gzip or zlib.")}
-    };
-
-    this.Warnings = {
-        IncorrectMIMEType: {id: 0, message: WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s.")}
-    };
-
-    this.addMainEventListeners(document);
-
-    window.addEventListener("unload", this.windowUnload.bind(this), true);
-    window.addEventListener("resize", this.windowResize.bind(this), true);
-
-    document.addEventListener("focus", this.focusChanged.bind(this), true);
-    document.addEventListener("keydown", this.documentKeyDown.bind(this), false);
-    document.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);
-    document.addEventListener("copy", this.documentCopy.bind(this), true);
-    document.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);
-
-    var dockToggleButton = document.getElementById("dock-status-bar-item");
-    dockToggleButton.addEventListener("click", this.toggleAttach.bind(this), false);
-
-    if (this.attached)
-        dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
-    else
-        dockToggleButton.title = WebInspector.UIString("Dock to main window.");
-
-    var errorWarningCount = document.getElementById("error-warning-count");
-    errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);
-    this._updateErrorAndWarningCounts();
-
-    this.styleChanges = 0;
-    // TODO: Uncomment when enabling the Changes Panel
-    // var changesElement = document.getElementById("changes-count");
-    // changesElement.addEventListener("click", this.showChanges.bind(this), false);
-    // this._updateErrorAndWarningCounts();
-
-    var searchField = document.getElementById("search");
-    searchField.addEventListener("search", this.performSearch.bind(this), false); // when the search is emptied
-    searchField.addEventListener("mousedown", this._searchFieldManualFocus.bind(this), false); // when the search field is manually selected
-    searchField.addEventListener("keydown", this._searchKeyDown.bind(this), true);
-
-    toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);
-    document.getElementById("close-button-left").addEventListener("click", this.close, true);
-    document.getElementById("close-button-right").addEventListener("click", this.close, true);
-
-    InspectorFrontendHost.loaded();
-}
-
-var windowLoaded = function()
-{
-    var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();
-    if (localizedStringsURL) {
-        var localizedStringsScriptElement = document.createElement("script");
-        localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);
-        localizedStringsScriptElement.type = "text/javascript";
-        localizedStringsScriptElement.src = localizedStringsURL;
-        document.head.appendChild(localizedStringsScriptElement);
-    } else
-        WebInspector.loaded();
-
-    window.removeEventListener("load", windowLoaded, false);
-    delete windowLoaded;
-};
-
-window.addEventListener("load", windowLoaded, false);
-
-WebInspector.dispatch = function() {
-    var methodName = arguments[0];
-    var parameters = Array.prototype.slice.call(arguments, 1);
-
-    // We'd like to enforce asynchronous interaction between the inspector controller and the frontend.
-    // This is important to LayoutTests.
-    function delayDispatch()
-    {
-        WebInspector[methodName].apply(WebInspector, parameters);
-        WebInspector.pendingDispatches--;
-    }
-    WebInspector.pendingDispatches++;
-    setTimeout(delayDispatch, 0);
-}
-
-WebInspector.windowUnload = function(event)
-{
-    InspectorFrontendHost.windowUnloading();
-}
-
-WebInspector.windowResize = function(event)
-{
-    if (this.currentPanel && this.currentPanel.resize)
-        this.currentPanel.resize();
-    this.drawer.resize();
-}
-
-WebInspector.windowFocused = function(event)
-{
-    // Fires after blur, so when focusing on either the main inspector
-    // or an <iframe> within the inspector we should always remove the
-    // "inactive" class.
-    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
-        document.body.removeStyleClass("inactive");
-}
-
-WebInspector.windowBlurred = function(event)
-{
-    // Leaving the main inspector or an <iframe> within the inspector.
-    // We can add "inactive" now, and if we are moving the focus to another
-    // part of the inspector then windowFocused will correct this.
-    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
-        document.body.addStyleClass("inactive");
-}
-
-WebInspector.focusChanged = function(event)
-{
-    this.currentFocusElement = event.target;
-}
-
-WebInspector.setAttachedWindow = function(attached)
-{
-    this.attached = attached;
-}
-
-WebInspector.close = function(event)
-{
-    InspectorFrontendHost.closeWindow();
-}
-
-WebInspector.documentClick = function(event)
-{
-    var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");
-    if (!anchor)
-        return;
-
-    // Prevent the link from navigating, since we don't do any navigation by following links normally.
-    event.preventDefault();
-
-    function followLink()
-    {
-        // FIXME: support webkit-html-external-link links here.
-        if (WebInspector.canShowSourceLineForURL(anchor.href, anchor.preferredPanel)) {
-            if (anchor.hasStyleClass("webkit-html-external-link")) {
-                anchor.removeStyleClass("webkit-html-external-link");
-                anchor.addStyleClass("webkit-html-resource-link");
-            }
-
-            WebInspector.showSourceLineForURL(anchor.href, anchor.lineNumber, anchor.preferredPanel);
-        } else {
-            var profileString = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
-            if (profileString)
-                WebInspector.showProfileForURL(anchor.href);
-        }
-    }
-
-    if (WebInspector.followLinkTimeout)
-        clearTimeout(WebInspector.followLinkTimeout);
-
-    if (anchor.preventFollowOnDoubleClick) {
-        // Start a timeout if this is the first click, if the timeout is canceled
-        // before it fires, then a double clicked happened or another link was clicked.
-        if (event.detail === 1)
-            WebInspector.followLinkTimeout = setTimeout(followLink, 333);
-        return;
-    }
-
-    followLink();
-}
-
-WebInspector.documentKeyDown = function(event)
-{
-    if (this.currentFocusElement && this.currentFocusElement.handleKeyEvent) {
-        this.currentFocusElement.handleKeyEvent(event);
-        if (event.handled) {
-            event.preventDefault();
-            return;
-        }
-    }
-
-    if (this.currentPanel && this.currentPanel.handleShortcut) {
-        this.currentPanel.handleShortcut(event);
-        if (event.handled) {
-            event.preventDefault();
-            return;
-        }
-    }
-
-    var isMac = WebInspector.isMac();
-
-    switch (event.keyIdentifier) {
-        case "U+001B": // Escape key
-            event.preventDefault();
-            if (this.drawer.fullPanel)
-                return;
-
-            this.drawer.visible = !this.drawer.visible;
-            break;
-
-        case "U+0046": // F key
-            if (isMac)
-                var isFindKey = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
-            else
-                var isFindKey = event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;
-
-            if (isFindKey) {
-                var searchField = document.getElementById("search");
-                searchField.focus();
-                searchField.select();
-                event.preventDefault();
-            }
-
-            break;
-
-        case "U+0047": // G key
-            if (isMac)
-                var isFindAgainKey = event.metaKey && !event.ctrlKey && !event.altKey;
-            else
-                var isFindAgainKey = event.ctrlKey && !event.metaKey && !event.altKey;
-
-            if (isFindAgainKey) {
-                if (event.shiftKey) {
-                    if (this.currentPanel.jumpToPreviousSearchResult)
-                        this.currentPanel.jumpToPreviousSearchResult();
-                } else if (this.currentPanel.jumpToNextSearchResult)
-                    this.currentPanel.jumpToNextSearchResult();
-                event.preventDefault();
-            }
-
-            break;
-
-        // Windows and Mac have two different definitions of [, so accept both.
-        case "U+005B":
-        case "U+00DB": // [ key
-            if (isMac)
-                var isRotateLeft = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
-            else
-                var isRotateLeft = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-
-            if (isRotateLeft) {
-                var index = this.panelOrder.indexOf(this.currentPanel);
-                index = (index === 0) ? this.panelOrder.length - 1 : index - 1;
-                this.panelOrder[index].toolbarItem.click();
-                event.preventDefault();
-            }
-
-            break;
-
-        // Windows and Mac have two different definitions of ], so accept both.
-        case "U+005D":
-        case "U+00DD":  // ] key
-            if (isMac)
-                var isRotateRight = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
-            else
-                var isRotateRight = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-
-            if (isRotateRight) {
-                var index = this.panelOrder.indexOf(this.currentPanel);
-                index = (index + 1) % this.panelOrder.length;
-                this.panelOrder[index].toolbarItem.click();
-                event.preventDefault();
-            }
-
-            break;
-    }
-}
-
-WebInspector.documentCanCopy = function(event)
-{
-    if (this.currentPanel && this.currentPanel.handleCopyEvent)
-        event.preventDefault();
-}
-
-WebInspector.documentCopy = function(event)
-{
-    if (this.currentPanel && this.currentPanel.handleCopyEvent)
-        this.currentPanel.handleCopyEvent(event);
-}
-
-WebInspector.contextMenuEventFired = function(event)
-{
-    if (event.handled || event.target.hasStyleClass("popup-glasspane"))
-        event.preventDefault();
-}
-
-WebInspector.animateStyle = function(animations, duration, callback)
-{
-    var interval;
-    var complete = 0;
-
-    const intervalDuration = (1000 / 30); // 30 frames per second.
-    const animationsLength = animations.length;
-    const propertyUnit = {opacity: ""};
-    const defaultUnit = "px";
-
-    function cubicInOut(t, b, c, d)
-    {
-        if ((t/=d/2) < 1) return c/2*t*t*t + b;
-        return c/2*((t-=2)*t*t + 2) + b;
-    }
-
-    // Pre-process animations.
-    for (var i = 0; i < animationsLength; ++i) {
-        var animation = animations[i];
-        var element = null, start = null, end = null, key = null;
-        for (key in animation) {
-            if (key === "element")
-                element = animation[key];
-            else if (key === "start")
-                start = animation[key];
-            else if (key === "end")
-                end = animation[key];
-        }
-
-        if (!element || !end)
-            continue;
-
-        if (!start) {
-            var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);
-            start = {};
-            for (key in end)
-                start[key] = parseInt(computedStyle.getPropertyValue(key));
-            animation.start = start;
-        } else
-            for (key in start)
-                element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-    }
-
-    function animateLoop()
-    {
-        // Advance forward.
-        complete += intervalDuration;
-        var next = complete + intervalDuration;
-
-        // Make style changes.
-        for (var i = 0; i < animationsLength; ++i) {
-            var animation = animations[i];
-            var element = animation.element;
-            var start = animation.start;
-            var end = animation.end;
-            if (!element || !end)
-                continue;
-
-            var style = element.style;
-            for (key in end) {
-                var endValue = end[key];
-                if (next < duration) {
-                    var startValue = start[key];
-                    var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);
-                    style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-                } else
-                    style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
-            }
-        }
-
-        // End condition.
-        if (complete >= duration) {
-            clearInterval(interval);
-            if (callback)
-                callback();
-        }
-    }
-
-    interval = setInterval(animateLoop, intervalDuration);
-    return interval;
-}
-
-WebInspector.updateSearchLabel = function()
-{
-    if (!this.currentPanel)
-        return;
-
-    var newLabel = WebInspector.UIString("Search %s", this.currentPanel.toolbarItemLabel);
-    if (this.attached)
-        document.getElementById("search").setAttribute("placeholder", newLabel);
-    else {
-        document.getElementById("search").removeAttribute("placeholder");
-        document.getElementById("search-toolbar-label").textContent = newLabel;
-    }
-}
-
-WebInspector.toggleAttach = function()
-{
-    this.attached = !this.attached;
-    this.drawer.resize();
-}
-
-WebInspector.toolbarDragStart = function(event)
-{
-    if ((!WebInspector.attached && WebInspector.platform !== "mac-leopard") || WebInspector.port == "qt")
-        return;
-
-    var target = event.target;
-    if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))
-        return;
-
-    var toolbar = document.getElementById("toolbar");
-    if (target !== toolbar && !target.hasStyleClass("toolbar-item"))
-        return;
-
-    toolbar.lastScreenX = event.screenX;
-    toolbar.lastScreenY = event.screenY;
-
-    WebInspector.elementDragStart(toolbar, WebInspector.toolbarDrag, WebInspector.toolbarDragEnd, event, (WebInspector.attached ? "row-resize" : "default"));
-}
-
-WebInspector.toolbarDragEnd = function(event)
-{
-    var toolbar = document.getElementById("toolbar");
-
-    WebInspector.elementDragEnd(event);
-
-    delete toolbar.lastScreenX;
-    delete toolbar.lastScreenY;
-}
-
-WebInspector.toolbarDrag = function(event)
-{
-    var toolbar = document.getElementById("toolbar");
-
-    if (WebInspector.attached) {
-        var height = window.innerHeight - (event.screenY - toolbar.lastScreenY);
-
-        InspectorFrontendHost.setAttachedWindowHeight(height);
-    } else {
-        var x = event.screenX - toolbar.lastScreenX;
-        var y = event.screenY - toolbar.lastScreenY;
-
-        // We cannot call window.moveBy here because it restricts the movement
-        // of the window at the edges.
-        InspectorFrontendHost.moveWindowBy(x, y);
-    }
-
-    toolbar.lastScreenX = event.screenX;
-    toolbar.lastScreenY = event.screenY;
-
-    event.preventDefault();
-}
-
-WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)
-{
-    if (this._elementDraggingEventListener || this._elementEndDraggingEventListener)
-        this.elementDragEnd(event);
-
-    this._elementDraggingEventListener = dividerDrag;
-    this._elementEndDraggingEventListener = elementDragEnd;
-
-    document.addEventListener("mousemove", dividerDrag, true);
-    document.addEventListener("mouseup", elementDragEnd, true);
-
-    document.body.style.cursor = cursor;
-
-    event.preventDefault();
-}
-
-WebInspector.elementDragEnd = function(event)
-{
-    document.removeEventListener("mousemove", this._elementDraggingEventListener, true);
-    document.removeEventListener("mouseup", this._elementEndDraggingEventListener, true);
-
-    document.body.style.removeProperty("cursor");
-
-    delete this._elementDraggingEventListener;
-    delete this._elementEndDraggingEventListener;
-
-    event.preventDefault();
-}
-
-WebInspector.showConsole = function()
-{
-    this.drawer.showView(this.console);
-}
-
-WebInspector.showChanges = function()
-{
-    this.drawer.showView(this.changes);
-}
-
-WebInspector.showElementsPanel = function()
-{
-    this.currentPanel = this.panels.elements;
-}
-
-WebInspector.showResourcesPanel = function()
-{
-    this.currentPanel = this.panels.resources;
-}
-
-WebInspector.showScriptsPanel = function()
-{
-    this.currentPanel = this.panels.scripts;
-}
-
-WebInspector.showTimelinePanel = function()
-{
-    this.currentPanel = this.panels.timeline;
-}
-
-WebInspector.showProfilesPanel = function()
-{
-    this.currentPanel = this.panels.profiles;
-}
-
-WebInspector.showStoragePanel = function()
-{
-    this.currentPanel = this.panels.storage;
-}
-
-WebInspector.showConsolePanel = function()
-{
-    this.currentPanel = this.panels.console;
-}
-
-WebInspector.clearConsoleMessages = function()
-{
-    WebInspector.console.clearMessages();
-}
-
-WebInspector.selectDatabase = function(o)
-{
-    WebInspector.showStoragePanel();
-    WebInspector.panels.storage.selectDatabase(o);
-}
-
-WebInspector.selectDOMStorage = function(o)
-{
-    WebInspector.showStoragePanel();
-    WebInspector.panels.storage.selectDOMStorage(o);
-}
-
-WebInspector.updateResource = function(identifier, payload)
-{
-    var resource = this.resources[identifier];
-    if (!resource) {
-        resource = new WebInspector.Resource(identifier, payload.url);
-        this.resources[identifier] = resource;
-        this.resourceURLMap[resource.url] = resource;
-        if (this.panels.resources)
-            this.panels.resources.addResource(resource);
-    }
-
-    if (payload.didRequestChange) {
-        resource.domain = payload.host;
-        resource.path = payload.path;
-        resource.lastPathComponent = payload.lastPathComponent;
-        resource.requestHeaders = payload.requestHeaders;
-        resource.mainResource = payload.mainResource;
-        resource.requestMethod = payload.requestMethod;
-        resource.requestFormData = payload.requestFormData;
-        resource.cached = payload.cached;
-        resource.documentURL = payload.documentURL;
-
-        if (resource.mainResource)
-            this.mainResource = resource;
-
-        var match = payload.documentURL.match(WebInspector.URLRegExp);
-        if (match) {
-            var protocol = match[1].toLowerCase();
-            if (protocol.indexOf("http") === 0 || protocol === "file")
-                this.addCookieDomain(protocol === "file" ? "" : match[2]);
-        }
-    }
-
-    if (payload.didResponseChange) {
-        resource.mimeType = payload.mimeType;
-        resource.suggestedFilename = payload.suggestedFilename;
-        resource.expectedContentLength = payload.expectedContentLength;
-        resource.statusCode = payload.statusCode;
-        resource.suggestedFilename = payload.suggestedFilename;
-        resource.responseHeaders = payload.responseHeaders;
-    }
-
-    if (payload.didTypeChange) {
-        resource.type = payload.type;
-    }
-
-    if (payload.didLengthChange) {
-        resource.contentLength = payload.contentLength;
-    }
-
-    if (payload.didCompletionChange) {
-        resource.failed = payload.failed;
-        resource.finished = payload.finished;
-    }
-
-    if (payload.didTimingChange) {
-        if (payload.startTime)
-            resource.startTime = payload.startTime;
-        if (payload.responseReceivedTime)
-            resource.responseReceivedTime = payload.responseReceivedTime;
-        if (payload.endTime)
-            resource.endTime = payload.endTime;
-
-        if (payload.loadEventTime) {
-            // This loadEventTime is for the main resource, and we want to show it
-            // for all resources on this page. This means we want to set it as a member
-            // of the resources panel instead of the individual resource.
-            if (this.panels.resources)
-                this.panels.resources.mainResourceLoadTime = payload.loadEventTime;
-            if (this.panels.audits)
-                this.panels.audits.mainResourceLoadTime = payload.loadEventTime;
-        }
-
-        if (payload.domContentEventTime) {
-            // This domContentEventTime is for the main resource, so it should go in
-            // the resources panel for the same reasons as above.
-            if (this.panels.resources)
-                this.panels.resources.mainResourceDOMContentTime = payload.domContentEventTime;
-            if (this.panels.audits)
-                this.panels.audits.mainResourceDOMContentTime = payload.domContentEventTime;
-        }
-    }
-}
-
-WebInspector.removeResource = function(identifier)
-{
-    var resource = this.resources[identifier];
-    if (!resource)
-        return;
-
-    resource.category.removeResource(resource);
-    delete this.resourceURLMap[resource.url];
-    delete this.resources[identifier];
-
-    if (this.panels.resources)
-        this.panels.resources.removeResource(resource);
-}
-
-WebInspector.addDatabase = function(payload)
-{
-    if (!this.panels.storage)
-        return;
-    var database = new WebInspector.Database(
-        payload.id,
-        payload.domain,
-        payload.name,
-        payload.version);
-    this.panels.storage.addDatabase(database);
-}
-
-WebInspector.addCookieDomain = function(domain)
-{
-    // Eliminate duplicate domains from the list.
-    if (domain in this.cookieDomains)
-        return;
-    this.cookieDomains[domain] = true;
-
-    if (!this.panels.storage)
-        return;
-    this.panels.storage.addCookieDomain(domain);
-}
-
-WebInspector.addDOMStorage = function(payload)
-{
-    if (!this.panels.storage)
-        return;
-    var domStorage = new WebInspector.DOMStorage(
-        payload.id,
-        payload.host,
-        payload.isLocalStorage);
-    this.panels.storage.addDOMStorage(domStorage);
-}
-
-WebInspector.updateDOMStorage = function(storageId)
-{
-    if (!this.panels.storage)
-        return;
-    this.panels.storage.updateDOMStorage(storageId);
-}
-
-WebInspector.resourceTrackingWasEnabled = function()
-{
-    this.panels.resources.resourceTrackingWasEnabled();
-}
-
-WebInspector.resourceTrackingWasDisabled = function()
-{
-    this.panels.resources.resourceTrackingWasDisabled();
-}
-
-WebInspector.attachDebuggerWhenShown = function()
-{
-    this.panels.scripts.attachDebuggerWhenShown();
-}
-
-WebInspector.debuggerWasEnabled = function()
-{
-    this.panels.scripts.debuggerWasEnabled();
-}
-
-WebInspector.debuggerWasDisabled = function()
-{
-    this.panels.scripts.debuggerWasDisabled();
-}
-
-WebInspector.profilerWasEnabled = function()
-{
-    this.panels.profiles.profilerWasEnabled();
-}
-
-WebInspector.profilerWasDisabled = function()
-{
-    this.panels.profiles.profilerWasDisabled();
-}
-
-WebInspector.parsedScriptSource = function(sourceID, sourceURL, source, startingLine)
-{
-    this.panels.scripts.addScript(sourceID, sourceURL, source, startingLine);
-}
-
-WebInspector.failedToParseScriptSource = function(sourceURL, source, startingLine, errorLine, errorMessage)
-{
-    this.panels.scripts.addScript(null, sourceURL, source, startingLine, errorLine, errorMessage);
-}
-
-WebInspector.pausedScript = function(callFrames)
-{
-    this.panels.scripts.debuggerPaused(callFrames);
-}
-
-WebInspector.resumedScript = function()
-{
-    this.panels.scripts.debuggerResumed();
-}
-
-WebInspector.populateInterface = function()
-{
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        if ("populateInterface" in panel)
-            panel.populateInterface();
-    }
-}
-
-WebInspector.reset = function()
-{
-    for (var panelName in this.panels) {
-        var panel = this.panels[panelName];
-        if ("reset" in panel)
-            panel.reset();
-    }
-
-    for (var category in this.resourceCategories)
-        this.resourceCategories[category].removeAllResources();
-
-    this.resources = {};
-    this.resourceURLMap = {};
-    this.cookieDomains = {};
-    this.hoveredDOMNode = null;
-
-    delete this.mainResource;
-
-    this.console.clearMessages();
-}
-
-WebInspector.resourceURLChanged = function(resource, oldURL)
-{
-    delete this.resourceURLMap[oldURL];
-    this.resourceURLMap[resource.url] = resource;
-}
-
-WebInspector.didCommitLoad = function()
-{
-    // Cleanup elements panel early on inspected page refresh.
-    WebInspector.setDocument(null);
-}
-
-WebInspector.updateConsoleMessageExpiredCount = function(count)
-{
-    var message = String.sprintf(WebInspector.UIString("%d console messages are not shown."), count);
-    WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(message, WebInspector.ConsoleMessage.MessageLevel.Warning));
-}
-
-WebInspector.addConsoleMessage = function(payload)
-{
-    var consoleMessage = new WebInspector.ConsoleMessage(
-        payload.source,
-        payload.type,
-        payload.level,
-        payload.line,
-        payload.url,
-        payload.groupLevel,
-        payload.repeatCount);
-    consoleMessage.setMessageBody(Array.prototype.slice.call(arguments, 1));
-    this.console.addMessage(consoleMessage);
-}
-
-WebInspector.updateConsoleMessageRepeatCount = function(count)
-{
-    this.console.updateMessageRepeatCount(count);
-}
-
-WebInspector.log = function(message)
-{
-    // remember 'this' for setInterval() callback
-    var self = this;
-
-    // return indication if we can actually log a message
-    function isLogAvailable()
-    {
-        return WebInspector.ConsoleMessage && WebInspector.ObjectProxy && self.console;
-    }
-
-    // flush the queue of pending messages
-    function flushQueue()
-    {
-        var queued = WebInspector.log.queued;
-        if (!queued)
-            return;
-
-        for (var i = 0; i < queued.length; ++i)
-            logMessage(queued[i]);
-
-        delete WebInspector.log.queued;
-    }
-
-    // flush the queue if it console is available
-    // - this function is run on an interval
-    function flushQueueIfAvailable()
-    {
-        if (!isLogAvailable())
-            return;
-
-        clearInterval(WebInspector.log.interval);
-        delete WebInspector.log.interval;
-
-        flushQueue();
-    }
-
-    // actually log the message
-    function logMessage(message)
-    {
-        var repeatCount = 1;
-        if (message == WebInspector.log.lastMessage)
-            repeatCount = WebInspector.log.repeatCount + 1;
-
-        WebInspector.log.lastMessage = message;
-        WebInspector.log.repeatCount = repeatCount;
-
-        // ConsoleMessage expects a proxy object
-        message = new WebInspector.ObjectProxy(null, [], 0, message, false);
-
-        // post the message
-        var msg = new WebInspector.ConsoleMessage(
-            WebInspector.ConsoleMessage.MessageSource.Other,
-            WebInspector.ConsoleMessage.MessageType.Log,
-            WebInspector.ConsoleMessage.MessageLevel.Debug,
-            -1,
-            null,
-            null,
-            repeatCount,
-            message);
-
-        self.console.addMessage(msg);
-    }
-
-    // if we can't log the message, queue it
-    if (!isLogAvailable()) {
-        if (!WebInspector.log.queued)
-            WebInspector.log.queued = [];
-
-        WebInspector.log.queued.push(message);
-
-        if (!WebInspector.log.interval)
-            WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);
-
-        return;
-    }
-
-    // flush the pending queue if any
-    flushQueue();
-
-    // log the message
-    logMessage(message);
-}
-
-WebInspector.addProfileHeader = function(profile)
-{
-    this.panels.profiles.addProfileHeader(profile);
-}
-
-WebInspector.setRecordingProfile = function(isProfiling)
-{
-    this.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);
-    this.panels.profiles.updateProfileTypeButtons();
-}
-
-WebInspector.drawLoadingPieChart = function(canvas, percent) {
-    var g = canvas.getContext("2d");
-    var darkColor = "rgb(122, 168, 218)";
-    var lightColor = "rgb(228, 241, 251)";
-    var cx = 8;
-    var cy = 8;
-    var r = 7;
-
-    g.beginPath();
-    g.arc(cx, cy, r, 0, Math.PI * 2, false);
-    g.closePath();
-
-    g.lineWidth = 1;
-    g.strokeStyle = darkColor;
-    g.fillStyle = lightColor;
-    g.fill();
-    g.stroke();
-
-    var startangle = -Math.PI / 2;
-    var endangle = startangle + (percent * Math.PI * 2);
-
-    g.beginPath();
-    g.moveTo(cx, cy);
-    g.arc(cx, cy, r, startangle, endangle, false);
-    g.closePath();
-
-    g.fillStyle = darkColor;
-    g.fill();
-}
-
-WebInspector.updateFocusedNode = function(nodeId)
-{
-    var node = WebInspector.domAgent.nodeForId(nodeId);
-    if (!node)
-        // FIXME: Should we deselect if null is passed in?
-        return;
-
-    this.currentPanel = this.panels.elements;
-    this.panels.elements.focusedDOMNode = node;
-}
-
-WebInspector.displayNameForURL = function(url)
-{
-    if (!url)
-        return "";
-    var resource = this.resourceURLMap[url];
-    if (resource)
-        return resource.displayName;
-    return url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
-}
-
-WebInspector.resourceForURL = function(url)
-{
-    if (url in this.resourceURLMap)
-        return this.resourceURLMap[url];
-
-    // No direct match found. Search for resources that contain
-    // a substring of the URL.
-    for (var resourceURL in this.resourceURLMap) {
-        if (resourceURL.hasSubstring(url))
-            return this.resourceURLMap[resourceURL];
-    }
-
-    return null;
-}
-
-WebInspector._choosePanelToShowSourceLineForURL = function(url, preferredPanel)
-{
-    preferredPanel = preferredPanel || "resources";
-    var panel = this.panels[preferredPanel];
-    if (panel && panel.canShowSourceLineForURL(url))
-        return panel;
-    panel = this.panels.resources;
-    return panel.canShowSourceLineForURL(url) ? panel : null;
-}
-
-WebInspector.canShowSourceLineForURL = function(url, preferredPanel)
-{
-    return !!this._choosePanelToShowSourceLineForURL(url, preferredPanel);
-}
-
-WebInspector.showSourceLineForURL = function(url, line, preferredPanel)
-{
-    this.currentPanel = this._choosePanelToShowSourceLineForURL(url, preferredPanel);
-    if (!this.currentPanel)
-        return false;
-    this.currentPanel.showSourceLineForURL(url, line);
-    return true;
-}
-
-WebInspector.linkifyStringAsFragment = function(string)
-{
-    var container = document.createDocumentFragment();
-    var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;
-
-    while (string) {
-        var linkString = linkStringRegEx.exec(string);
-        if (!linkString)
-            break;
-
-        linkString = linkString[0];
-        var title = linkString;
-        var linkIndex = string.indexOf(linkString);
-        var nonLink = string.substring(0, linkIndex);
-        container.appendChild(document.createTextNode(nonLink));
-
-        var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);
-        if (profileStringMatches)
-            title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);
-
-        var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);
-        container.appendChild(WebInspector.linkifyURLAsNode(realURL, title, null, (realURL in WebInspector.resourceURLMap)));
-        string = string.substring(linkIndex + linkString.length, string.length);
-    }
-
-    if (string)
-        container.appendChild(document.createTextNode(string));
-
-    return container;
-}
-
-WebInspector.showProfileForURL = function(url)
-{
-    WebInspector.showProfilesPanel();
-    WebInspector.panels.profiles.showProfileForURL(url);
-}
-
-WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
-{
-    if (!linkText)
-        linkText = url;
-    classes = (classes ? classes + " " : "");
-    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";
-
-    var a = document.createElement("a");
-    a.href = url;
-    a.className = classes;
-    a.title = tooltipText || url;
-    a.target = "_blank";
-    a.textContent = linkText;
-
-    return a;
-}
-
-WebInspector.linkifyURL = function(url, linkText, classes, isExternal, tooltipText)
-{
-    // Use the DOM version of this function so as to avoid needing to escape attributes.
-    // FIXME:  Get rid of linkifyURL entirely.
-    return WebInspector.linkifyURLAsNode(url, linkText, classes, isExternal, tooltipText).outerHTML;
-}
-
-WebInspector.addMainEventListeners = function(doc)
-{
-    doc.defaultView.addEventListener("focus", this.windowFocused.bind(this), false);
-    doc.defaultView.addEventListener("blur", this.windowBlurred.bind(this), false);
-    doc.addEventListener("click", this.documentClick.bind(this), true);
-}
-
-WebInspector._searchFieldManualFocus = function(event)
-{
-    this.currentFocusElement = event.target;
-    this._previousFocusElement = event.target;
-}
-
-WebInspector._searchKeyDown = function(event)
-{
-    // Escape Key will clear the field and clear the search results
-    if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
-        // If focus belongs here and text is empty - nothing to do, return unhandled.
-        if (event.target.value === "" && this.currentFocusElement === this.previousFocusElement)
-            return;
-        event.preventDefault();
-        event.stopPropagation();
-        // When search was selected manually and is currently blank, we'd like Esc stay unhandled
-        // and hit console drawer handler.
-        event.target.value = "";
-
-        this.performSearch(event);
-        this.currentFocusElement = this.previousFocusElement;
-        if (this.currentFocusElement === event.target)
-            this.currentFocusElement.select();
-        return false;
-    }
-
-    if (!isEnterKey(event))
-        return false;
-
-    // Select all of the text so the user can easily type an entirely new query.
-    event.target.select();
-
-    // Only call performSearch if the Enter key was pressed. Otherwise the search
-    // performance is poor because of searching on every key. The search field has
-    // the incremental attribute set, so we still get incremental searches.
-    this.performSearch(event);
-
-    // Call preventDefault since this was the Enter key. This prevents a "search" event
-    // from firing for key down. This stops performSearch from being called twice in a row.
-    event.preventDefault();
-}
-
-WebInspector.performSearch = function(event)
-{
-    var query = event.target.value;
-    var forceSearch = event.keyIdentifier === "Enter";
-    var isShortSearch = (query.length < 3);
-
-    // Clear a leftover short search flag due to a non-conflicting forced search.
-    if (isShortSearch && this.shortSearchWasForcedByKeyEvent && this.currentQuery !== query)
-        delete this.shortSearchWasForcedByKeyEvent;
-
-    // Indicate this was a forced search on a short query.
-    if (isShortSearch && forceSearch)
-        this.shortSearchWasForcedByKeyEvent = true;
-
-    if (!query || !query.length || (!forceSearch && isShortSearch)) {
-        // Prevent clobbering a short search forced by the user.
-        if (this.shortSearchWasForcedByKeyEvent) {
-            delete this.shortSearchWasForcedByKeyEvent;
-            return;
-        }
-
-        delete this.currentQuery;
-
-        for (var panelName in this.panels) {
-            var panel = this.panels[panelName];
-            if (panel.currentQuery && panel.searchCanceled)
-                panel.searchCanceled();
-            delete panel.currentQuery;
-        }
-
-        this.updateSearchMatchesCount();
-
-        return;
-    }
-
-    if (query === this.currentPanel.currentQuery && this.currentPanel.currentQuery === this.currentQuery) {
-        // When this is the same query and a forced search, jump to the next
-        // search result for a good user experience.
-        if (forceSearch && this.currentPanel.jumpToNextSearchResult)
-            this.currentPanel.jumpToNextSearchResult();
-        return;
-    }
-
-    this.currentQuery = query;
-
-    this.updateSearchMatchesCount();
-
-    if (!this.currentPanel.performSearch)
-        return;
-
-    this.currentPanel.currentQuery = query;
-    this.currentPanel.performSearch(query);
-}
-
-WebInspector.addNodesToSearchResult = function(nodeIds)
-{
-    WebInspector.panels.elements.addNodesToSearchResult(nodeIds);
-}
-
-WebInspector.updateSearchMatchesCount = function(matches, panel)
-{
-    if (!panel)
-        panel = this.currentPanel;
-
-    panel.currentSearchMatches = matches;
-
-    if (panel !== this.currentPanel)
-        return;
-
-    if (!this.currentPanel.currentQuery) {
-        document.getElementById("search-results-matches").addStyleClass("hidden");
-        return;
-    }
-
-    if (matches) {
-        if (matches === 1)
-            var matchesString = WebInspector.UIString("1 match");
-        else
-            var matchesString = WebInspector.UIString("%d matches", matches);
-    } else
-        var matchesString = WebInspector.UIString("Not Found");
-
-    var matchesToolbarElement = document.getElementById("search-results-matches");
-    matchesToolbarElement.removeStyleClass("hidden");
-    matchesToolbarElement.textContent = matchesString;
-}
-
-WebInspector.UIString = function(string)
-{
-    if (window.localizedStrings && string in window.localizedStrings)
-        string = window.localizedStrings[string];
-    else {
-        if (!(string in this.missingLocalizedStrings)) {
-            if (!WebInspector.InspectorBackendStub)
-                console.error("Localized string \"" + string + "\" not found.");
-            this.missingLocalizedStrings[string] = true;
-        }
-
-        if (Preferences.showMissingLocalizedStrings)
-            string += " (not localized)";
-    }
-
-    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
-}
-
-WebInspector.isMac = function()
-{
-    if (!("_isMac" in this))
-        this._isMac = WebInspector.platform.indexOf("mac-") === 0;
-
-    return this._isMac;
-}
-
-WebInspector.isBeingEdited = function(element)
-{
-    return element.__editing;
-}
-
-WebInspector.startEditing = function(element, committedCallback, cancelledCallback, context, multiline)
-{
-    if (element.__editing)
-        return;
-    element.__editing = true;
-
-    var oldText = getContent(element);
-    var moveDirection = "";
-
-    element.addStyleClass("editing");
-
-    var oldTabIndex = element.tabIndex;
-    if (element.tabIndex < 0)
-        element.tabIndex = 0;
-
-    function blurEventListener() {
-        editingCommitted.call(element);
-    }
-
-    function getContent(element) {
-        if (element.tagName === "INPUT" && element.type === "text")
-            return element.value;
-        else
-            return element.textContent;
-    }
-
-    function cleanUpAfterEditing() {
-        delete this.__editing;
-
-        this.removeStyleClass("editing");
-        this.tabIndex = oldTabIndex;
-        this.scrollTop = 0;
-        this.scrollLeft = 0;
-
-        element.removeEventListener("blur", blurEventListener, false);
-        element.removeEventListener("keydown", keyDownEventListener, true);
-
-        if (element === WebInspector.currentFocusElement || element.isAncestor(WebInspector.currentFocusElement))
-            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
-    }
-
-    function editingCancelled() {
-        if (this.tagName === "INPUT" && this.type === "text")
-            this.value = oldText;
-        else
-            this.textContent = oldText;
-
-        cleanUpAfterEditing.call(this);
-
-        if (cancelledCallback)
-            cancelledCallback(this, context);
-    }
-
-    function editingCommitted() {
-        cleanUpAfterEditing.call(this);
-
-        if (committedCallback)
-            committedCallback(this, getContent(this), oldText, context, moveDirection);
-    }
-
-    function keyDownEventListener(event) {
-        var isMetaOrCtrl = WebInspector.isMac() ?
-            event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
-            event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
-        if (isEnterKey(event) && (!multiline || isMetaOrCtrl)) {
-            editingCommitted.call(element);
-            event.preventDefault();
-            event.stopPropagation();
-        } else if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
-            editingCancelled.call(element);
-            event.preventDefault();
-            event.stopPropagation();
-        } else if (event.keyIdentifier === "U+0009") // Tab key
-            moveDirection = (event.shiftKey ? "backward" : "forward");
-    }
-
-    element.addEventListener("blur", blurEventListener, false);
-    element.addEventListener("keydown", keyDownEventListener, true);
-
-    WebInspector.currentFocusElement = element;
-}
-
-WebInspector._toolbarItemClicked = function(event)
-{
-    var toolbarItem = event.currentTarget;
-    this.currentPanel = toolbarItem.panel;
-}
-
-// This table maps MIME types to the Resource.Types which are valid for them.
-// The following line:
-//    "text/html":                {0: 1},
-// means that text/html is a valid MIME type for resources that have type
-// WebInspector.Resource.Type.Document (which has a value of 0).
-WebInspector.MIMETypes = {
-    "text/html":                   {0: true},
-    "text/xml":                    {0: true},
-    "text/plain":                  {0: true},
-    "application/xhtml+xml":       {0: true},
-    "text/css":                    {1: true},
-    "text/xsl":                    {1: true},
-    "image/jpeg":                  {2: true},
-    "image/png":                   {2: true},
-    "image/gif":                   {2: true},
-    "image/bmp":                   {2: true},
-    "image/vnd.microsoft.icon":    {2: true},
-    "image/x-icon":                {2: true},
-    "image/x-xbitmap":             {2: true},
-    "font/ttf":                    {3: true},
-    "font/opentype":               {3: true},
-    "application/x-font-type1":    {3: true},
-    "application/x-font-ttf":      {3: true},
-    "application/x-truetype-font": {3: true},
-    "text/javascript":             {4: true},
-    "text/ecmascript":             {4: true},
-    "application/javascript":      {4: true},
-    "application/ecmascript":      {4: true},
-    "application/x-javascript":    {4: true},
-    "text/javascript1.1":          {4: true},
-    "text/javascript1.2":          {4: true},
-    "text/javascript1.3":          {4: true},
-    "text/jscript":                {4: true},
-    "text/livescript":             {4: true},
-}
-
-/* InspectorBackendStub.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-if (!window.InspectorBackend) {
-
-WebInspector.InspectorBackendStub = function()
-{
-    this._searchingForNode = false;
-    this._attachedWindowHeight = 0;
-    this._debuggerEnabled = true;
-    this._profilerEnabled = true;
-    this._resourceTrackingEnabled = false;
-    this._timelineEnabled = false;
-}
-
-WebInspector.InspectorBackendStub.prototype = {
-    wrapCallback: function(func)
-    {
-        return func;
-    },
-
-    platform: function()
-    {
-        return "mac-leopard";
-    },
-
-    port: function()
-    {
-        return "unknown";
-    },
-
-
-    closeWindow: function()
-    {
-        this._windowVisible = false;
-    },
-
-    attach: function()
-    {
-    },
-
-    detach: function()
-    {
-    },
-
-    storeLastActivePanel: function(panel)
-    {
-    },
-
-    clearMessages: function()
-    {
-    },
-
-    searchingForNode: function()
-    {
-        return this._searchingForNode;
-    },
-
-    search: function(sourceRow, query)
-    {
-    },
-
-    toggleNodeSearch: function()
-    {
-        this._searchingForNode = !this._searchingForNode;
-    },
-
-    setAttachedWindowHeight: function(height)
-    {
-    },
-
-    moveByUnrestricted: function(x, y)
-    {
-    },
-
-
-    addResourceSourceToFrame: function(identifier, element)
-    {
-    },
-
-    addSourceToFrame: function(mimeType, source, element)
-    {
-        return false;
-    },
-
-    getResourceDocumentNode: function(identifier)
-    {
-        return undefined;
-    },
-
-    highlightDOMNode: function(node)
-    {
-    },
-
-    hideDOMNodeHighlight: function()
-    {
-    },
-
-    inspectedWindow: function()
-    {
-        return window;
-    },
-
-    loaded: function()
-    {
-    },
-
-    localizedStringsURL: function()
-    {
-        return undefined;
-    },
-
-    windowUnloading: function()
-    {
-        return false;
-    },
-
-    hiddenPanels: function()
-    {
-        return "";
-    },
-
-    debuggerEnabled: function()
-    {
-        return this._debuggerEnabled;
-    },
-
-    enableResourceTracking: function()
-    {
-        this._resourceTrackingEnabled = true;
-        WebInspector.resourceTrackingWasEnabled();
-    },
-
-    disableResourceTracking: function()
-    {
-        this._resourceTrackingEnabled = false;
-        WebInspector.resourceTrackingWasDisabled();
-    },
-
-    resourceTrackingEnabled: function()
-    {
-        return this._resourceTrackingEnabled;
-    },
-
-    enableDebugger: function()
-    {
-        this._debuggerEnabled = true;
-    },
-
-    disableDebugger: function()
-    {
-        this._debuggerEnabled = false;
-    },
-
-    addBreakpoint: function(sourceID, line, condition)
-    {
-    },
-
-    removeBreakpoint: function(sourceID, line)
-    {
-    },
-
-    updateBreakpoint: function(sourceID, line, condition)
-    {
-    },
-
-    pauseInDebugger: function()
-    {
-    },
-
-    pauseOnExceptions: function()
-    {
-        return false;
-    },
-
-    setPauseOnExceptions: function(value)
-    {
-    },
-
-    resumeDebugger: function()
-    {
-    },
-
-    profilerEnabled: function()
-    {
-        return true;
-    },
-
-    enableProfiler: function()
-    {
-        this._profilerEnabled = true;
-    },
-
-    disableProfiler: function()
-    {
-        this._profilerEnabled = false;
-    },
-
-    startProfiling: function()
-    {
-    },
-
-    stopProfiling: function()
-    {
-    },
-
-    getProfileHeaders: function(callId)
-    {
-        WebInspector.didGetProfileHeaders(callId, []);
-    },
-
-    getProfile: function(callId, uid)
-    {
-        if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
-        {
-            WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
-        }
-    },
-
-    takeHeapSnapshot: function()
-    {
-    },
-
-    databaseTableNames: function(database)
-    {
-        return [];
-    },
-
-    stepIntoStatementInDebugger: function()
-    {
-    },
-
-    stepOutOfFunctionInDebugger: function()
-    {
-    },
-
-    stepOverStatementInDebugger: function()
-    {
-    },
-
-    saveFrontendSettings: function()
-    {
-    },
-
-    dispatchOnInjectedScript: function()
-    {
-    },
-
-    releaseWrapperObjectGroup: function()
-    {
-    }
-}
-
-InspectorBackend = new WebInspector.InspectorBackendStub();
-
-}
-
-/* InspectorFrontendHostStub.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-if (!window.InspectorFrontendHost) {
-
-WebInspector.InspectorFrontendHostStub = function()
-{
-    this._attachedWindowHeight = 0;
-}
-
-WebInspector.InspectorFrontendHostStub.prototype = {
-    platform: function()
-    {
-        return "mac-leopard";
-    },
-
-    port: function()
-    {
-        return "unknown";
-    },
-
-    closeWindow: function()
-    {
-        this._windowVisible = false;
-    },
-
-    attach: function()
-    {
-    },
-
-    detach: function()
-    {
-    },
-
-    search: function(sourceRow, query)
-    {
-    },
-
-    setAttachedWindowHeight: function(height)
-    {
-    },
-
-    moveWindowBy: function(x, y)
-    {
-    },
-
-    addResourceSourceToFrame: function(identifier, element)
-    {
-    },
-
-    addSourceToFrame: function(mimeType, source, element)
-    {
-        return false;
-    },
-
-    loaded: function()
-    {
-    },
-
-    localizedStringsURL: function()
-    {
-        return undefined;
-    },
-
-    hiddenPanels: function()
-    {
-        return "";
-    },
-
-    windowUnloading: function()
-    {
-    }
-}
-
-InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
-
-}
-
-/* Object.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Object = function() {
-}
-
-WebInspector.Object.prototype = {
-    addEventListener: function(eventType, listener, thisObject) {
-        if (!("_listeners" in this))
-            this._listeners = {};
-        if (!(eventType in this._listeners))
-            this._listeners[eventType] = [];
-        this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
-    },
-
-    removeEventListener: function(eventType, listener, thisObject) {
-        if (!("_listeners" in this) || !(eventType in this._listeners))
-            return;
-        var listeners = this._listeners[eventType];
-        for (var i = 0; i < listeners.length; ++i) {
-            if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
-                listeners.splice(i, 1);
-            else if (!listener && thisObject && listeners[i].thisObject === thisObject)
-                listeners.splice(i, 1);
-        }
-
-        if (!listeners.length)
-            delete this._listeners[eventType];
-    },
-
-    dispatchEventToListeners: function(eventType) {
-        if (!("_listeners" in this) || !(eventType in this._listeners))
-            return;
-
-        var stoppedPropagation = false;
-
-        function stopPropagation()
-        {
-            stoppedPropagation = true;
-        }
-
-        function preventDefault()
-        {
-            this.defaultPrevented = true;
-        }
-
-        var event = {target: this, type: eventType, defaultPrevented: false};
-        event.stopPropagation = stopPropagation;
-        event.preventDefault = preventDefault;
-
-        var listeners = this._listeners[eventType].slice(0);
-        for (var i = 0; i < listeners.length; ++i) {
-            listeners[i].listener.call(listeners[i].thisObject, event);
-            if (stoppedPropagation)
-                break;
-        }
-
-        return event.defaultPrevented;
-    }
-}
-
-/* Settings.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-var Preferences = {
-    maxInlineTextChildLength: 80,
-    minConsoleHeight: 75,
-    minSidebarWidth: 100,
-    minElementsSidebarWidth: 200,
-    minScriptsSidebarWidth: 200,
-    styleRulesExpandedState: {},
-    showMissingLocalizedStrings: false,
-    heapProfilerPresent: false,
-    samplingCPUProfiler: false,
-    showColorNicknames: true
-}
-
-WebInspector.populateFrontendSettings = function(settingsString)
-{
-    WebInspector.settings._load(settingsString);
-}
-
-WebInspector.Settings = function()
-{
-}
-
-WebInspector.Settings.prototype = {
-    _load: function(settingsString)
-    {
-        try {
-            this._store = JSON.parse(settingsString);
-        } catch (e) {
-            // May fail;
-            this._store = {};
-        }
-
-        this._installSetting("eventListenersFilter", "event-listeners-filter", "all");
-        this._installSetting("colorFormat", "color-format", "hex");
-        this._installSetting("resourcesLargeRows", "resources-large-rows", true);
-        this._installSetting("watchExpressions", "watch-expressions", []);
-        this._installSetting("lastViewedScriptFile", "last-viewed-script-file");
-        this._installSetting("showInheritedComputedStyleProperties", "show-inherited-computed-style-properties", false);
-        this._installSetting("showUserAgentStyles", "show-user-agent-styles", true);
-        this.dispatchEventToListeners("loaded");
-    },
-
-    _installSetting: function(name, propertyName, defaultValue)
-    {
-        this.__defineGetter__(name, this._get.bind(this, propertyName));
-        this.__defineSetter__(name, this._set.bind(this, propertyName));
-        if (!(propertyName in this._store)) {
-            this._store[propertyName] = defaultValue;
-        }
-    },
-
-    _get: function(propertyName)
-    {
-        return this._store[propertyName];
-    },
-
-    _set: function(propertyName, newValue)
-    {
-        this._store[propertyName] = newValue;
-        try {
-            InspectorBackend.saveFrontendSettings(JSON.stringify(this._store));
-        } catch (e) {
-            // May fail;
-        }
-    }
-}
-
-WebInspector.Settings.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ContextMenu.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ContextMenu = function() {
-    this._items = [];
-    this._handlers = {};
-}
-
-WebInspector.ContextMenu.prototype = {
-    show: function(event)
-    {
-        // Remove trailing separator.
-        while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))
-            this._items.splice(this._items.length - 1, 1);
-
-        if (this._items.length) {
-            WebInspector._contextMenu = this;
-            InspectorFrontendHost.showContextMenu(event, this._items);
-        }
-    },
-
-    appendItem: function(label, handler)
-    {
-        var id = this._items.length;
-        this._items.push({id: id, label: label});
-        this._handlers[id] = handler;
-    },
-
-    appendSeparator: function()
-    {
-        // No separator dupes allowed.
-        if (this._items.length === 0)
-            return;
-        if (!("id" in this._items[this._items.length - 1]))
-            return;
-        this._items.push({});
-    },
-
-    _itemSelected: function(id)
-    {
-        if (this._handlers[id])
-            this._handlers[id].call(this);
-    }
-}
-
-WebInspector.contextMenuItemSelected = function(id)
-{
-    if (WebInspector._contextMenu)
-        WebInspector._contextMenu._itemSelected(id);
-}
-
-WebInspector.contextMenuCleared = function()
-{
-    // FIXME: Unfortunately, contextMenuCleared is invoked between show and item selected
-    // so we can't delete last menu object from WebInspector. Fix the contract.
-}
-
-/* KeyboardShortcut.js */
-
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.KeyboardShortcut = function()
-{
-};
-
-/**
- * Constants for encoding modifier key set as a bit mask.
- * @see #_makeKeyFromCodeAndModifiers
- */
-WebInspector.KeyboardShortcut.Modifiers = {
-    None: 0,   // Constant for empty modifiers set.
-    Shift: 1,
-    Ctrl: 2,
-    Alt: 4,
-    Meta: 8    // Command key on Mac, Win key on other platforms.
-};
-
-WebInspector.KeyboardShortcut.KeyCodes = {
-    Backspace: 8,
-    Esc: 27,
-    Space: 32,
-    PageUp: 33,      // also NUM_NORTH_EAST
-    PageDown: 34,    // also NUM_SOUTH_EAST
-    End: 35,         // also NUM_SOUTH_WEST
-    Home: 36,        // also NUM_NORTH_WEST
-    Left: 37,        // also NUM_WEST
-    Up: 38,          // also NUM_NORTH
-    Right: 39,       // also NUM_EAST
-    Down: 40,        // also NUM_SOUTH
-    Delete: 46,
-    F1: 112,
-    F2: 113,
-    F3: 114,
-    F4: 115,
-    F5: 116,
-    F6: 117,
-    F7: 118,
-    F8: 119,
-    F9: 120,
-    F10: 121,
-    F11: 122,
-    F12: 123,
-    Semicolon: 186,    // ;
-    Comma: 188,        // ,
-    Period: 190,       // .
-    Slash: 191,        // /
-    Apostrophe: 192,   // `
-    SingleQuote: 222,  // '
-};
-
-/**
- * Creates a number encoding keyCode in the lower 8 bits and modifiers mask in the higher 8 bits.
- * It is useful for matching pressed keys.
- * keyCode is the Code of the key, or a character "a-z" which is converted to a keyCode value.
- * optModifiers is an Optional list of modifiers passed as additional paramerters.
- */
-WebInspector.KeyboardShortcut.makeKey = function(keyCode, optModifiers)
-{
-    if (typeof keyCode === "string")
-        keyCode = keyCode.charCodeAt(0) - 32;
-    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
-    for (var i = 1; i < arguments.length; i++)
-        modifiers |= arguments[i];
-    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);
-};
-
-WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)
-{
-    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
-    if (keyboardEvent.shiftKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;
-    if (keyboardEvent.ctrlKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-    if (keyboardEvent.altKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;
-    if (keyboardEvent.metaKey)
-        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;
-    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);
-};
-
-WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)
-{
-    return (keyCode & 255) | (modifiers << 8);
-};
-
-/* TextPrompt.js */
-
-/*
- * Copyright (C) 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TextPrompt = function(element, completions, stopCharacters)
-{
-    this.element = element;
-    this.completions = completions;
-    this.completionStopCharacters = stopCharacters;
-    this.history = [];
-    this.historyOffset = 0;
-    this.element.addEventListener("keydown", this._onKeyDown.bind(this), true);
-}
-
-WebInspector.TextPrompt.prototype = {
-    get text()
-    {
-        return this.element.textContent;
-    },
-
-    set text(x)
-    {
-        if (!x) {
-            // Append a break element instead of setting textContent to make sure the selection is inside the prompt.
-            this.element.removeChildren();
-            this.element.appendChild(document.createElement("br"));
-        } else
-            this.element.textContent = x;
-
-        this.moveCaretToEndOfPrompt();
-    },
-
-    _onKeyDown: function(event)
-    {
-        function defaultAction()
-        {
-            this.clearAutoComplete();
-            this.autoCompleteSoon();
-        }
-
-        var handled = false;
-        switch (event.keyIdentifier) {
-            case "Up":
-                this._upKeyPressed(event);
-                break;
-            case "Down":
-                this._downKeyPressed(event);
-                break;
-            case "U+0009": // Tab
-                this._tabKeyPressed(event);
-                break;
-            case "Right":
-            case "End":
-                if (!this.acceptAutoComplete())
-                    this.autoCompleteSoon();
-                break;
-            case "Alt":
-            case "Meta":
-            case "Shift":
-            case "Control":
-                break;
-            case "U+0050": // Ctrl+P = Previous
-                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
-                    handled = true;
-                    this._moveBackInHistory();
-                    break;
-                }
-                defaultAction.call(this);
-                break;
-            case "U+004E": // Ctrl+N = Next
-                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
-                    handled = true;
-                    this._moveForwardInHistory();
-                    break;
-                }
-                defaultAction.call(this);
-                break;
-            default:
-                defaultAction.call(this);
-                break;
-        }
-
-        if (handled) {
-            event.preventDefault();
-            event.stopPropagation();
-        }
-    },
-
-    acceptAutoComplete: function()
-    {
-        if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)
-            return false;
-
-        var text = this.autoCompleteElement.textContent;
-        var textNode = document.createTextNode(text);
-        this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);
-        delete this.autoCompleteElement;
-
-        var finalSelectionRange = document.createRange();
-        finalSelectionRange.setStart(textNode, text.length);
-        finalSelectionRange.setEnd(textNode, text.length);
-
-        var selection = window.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-
-        return true;
-    },
-
-    clearAutoComplete: function(includeTimeout)
-    {
-        if (includeTimeout && "_completeTimeout" in this) {
-            clearTimeout(this._completeTimeout);
-            delete this._completeTimeout;
-        }
-
-        if (!this.autoCompleteElement)
-            return;
-
-        if (this.autoCompleteElement.parentNode)
-            this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
-        delete this.autoCompleteElement;
-
-        if (!this._userEnteredRange || !this._userEnteredText)
-            return;
-
-        this._userEnteredRange.deleteContents();
-
-        var userTextNode = document.createTextNode(this._userEnteredText);
-        this._userEnteredRange.insertNode(userTextNode);
-
-        var selectionRange = document.createRange();
-        selectionRange.setStart(userTextNode, this._userEnteredText.length);
-        selectionRange.setEnd(userTextNode, this._userEnteredText.length);
-
-        var selection = window.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(selectionRange);
-
-        delete this._userEnteredRange;
-        delete this._userEnteredText;
-    },
-
-    autoCompleteSoon: function()
-    {
-        if (!("_completeTimeout" in this))
-            this._completeTimeout = setTimeout(this.complete.bind(this, true), 250);
-    },
-
-    complete: function(auto)
-    {
-        this.clearAutoComplete(true);
-        var selection = window.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-        if (!selectionRange.commonAncestorContainer.isDescendant(this.element))
-            return;
-        if (auto && !this.isCaretAtEndOfPrompt())
-            return;
-        var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this.completionStopCharacters, this.element, "backward");
-        this.completions(wordPrefixRange, auto, this._completionsReady.bind(this, selection, auto, wordPrefixRange));
-    },
-
-    _completionsReady: function(selection, auto, originalWordPrefixRange, completions)
-    {
-        if (!completions || !completions.length)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-
-        var fullWordRange = document.createRange();
-        fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);
-        fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);
-
-        if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())
-            return;
-
-        if (completions.length === 1 || selection.isCollapsed || auto) {
-            var completionText = completions[0];
-        } else {
-            var currentText = fullWordRange.toString();
-
-            var foundIndex = null;
-            for (var i = 0; i < completions.length; ++i)
-                if (completions[i] === currentText)
-                    foundIndex = i;
-
-            if (foundIndex === null || (foundIndex + 1) >= completions.length)
-                var completionText = completions[0];
-            else
-                var completionText = completions[foundIndex + 1];
-        }
-
-        var wordPrefixLength = originalWordPrefixRange.toString().length;
-
-        this._userEnteredRange = fullWordRange;
-        this._userEnteredText = fullWordRange.toString();
-
-        fullWordRange.deleteContents();
-
-        var finalSelectionRange = document.createRange();
-
-        if (auto) {
-            var prefixText = completionText.substring(0, wordPrefixLength);
-            var suffixText = completionText.substring(wordPrefixLength);
-
-            var prefixTextNode = document.createTextNode(prefixText);
-            fullWordRange.insertNode(prefixTextNode);
-
-            this.autoCompleteElement = document.createElement("span");
-            this.autoCompleteElement.className = "auto-complete-text";
-            this.autoCompleteElement.textContent = suffixText;
-
-            prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);
-
-            finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);
-            finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);
-        } else {
-            var completionTextNode = document.createTextNode(completionText);
-            fullWordRange.insertNode(completionTextNode);
-
-            if (completions.length > 1)
-                finalSelectionRange.setStart(completionTextNode, wordPrefixLength);
-            else
-                finalSelectionRange.setStart(completionTextNode, completionText.length);
-
-            finalSelectionRange.setEnd(completionTextNode, completionText.length);
-        }
-
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-    },
-
-    isCaretInsidePrompt: function()
-    {
-        return this.element.isInsertionCaretInside();
-    },
-
-    isCaretAtEndOfPrompt: function()
-    {
-        var selection = window.getSelection();
-        if (!selection.rangeCount || !selection.isCollapsed)
-            return false;
-
-        var selectionRange = selection.getRangeAt(0);
-        var node = selectionRange.startContainer;
-        if (node !== this.element && !node.isDescendant(this.element))
-            return false;
-
-        if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)
-            return false;
-
-        var foundNextText = false;
-        while (node) {
-            if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {
-                if (foundNextText)
-                    return false;
-                foundNextText = true;
-            }
-
-            node = node.traverseNextNode(this.element);
-        }
-
-        return true;
-    },
-
-    isCaretOnFirstLine: function()
-    {
-        var selection = window.getSelection();
-        var focusNode = selection.focusNode;
-        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
-            return true;
-
-        if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)
-            return false;
-        focusNode = focusNode.previousSibling;
-
-        while (focusNode) {
-            if (focusNode.nodeType !== Node.TEXT_NODE)
-                return true;
-            if (focusNode.textContent.indexOf("\n") !== -1)
-                return false;
-            focusNode = focusNode.previousSibling;
-        }
-
-        return true;
-    },
-
-    isCaretOnLastLine: function()
-    {
-        var selection = window.getSelection();
-        var focusNode = selection.focusNode;
-        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
-            return true;
-
-        if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)
-            return false;
-        focusNode = focusNode.nextSibling;
-
-        while (focusNode) {
-            if (focusNode.nodeType !== Node.TEXT_NODE)
-                return true;
-            if (focusNode.textContent.indexOf("\n") !== -1)
-                return false;
-            focusNode = focusNode.nextSibling;
-        }
-
-        return true;
-    },
-
-    moveCaretToEndOfPrompt: function()
-    {
-        var selection = window.getSelection();
-        var selectionRange = document.createRange();
-
-        var offset = this.element.childNodes.length;
-        selectionRange.setStart(this.element, offset);
-        selectionRange.setEnd(this.element, offset);
-
-        selection.removeAllRanges();
-        selection.addRange(selectionRange);
-    },
-
-    _tabKeyPressed: function(event)
-    {
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.complete();
-    },
-
-    _upKeyPressed: function(event)
-    {
-        if (!this.isCaretOnFirstLine())
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this._moveBackInHistory();
-    },
-
-    _downKeyPressed: function(event)
-    {
-        if (!this.isCaretOnLastLine())
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this._moveForwardInHistory();
-    },
-
-    _moveBackInHistory: function()
-    {
-        if (this.historyOffset == this.history.length)
-            return;
-
-        this.clearAutoComplete(true);
-
-        if (this.historyOffset === 0)
-            this.tempSavedCommand = this.text;
-
-        ++this.historyOffset;
-        this.text = this.history[this.history.length - this.historyOffset];
-
-        this.element.scrollIntoViewIfNeeded();
-        var firstNewlineIndex = this.text.indexOf("\n");
-        if (firstNewlineIndex === -1)
-            this.moveCaretToEndOfPrompt();
-        else {
-            var selection = window.getSelection();
-            var selectionRange = document.createRange();
-
-            selectionRange.setStart(this.element.firstChild, firstNewlineIndex);
-            selectionRange.setEnd(this.element.firstChild, firstNewlineIndex);
-
-            selection.removeAllRanges();
-            selection.addRange(selectionRange);
-        }
-    },
-
-    _moveForwardInHistory: function()
-    {
-        if (this.historyOffset === 0)
-            return;
-
-        this.clearAutoComplete(true);
-
-        --this.historyOffset;
-
-        if (this.historyOffset === 0) {
-            this.text = this.tempSavedCommand;
-            delete this.tempSavedCommand;
-            return;
-        }
-
-        this.text = this.history[this.history.length - this.historyOffset];
-        this.element.scrollIntoViewIfNeeded();
-    }
-}
-
-/* Popup.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * This class provides a popup that can be shown relative to an anchor element
- * or at an arbitrary absolute position.
- * Points are Objects: {x: xValue, y: yValue}.
- * Rectangles are Objects: {x: xValue, y: yValue, width: widthValue, height: heightValue}.
- *
- * element is an optional unparented visible element (style.display != "none" AND style.visibility != "hidden").
- * If the element is absent/undefined, it must have been set with the element(x) setter before the show() method invocation.
- */
-WebInspector.Popup = function(element)
-{
-    if (element)
-        this.element = element;
-    this._keyHandler = this._keyEventHandler.bind(this);
-    this._mouseDownHandler = this._mouseDownEventHandler.bind(this);
-    this._visible = false;
-    this._autoHide = true;
-}
-
-WebInspector.Popup.prototype = {
-    show: function()
-    {
-        if (this.visible)
-            return;
-        var ownerDocument = this._contentElement.ownerDocument;
-        if (!ownerDocument)
-            return;
-
-        this._glasspaneElement = ownerDocument.createElement("div");
-        this._glasspaneElement.className = "popup-glasspane";
-        ownerDocument.body.appendChild(this._glasspaneElement);
-
-        this._contentElement.positionAt(0, 0);
-        this._contentElement.removeStyleClass("hidden");
-        ownerDocument.body.appendChild(this._contentElement);
-
-        this.positionElement();
-        this._visible = true;
-        ownerDocument.addEventListener("keydown", this._keyHandler, false);
-        ownerDocument.addEventListener("mousedown", this._mouseDownHandler, false);
-    },
-
-    hide: function()
-    {
-        if (this.visible) {
-            this._visible = false;
-            this._contentElement.ownerDocument.removeEventListener("keydown", this._keyHandler, false);
-            this._contentElement.ownerDocument.removeEventListener("mousedown", this._mouseDownHandler, false);
-            this._glasspaneElement.parentElement.removeChild(this._glasspaneElement);
-            this._contentElement.parentElement.removeChild(this._contentElement);
-        }
-    },
-
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set element(x)
-    {
-        this._checkNotVisible();
-        this._contentElement = x;
-        this._contentElement.addStyleClass("hidden");
-    },
-
-    get element()
-    {
-        return this._contentElement;
-    },
-
-    positionElement: function()
-    {
-        var element = this._contentElement;
-        var anchorElement = this._anchorElement;
-
-        var targetDocument = element.ownerDocument;
-        var targetDocumentBody = targetDocument.body;
-        var targetDocumentElement = targetDocument.documentElement;
-        var clippingBox = {x: 0, y: 0, width: targetDocumentElement.clientWidth, height: targetDocumentElement.clientHeight};
-        var parentElement = element.offsetParent || element.parentElement;
-
-        var anchorPosition = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop};
-
-        // FIXME([email protected]): Translate anchorPosition to the element.ownerDocument frame when https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed.
-        var anchorBox = {x: anchorPosition.x, y: anchorPosition.y, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};
-        var elementBox = {x: element.totalOffsetLeft, y: element.totalOffsetTop, width: element.offsetWidth, height: element.offsetHeight};
-        var newElementPosition = {x: 0, y: 0};
-
-        if (anchorBox.y - elementBox.height >= clippingBox.y)
-            newElementPosition.y = anchorBox.y - elementBox.height;
-        else
-            newElementPosition.y = Math.min(anchorBox.y + anchorBox.height, Math.max(clippingBox.y, clippingBox.y + clippingBox.height - elementBox.height));
-
-        if (anchorBox.x + elementBox.height <= clippingBox.x + clippingBox.height)
-            newElementPosition.x = anchorBox.x;
-        else
-            newElementPosition.x = Math.max(clippingBox.x, clippingBox.x + clippingBox.height - elementBox.height);
-        element.positionAt(newElementPosition.x, newElementPosition.y);
-    },
-
-    set anchor(x)
-    {
-        this._checkNotVisible();
-        this._anchorElement = x;
-    },
-
-    get anchor()
-    {
-        return this._anchorElement;
-    },
-
-    set autoHide(x)
-    {
-        this._autoHide = x;
-    },
-
-    _checkNotVisible: function()
-    {
-        if (this.visible)
-            throw new Error("The popup must not be visible.");
-    },
-
-    _keyEventHandler: function(event)
-    {
-        // Escape hides the popup.
-        if (event.keyIdentifier == "U+001B") {
-            this.hide();
-            event.preventDefault();
-            event.handled = true;
-        }
-    },
-
-    _mouseDownEventHandler: function(event)
-    {
-        if (this._autoHide && event.originalTarget === this._glasspaneElement)
-            this.hide();
-    }
-}
-
-/* Placard.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Placard = function(title, subtitle)
-{
-    this.element = document.createElement("div");
-    this.element.className = "placard";
-    this.element.placard = this;
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-
-    this.subtitleElement = document.createElement("div");
-    this.subtitleElement.className = "subtitle";
-
-    this.element.appendChild(this.subtitleElement);
-    this.element.appendChild(this.titleElement);
-
-    this.title = title;
-    this.subtitle = subtitle;
-    this.selected = false;
-}
-
-WebInspector.Placard.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.titleElement.textContent = x;
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        if (this._subtitle === x)
-            return;
-        this._subtitle = x;
-        this.subtitleElement.innerHTML = x;
-    },
-
-    get selected()
-    {
-        return this._selected;
-    },
-
-    set selected(x)
-    {
-        if (x)
-            this.select();
-        else
-            this.deselect();
-    },
-
-    select: function()
-    {
-        if (this._selected)
-            return;
-        this._selected = true;
-        this.element.addStyleClass("selected");
-    },
-
-    deselect: function()
-    {
-        if (!this._selected)
-            return;
-        this._selected = false;
-        this.element.removeStyleClass("selected");
-    },
-
-    toggleSelected: function()
-    {
-        this.selected = !this.selected;
-    }
-}
-
-/* View.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.View = function(element)
-{
-    this.element = element || document.createElement("div");
-    this._visible = false;
-}
-
-WebInspector.View.prototype = {
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set visible(x)
-    {
-        if (this._visible === x)
-            return;
-
-        if (x)
-            this.show();
-        else
-            this.hide();
-    },
-
-    show: function(parentElement)
-    {
-        this._visible = true;
-        if (parentElement && parentElement !== this.element.parentNode) {
-            this.detach();
-            parentElement.appendChild(this.element);
-        }
-        if (!this.element.parentNode && this.attach)
-            this.attach();
-        this.element.addStyleClass("visible");
-    },
-
-    hide: function()
-    {
-        this.element.removeStyleClass("visible");
-        this._visible = false;
-    },
-
-    detach: function()
-    {
-        if (this.element.parentNode)
-            this.element.parentNode.removeChild(this.element);
-    }
-}
-
-WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* Callback.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Callback = function()
-{
-    this._lastCallbackId = 1;
-    this._callbacks = {};
-}
-
-WebInspector.Callback.prototype = {
-    wrap: function(callback)
-    {
-        var callbackId = this._lastCallbackId++;
-        this._callbacks[callbackId] = callback || function() {};
-        return callbackId;
-    },
-
-    processCallback: function(callbackId, opt_vararg)
-    {
-        var args = Array.prototype.slice.call(arguments, 1);
-        var callback = this._callbacks[callbackId];
-        callback.apply(null, args);
-        delete this._callbacks[callbackId];
-    }
-}
-
-WebInspector.Callback._INSTANCE = new WebInspector.Callback();
-WebInspector.Callback.wrap = WebInspector.Callback._INSTANCE.wrap.bind(WebInspector.Callback._INSTANCE);
-WebInspector.Callback.processCallback = WebInspector.Callback._INSTANCE.processCallback.bind(WebInspector.Callback._INSTANCE);
-
-/* Drawer.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Drawer = function()
-{
-    WebInspector.View.call(this, document.getElementById("drawer"));
-
-    this._savedHeight = 200; // Default.
-    this.state = WebInspector.Drawer.State.Hidden;
-    this.fullPanel = false;
-
-    this.mainElement = document.getElementById("main");
-    this.toolbarElement = document.getElementById("toolbar");
-    this.mainStatusBar = document.getElementById("main-status-bar");
-    this.mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
-    this.viewStatusBar = document.getElementById("other-drawer-status-bar-items");
-}
-
-WebInspector.Drawer.prototype = {
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    set visibleView(x)
-    {
-        if (this._visibleView === x) {
-            if (this.visible && this.fullPanel)
-                return;
-            this.visible = !this.visible;
-            return;
-        }
-
-        var firstTime = !this._visibleView;
-        if (this._visibleView)
-            this._visibleView.hide();
-
-        this._visibleView = x;
-
-        if (x && !firstTime) {
-            this._safelyRemoveChildren();
-            this.viewStatusBar.removeChildren(); // optimize this? call old.detach()
-            x.attach(this.element, this.viewStatusBar);
-            x.show();
-            this.visible = true;
-        }
-    },
-
-    get savedHeight()
-    {
-        var height = this._savedHeight || this.element.offsetHeight;
-        return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this.mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-    },
-
-    showView: function(view)
-    {
-        if (!this.visible || this.visibleView !== view)
-            this.visibleView = view;
-    },
-
-    show: function()
-    {
-        if (this._animating || this.visible)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.show();
-
-        WebInspector.View.prototype.show.call(this);
-
-        this._animating = true;
-
-        document.body.addStyleClass("drawer-visible");
-
-        var anchoredItems = document.getElementById("anchored-status-bar-items");
-        var height = (this.fullPanel ? window.innerHeight - this.toolbarElement.offsetHeight : this.savedHeight);
-        var animations = [
-            {element: this.element, end: {height: height}},
-            {element: document.getElementById("main"), end: {bottom: height}},
-            {element: document.getElementById("main-status-bar"), start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
-            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 0}, end: {opacity: 1}}
-        ];
-
-        var drawerStatusBar = document.getElementById("drawer-status-bar");
-        drawerStatusBar.insertBefore(anchoredItems, drawerStatusBar.firstChild);
-
-        function animationFinished()
-        {
-            if ("updateStatusBarItems" in WebInspector.currentPanel)
-                WebInspector.currentPanel.updateStatusBarItems();
-            if (this.visibleView.afterShow)
-                this.visibleView.afterShow();
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    hide: function()
-    {
-        if (this._animating || !this.visible)
-            return;
-
-        WebInspector.View.prototype.hide.call(this);
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        this._animating = true;
-
-        if (!this.fullPanel)
-            this._savedHeight = this.element.offsetHeight;
-
-        if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))
-            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
-
-        var anchoredItems = document.getElementById("anchored-status-bar-items");
-
-        // Temporarily set properties and classes to mimic the post-animation values so panels
-        // like Elements in their updateStatusBarItems call will size things to fit the final location.
-        this.mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
-        document.body.removeStyleClass("drawer-visible");
-        if ("updateStatusBarItems" in WebInspector.currentPanel)
-            WebInspector.currentPanel.updateStatusBarItems();
-        document.body.addStyleClass("drawer-visible");
-
-        var animations = [
-            {element: document.getElementById("main"), end: {bottom: 0}},
-            {element: document.getElementById("main-status-bar"), start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
-            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 1}, end: {opacity: 0}}
-        ];
-
-        function animationFinished()
-        {
-            var mainStatusBar = document.getElementById("main-status-bar");
-            mainStatusBar.insertBefore(anchoredItems, mainStatusBar.firstChild);
-            mainStatusBar.style.removeProperty("padding-left");
-            document.body.removeStyleClass("drawer-visible");
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = WebInspector.Drawer.State.Hidden;
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    resize: function()
-    {
-        if (this.state === WebInspector.Drawer.State.Hidden)
-            return;
-
-        var height;
-        var mainElement = document.getElementById("main");
-        if (this.state === WebInspector.Drawer.State.Variable) {
-            height = parseInt(this.element.style.height);
-            height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-        } else
-            height = window.innerHeight - this.toolbarElement.offsetHeight;
-
-        mainElement.style.bottom = height + "px";
-        this.element.style.height = height + "px";
-    },
-
-    enterPanelMode: function()
-    {
-        this._cancelAnimationIfNeeded();
-        this.fullPanel = true;
-        
-        if (this.visible) {
-            this._savedHeight = this.element.offsetHeight;
-            var height = window.innerHeight - this.toolbarElement.offsetHeight;
-            this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);
-        }
-    },
-
-    exitPanelMode: function()
-    {
-        this._cancelAnimationIfNeeded();
-        this.fullPanel = false;
-
-        if (this.visible) {
-            // If this animation gets cancelled, we want the state of the drawer to be Variable,
-            // so that the new animation can't do an immediate transition between Hidden/Full states.
-            this.state = WebInspector.Drawer.State.Variable;
-            var height = this.savedHeight;
-            this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);
-        }
-    },
-
-    immediatelyExitPanelMode: function()
-    {
-        this.visible = false;
-        this.fullPanel = false;
-    },
-
-    _cancelAnimationIfNeeded: function()
-    {
-        if (this._animating) {
-            clearInterval(this._currentAnimationInterval);
-            delete this._animating;
-            delete this._currentAnimationInterval;
-        }
-    },
-
-    _animateDrawerHeight: function(height, finalState)
-    {
-        this._animating = true;
-        var animations = [
-            {element: this.element, end: {height: height}},
-            {element: document.getElementById("main"), end: {bottom: height}}
-        ];
-
-        function animationFinished()
-        {
-            delete this._animating;
-            delete this._currentAnimationInterval;
-            this.state = finalState;
-        }
-
-        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
-    },
-
-    _animationDuration: function()
-    {
-        // Immediate if going between Hidden and Full in full panel mode
-        if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))
-            return 0;
-
-        return (window.event && window.event.shiftKey ? 2000 : 250);
-    },
-
-    _safelyRemoveChildren: function()
-    {
-        var child = this.element.firstChild;
-        while (child) {
-            if (child.id !== "drawer-status-bar") {
-                var moveTo = child.nextSibling;
-                this.element.removeChild(child);
-                child = moveTo;
-            } else
-                child = child.nextSibling;
-        }
-    },
-
-    _startStatusBarDragging: function(event)
-    {
-        if (!this.visible || event.target !== this.mainStatusBar)
-            return;
-
-        WebInspector.elementDragStart(this.mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
-
-        this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;
-
-        event.stopPropagation();
-    },
-
-    _statusBarDragging: function(event)
-    {
-        var mainElement = document.getElementById("main");
-        var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
-        height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
-
-        mainElement.style.bottom = height + "px";
-        this.element.style.height = height + "px";
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    _endStatusBarDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-
-        this._savedHeight = this.element.offsetHeight;
-        delete this._statusBarDragOffset;
-
-        event.stopPropagation();
-    }
-}
-
-WebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.Drawer.State = {
-    Hidden: 0,
-    Variable: 1,
-    Full: 2
-};
-
-/* ChangesView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ChangesView = function(drawer)
-{
-    WebInspector.View.call(this);
-    this.element.innerHTML = "<div style=\"bottom:25%;color:rgb(192,192,192);font-size:12px;height:65px;left:0px;margin:auto;position:absolute;right:0px;text-align:center;top:0px;\"><h1>Not Implemented Yet</h1></div>";
-
-    this.drawer = drawer;
-
-    this.clearButton = document.createElement("button");
-    this.clearButton.id = "clear-changes-status-bar-item";
-    this.clearButton.title = WebInspector.UIString("Clear changes log.");
-    this.clearButton.className = "status-bar-item";
-    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.toggleChangesButton = document.getElementById("changes-status-bar-item");
-    this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
-    this.toggleChangesButton.addEventListener("click", this._toggleChangesButtonClicked.bind(this), false);
-    var anchoredStatusBar = document.getElementById("anchored-status-bar-items");
-    anchoredStatusBar.appendChild(this.toggleChangesButton);
-}
-
-WebInspector.ChangesView.prototype = {
-    _clearButtonClicked: function()
-    {
-        // Not Implemented Yet
-    },
-
-    _toggleChangesButtonClicked: function()
-    {
-        this.drawer.visibleView = this;
-    },
-
-    attach: function(mainElement, statusBarElement)
-    {
-        mainElement.appendChild(this.element);
-        statusBarElement.appendChild(this.clearButton);
-    },
-
-    show: function()
-    {
-        this.toggleChangesButton.addStyleClass("toggled-on");
-        this.toggleChangesButton.title = WebInspector.UIString("Hide changes view.");
-    },
-
-    hide: function()
-    {
-        this.toggleChangesButton.removeStyleClass("toggled-on");
-        this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
-    }
-}
-
-WebInspector.ChangesView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ConsoleView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
-
-WebInspector.ConsoleView = function(drawer)
-{
-    WebInspector.View.call(this, document.getElementById("console-view"));
-
-    this.messages = [];
-    this.drawer = drawer;
-
-    this.clearButton = document.getElementById("clear-console-status-bar-item");
-    this.clearButton.title = WebInspector.UIString("Clear console log.");
-    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.messagesElement = document.getElementById("console-messages");
-    this.messagesElement.addEventListener("selectstart", this._messagesSelectStart.bind(this), false);
-    this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);
-
-    this.promptElement = document.getElementById("console-prompt");
-    this.promptElement.className = "source-code";
-    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
-    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");
-
-    this.topGroup = new WebInspector.ConsoleGroup(null, 0);
-    this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
-    this.groupLevel = 0;
-    this.currentGroup = this.topGroup;
-
-    this.toggleConsoleButton = document.getElementById("console-status-bar-item");
-    this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
-    this.toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);
-
-    // Will hold the list of filter elements
-    this.filterBarElement = document.getElementById("console-filter");
-
-    function createDividerElement() {
-        var dividerElement = document.createElement("div");
-        dividerElement.addStyleClass("divider");
-        this.filterBarElement.appendChild(dividerElement);
-    }
-
-    var updateFilterHandler = this._updateFilter.bind(this);
-    function createFilterElement(category) {
-        var categoryElement = document.createElement("li");
-        categoryElement.category = category;
-        categoryElement.addStyleClass(categoryElement.category);            
-        categoryElement.addEventListener("click", updateFilterHandler, false);
-
-        var label = category.toString();
-        categoryElement.appendChild(document.createTextNode(label));
-
-        this.filterBarElement.appendChild(categoryElement);
-        return categoryElement;
-    }
-    
-    this.allElement = createFilterElement.call(this, "All");
-    createDividerElement.call(this);
-    this.errorElement = createFilterElement.call(this, "Errors");
-    this.warningElement = createFilterElement.call(this, "Warnings");
-    this.logElement = createFilterElement.call(this, "Logs");
-
-    this.filter(this.allElement, false);
-
-    this._shortcuts = {};
-
-    var shortcut;
-    var clearConsoleHandler = this.requestClearMessages.bind(this);
-
-    shortcut = WebInspector.KeyboardShortcut.makeKey("k", WebInspector.KeyboardShortcut.Modifiers.Meta);
-    this._shortcuts[shortcut] = clearConsoleHandler;
-    this._shortcuts[shortcut].isMacOnly = true;
-    shortcut = WebInspector.KeyboardShortcut.makeKey("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = clearConsoleHandler;
-
-    // Since the Context Menu for the Console View will always be the same, we can create it in
-    // the constructor.
-    this._contextMenu = new WebInspector.ContextMenu();
-    this._contextMenu.appendItem(WebInspector.UIString("Clear Console"), clearConsoleHandler);
-    this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);
-    
-    this._customFormatters = {
-        "object": this._formatobject,
-        "array":  this._formatarray,
-        "node":   this._formatnode,
-        "string": this._formatstring
-    };
-}
-
-WebInspector.ConsoleView.prototype = {
-    
-    _updateFilter: function(e)
-    {
-        var isMac = WebInspector.isMac();
-        var selectMultiple = false;
-        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-
-        this.filter(e.target, selectMultiple);
-    },
-    
-    filter: function(target, selectMultiple)
-    {
-        function unselectAll()
-        {
-            this.allElement.removeStyleClass("selected");
-            this.errorElement.removeStyleClass("selected");
-            this.warningElement.removeStyleClass("selected");
-            this.logElement.removeStyleClass("selected");
-            
-            this.messagesElement.removeStyleClass("filter-all");
-            this.messagesElement.removeStyleClass("filter-errors");
-            this.messagesElement.removeStyleClass("filter-warnings");
-            this.messagesElement.removeStyleClass("filter-logs");
-        }
-        
-        var targetFilterClass = "filter-" + target.category.toLowerCase();
-
-        if (target.category == "All") {
-            if (target.hasStyleClass("selected")) {
-                // We can't unselect all, so we break early here
-                return;
-            }
-
-            unselectAll.call(this);
-        } else {
-            // Something other than all is being selected, so we want to unselect all
-            if (this.allElement.hasStyleClass("selected")) {
-                this.allElement.removeStyleClass("selected");
-                this.messagesElement.removeStyleClass("filter-all");
-            }
-        }
-        
-        if (!selectMultiple) {
-            // If multiple selection is off, we want to unselect everything else
-            // and just select ourselves.
-            unselectAll.call(this);
-            
-            target.addStyleClass("selected");
-            this.messagesElement.addStyleClass(targetFilterClass);
-            
-            return;
-        }
-        
-        if (target.hasStyleClass("selected")) {
-            // If selectMultiple is turned on, and we were selected, we just
-            // want to unselect ourselves.
-            target.removeStyleClass("selected");
-            this.messagesElement.removeStyleClass(targetFilterClass);
-        } else {
-            // If selectMultiple is turned on, and we weren't selected, we just
-            // want to select ourselves.
-            target.addStyleClass("selected");
-            this.messagesElement.addStyleClass(targetFilterClass);
-        }
-    },
-    
-    _toggleConsoleButtonClicked: function()
-    {
-        this.drawer.visibleView = this;
-    },
-
-    attach: function(mainElement, statusBarElement)
-    {
-        mainElement.appendChild(this.element);
-        statusBarElement.appendChild(this.clearButton);
-        statusBarElement.appendChild(this.filterBarElement);
-    },
-
-    show: function()
-    {
-        this.toggleConsoleButton.addStyleClass("toggled-on");
-        this.toggleConsoleButton.title = WebInspector.UIString("Hide console.");
-        if (!this.prompt.isCaretInsidePrompt())
-            this.prompt.moveCaretToEndOfPrompt();
-    },
-
-    afterShow: function()
-    {
-        WebInspector.currentFocusElement = this.promptElement;  
-    },
-
-    hide: function()
-    {
-        this.toggleConsoleButton.removeStyleClass("toggled-on");
-        this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
-    },
-
-    addMessage: function(msg)
-    {
-        if (msg instanceof WebInspector.ConsoleMessage && !(msg instanceof WebInspector.ConsoleCommandResult)) {
-            this._incrementErrorWarningCount(msg);
-
-            // Add message to the resource panel
-            if (msg.url in WebInspector.resourceURLMap) {
-                msg.resource = WebInspector.resourceURLMap[msg.url];
-                if (WebInspector.panels.resources)
-                    WebInspector.panels.resources.addMessageToResource(msg.resource, msg);
-            }
-
-            this.commandSincePreviousMessage = false;
-            this.previousMessage = msg;
-        } else if (msg instanceof WebInspector.ConsoleCommand) {
-            if (this.previousMessage) {
-                this.commandSincePreviousMessage = true;
-            }
-        }
-
-        this.messages.push(msg);
-
-        if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
-            if (this.groupLevel < 1)
-                return;
-
-            this.groupLevel--;
-
-            this.currentGroup = this.currentGroup.parentGroup;
-        } else {
-            if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
-                this.groupLevel++;
-
-                var group = new WebInspector.ConsoleGroup(this.currentGroup, this.groupLevel);
-                this.currentGroup.messagesElement.appendChild(group.element);
-                this.currentGroup = group;
-            }
-
-            this.currentGroup.addMessage(msg);
-        }
-
-        this.promptElement.scrollIntoView(false);
-    },
-
-    updateMessageRepeatCount: function(count)
-    {
-        var msg = this.previousMessage;
-        var prevRepeatCount = msg.totalRepeatCount;
-        
-        if (!this.commandSincePreviousMessage) {
-            msg.repeatDelta = count - prevRepeatCount;
-            msg.repeatCount = msg.repeatCount + msg.repeatDelta;
-            msg.totalRepeatCount = count;
-            msg._updateRepeatCount();
-            this._incrementErrorWarningCount(msg);
-        } else {
-            msgCopy = new WebInspector.ConsoleMessage(msg.source, msg.type, msg.level, msg.line, msg.url, msg.groupLevel, count - prevRepeatCount);
-            msgCopy.totalRepeatCount = count;
-            msgCopy.setMessageBody(msg.args);
-            this.addMessage(msgCopy);
-        }
-    },
-
-    _incrementErrorWarningCount: function(msg)
-    {
-        switch (msg.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                WebInspector.warnings += msg.repeatDelta;
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                WebInspector.errors += msg.repeatDelta;
-                break;
-        }
-    },
-
-    requestClearMessages: function()
-    {
-        InjectedScriptAccess.clearConsoleMessages(function() {});
-    },
-
-    clearMessages: function()
-    {
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.clearMessages();
-
-        this.messages = [];
-
-        this.groupLevel = 0;
-        this.currentGroup = this.topGroup;
-        this.topGroup.messagesElement.removeChildren();
-
-        WebInspector.errors = 0;
-        WebInspector.warnings = 0;
-
-        delete this.commandSincePreviousMessage;
-        delete this.previousMessage;
-    },
-
-    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
-    {
-        // Pass less stop characters to rangeOfWord so the range will be a more complete expression.
-        var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");
-        var expressionString = expressionRange.toString();
-        var lastIndex = expressionString.length - 1;
-
-        var dotNotation = (expressionString[lastIndex] === ".");
-        var bracketNotation = (expressionString[lastIndex] === "[");
-
-        if (dotNotation || bracketNotation)
-            expressionString = expressionString.substr(0, lastIndex);
-
-        var prefix = wordRange.toString();
-        if (!expressionString && !prefix)
-            return;
-
-        var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);
-        // Collect comma separated object properties for the completion.
-
-        var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);
-        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused)
-            var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();
-        InjectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);
-    },
-
-    _reportCompletions: function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
-        if (isException)
-            return;
-
-        if (bracketNotation) {
-            if (prefix.length && prefix[0] === "'")
-                var quoteUsed = "'";
-            else
-                var quoteUsed = "\"";
-        }
-
-        var results = [];
-        var properties = Object.sortedProperties(result);
-
-        for (var i = 0; i < properties.length; ++i) {
-            var property = properties[i];
-
-            if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
-                continue;
-
-            if (bracketNotation) {
-                if (!/^[0-9]+$/.test(property))
-                    property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;
-                property += "]";
-            }
-
-            if (property.length < prefix.length)
-                continue;
-            if (property.indexOf(prefix) !== 0)
-                continue;
-
-            results.push(property);
-            if (bestMatchOnly)
-                break;
-        }
-        completionsReadyCallback(results);
-    },
-
-    _clearButtonClicked: function()
-    {
-        this.requestClearMessages();
-    },
-
-    _handleContextMenuEvent: function(event)
-    {
-        if (!window.getSelection().isCollapsed) {
-            // If there is a selection, we want to show our normal context menu
-            // (with Copy, etc.), and not Clear Console.
-            return;
-        }
-
-        this._contextMenu.show(event);
-    },
-
-    _messagesSelectStart: function(event)
-    {
-        if (this._selectionTimeout)
-            clearTimeout(this._selectionTimeout);
-
-        this.prompt.clearAutoComplete();
-
-        function moveBackIfOutside()
-        {
-            delete this._selectionTimeout;
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-            this.prompt.autoCompleteSoon();
-        }
-
-        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
-    },
-
-    _messagesClicked: function(event)
-    {
-        var link = event.target.enclosingNodeOrSelfWithNodeName("a");
-        if (!link || !link.representedNode)
-            return;
-
-        WebInspector.updateFocusedNode(link.representedNode.id);
-        event.stopPropagation();
-        event.preventDefault();
-    },
-
-    _promptKeyDown: function(event)
-    {
-        if (isEnterKey(event)) {
-            this._enterKeyPressed(event);
-            return;
-        }
-
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            if (!this._shortcuts[shortcut].isMacOnly || WebInspector.isMac()) {
-                handler();
-                event.preventDefault();
-                return;
-            }
-        }
-    },
-
-    evalInInspectedWindow: function(expression, objectGroup, callback)
-    {
-        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
-            WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);
-            return;
-        }
-        this.doEvalInWindow(expression, objectGroup, callback);
-    },
-
-    doEvalInWindow: function(expression, objectGroup, callback)
-    {
-        if (!expression) {
-            // There is no expression, so the completion should happen against global properties.
-            expression = "this";
-        }
-
-        function evalCallback(result)
-        {
-            callback(result.value, result.isException);
-        };
-        InjectedScriptAccess.evaluate(expression, objectGroup, evalCallback);
-    },
-
-    _enterKeyPressed: function(event)
-    {
-        if (event.altKey)
-            return;
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.prompt.clearAutoComplete(true);
-
-        var str = this.prompt.text;
-        if (!str.length)
-            return;
-
-        var commandMessage = new WebInspector.ConsoleCommand(str);
-        this.addMessage(commandMessage);
-
-        var self = this;
-        function printResult(result, exception)
-        {
-            self.prompt.history.push(str);
-            self.prompt.historyOffset = 0;
-            self.prompt.text = "";
-            self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
-        }
-        this.evalInInspectedWindow(str, "console", printResult);
-    },
-
-    _format: function(output, forceObjectFormat)
-    {
-        var isProxy = (output != null && typeof output === "object");
-        var type = (forceObjectFormat ? "object" : Object.proxyType(output));
-
-        var formatter = this._customFormatters[type];
-        if (!formatter || !isProxy) {
-            formatter = this._formatvalue;
-            output = output.description || output;
-        }
-
-        var span = document.createElement("span");
-        span.className = "console-formatted-" + type + " source-code";
-        formatter.call(this, output, span);
-        return span;
-    },
-
-    _formatvalue: function(val, elem)
-    {
-        elem.appendChild(document.createTextNode(val));
-    },
-
-    _formatobject: function(obj, elem)
-    {
-        elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description, null, true).element);
-    },
-
-    _formatnode: function(object, elem)
-    {
-        function printNode(nodeId)
-        {
-            if (!nodeId)
-                return;
-            var treeOutline = new WebInspector.ElementsTreeOutline();
-            treeOutline.showInElementsPanelEnabled = true;
-            treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);
-            treeOutline.element.addStyleClass("outline-disclosure");
-            if (!treeOutline.children[0].hasChildren)
-                treeOutline.element.addStyleClass("single-node");
-            elem.appendChild(treeOutline.element);
-        }
-
-        InjectedScriptAccess.pushNodeToFrontend(object, printNode);
-    },
-
-    _formatarray: function(arr, elem)
-    {
-        InjectedScriptAccess.getProperties(arr, false, false, this._printArray.bind(this, elem));
-    },
-
-    _formatstring: function(output, elem)
-    {
-        var span = document.createElement("span");
-        span.className = "console-formatted-string source-code";
-        span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
-
-        // Make black quotes.
-        elem.removeStyleClass("console-formatted-string");
-        elem.appendChild(document.createTextNode("\""));
-        elem.appendChild(span);
-        elem.appendChild(document.createTextNode("\""));
-    },
-
-    _printArray: function(elem, properties)
-    {
-        if (!properties)
-            return;
-
-        var elements = [];
-        for (var i = 0; i < properties.length; ++i) {
-            var name = properties[i].name;
-            if (name == parseInt(name))
-                elements[name] = this._format(properties[i].value);
-        }
-
-        elem.appendChild(document.createTextNode("["));
-        for (var i = 0; i < elements.length; ++i) {
-            var element = elements[i];
-            if (element)
-                elem.appendChild(element);
-            else
-                elem.appendChild(document.createTextNode("undefined"))
-            if (i < elements.length - 1)
-                elem.appendChild(document.createTextNode(", "));
-        }
-        elem.appendChild(document.createTextNode("]"));
-    }
-}
-
-WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.ConsoleMessage = function(source, type, level, line, url, groupLevel, repeatCount)
-{
-    this.source = source;
-    this.type = type;
-    this.level = level;
-    this.line = line;
-    this.url = url;
-    this.groupLevel = groupLevel;
-    this.repeatCount = repeatCount;
-    this.repeatDelta = repeatCount;
-    this.totalRepeatCount = repeatCount;
-    if (arguments.length > 7)
-        this.setMessageBody(Array.prototype.slice.call(arguments, 7));
-}
-
-WebInspector.ConsoleMessage.prototype = {
-    setMessageBody: function(args)
-    {
-        this.args = args;
-        switch (this.type) {
-            case WebInspector.ConsoleMessage.MessageType.Trace:
-                var span = document.createElement("span");
-                span.className = "console-formatted-trace source-code";
-                var stack = Array.prototype.slice.call(args);
-                var funcNames = stack.map(function(f) {
-                    return f || WebInspector.UIString("(anonymous function)");
-                });
-                span.appendChild(document.createTextNode(funcNames.join("\n")));
-                this.formattedMessage = span;
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Object:
-                this.formattedMessage = this._format(["%O", args[0]]);
-                break;
-            default:
-                this.formattedMessage = this._format(args);
-                break;
-        }
-
-        // This is used for inline message bubbles in SourceFrames, or other plain-text representations.
-        this.message = this.formattedMessage.textContent;
-    },
-
-    isErrorOrWarning: function()
-    {
-        return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
-    },
-
-    _format: function(parameters)
-    {
-        // This node is used like a Builder. Values are contintually appended onto it.
-        var formattedResult = document.createElement("span");
-        if (!parameters.length)
-            return formattedResult;
-
-        // Formatting code below assumes that parameters are all wrappers whereas frontend console
-        // API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here.
-        for (var i = 0; i < parameters.length; ++i)
-            if (typeof parameters[i] !== "object" && typeof parameters[i] !== "function")
-                parameters[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(parameters[i]);
-
-        // There can be string log and string eval result. We distinguish between them based on message type.
-        var shouldFormatMessage = Object.proxyType(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
-
-        // Multiple parameters with the first being a format string. Save unused substitutions.
-        if (shouldFormatMessage) {
-            // Multiple parameters with the first being a format string. Save unused substitutions.
-            var result = this._formatWithSubstitutionString(parameters, formattedResult);
-            parameters = result.unusedSubstitutions;
-            if (parameters.length)
-                formattedResult.appendChild(document.createTextNode(" "));
-        }
-
-        // Single parameter, or unused substitutions from above.
-        for (var i = 0; i < parameters.length; ++i) {
-            // Inline strings when formatting.
-            if (shouldFormatMessage && parameters[i].type === "string")
-                formattedResult.appendChild(document.createTextNode(parameters[i].description));
-            else
-                formattedResult.appendChild(WebInspector.console._format(parameters[i]));
-            if (i < parameters.length - 1)
-                formattedResult.appendChild(document.createTextNode(" "));
-        }
-        return formattedResult;
-    },
-
-    _formatWithSubstitutionString: function(parameters, formattedResult)
-    {
-        var formatters = {}
-        for (var i in String.standardFormatters)
-            formatters[i] = String.standardFormatters[i];
-
-        function consoleFormatWrapper(force)
-        {
-            return function(obj) {
-                return WebInspector.console._format(obj, force);
-            };
-        }
-
-        // Firebug uses %o for formatting objects.
-        formatters.o = consoleFormatWrapper();
-        // Firebug allows both %i and %d for formatting integers.
-        formatters.i = formatters.d;
-        // Support %O to force object formating, instead of the type-based %o formatting.
-        formatters.O = consoleFormatWrapper(true);
-
-        function append(a, b)
-        {
-            if (!(b instanceof Node))
-                a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));
-            else
-                a.appendChild(b);
-            return a;
-        }
-
-        // String.format does treat formattedResult like a Builder, result is an object.
-        return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);
-    },
-
-    toMessageElement: function()
-    {
-        if (this._element)
-            return this._element;
-
-        var element = document.createElement("div");
-        element.message = this;
-        element.className = "console-message";
-
-        this._element = element;
-
-        switch (this.source) {
-            case WebInspector.ConsoleMessage.MessageSource.HTML:
-                element.addStyleClass("console-html-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.WML:
-                element.addStyleClass("console-wml-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.XML:
-                element.addStyleClass("console-xml-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.JS:
-                element.addStyleClass("console-js-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.CSS:
-                element.addStyleClass("console-css-source");
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.Other:
-                element.addStyleClass("console-other-source");
-                break;
-        }
-
-        switch (this.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Tip:
-                element.addStyleClass("console-tip-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Log:
-                element.addStyleClass("console-log-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Debug:
-                element.addStyleClass("console-debug-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                element.addStyleClass("console-warning-level");
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                element.addStyleClass("console-error-level");
-                break;
-        }
-        
-        if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup)
-            element.addStyleClass("console-group-title");
-
-        if (this.elementsTreeOutline) {
-            element.addStyleClass("outline-disclosure");
-            element.appendChild(this.elementsTreeOutline.element);
-            return element;
-        }
-
-        if (this.url && this.url !== "undefined") {
-            var urlElement = document.createElement("a");
-            urlElement.className = "console-message-url webkit-html-resource-link";
-            urlElement.href = this.url;
-            urlElement.lineNumber = this.line;
-
-            if (this.source === WebInspector.ConsoleMessage.MessageSource.JS)
-                urlElement.preferredPanel = "scripts";
-
-            if (this.line > 0)
-                urlElement.textContent = WebInspector.displayNameForURL(this.url) + ":" + this.line;
-            else
-                urlElement.textContent = WebInspector.displayNameForURL(this.url);
-
-            element.appendChild(urlElement);
-        }
-
-        var messageTextElement = document.createElement("span");
-        messageTextElement.className = "console-message-text source-code";
-        if (this.type === WebInspector.ConsoleMessage.MessageType.Assert)
-            messageTextElement.appendChild(document.createTextNode(WebInspector.UIString("Assertion failed: ")));
-        messageTextElement.appendChild(this.formattedMessage);
-        element.appendChild(messageTextElement);
-
-        if (this.repeatCount > 1)
-            this._updateRepeatCount();
-
-        return element;
-    },
-
-    _updateRepeatCount: function() {
-        if (!this.repeatCountElement) {
-            this.repeatCountElement = document.createElement("span");
-            this.repeatCountElement.className = "bubble";
-    
-            this._element.insertBefore(this.repeatCountElement, this._element.firstChild);
-            this._element.addStyleClass("repeated-message");
-        }
-        this.repeatCountElement.textContent = this.repeatCount;
-    },
-
-    toString: function()
-    {
-        var sourceString;
-        switch (this.source) {
-            case WebInspector.ConsoleMessage.MessageSource.HTML:
-                sourceString = "HTML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.WML:
-                sourceString = "WML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.XML:
-                sourceString = "XML";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.JS:
-                sourceString = "JS";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.CSS:
-                sourceString = "CSS";
-                break;
-            case WebInspector.ConsoleMessage.MessageSource.Other:
-                sourceString = "Other";
-                break;
-        }
-
-        var typeString;
-        switch (this.type) {
-            case WebInspector.ConsoleMessage.MessageType.Log:
-                typeString = "Log";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Object:
-                typeString = "Object";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Trace:
-                typeString = "Trace";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.StartGroup:
-                typeString = "Start Group";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.EndGroup:
-                typeString = "End Group";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Assert:
-                typeString = "Assert";
-                break;
-            case WebInspector.ConsoleMessage.MessageType.Result:
-                typeString = "Result";
-                break;
-        }
-        
-        var levelString;
-        switch (this.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Tip:
-                levelString = "Tip";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Log:
-                levelString = "Log";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                levelString = "Warning";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Debug:
-                levelString = "Debug";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                levelString = "Error";
-                break;
-        }
-
-        return sourceString + " " + typeString + " " + levelString + ": " + this.formattedMessage.textContent + "\n" + this.url + " line " + this.line;
-    },
-
-    isEqual: function(msg, disreguardGroup)
-    {
-        if (!msg)
-            return false;
-
-        var ret = (this.source == msg.source)
-            && (this.type == msg.type)
-            && (this.level == msg.level)
-            && (this.line == msg.line)
-            && (this.url == msg.url)
-            && (this.message == msg.message);
-
-        return (disreguardGroup ? ret : (ret && (this.groupLevel == msg.groupLevel)));
-    }
-}
-
-// Note: Keep these constants in sync with the ones in Console.h
-WebInspector.ConsoleMessage.MessageSource = {
-    HTML: 0,
-    WML: 1,
-    XML: 2,
-    JS: 3,
-    CSS: 4,
-    Other: 5
-}
-
-WebInspector.ConsoleMessage.MessageType = {
-    Log: 0,
-    Object: 1,
-    Trace: 2,
-    StartGroup: 3,
-    EndGroup: 4,
-    Assert: 5,
-    Result: 6
-}
-
-WebInspector.ConsoleMessage.MessageLevel = {
-    Tip: 0,
-    Log: 1,
-    Warning: 2,
-    Error: 3,
-    Debug: 4
-}
-
-WebInspector.ConsoleCommand = function(command)
-{
-    this.command = command;
-}
-
-WebInspector.ConsoleCommand.prototype = {
-    toMessageElement: function()
-    {
-        var element = document.createElement("div");
-        element.command = this;
-        element.className = "console-user-command";
-
-        var commandTextElement = document.createElement("span");
-        commandTextElement.className = "console-message-text source-code";
-        commandTextElement.textContent = this.command;
-        element.appendChild(commandTextElement);
-
-        return element;
-    }
-}
-
-WebInspector.ConsoleTextMessage = function(text, level)
-{
-    level = level || WebInspector.ConsoleMessage.MessageLevel.Log;
-    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Log, level, 0, null, null, 1, text);
-}
-
-WebInspector.ConsoleTextMessage.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
-
-WebInspector.ConsoleCommandResult = function(result, exception, originatingCommand)
-{
-    var level = (exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
-    var message = result;
-    if (exception) {
-        // Distinguish between strings and errors (no need to quote latter).
-        message = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
-        message.type = "error";
-    }
-    var line = (exception ? result.line : -1);
-    var url = (exception ? result.sourceURL : null);
-
-    this.originatingCommand = originatingCommand;
-
-    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, line, url, null, 1, message);
-}
-
-WebInspector.ConsoleCommandResult.prototype = {
-    toMessageElement: function()
-    {
-        var element = WebInspector.ConsoleMessage.prototype.toMessageElement.call(this);
-        element.addStyleClass("console-user-command-result");
-        return element;
-    }
-}
-
-WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
-
-WebInspector.ConsoleGroup = function(parentGroup, level)
-{
-    this.parentGroup = parentGroup;
-    this.level = level;
-
-    var element = document.createElement("div");
-    element.className = "console-group";
-    element.group = this;
-    this.element = element;
-
-    var messagesElement = document.createElement("div");
-    messagesElement.className = "console-group-messages";
-    element.appendChild(messagesElement);
-    this.messagesElement = messagesElement;
-}
-
-WebInspector.ConsoleGroup.prototype = {
-    addMessage: function(msg)
-    {
-        var element = msg.toMessageElement();
-        
-        if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
-            this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
-            element.addEventListener("click", this._titleClicked.bind(this), true);
-        } else
-            this.messagesElement.appendChild(element);
-
-        if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
-            element.previousSibling.addStyleClass("console-adjacent-user-command-result");
-    },
-
-    _titleClicked: function(event)
-    {
-        var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");
-        if (groupTitleElement) {
-            var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");
-            if (groupElement)
-                if (groupElement.hasStyleClass("collapsed"))
-                    groupElement.removeStyleClass("collapsed");
-                else
-                    groupElement.addStyleClass("collapsed");
-            groupTitleElement.scrollIntoViewIfNeeded(true);
-        }
-
-        event.stopPropagation();
-        event.preventDefault();
-    }
-}
-
-/* Panel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Panel = function()
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("panel");
-}
-
-WebInspector.Panel.prototype = {
-    get toolbarItem()
-    {
-        if (this._toolbarItem)
-            return this._toolbarItem;
-
-        // Sample toolbar item as markup:
-        // <button class="toolbar-item resources toggleable">
-        // <div class="toolbar-icon"></div>
-        // <div class="toolbar-label">Resources</div>
-        // </button>
-
-        this._toolbarItem = document.createElement("button");
-        this._toolbarItem.className = "toolbar-item toggleable";
-        this._toolbarItem.panel = this;
-
-        if ("toolbarItemClass" in this)
-            this._toolbarItem.addStyleClass(this.toolbarItemClass);
-
-        var iconElement = document.createElement("div");
-        iconElement.className = "toolbar-icon";
-        this._toolbarItem.appendChild(iconElement);
-
-        if ("toolbarItemLabel" in this) {
-            var labelElement = document.createElement("div");
-            labelElement.className = "toolbar-label";
-            labelElement.textContent = this.toolbarItemLabel;
-            this._toolbarItem.appendChild(labelElement);
-        }
-
-        return this._toolbarItem;
-    },
-
-    show: function()
-    {
-        WebInspector.View.prototype.show.call(this);
-
-        var statusBarItems = this.statusBarItems;
-        if (statusBarItems) {
-            this._statusBarItemContainer = document.createElement("div");
-            for (var i = 0; i < statusBarItems.length; ++i)
-                this._statusBarItemContainer.appendChild(statusBarItems[i]);
-            document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
-        }
-
-        if ("_toolbarItem" in this)
-            this._toolbarItem.addStyleClass("toggled-on");
-
-        WebInspector.currentFocusElement = this.defaultFocusedElement;
-
-        this.updateSidebarWidth();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-
-        if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)
-            this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);
-        delete this._statusBarItemContainer;
-        if ("_toolbarItem" in this)
-            this._toolbarItem.removeStyleClass("toggled-on");
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.sidebarTreeElement || this.element;
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode)
-            document.getElementById("main-panels").appendChild(this.element);
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var view = this._searchResults[i];
-                if (view.searchCanceled)
-                    view.searchCanceled();
-                delete view.currentQuery;
-            }
-        }
-
-        WebInspector.updateSearchMatchesCount(0, this);
-
-        if (this._currentSearchChunkIntervalIdentifier) {
-            clearInterval(this._currentSearchChunkIntervalIdentifier);
-            delete this._currentSearchChunkIntervalIdentifier;
-        }
-
-        this._totalSearchMatches = 0;
-        this._currentSearchResultIndex = 0;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled(true);
-
-        var searchableViews = this.searchableViews;
-        if (!searchableViews || !searchableViews.length)
-            return;
-
-        var parentElement = this.viewsContainerElement;
-        var visibleView = this.visibleView;
-        var sortFuction = this.searchResultsSortFunction;
-
-        var matchesCountUpdateTimeout = null;
-
-        function updateMatchesCount()
-        {
-            WebInspector.updateSearchMatchesCount(this._totalSearchMatches, this);
-            matchesCountUpdateTimeout = null;
-        }
-
-        function updateMatchesCountSoon()
-        {
-            if (matchesCountUpdateTimeout)
-                return;
-            // Update the matches count every half-second so it doesn't feel twitchy.
-            matchesCountUpdateTimeout = setTimeout(updateMatchesCount.bind(this), 500);
-        }
-
-        function finishedCallback(view, searchMatches)
-        {
-            if (!searchMatches)
-                return;
-
-            this._totalSearchMatches += searchMatches;
-            this._searchResults.push(view);
-
-            if (sortFuction)
-                this._searchResults.sort(sortFuction);
-
-            if (this.searchMatchFound)
-                this.searchMatchFound(view, searchMatches);
-
-            updateMatchesCountSoon.call(this);
-
-            if (view === visibleView)
-                view.jumpToFirstSearchResult();
-        }
-
-        var i = 0;
-        var panel = this;
-        var boundFinishedCallback = finishedCallback.bind(this);
-        var chunkIntervalIdentifier = null;
-
-        // Split up the work into chunks so we don't block the
-        // UI thread while processing.
-
-        function processChunk()
-        {
-            var view = searchableViews[i];
-
-            if (++i >= searchableViews.length) {
-                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
-                    delete panel._currentSearchChunkIntervalIdentifier;
-                clearInterval(chunkIntervalIdentifier);
-            }
-
-            if (!view)
-                return;
-
-            if (view.element.parentNode !== parentElement && view.element.parentNode && parentElement)
-                view.detach();
-
-            view.currentQuery = query;
-            view.performSearch(query, boundFinishedCallback);
-        }
-
-        processChunk();
-
-        chunkIntervalIdentifier = setInterval(processChunk, 25);
-        this._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this.showView || !this._searchResults || !this._searchResults.length)
-            return;
-
-        var showFirstResult = false;
-
-        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
-        if (this._currentSearchResultIndex === -1) {
-            this._currentSearchResultIndex = 0;
-            showFirstResult = true;
-        }
-
-        var currentView = this._searchResults[this._currentSearchResultIndex];
-
-        if (currentView.showingLastSearchResult()) {
-            if (++this._currentSearchResultIndex >= this._searchResults.length)
-                this._currentSearchResultIndex = 0;
-            currentView = this._searchResults[this._currentSearchResultIndex];
-            showFirstResult = true;
-        }
-
-        if (currentView !== this.visibleView) {
-            currentView = this.visibleView;
-            this._currentSearchResultIndex = 0;
-            showFirstResult = true;
-        }
-
-        if (showFirstResult)
-            currentView.jumpToFirstSearchResult();
-        else
-            currentView.jumpToNextSearchResult();
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this.showView || !this._searchResults || !this._searchResults.length)
-            return;
-
-        var showLastResult = false;
-
-        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
-        if (this._currentSearchResultIndex === -1) {
-            this._currentSearchResultIndex = 0;
-            showLastResult = true;
-        }
-
-        var currentView = this._searchResults[this._currentSearchResultIndex];
-
-        if (currentView.showingFirstSearchResult()) {
-            if (--this._currentSearchResultIndex < 0)
-                this._currentSearchResultIndex = (this._searchResults.length - 1);
-            currentView = this._searchResults[this._currentSearchResultIndex];
-            showLastResult = true;
-        }
-
-        if (currentView !== this.visibleView)
-            this.showView(currentView);
-
-        if (showLastResult)
-            currentView.jumpToLastSearchResult();
-        else
-            currentView.jumpToPreviousSearchResult();
-    },
-
-    createSidebar: function(parentElement, resizerParentElement)
-    {
-        if (this.hasSidebar)
-            return;
-
-        if (!parentElement)
-            parentElement = this.element;
-
-        if (!resizerParentElement)
-            resizerParentElement = parentElement;
-
-        this.hasSidebar = true;
-
-        this.sidebarElement = document.createElement("div");
-        this.sidebarElement.className = "sidebar";
-        parentElement.appendChild(this.sidebarElement);
-
-        this.sidebarResizeElement = document.createElement("div");
-        this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-        this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
-        resizerParentElement.appendChild(this.sidebarResizeElement);
-
-        this.sidebarTreeElement = document.createElement("ol");
-        this.sidebarTreeElement.className = "sidebar-tree";
-        this.sidebarElement.appendChild(this.sidebarTreeElement);
-
-        this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
-    },
-
-    _startSidebarDragging: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
-    },
-
-    _sidebarDragging: function(event)
-    {
-        this.updateSidebarWidth(event.pageX);
-
-        event.preventDefault();
-    },
-
-    _endSidebarDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    },
-
-    updateSidebarWidth: function(width)
-    {
-        if (!this.hasSidebar)
-            return;
-
-        if (this.sidebarElement.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        if (!("_currentSidebarWidth" in this))
-            this._currentSidebarWidth = this.sidebarElement.offsetWidth;
-
-        if (typeof width === "undefined")
-            width = this._currentSidebarWidth;
-
-        width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
-
-        this._currentSidebarWidth = width;
-        this.setSidebarWidth(width);
-
-        this.updateMainViewWidth(width);
-
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    setSidebarWidth: function(width)
-    {
-        this.sidebarElement.style.width = width + "px";
-        this.sidebarResizeElement.style.left = (width - 3) + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        // Should be implemented by ancestors.
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return false;
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        return false;
-    }
-}
-
-WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;
-
-/* TimelineGrid.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineGrid = function()
-{
-    this.element = document.createElement("div");
-
-    this._itemsGraphsElement = document.createElement("div");
-    this._itemsGraphsElement.id = "resources-graphs";
-    this.element.appendChild(this._itemsGraphsElement);
-
-    this._dividersElement = document.createElement("div");
-    this._dividersElement.id = "resources-dividers";
-    this.element.appendChild(this._dividersElement);
-
-    this._eventDividersElement = document.createElement("div");
-    this._eventDividersElement.id = "resources-event-dividers";
-    this.element.appendChild(this._eventDividersElement);
-
-    this._dividersLabelBarElement = document.createElement("div");
-    this._dividersLabelBarElement.id = "resources-dividers-label-bar";
-    this.element.appendChild(this._dividersLabelBarElement);
-}
-
-WebInspector.TimelineGrid.prototype = {
-    get itemsGraphsElement()
-    {
-        return this._itemsGraphsElement;
-    },
-
-    updateDividers: function(force, calculator, paddingLeft)
-    {
-        var dividerCount = Math.round(this._dividersElement.offsetWidth / 64);
-        var slice = calculator.boundarySpan / dividerCount;
-        if (!force && this._currentDividerSlice === slice)
-            return false;
-
-        if (!(typeof paddingLeft === "number"))
-            paddingLeft = 0;
-        this._currentDividerSlice = slice;
-
-        this._eventDividersElement.removeChildren();
-        // Reuse divider elements and labels.
-        var divider = this._dividersElement.firstChild;
-        var dividerLabelBar = this._dividersLabelBarElement.firstChild;
-
-        var clientWidth = this._dividersLabelBarElement.clientWidth - paddingLeft;
-        for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {
-            if (!divider) {
-                divider = document.createElement("div");
-                divider.className = "resources-divider";
-                this._dividersElement.appendChild(divider);
-
-                dividerLabelBar = document.createElement("div");
-                dividerLabelBar.className = "resources-divider";
-                var label = document.createElement("div");
-                label.className = "resources-divider-label";
-                dividerLabelBar._labelElement = label;
-                dividerLabelBar.appendChild(label);
-                this._dividersLabelBarElement.appendChild(dividerLabelBar);
-            }
-
-            if (i === dividerCount)
-                divider.addStyleClass("last");
-            else
-                divider.removeStyleClass("last");
-
-            var left = paddingLeft + clientWidth * (i / dividerCount);
-            var percentLeft = 100 * left / this._dividersLabelBarElement.clientWidth + "%";
-            divider.style.left = percentLeft;
-            dividerLabelBar.style.left = percentLeft;
-
-            if (!isNaN(slice))
-                dividerLabelBar._labelElement.textContent = calculator.formatValue(slice * i);
-
-            divider = divider.nextSibling;
-            dividerLabelBar = dividerLabelBar.nextSibling;
-        }
-
-        // Remove extras.
-        while (divider) {
-            var nextDivider = divider.nextSibling;
-            this._dividersElement.removeChild(divider);
-            divider = nextDivider;
-        }
-        while (dividerLabelBar) {
-            var nextDivider = dividerLabelBar.nextSibling;
-            this._dividersLabelBarElement.removeChild(dividerLabelBar);
-            dividerLabelBar = nextDivider;
-        }
-        return true;
-    },
-
-    addEventDivider: function(divider)
-    {
-        this._eventDividersElement.appendChild(divider);
-    },
-
-    setScrollAndDividerTop: function(scrollTop, dividersTop)
-    {
-        this._dividersElement.style.top = scrollTop + "px";
-        this._eventDividersElement.style.top = scrollTop + "px";
-        this._dividersLabelBarElement.style.top = dividersTop + "px";
-    }
-}
-
-/* AbstractTimelinePanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AbstractTimelinePanel = function()
-{
-    WebInspector.Panel.call(this);
-    this._items = [];
-    this._staleItems = [];
-}
-
-WebInspector.AbstractTimelinePanel.prototype = {
-    get categories()
-    {
-        // Should be implemented by the concrete subclasses.
-        return {};
-    },
-
-    populateSidebar: function()
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    createItemTreeElement: function(item)
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    createItemGraph: function(item)
-    {
-        // Should be implemented by the concrete subclasses.
-    },
-
-    get items()
-    {
-        return this._items;
-    },
-
-    createInterface: function()
-    {
-        this.containerElement = document.createElement("div");
-        this.containerElement.id = "resources-container";
-        this.containerElement.addEventListener("scroll", this._updateDividersLabelBarPosition.bind(this), false);
-        this.element.appendChild(this.containerElement);
-
-        this.createSidebar(this.containerElement, this.element);
-        this.sidebarElement.id = "resources-sidebar";
-        this.populateSidebar();
-
-        this._containerContentElement = document.createElement("div");
-        this._containerContentElement.id = "resources-container-content";
-        this.containerElement.appendChild(this._containerContentElement);
-
-        this.summaryBar = new WebInspector.SummaryBar(this.categories);
-        this.summaryBar.element.id = "resources-summary";
-        this._containerContentElement.appendChild(this.summaryBar.element);
-
-        this._timelineGrid = new WebInspector.TimelineGrid();
-        this._containerContentElement.appendChild(this._timelineGrid.element);
-        this.itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
-    },
-
-    createFilterPanel: function()
-    {
-        this.filterBarElement = document.createElement("div");
-        this.filterBarElement.id = "resources-filter";
-        this.filterBarElement.className = "scope-bar";
-        this.element.appendChild(this.filterBarElement);
-
-        function createFilterElement(category)
-        {
-            if (category === "all")
-                var label = WebInspector.UIString("All");
-            else if (this.categories[category])
-                var label = this.categories[category].title;
-
-            var categoryElement = document.createElement("li");
-            categoryElement.category = category;
-            categoryElement.addStyleClass(category);
-            categoryElement.appendChild(document.createTextNode(label));
-            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
-            this.filterBarElement.appendChild(categoryElement);
-
-            return categoryElement;
-        }
-
-        this.filterAllElement = createFilterElement.call(this, "all");
-
-        // Add a divider
-        var dividerElement = document.createElement("div");
-        dividerElement.addStyleClass("divider");
-        this.filterBarElement.appendChild(dividerElement);
-
-        for (var category in this.categories)
-            createFilterElement.call(this, category);
-    },
-
-    showCategory: function(category)
-    {
-        var filterClass = "filter-" + category.toLowerCase();
-        this.itemsGraphsElement.addStyleClass(filterClass);
-        this.itemsTreeElement.childrenListElement.addStyleClass(filterClass);
-    },
-
-    hideCategory: function(category)
-    {
-        var filterClass = "filter-" + category.toLowerCase();
-        this.itemsGraphsElement.removeStyleClass(filterClass);
-        this.itemsTreeElement.childrenListElement.removeStyleClass(filterClass);
-    },
-
-    filter: function(target, selectMultiple)
-    {
-        function unselectAll()
-        {
-            for (var i = 0; i < this.filterBarElement.childNodes.length; ++i) {
-                var child = this.filterBarElement.childNodes[i];
-                if (!child.category)
-                    continue;
-
-                child.removeStyleClass("selected");
-                this.hideCategory(child.category);
-            }
-        }
-
-        if (target === this.filterAllElement) {
-            if (target.hasStyleClass("selected")) {
-                // We can't unselect All, so we break early here
-                return;
-            }
-
-            // If All wasn't selected, and now is, unselect everything else.
-            unselectAll.call(this);
-        } else {
-            // Something other than All is being selected, so we want to unselect All.
-            if (this.filterAllElement.hasStyleClass("selected")) {
-                this.filterAllElement.removeStyleClass("selected");
-                this.hideCategory("all");
-            }
-        }
-
-        if (!selectMultiple) {
-            // If multiple selection is off, we want to unselect everything else
-            // and just select ourselves.
-            unselectAll.call(this);
-
-            target.addStyleClass("selected");
-            this.showCategory(target.category);
-            return;
-        }
-
-        if (target.hasStyleClass("selected")) {
-            // If selectMultiple is turned on, and we were selected, we just
-            // want to unselect ourselves.
-            target.removeStyleClass("selected");
-            this.hideCategory(target.category);
-        } else {
-            // If selectMultiple is turned on, and we weren't selected, we just
-            // want to select ourselves.
-            target.addStyleClass("selected");
-            this.showCategory(target.category);
-        }
-    },
-
-    _updateFilter: function(e)
-    {
-        var isMac = WebInspector.isMac();
-        var selectMultiple = false;
-        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
-            selectMultiple = true;
-
-        this.filter(e.target, selectMultiple);
-
-        // When we are updating our filtering, scroll to the top so we don't end up
-        // in blank graph under all the resources.
-        this.containerElement.scrollTop = 0;
-    },
-
-    updateGraphDividersIfNeeded: function(force)
-    {
-        if (!this.visible) {
-            this.needsRefresh = true;
-            return false;
-        }
-        return this._timelineGrid.updateDividers(force, this.calculator);
-    },
-
-    _updateDividersLabelBarPosition: function()
-    {
-        var scrollTop = this.containerElement.scrollTop;
-        var dividersTop = (scrollTop < this.summaryBar.element.offsetHeight ? this.summaryBar.element.offsetHeight : scrollTop);
-        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
-    },
-
-    get needsRefresh()
-    {
-        return this._needsRefresh;
-    },
-
-    set needsRefresh(x)
-    {
-        if (this._needsRefresh === x)
-            return;
-
-        this._needsRefresh = x;
-
-        if (x) {
-            if (this.visible && !("_refreshTimeout" in this))
-                this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
-        } else {
-            if ("_refreshTimeout" in this) {
-                clearTimeout(this._refreshTimeout);
-                delete this._refreshTimeout;
-            }
-        }
-    },
-
-    refreshIfNeeded: function()
-    {
-        if (this.needsRefresh)
-            this.refresh();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this._updateDividersLabelBarPosition();
-        this.refreshIfNeeded();
-    },
-
-    resize: function()
-    {
-        this.updateGraphDividersIfNeeded();
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._containerContentElement.style.left = width + "px";
-        this.updateGraphDividersIfNeeded();
-    },
-
-    invalidateAllItems: function()
-    {
-        this._staleItems = this._items.slice();
-    },
-
-    refresh: function()
-    {
-        this.needsRefresh = false;
-
-        var staleItemsLength = this._staleItems.length;
-
-        var boundariesChanged = false;
-
-        for (var i = 0; i < staleItemsLength; ++i) {
-            var item = this._staleItems[i];
-            if (!item._itemsTreeElement) {
-                // Create the timeline tree element and graph.
-                item._itemsTreeElement = this.createItemTreeElement(item);
-                item._itemsTreeElement._itemGraph = this.createItemGraph(item);
-
-                this.itemsTreeElement.appendChild(item._itemsTreeElement);
-                this.itemsGraphsElement.appendChild(item._itemsTreeElement._itemGraph.graphElement);
-            }
-
-            if (item._itemsTreeElement.refresh)
-                item._itemsTreeElement.refresh();
-
-            if (this.calculator.updateBoundaries(item))
-                boundariesChanged = true;
-        }
-
-        if (boundariesChanged) {
-            // The boundaries changed, so all item graphs are stale.
-            this._staleItems = this._items.slice();
-            staleItemsLength = this._staleItems.length;
-        }
-
-        for (var i = 0; i < staleItemsLength; ++i)
-            this._staleItems[i]._itemsTreeElement._itemGraph.refresh(this.calculator);
-
-        this._staleItems = [];
-
-        this.updateGraphDividersIfNeeded();
-    },
-
-    reset: function()
-    {
-        this.containerElement.scrollTop = 0;
-
-        if (this._calculator)
-            this._calculator.reset();
-
-        if (this._items) {
-            var itemsLength = this._items.length;
-            for (var i = 0; i < itemsLength; ++i) {
-                var item = this._items[i];
-                delete item._itemsTreeElement;
-            }
-        }
-
-        this._items = [];
-        this._staleItems = [];
-
-        this.itemsTreeElement.removeChildren();
-        this.itemsGraphsElement.removeChildren();
-
-        this.updateGraphDividersIfNeeded(true);
-    },
-
-    get calculator()
-    {
-        return this._calculator;
-    },
-
-    set calculator(x)
-    {
-        if (!x || this._calculator === x)
-            return;
-
-        this._calculator = x;
-        this._calculator.reset();
-
-        this._staleItems = this._items.slice();
-        this.refresh();
-    },
-
-    addItem: function(item)
-    {
-        this._items.push(item);
-        this.refreshItem(item);
-    },
-
-    removeItem: function(item)
-    {
-        this._items.remove(item, true);
-
-        if (item._itemsTreeElement) {
-            this.itemsTreeElement.removeChild(item._itemsTreeElement);
-            this.itemsGraphsElement.removeChild(item._itemsTreeElement._itemGraph.graphElement);
-        }
-
-        delete item._itemsTreeElement;
-        this.adjustScrollPosition();
-    },
-
-    refreshItem: function(item)
-    {
-        this._staleItems.push(item);
-        this.needsRefresh = true;
-    },
-
-    revealAndSelectItem: function(item)
-    {
-        if (item._itemsTreeElement) {
-            item._itemsTreeElement.reveal();
-            item._itemsTreeElement.select(true);
-        }
-    },
-
-    sortItems: function(sortingFunction)
-    {
-        var sortedElements = [].concat(this.itemsTreeElement.children);
-        sortedElements.sort(sortingFunction);
-
-        var sortedElementsLength = sortedElements.length;
-        for (var i = 0; i < sortedElementsLength; ++i) {
-            var treeElement = sortedElements[i];
-            if (treeElement === this.itemsTreeElement.children[i])
-                continue;
-
-            var wasSelected = treeElement.selected;
-            this.itemsTreeElement.removeChild(treeElement);
-            this.itemsTreeElement.insertChild(treeElement, i);
-            if (wasSelected)
-                treeElement.select(true);
-
-            var graphElement = treeElement._itemGraph.graphElement;
-            this.itemsGraphsElement.insertBefore(graphElement, this.itemsGraphsElement.children[i]);
-        }
-    },
-
-    adjustScrollPosition: function()
-    {
-        // Prevent the container from being scrolled off the end.
-        if ((this.containerElement.scrollTop + this.containerElement.offsetHeight) > this.sidebarElement.offsetHeight)
-            this.containerElement.scrollTop = (this.sidebarElement.offsetHeight - this.containerElement.offsetHeight);
-    },
-
-    addEventDivider: function(divider)
-    {
-        this._timelineGrid.addEventDivider(divider);
-    }
-}
-
-WebInspector.AbstractTimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.AbstractTimelineCalculator = function()
-{
-}
-
-WebInspector.AbstractTimelineCalculator.prototype = {
-    computeSummaryValues: function(items)
-    {
-        var total = 0;
-        var categoryValues = {};
-
-        var itemsLength = items.length;
-        for (var i = 0; i < itemsLength; ++i) {
-            var item = items[i];
-            var value = this._value(item);
-            if (typeof value === "undefined")
-                continue;
-            if (!(item.category.name in categoryValues))
-                categoryValues[item.category.name] = 0;
-            categoryValues[item.category.name] += value;
-            total += value;
-        }
-
-        return {categoryValues: categoryValues, total: total};
-    },
-
-    computeBarGraphPercentages: function(item)
-    {
-        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
-    },
-
-    computeBarGraphLabels: function(item)
-    {
-        const label = this.formatValue(this._value(item));
-        return {left: label, right: label, tooltip: label};
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    updateBoundaries: function(item)
-    {
-        this.minimumBoundary = 0;
-
-        var value = this._value(item);
-        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
-            this.maximumBoundary = value;
-            return true;
-        }
-        return false;
-    },
-
-    reset: function()
-    {
-        delete this.minimumBoundary;
-        delete this.maximumBoundary;
-    },
-
-    _value: function(item)
-    {
-        return 0;
-    },
-
-    formatValue: function(value)
-    {
-        return value.toString();
-    }
-}
-
-WebInspector.AbstractTimelineCategory = function(name, title, color)
-{
-    this.name = name;
-    this.title = title;
-    this.color = color;
-}
-
-WebInspector.AbstractTimelineCategory.prototype = {
-    toString: function()
-    {
-        return this.title;
-    }
-}
-
-/* Resource.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Resource = function(identifier, url)
-{
-    this.identifier = identifier;
-    this._url = url;
-    this._startTime = -1;
-    this._endTime = -1;
-    this._requestMethod = "";
-    this._requestFormData = "";
-    this._category = WebInspector.resourceCategories.other;
-}
-
-WebInspector.Resource.StatusText = {
-    100: "Continue",
-    101: "Switching Protocols",
-    102: "Processing (WebDav)",
-    200: "OK",
-    201: "Created",
-    202: "Accepted",
-    203: "Non-Authoritative Information",
-    204: "No Content",
-    205: "Reset Content",
-    206: "Partial Content",
-    207: "Multi-Status (WebDav)",
-    300: "Multiple Choices",
-    301: "Moved Permanently",
-    302: "Found",
-    303: "See Other",
-    304: "Not Modified",
-    305: "Use Proxy",
-    306: "Switch Proxy",
-    307: "Temporary",
-    400: "Bad Request",
-    401: "Unauthorized",
-    402: "Payment Required",
-    403: "Forbidden",
-    404: "Not Found",
-    405: "Method Not Allowed",
-    406: "Not Acceptable",
-    407: "Proxy Authentication Required",
-    408: "Request Timeout",
-    409: "Conflict",
-    410: "Gone",
-    411: "Length Required",
-    412: "Precondition Failed",
-    413: "Request Entity Too Large",
-    414: "Request-URI Too Long",
-    415: "Unsupported Media Type",
-    416: "Requested Range Not Satisfiable",
-    417: "Expectation Failed",
-    418: "I'm a teapot",
-    422: "Unprocessable Entity (WebDav)",
-    423: "Locked (WebDav)",
-    424: "Failed Dependency (WebDav)",
-    425: "Unordered Collection",
-    426: "Upgrade Required",
-    449: "Retry With",
-    500: "Internal Server Error",
-    501: "Not Implemented",
-    502: "Bad Gateway",
-    503: "Service Unavailable",
-    504: "Gateway Timeout",
-    505: "HTTP Version Not Supported",
-    506: "Variant Also Negotiates",
-    507: "Insufficient Storage (WebDav)",
-    509: "Bandwidth Limit Exceeded",
-    510: "Not Extended"
-};
-
-// Keep these in sync with WebCore::InspectorResource::Type
-WebInspector.Resource.Type = {
-    Document:   0,
-    Stylesheet: 1,
-    Image:      2,
-    Font:       3,
-    Script:     4,
-    XHR:        5,
-    Media:      6,
-    Other:      7,
-
-    isTextType: function(type)
-    {
-        return (type === this.Document) || (type === this.Stylesheet) || (type === this.Script) || (type === this.XHR);
-    },
-
-    toString: function(type)
-    {
-        switch (type) {
-            case this.Document:
-                return WebInspector.UIString("document");
-            case this.Stylesheet:
-                return WebInspector.UIString("stylesheet");
-            case this.Image:
-                return WebInspector.UIString("image");
-            case this.Font:
-                return WebInspector.UIString("font");
-            case this.Script:
-                return WebInspector.UIString("script");
-            case this.XHR:
-                return WebInspector.UIString("XHR");
-            case this.Other:
-            default:
-                return WebInspector.UIString("other");
-        }
-    }
-}
-
-WebInspector.Resource.prototype = {
-    get url()
-    {
-        return this._url;
-    },
-
-    set url(x)
-    {
-        if (this._url === x)
-            return;
-
-        var oldURL = this._url;
-        this._url = x;
-
-        // FIXME: We should make the WebInspector object listen for the "url changed" event.
-        // Then resourceURLChanged can be removed.
-        WebInspector.resourceURLChanged(this, oldURL);
-
-        this.dispatchEventToListeners("url changed");
-    },
-
-    get documentURL()
-    {
-        return this._documentURL;
-    },
-
-    set documentURL(x)
-    {
-        if (this._documentURL === x)
-            return;
-        this._documentURL = x;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    set domain(x)
-    {
-        if (this._domain === x)
-            return;
-        this._domain = x;
-    },
-
-    get lastPathComponent()
-    {
-        return this._lastPathComponent;
-    },
-
-    set lastPathComponent(x)
-    {
-        if (this._lastPathComponent === x)
-            return;
-        this._lastPathComponent = x;
-        this._lastPathComponentLowerCase = x ? x.toLowerCase() : null;
-    },
-
-    get displayName()
-    {
-        var title = this.lastPathComponent;
-        if (!title)
-            title = this.displayDomain;
-        if (!title && this.url)
-            title = this.url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
-        if (title === "/")
-            title = this.url;
-        return title;
-    },
-
-    get displayDomain()
-    {
-        // WebInspector.Database calls this, so don't access more than this.domain.
-        if (this.domain && (!WebInspector.mainResource || (WebInspector.mainResource && this.domain !== WebInspector.mainResource.domain)))
-            return this.domain;
-        return "";
-    },
-
-    get startTime()
-    {
-        return this._startTime || -1;
-    },
-
-    set startTime(x)
-    {
-        if (this._startTime === x)
-            return;
-
-        this._startTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get responseReceivedTime()
-    {
-        return this._responseReceivedTime || -1;
-    },
-
-    set responseReceivedTime(x)
-    {
-        if (this._responseReceivedTime === x)
-            return;
-
-        this._responseReceivedTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get endTime()
-    {
-        return this._endTime || -1;
-    },
-
-    set endTime(x)
-    {
-        if (this._endTime === x)
-            return;
-
-        this._endTime = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get duration()
-    {
-        if (this._endTime === -1 || this._startTime === -1)
-            return -1;
-        return this._endTime - this._startTime;
-    },
-
-    get latency()
-    {
-        if (this._responseReceivedTime === -1 || this._startTime === -1)
-            return -1;
-        return this._responseReceivedTime - this._startTime;
-    },
-
-    get contentLength()
-    {
-        return this._contentLength || 0;
-    },
-
-    set contentLength(x)
-    {
-        if (this._contentLength === x)
-            return;
-
-        this._contentLength = x;
-
-        if (WebInspector.panels.resources)
-            WebInspector.panels.resources.refreshResource(this);
-    },
-
-    get expectedContentLength()
-    {
-        return this._expectedContentLength || 0;
-    },
-
-    set expectedContentLength(x)
-    {
-        if (this._expectedContentLength === x)
-            return;
-        this._expectedContentLength = x;
-    },
-
-    get finished()
-    {
-        return this._finished;
-    },
-
-    set finished(x)
-    {
-        if (this._finished === x)
-            return;
-
-        this._finished = x;
-
-        if (x) {
-            this._checkWarnings();
-            this.dispatchEventToListeners("finished");
-        }
-    },
-
-    get failed()
-    {
-        return this._failed;
-    },
-
-    set failed(x)
-    {
-        this._failed = x;
-    },
-
-    get category()
-    {
-        return this._category;
-    },
-
-    set category(x)
-    {
-        if (this._category === x)
-            return;
-
-        var oldCategory = this._category;
-        if (oldCategory)
-            oldCategory.removeResource(this);
-
-        this._category = x;
-
-        if (this._category)
-            this._category.addResource(this);
-
-        if (WebInspector.panels.resources) {
-            WebInspector.panels.resources.refreshResource(this);
-            WebInspector.panels.resources.recreateViewForResourceIfNeeded(this);
-        }
-    },
-
-    get mimeType()
-    {
-        return this._mimeType;
-    },
-
-    set mimeType(x)
-    {
-        if (this._mimeType === x)
-            return;
-
-        this._mimeType = x;
-    },
-
-    get type()
-    {
-        return this._type;
-    },
-
-    set type(x)
-    {
-        if (this._type === x)
-            return;
-
-        this._type = x;
-
-        switch (x) {
-            case WebInspector.Resource.Type.Document:
-                this.category = WebInspector.resourceCategories.documents;
-                break;
-            case WebInspector.Resource.Type.Stylesheet:
-                this.category = WebInspector.resourceCategories.stylesheets;
-                break;
-            case WebInspector.Resource.Type.Script:
-                this.category = WebInspector.resourceCategories.scripts;
-                break;
-            case WebInspector.Resource.Type.Image:
-                this.category = WebInspector.resourceCategories.images;
-                break;
-            case WebInspector.Resource.Type.Font:
-                this.category = WebInspector.resourceCategories.fonts;
-                break;
-            case WebInspector.Resource.Type.XHR:
-                this.category = WebInspector.resourceCategories.xhr;
-                break;
-            case WebInspector.Resource.Type.Other:
-            default:
-                this.category = WebInspector.resourceCategories.other;
-                break;
-        }
-    },
-
-    get requestHeaders()
-    {
-        if (this._requestHeaders === undefined)
-            this._requestHeaders = {};
-        return this._requestHeaders;
-    },
-
-    set requestHeaders(x)
-    {
-        if (this._requestHeaders === x)
-            return;
-
-        this._requestHeaders = x;
-        delete this._sortedRequestHeaders;
-
-        this.dispatchEventToListeners("requestHeaders changed");
-    },
-
-    get sortedRequestHeaders()
-    {
-        if (this._sortedRequestHeaders !== undefined)
-            return this._sortedRequestHeaders;
-
-        this._sortedRequestHeaders = [];
-        for (var key in this.requestHeaders)
-            this._sortedRequestHeaders.push({header: key, value: this.requestHeaders[key]});
-        this._sortedRequestHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
-
-        return this._sortedRequestHeaders;
-    },
-
-    get responseHeaders()
-    {
-        if (this._responseHeaders === undefined)
-            this._responseHeaders = {};
-        return this._responseHeaders;
-    },
-
-    set responseHeaders(x)
-    {
-        if (this._responseHeaders === x)
-            return;
-
-        this._responseHeaders = x;
-        delete this._sortedResponseHeaders;
-
-        this.dispatchEventToListeners("responseHeaders changed");
-    },
-
-    get sortedResponseHeaders()
-    {
-        if (this._sortedResponseHeaders !== undefined)
-            return this._sortedResponseHeaders;
-
-        this._sortedResponseHeaders = [];
-        for (var key in this.responseHeaders)
-            this._sortedResponseHeaders.push({header: key, value: this.responseHeaders[key]});
-        this._sortedResponseHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
-
-        return this._sortedResponseHeaders;
-    },
-
-    get scripts()
-    {
-        if (!("_scripts" in this))
-            this._scripts = [];
-        return this._scripts;
-    },
-
-    addScript: function(script)
-    {
-        if (!script)
-            return;
-        this.scripts.unshift(script);
-        script.resource = this;
-    },
-
-    removeAllScripts: function()
-    {
-        if (!this._scripts)
-            return;
-
-        for (var i = 0; i < this._scripts.length; ++i) {
-            if (this._scripts[i].resource === this)
-                delete this._scripts[i].resource;
-        }
-
-        delete this._scripts;
-    },
-
-    removeScript: function(script)
-    {
-        if (!script)
-            return;
-
-        if (script.resource === this)
-            delete script.resource;
-
-        if (!this._scripts)
-            return;
-
-        this._scripts.remove(script);
-    },
-
-    get errors()
-    {
-        return this._errors || 0;
-    },
-
-    set errors(x)
-    {
-        this._errors = x;
-    },
-
-    get warnings()
-    {
-        return this._warnings || 0;
-    },
-
-    set warnings(x)
-    {
-        this._warnings = x;
-    },
-
-    _mimeTypeIsConsistentWithType: function()
-    {
-        if (typeof this.type === "undefined"
-         || this.type === WebInspector.Resource.Type.Other
-         || this.type === WebInspector.Resource.Type.XHR)
-            return true;
-
-        if (this.mimeType in WebInspector.MIMETypes)
-            return this.type in WebInspector.MIMETypes[this.mimeType];
-
-        return false;
-    },
-
-    _checkWarnings: function()
-    {
-        for (var warning in WebInspector.Warnings)
-            this._checkWarning(WebInspector.Warnings[warning]);
-    },
-
-    _checkWarning: function(warning)
-    {
-        var msg;
-        switch (warning.id) {
-            case WebInspector.Warnings.IncorrectMIMEType.id:
-                if (!this._mimeTypeIsConsistentWithType())
-                    msg = new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,
-                        WebInspector.ConsoleMessage.MessageType.Log, 
-                        WebInspector.ConsoleMessage.MessageLevel.Warning, -1, this.url, null, 1,
-                        String.sprintf(WebInspector.Warnings.IncorrectMIMEType.message,
-                        WebInspector.Resource.Type.toString(this.type), this.mimeType));
-                break;
-        }
-
-        if (msg)
-            WebInspector.console.addMessage(msg);
-    }
-}
-
-WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.Resource.CompareByStartTime = function(a, b)
-{
-    if (a.startTime < b.startTime)
-        return -1;
-    if (a.startTime > b.startTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByResponseReceivedTime = function(a, b)
-{
-    if (a.responseReceivedTime === -1 && b.responseReceivedTime !== -1)
-        return 1;
-    if (a.responseReceivedTime !== -1 && b.responseReceivedTime === -1)
-        return -1;
-    if (a.responseReceivedTime < b.responseReceivedTime)
-        return -1;
-    if (a.responseReceivedTime > b.responseReceivedTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByEndTime = function(a, b)
-{
-    if (a.endTime === -1 && b.endTime !== -1)
-        return 1;
-    if (a.endTime !== -1 && b.endTime === -1)
-        return -1;
-    if (a.endTime < b.endTime)
-        return -1;
-    if (a.endTime > b.endTime)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByDuration = function(a, b)
-{
-    if (a.duration < b.duration)
-        return -1;
-    if (a.duration > b.duration)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareByLatency = function(a, b)
-{
-    if (a.latency < b.latency)
-        return -1;
-    if (a.latency > b.latency)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.CompareBySize = function(a, b)
-{
-    if (a.contentLength < b.contentLength)
-        return -1;
-    if (a.contentLength > b.contentLength)
-        return 1;
-    return 0;
-}
-
-WebInspector.Resource.StatusTextForCode = function(code)
-{
-    return code ? code + " " + WebInspector.Resource.StatusText[code] : "";
-}
-
-/* ResourceCategory.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourceCategory = function(name, title, color)
-{
-    WebInspector.AbstractTimelineCategory.call(this, name, title, color);
-    this.resources = [];
-}
-
-WebInspector.ResourceCategory.prototype = {
-
-    addResource: function(resource)
-    {
-        var a = resource;
-        var resourcesLength = this.resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var b = this.resources[i];
-            if (a._lastPathComponentLowerCase && b._lastPathComponentLowerCase)
-                if (a._lastPathComponentLowerCase < b._lastPathComponentLowerCase)
-                    break;
-            else if (a.name && b.name)
-                if (a.name < b.name)
-                    break;
-        }
-
-        this.resources.splice(i, 0, resource);
-    },
-
-    removeResource: function(resource)
-    {
-        this.resources.remove(resource, true);
-    },
-
-    removeAllResources: function(resource)
-    {
-        this.resources = [];
-    }
-}
-
-WebInspector.ResourceCategory.prototype.__proto__ = WebInspector.AbstractTimelineCategory.prototype;
-
-/* Database.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Database = function(id, domain, name, version)
-{
-    this._id = id;
-    this._domain = domain;
-    this._name = name;
-    this._version = version;
-}
-
-WebInspector.Database.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get name()
-    {
-        return this._name;
-    },
-
-    set name(x)
-    {
-        this._name = x;
-    },
-
-    get version()
-    {
-        return this._version;
-    },
-
-    set version(x)
-    {
-        this._version = x;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    set domain(x)
-    {
-        this._domain = x;
-    },
-
-    get displayDomain()
-    {
-        return WebInspector.Resource.prototype.__lookupGetter__("displayDomain").call(this);
-    },
-
-    getTableNames: function(callback)
-    {
-        function sortingCallback(names)
-        {
-            callback(names.sort());
-        }
-        var callId = WebInspector.Callback.wrap(sortingCallback);
-        InspectorBackend.getDatabaseTableNames(callId, this._id);
-    },
-    
-    executeSql: function(query, onSuccess, onError)
-    {
-        function callback(result)
-        {
-            if (!(result instanceof Array)) {
-                onError(result);
-                return;
-            }
-            onSuccess(result);
-        }
-        InjectedScriptAccess.executeSql(this._id, query, callback);
-    }
-}
-
-WebInspector.didGetDatabaseTableNames = WebInspector.Callback.processCallback;
-
-/* DOMStorage.js */
-
-/*
- * Copyright (C) 2008 Nokia Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMStorage = function(id, domain, isLocalStorage)
-{
-    this._id = id;
-    this._domain = domain;
-    this._isLocalStorage = isLocalStorage;
-}
-
-WebInspector.DOMStorage.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get domStorage()
-    {
-        return this._domStorage;
-    },
-
-    get domain()
-    {
-        return this._domain;
-    },
-
-    get isLocalStorage()
-    {
-        return this._isLocalStorage;
-    },
-
-    getEntries: function(callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.getDOMStorageEntries(callId, this._id);
-    },
-    
-    setItem: function(key, value, callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.setDOMStorageItem(callId, this._id, key, value);
-    },
-    
-    removeItem: function(key, callback)
-    {
-        var callId = WebInspector.Callback.wrap(callback);
-        InspectorBackend.removeDOMStorageItem(callId, this._id, key);
-    }
-}
-
-WebInspector.didGetDOMStorageEntries = WebInspector.Callback.processCallback;
-WebInspector.didSetDOMStorageItem = WebInspector.Callback.processCallback;
-WebInspector.didRemoveDOMStorageItem = WebInspector.Callback.processCallback;
-
-/* DOMStorageItemsView.js */
-
-/*
- * Copyright (C) 2008 Nokia Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMStorageItemsView = function(domStorage)
-{
-    WebInspector.View.call(this);
-
-    this.domStorage = domStorage;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
-    this.deleteButton.visible = false;
-    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-}
-
-WebInspector.DOMStorageItemsView.prototype = {
-    get statusBarItems()
-    {
-        return [this.refreshButton.element, this.deleteButton.element];
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this.deleteButton.visible = false;
-    },
-
-    update: function()
-    {
-        this.element.removeChildren();
-        var callback = this._showDOMStorageEntries.bind(this);
-        this.domStorage.getEntries(callback);
-    },
-
-    _showDOMStorageEntries: function(entries)
-    {
-        this._dataGrid = this._dataGridForDOMStorageEntries(entries);
-        this.element.appendChild(this._dataGrid.element);
-        this._dataGrid.updateWidths();
-        this.deleteButton.visible = true;
-    },
-
-    resize: function()
-    {
-        if (this._dataGrid)
-            this._dataGrid.updateWidths();
-    },
-
-    _dataGridForDOMStorageEntries: function(entries)
-    {
-        var columns = {};
-        columns[0] = {};
-        columns[1] = {};
-        columns[0].title = WebInspector.UIString("Key");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-
-        var nodes = [];
-
-        var keys = [];
-        var length = entries.length;
-        for (var i = 0; i < entries.length; i++) {
-            var data = {};
-
-            var key = entries[i][0];
-            data[0] = key;
-            if (key.length > columns[0].width)
-                columns[0].width = key.length;
-
-            var value = entries[i][1];
-            data[1] = value;
-            if (value.length > columns[1].width)
-                columns[1].width = value.length;
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = true;
-            nodes.push(node);
-            keys.push(key);
-        }
-
-        var totalColumnWidths = columns[0].width + columns[1].width;
-        var width = Math.round((columns[0].width * 100) / totalColumnWidths);
-        const minimumPrecent = 10;
-        if (width < minimumPrecent)
-            width = minimumPrecent;
-        if (width > 100 - minimumPrecent)
-            width = 100 - minimumPrecent;
-        columns[0].width = width;
-        columns[1].width = 100 - width;
-        columns[0].width += "%";
-        columns[1].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        dataGrid.addCreationNode(false);
-        if (length > 0)
-            nodes[0].selected = true;
-        return dataGrid;
-    },
-
-    _deleteButtonClicked: function(event)
-    {
-        if (!this._dataGrid || !this._dataGrid.selectedNode)
-            return;
-
-        this._deleteCallback(this._dataGrid.selectedNode);
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    },
-    
-    _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
-    {
-        var domStorage = this.domStorage;
-        if (columnIdentifier === 0) {
-            if (oldText)
-                domStorage.removeItem(oldText);
-
-            domStorage.setItem(newText, editingNode.data[1]);
-        } else {
-            domStorage.setItem(editingNode.data[0], newText);
-        }
-        
-        this.update();
-    },
-    
-    _deleteCallback: function(node)
-    {
-        if (!node || node.isCreationNode)
-            return;
-
-        if (this.domStorage)
-            this.domStorage.removeItem(node.data[0]);
-            
-        this.update();
-    }
-}
-
-WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* DataGrid.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *        notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *        notice, this list of conditions and the following disclaimer in the
- *        documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.         IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DataGrid = function(columns, editCallback, deleteCallback)
-{
-    this.element = document.createElement("div");
-    this.element.className = "data-grid";
-    this.element.tabIndex = 0;
-    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
-
-    this._headerTable = document.createElement("table");
-    this._headerTable.className = "header";
-
-    this._dataTable = document.createElement("table");
-    this._dataTable.className = "data";
-
-    this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
-    this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
-    
-    this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
-    
-    // FIXME: Add a createCallback which is different from editCallback and has different
-    // behavior when creating a new node.
-    if (editCallback) {
-        this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
-        this._editCallback = editCallback;
-    }
-    if (deleteCallback)
-        this._deleteCallback = deleteCallback;
-    
-    this.aligned = {};
-
-    var scrollContainer = document.createElement("div");
-    scrollContainer.className = "data-container";
-    scrollContainer.appendChild(this._dataTable);
-
-    this.element.appendChild(this._headerTable);
-    this.element.appendChild(scrollContainer);
-
-    var headerRow = document.createElement("tr");
-    var columnGroup = document.createElement("colgroup");
-    var columnCount = 0;
-
-    for (var columnIdentifier in columns) {
-        var column = columns[columnIdentifier];
-        if (column.disclosure)
-            this.disclosureColumnIdentifier = columnIdentifier;
-
-        var col = document.createElement("col");
-        if (column.width)
-            col.style.width = column.width;
-        columnGroup.appendChild(col);
-
-        var cell = document.createElement("th");
-        cell.className = columnIdentifier + "-column";
-        cell.columnIdentifier = columnIdentifier;
-
-        var div = document.createElement("div");
-        div.textContent = column.title;
-        cell.appendChild(div);
-
-        if (column.sort) {
-            cell.addStyleClass("sort-" + column.sort);
-            this._sortColumnCell = cell;
-        }
-
-        if (column.sortable) {
-            cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
-            cell.addStyleClass("sortable");
-        }
-
-        if (column.aligned) {
-            cell.addStyleClass(column.aligned);
-            this.aligned[columnIdentifier] = column.aligned;
-        }
-
-        headerRow.appendChild(cell);
-
-        ++columnCount;
-    }
-
-    columnGroup.span = columnCount;
-
-    var cell = document.createElement("th");
-    cell.className = "corner";
-    headerRow.appendChild(cell);
-
-    this._headerTableColumnGroup = columnGroup;
-    this._headerTable.appendChild(this._headerTableColumnGroup);
-    this.headerTableBody.appendChild(headerRow);
-
-    var fillerRow = document.createElement("tr");
-    fillerRow.className = "filler";
-
-    for (var i = 0; i < columnCount; ++i) {
-        var cell = document.createElement("td");
-        fillerRow.appendChild(cell);
-    }
-    
-    this._dataTableColumnGroup = columnGroup.cloneNode(true);
-    this._dataTable.appendChild(this._dataTableColumnGroup);
-    this.dataTableBody.appendChild(fillerRow);
-
-    this.columns = columns || {};
-    this.children = [];
-    this.selectedNode = null;
-    this.expandNodesWhenArrowing = false;
-    this.root = true;
-    this.hasChildren = false;
-    this.expanded = true;
-    this.revealed = true;
-    this.selected = false;
-    this.dataGrid = this;
-    this.indentWidth = 15;
-    this.resizers = [];
-    this.columnWidthsInitialized = false;
-}
-
-WebInspector.DataGrid.prototype = {
-    _ondblclick: function(event)
-    {
-        if (this._editing || this._editingNode)
-            return;
-
-        this._startEditing(event.target);
-    },
-
-    _startEditingColumnOfDataGridNode: function(node, column)
-    {
-        this._editing = true;
-        this._editingNode = node;
-        this._editingNode.select();
-
-        var element = this._editingNode._element.children[column];
-        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    _startEditing: function(target)
-    {
-        var element = target.enclosingNodeOrSelfWithNodeName("td");
-        if (!element)
-            return;
-
-        this._editingNode = this.dataGridNodeFromNode(target);
-        if (!this._editingNode) {
-            if (!this.creationNode)
-                return;
-            this._editingNode = this.creationNode;
-        }
-
-        // Force editing the 1st column when editing the creation node
-        if (this._editingNode.isCreationNode)
-            return this._startEditingColumnOfDataGridNode(this._editingNode, 0);
-
-        this._editing = true;
-        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    _editingCommitted: function(element, newText, oldText, context, moveDirection)
-    {
-        // FIXME: We need more column identifiers here throughout this function.
-        // Not needed yet since only editable DataGrid is DOM Storage, which is Key - Value.
-        
-        // FIXME: Better way to do this than regular expressions?
-        var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1]);
-
-        var textBeforeEditing = this._editingNode.data[columnIdentifier];
-        var currentEditingNode = this._editingNode;
-
-        function moveToNextIfNeeded(wasChange) {
-            if (!moveDirection)
-                return;
-
-            if (moveDirection === "forward") {
-                if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)
-                    return;
-
-                if (columnIdentifier === 0)
-                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);
-
-                var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
-                if (nextDataGridNode)
-                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);
-                if (currentEditingNode.isCreationNode && wasChange) {
-                    addCreationNode(false);
-                    return this._startEditingColumnOfDataGridNode(this.creationNode, 0);
-                }
-                return;
-            }
-
-            if (moveDirection === "backward") {
-                if (columnIdentifier === 1)
-                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);
-                    var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);
-
-                if (nextDataGridNode)
-                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);
-                return;
-            }
-        }
-
-        if (textBeforeEditing == newText) {
-            this._editingCancelled(element);
-            moveToNextIfNeeded.call(this, false);
-            return;
-        }
-
-        // Update the text in the datagrid that we typed
-        this._editingNode.data[columnIdentifier] = newText;
-        
-        // Make the callback - expects an editing node (table row), the column number that is being edited,
-        // the text that used to be there, and the new text.
-        this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
-
-        if (this._editingNode.isCreationNode)
-            this.addCreationNode(false);
-
-        this._editingCancelled(element);
-        moveToNextIfNeeded.call(this, true);
-    },
-
-    _editingCancelled: function(element, context)
-    {
-        delete this._editing;
-        this._editingNode = null;
-    },
-    
-    get sortColumnIdentifier()
-    {
-        if (!this._sortColumnCell)
-            return null;
-        return this._sortColumnCell.columnIdentifier;
-    },
-
-    get sortOrder()
-    {
-        if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))
-            return "ascending";
-        if (this._sortColumnCell.hasStyleClass("sort-descending"))
-            return "descending";
-        return null;
-    },
-
-    get headerTableBody()
-    {
-        if ("_headerTableBody" in this)
-            return this._headerTableBody;
-
-        this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
-        if (!this._headerTableBody) {
-            this._headerTableBody = this.element.ownerDocument.createElement("tbody");
-            this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
-        }
-
-        return this._headerTableBody;
-    },
-
-    get dataTableBody()
-    {
-        if ("_dataTableBody" in this)
-            return this._dataTableBody;
-
-        this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
-        if (!this._dataTableBody) {
-            this._dataTableBody = this.element.ownerDocument.createElement("tbody");
-            this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
-        }
-
-        return this._dataTableBody;
-    },
- 
-    // Updates the widths of the table, including the positions of the column
-    // resizers.
-    //
-    // IMPORTANT: This function MUST be called once after the element of the
-    // DataGrid is attached to its parent element and every subsequent time the
-    // width of the parent element is changed in order to make it possible to
-    // resize the columns.
-    //
-    // If this function is not called after the DataGrid is attached to its
-    // parent element, then the DataGrid's columns will not be resizable.
-    updateWidths: function()
-    {
-        var headerTableColumns = this._headerTableColumnGroup.children;
-        
-        var left = 0;
-        var tableWidth = this._dataTable.offsetWidth;
-        var numColumns = headerTableColumns.length;
-        
-        if (!this.columnWidthsInitialized) {
-            // Give all the columns initial widths now so that during a resize,
-            // when the two columns that get resized get a percent value for
-            // their widths, all the other columns already have percent values
-            // for their widths.
-            for (var i = 0; i < numColumns; i++) {
-                var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
-                var percentWidth = ((columnWidth / tableWidth) * 100) + "%";
-                this._headerTableColumnGroup.children[i].style.width = percentWidth;
-                this._dataTableColumnGroup.children[i].style.width = percentWidth;
-            }
-            this.columnWidthsInitialized = true;
-        }
-        
-        // Make n - 1 resizers for n columns. 
-        for (var i = 0; i < numColumns - 1; i++) {
-            var resizer = this.resizers[i];
-
-            if (!resizer) {
-                // This is the first call to updateWidth, so the resizers need
-                // to be created.
-                resizer = document.createElement("div");
-                resizer.addStyleClass("data-grid-resizer");
-                // This resizer is associated with the column to its right.
-                resizer.rightNeighboringColumnID = i + 1;
-                resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);
-                this.element.appendChild(resizer);
-                this.resizers[i] = resizer;
-            }
-
-            // Get the width of the cell in the first (and only) row of the
-            // header table in order to determine the width of the column, since
-            // it is not possible to query a column for its width.
-            left += this.headerTableBody.rows[0].cells[i].offsetWidth;
-            
-            resizer.style.left = left + "px";
-        }
-    },
-
-    addCreationNode: function(hasChildren)
-    {
-        if (this.creationNode)
-            this.creationNode.makeNormal();
-
-        var emptyData = {};
-        for (var column in this.columns)
-            emptyData[column] = '';
-        this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
-        this.appendChild(this.creationNode);
-    },
-
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        if (!child)
-            throw("insertChild: Node can't be undefined or null.");
-        if (child.parent === this)
-            throw("insertChild: Node is already a child of this node.");
-
-        if (child.parent)
-            child.parent.removeChild(child);
-
-        this.children.splice(index, 0, child);
-        this.hasChildren = true;
-
-        child.parent = this;
-        child.dataGrid = this.dataGrid;
-        child._recalculateSiblings(index);
-
-        delete child._depth;
-        delete child._revealed;
-        delete child._attached;
-        child._shouldRefreshChildren = true;
-
-        var current = child.children[0];
-        while (current) {
-            current.dataGrid = this.dataGrid;
-            delete current._depth;
-            delete current._revealed;
-            delete current._attached;
-            current._shouldRefreshChildren = true;
-            current = current.traverseNextNode(false, child, true);
-        }
-
-        if (this.expanded)
-            child._attach();
-    },
-
-    removeChild: function(child)
-    {
-        if (!child)
-            throw("removeChild: Node can't be undefined or null.");
-        if (child.parent !== this)
-            throw("removeChild: Node is not a child of this node.");
-
-        child.deselect();
-
-        this.children.remove(child, true);
-
-        if (child.previousSibling)
-            child.previousSibling.nextSibling = child.nextSibling;
-        if (child.nextSibling)
-            child.nextSibling.previousSibling = child.previousSibling;
-
-        child.dataGrid = null;
-        child.parent = null;
-        child.nextSibling = null;
-        child.previousSibling = null;
-
-        if (this.children.length <= 0)
-            this.hasChildren = false;
-    },
-
-    removeChildren: function()
-    {
-        for (var i = 0; i < this.children.length; ++i) {
-            var child = this.children[i];
-            child.deselect();
-            child._detach();
-
-            child.dataGrid = null;
-            child.parent = null;
-            child.nextSibling = null;
-            child.previousSibling = null;
-        }
-
-        this.children = [];
-        this.hasChildren = false;
-    },
-
-    removeChildrenRecursive: function()
-    {
-        var childrenToRemove = this.children;
-
-        var child = this.children[0];
-        while (child) {
-            if (child.children.length)
-                childrenToRemove = childrenToRemove.concat(child.children);
-            child = child.traverseNextNode(false, this, true);
-        }
-
-        for (var i = 0; i < childrenToRemove.length; ++i) {
-            var child = childrenToRemove[i];
-            child.deselect();
-            child._detach();
-
-            child.children = [];
-            child.dataGrid = null;
-            child.parent = null;
-            child.nextSibling = null;
-            child.previousSibling = null;
-        }
-
-        this.children = [];
-    },
-
-
-    _keyDown: function(event)
-    {
-        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
-            return;
-
-        var handled = false;
-        var nextSelectedNode;
-        if (event.keyIdentifier === "Up" && !event.altKey) {
-            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
-            while (nextSelectedNode && !nextSelectedNode.selectable)
-                nextSelectedNode = nextSelectedNode.traversePreviousNode(!this.expandTreeNodesWhenArrowing);
-            handled = nextSelectedNode ? true : false;
-        } else if (event.keyIdentifier === "Down" && !event.altKey) {
-            nextSelectedNode = this.selectedNode.traverseNextNode(true);
-            while (nextSelectedNode && !nextSelectedNode.selectable)
-                nextSelectedNode = nextSelectedNode.traverseNextNode(!this.expandTreeNodesWhenArrowing);
-            handled = nextSelectedNode ? true : false;
-        } else if (event.keyIdentifier === "Left") {
-            if (this.selectedNode.expanded) {
-                if (event.altKey)
-                    this.selectedNode.collapseRecursively();
-                else
-                    this.selectedNode.collapse();
-                handled = true;
-            } else if (this.selectedNode.parent && !this.selectedNode.parent.root) {
-                handled = true;
-                if (this.selectedNode.parent.selectable) {
-                    nextSelectedNode = this.selectedNode.parent;
-                    handled = nextSelectedNode ? true : false;
-                } else if (this.selectedNode.parent)
-                    this.selectedNode.parent.collapse();
-            }
-        } else if (event.keyIdentifier === "Right") {
-            if (!this.selectedNode.revealed) {
-                this.selectedNode.reveal();
-                handled = true;
-            } else if (this.selectedNode.hasChildren) {
-                handled = true;
-                if (this.selectedNode.expanded) {
-                    nextSelectedNode = this.selectedNode.children[0];
-                    handled = nextSelectedNode ? true : false;
-                } else {
-                    if (event.altKey)
-                        this.selectedNode.expandRecursively();
-                    else
-                        this.selectedNode.expand();
-                }
-            }
-        } else if (event.keyCode === 8 || event.keyCode === 46) {
-            if (this._deleteCallback) {
-                handled = true;
-                this._deleteCallback(this.selectedNode);
-            }
-        } else if (isEnterKey(event)) {
-            if (this._editCallback) {
-                handled = true;
-                // The first child of the selected element is the <td class="0-column">,
-                // and that's what we want to edit.
-                this._startEditing(this.selectedNode._element.children[0]);
-            }
-        }
-
-        if (nextSelectedNode) {
-            nextSelectedNode.reveal();
-            nextSelectedNode.select();
-        }
-
-        if (handled) {
-            event.preventDefault();
-            event.stopPropagation();
-        }
-    },
-
-    expand: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    collapse: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    reveal: function()
-    {
-        // This is the root, do nothing.
-    },
-
-    dataGridNodeFromNode: function(target)
-    {
-        var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
-        return rowElement._dataGridNode;
-    },
-
-    dataGridNodeFromPoint: function(x, y)
-    {
-        var node = this._dataTable.ownerDocument.elementFromPoint(x, y);
-        var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");
-        return rowElement._dataGridNode;
-    },
-
-    _clickInHeaderCell: function(event)
-    {
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
-        if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))
-            return;
-
-        var sortOrder = this.sortOrder;
-
-        if (this._sortColumnCell) {
-            this._sortColumnCell.removeStyleClass("sort-ascending");
-            this._sortColumnCell.removeStyleClass("sort-descending");
-        }
-
-        if (cell == this._sortColumnCell) {
-            if (sortOrder == "ascending")
-                sortOrder = "descending";
-            else
-                sortOrder = "ascending";
-        }
-
-        this._sortColumnCell = cell;
-
-        cell.addStyleClass("sort-" + sortOrder);
-
-        this.dispatchEventToListeners("sorting changed");
-    },
-
-    _mouseDownInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.selectable)
-            return;
-
-        if (gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (event.metaKey) {
-            if (gridNode.selected)
-                gridNode.deselect();
-            else
-                gridNode.select();
-        } else
-            gridNode.select();
-    },
-    
-    _contextMenuInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.selectable)
-            return;
-        
-        if (gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-      
-        var contextMenu = new WebInspector.ContextMenu();
-        
-        // FIXME: Use the column names for Editing, instead of just "Edit".
-        if (this.dataGrid._editCallback) {
-            if (gridNode === this.creationNode)
-                contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));
-            else
-                contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));
-        }
-        if (this.dataGrid._deleteCallback && gridNode !== this.creationNode)
-            contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
-        
-        contextMenu.show(event);
-    },
-
-    _clickInDataTable: function(event)
-    {
-        var gridNode = this.dataGridNodeFromNode(event.target);
-        if (!gridNode || !gridNode.hasChildren)
-            return;
-
-        if (!gridNode.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (gridNode.expanded) {
-            if (event.altKey)
-                gridNode.collapseRecursively();
-            else
-                gridNode.collapse();
-        } else {
-            if (event.altKey)
-                gridNode.expandRecursively();
-            else
-                gridNode.expand();
-        }
-    },
-    
-    _startResizerDragging: function(event)
-    {
-        this.currentResizer = event.target;
-        if (!this.currentResizer.rightNeighboringColumnID)
-            return;
-        WebInspector.elementDragStart(this.lastResizer, this._resizerDragging.bind(this),
-            this._endResizerDragging.bind(this), event, "col-resize");
-    },
-    
-    _resizerDragging: function(event)
-    {
-        var resizer = this.currentResizer;
-        if (!resizer)
-            return;
-        
-        // Constrain the dragpoint to be within the containing div of the
-        // datagrid.
-        var dragPoint = event.clientX - this.element.totalOffsetLeft;
-        // Constrain the dragpoint to be within the space made up by the
-        // column directly to the left and the column directly to the right.
-        var leftEdgeOfPreviousColumn = 0;
-        var firstRowCells = this.headerTableBody.rows[0].cells;
-        for (var i = 0; i < resizer.rightNeighboringColumnID - 1; i++)
-            leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
-            
-        var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.rightNeighboringColumnID - 1].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth;
-        
-        // Give each column some padding so that they don't disappear.               
-        var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
-        var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
-        
-        dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
-        
-        resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";
-        
-        var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";
-        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
-        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
-        
-        var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";
-        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width =  percentRightColumn;
-        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn;
-        
-        event.preventDefault();
-    },
-    
-    _endResizerDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-        this.currentResizer = null;
-    },
-    
-    ColumnResizePadding: 10,
-    
-    CenterResizerOverBorderAdjustment: 3,
-}
-
-WebInspector.DataGrid.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.DataGridNode = function(data, hasChildren)
-{
-    this._expanded = false;
-    this._selected = false;
-    this._shouldRefreshChildren = true;
-    this._data = data || {};
-    this.hasChildren = hasChildren || false;
-    this.children = [];
-    this.dataGrid = null;
-    this.parent = null;
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.disclosureToggleWidth = 10;
-}
-
-WebInspector.DataGridNode.prototype = {
-    selectable: true,
-
-    get element()
-    {
-        if (this._element)
-            return this._element;
-
-        if (!this.dataGrid)
-            return null;
-
-        this._element = document.createElement("tr");
-        this._element._dataGridNode = this;
-
-        if (this.hasChildren)
-            this._element.addStyleClass("parent");
-        if (this.expanded)
-            this._element.addStyleClass("expanded");
-        if (this.selected)
-            this._element.addStyleClass("selected");
-        if (this.revealed)
-            this._element.addStyleClass("revealed");
-
-        for (var columnIdentifier in this.dataGrid.columns) {
-            var cell = this.createCell(columnIdentifier);
-            this._element.appendChild(cell);
-        }
-
-        return this._element;
-    },
-
-    get data()
-    {
-        return this._data;
-    },
-
-    set data(x)
-    {
-        this._data = x || {};
-        this.refresh();
-    },
-
-    get revealed()
-    {
-        if ("_revealed" in this)
-            return this._revealed;
-
-        var currentAncestor = this.parent;
-        while (currentAncestor && !currentAncestor.root) {
-            if (!currentAncestor.expanded) {
-                this._revealed = false;
-                return false;
-            }
-
-            currentAncestor = currentAncestor.parent;
-        }
-
-        this._revealed = true;
-        return true;
-    },
-
-    set hasChildren(x)
-    {
-        if (this._hasChildren === x)
-            return;
-
-        this._hasChildren = x;
-
-        if (!this._element)
-            return;
-
-        if (this._hasChildren)
-        {
-            this._element.addStyleClass("parent");
-            if (this.expanded)
-                this._element.addStyleClass("expanded");
-        }
-        else
-        {
-            this._element.removeStyleClass("parent");
-            this._element.removeStyleClass("expanded");
-        }
-    },
-
-    get hasChildren()
-    {
-        return this._hasChildren;
-    },
-
-    set revealed(x)
-    {
-        if (this._revealed === x)
-            return;
-
-        this._revealed = x;
-
-        if (this._element) {
-            if (this._revealed)
-                this._element.addStyleClass("revealed");
-            else
-                this._element.removeStyleClass("revealed");
-        }
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i].revealed = x && this.expanded;
-    },
-
-    get depth()
-    {
-        if ("_depth" in this)
-            return this._depth;
-        if (this.parent && !this.parent.root)
-            this._depth = this.parent.depth + 1;
-        else
-            this._depth = 0;
-        return this._depth;
-    },
-
-    get shouldRefreshChildren()
-    {
-        return this._shouldRefreshChildren;
-    },
-
-    set shouldRefreshChildren(x)
-    {
-        this._shouldRefreshChildren = x;
-        if (x && this.expanded)
-            this.expand();
-    },
-
-    get selected()
-    {
-        return this._selected;
-    },
-
-    set selected(x)
-    {
-        if (x)
-            this.select();
-        else
-            this.deselect();
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    refresh: function()
-    {
-        if (!this._element || !this.dataGrid)
-            return;
-
-        this._element.removeChildren();
-
-        for (var columnIdentifier in this.dataGrid.columns) {
-            var cell = this.createCell(columnIdentifier);
-            this._element.appendChild(cell);
-        }
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = document.createElement("td");
-        cell.className = columnIdentifier + "-column";
-
-        var alignment = this.dataGrid.aligned[columnIdentifier];
-        if (alignment)
-            cell.addStyleClass(alignment);
-
-        var div = document.createElement("div");
-        div.textContent = this.data[columnIdentifier];
-        cell.appendChild(div);
-
-        if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
-            cell.addStyleClass("disclosure");
-            if (this.depth)
-                cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
-        }
-
-        return cell;
-    },
-
-    // Share these functions with DataGrid. They are written to work with a DataGridNode this object.
-    appendChild: WebInspector.DataGrid.prototype.appendChild,
-    insertChild: WebInspector.DataGrid.prototype.insertChild,
-    removeChild: WebInspector.DataGrid.prototype.removeChild,
-    removeChildren: WebInspector.DataGrid.prototype.removeChildren,
-    removeChildrenRecursive: WebInspector.DataGrid.prototype.removeChildrenRecursive,
-
-    _recalculateSiblings: function(myIndex)
-    {
-        if (!this.parent)
-            return;
-
-        var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);
-
-        if (previousChild) {
-            previousChild.nextSibling = this;
-            this.previousSibling = previousChild;
-        } else
-            this.previousSibling = null;
-
-        var nextChild = this.parent.children[myIndex + 1];
-
-        if (nextChild) {
-            nextChild.previousSibling = this;
-            this.nextSibling = nextChild;
-        } else
-            this.nextSibling = null;
-    },
-
-    collapse: function()
-    {
-        if (this._element)
-            this._element.removeStyleClass("expanded");
-
-        this._expanded = false;
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i].revealed = false;
-
-        this.dispatchEventToListeners("collapsed");
-    },
-
-    collapseRecursively: function()
-    {
-        var item = this;
-        while (item) {
-            if (item.expanded)
-                item.collapse();
-            item = item.traverseNextNode(false, this, true);
-        }
-    },
-
-    expand: function()
-    {
-        if (!this.hasChildren || this.expanded)
-            return;
-
-        if (this.revealed && !this._shouldRefreshChildren)
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i].revealed = true;
-
-        if (this._shouldRefreshChildren) {
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i]._detach();
-
-            this.dispatchEventToListeners("populate");
-
-            if (this._attached) {
-                for (var i = 0; i < this.children.length; ++i) {
-                    var child = this.children[i];
-                    if (this.revealed)
-                        child.revealed = true;
-                    child._attach();
-                }
-            }
-
-            delete this._shouldRefreshChildren;
-        }
-
-        if (this._element)
-            this._element.addStyleClass("expanded");
-
-        this._expanded = true;
-
-        this.dispatchEventToListeners("expanded");
-    },
-
-    expandRecursively: function()
-    {
-        var item = this;
-        while (item) {
-            item.expand();
-            item = item.traverseNextNode(false, this);
-        }
-    },
-
-    reveal: function()
-    {
-        var currentAncestor = this.parent;
-        while (currentAncestor && !currentAncestor.root) {
-            if (!currentAncestor.expanded)
-                currentAncestor.expand();
-            currentAncestor = currentAncestor.parent;
-        }
-
-        this.element.scrollIntoViewIfNeeded(false);
-
-        this.dispatchEventToListeners("revealed");
-    },
-
-    select: function(supressSelectedEvent)
-    {
-        if (!this.dataGrid || !this.selectable || this.selected)
-            return;
-
-        if (this.dataGrid.selectedNode)
-            this.dataGrid.selectedNode.deselect();
-
-        this._selected = true;
-        this.dataGrid.selectedNode = this;
-
-        if (this._element)
-            this._element.addStyleClass("selected");
-
-        if (!supressSelectedEvent)
-            this.dispatchEventToListeners("selected");
-    },
-
-    deselect: function(supressDeselectedEvent)
-    {
-        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
-            return;
-
-        this._selected = false;
-        this.dataGrid.selectedNode = null;
-
-        if (this._element)
-            this._element.removeStyleClass("selected");
-
-        if (!supressDeselectedEvent)
-            this.dispatchEventToListeners("deselected");
-    },
-
-    traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
-    {
-        if (!dontPopulate && this.hasChildren)
-            this.dispatchEventToListeners("populate");
-
-        if (info)
-            info.depthChange = 0;
-
-        var node = (!skipHidden || this.revealed) ? this.children[0] : null;
-        if (node && (!skipHidden || this.expanded)) {
-            if (info)
-                info.depthChange = 1;
-            return node;
-        }
-
-        if (this === stayWithin)
-            return null;
-
-        node = (!skipHidden || this.revealed) ? this.nextSibling : null;
-        if (node)
-            return node;
-
-        node = this;
-        while (node && !node.root && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
-            if (info)
-                info.depthChange -= 1;
-            node = node.parent;
-        }
-
-        if (!node)
-            return null;
-
-        return (!skipHidden || node.revealed) ? node.nextSibling : null;
-    },
-
-    traversePreviousNode: function(skipHidden, dontPopulate)
-    {
-        var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
-        if (!dontPopulate && node && node.hasChildren)
-            node.dispatchEventToListeners("populate");
-
-        while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
-            if (!dontPopulate && node.hasChildren)
-                node.dispatchEventToListeners("populate");
-            node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
-        }
-
-        if (node)
-            return node;
-
-        if (!this.parent || this.parent.root)
-            return null;
-
-        return this.parent;
-    },
-
-    isEventWithinDisclosureTriangle: function(event)
-    {
-        if (!this.hasChildren)
-            return false;
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell.hasStyleClass("disclosure"))
-            return false;
-        var computedLeftPadding = window.getComputedStyle(cell).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
-        var left = cell.totalOffsetLeft + computedLeftPadding;
-        return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
-    },
-
-    _attach: function()
-    {
-        if (!this.dataGrid || this._attached)
-            return;
-
-        this._attached = true;
-
-        var nextNode = null;
-        var previousNode = this.traversePreviousNode(true, true);
-        if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)
-            var nextNode = previousNode.element.nextSibling;
-        if (!nextNode)
-            nextNode = this.dataGrid.dataTableBody.lastChild;
-        this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);
-
-        if (this.expanded)
-            for (var i = 0; i < this.children.length; ++i)
-                this.children[i]._attach();
-    },
-
-    _detach: function()
-    {
-        if (!this._attached)
-            return;
-
-        this._attached = false;
-
-        if (this._element && this._element.parentNode)
-            this._element.parentNode.removeChild(this._element);
-
-        for (var i = 0; i < this.children.length; ++i)
-            this.children[i]._detach();
-    },
-
-    savePosition: function()
-    {
-        if (this._savedPosition)
-            return;
-
-        if (!this.parent)
-            throw("savePosition: Node must have a parent.");
-        this._savedPosition = {
-            parent: this.parent,
-            index: this.parent.children.indexOf(this)
-        };
-    },
-
-    restorePosition: function()
-    {
-        if (!this._savedPosition)
-            return;
-
-        if (this.parent !== this._savedPosition.parent)
-            this._savedPosition.parent.insertChild(this, this._savedPosition.index);
-
-        delete this._savedPosition;
-    }
-}
-
-WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;
-
-WebInspector.CreationDataGridNode = function(data, hasChildren)
-{
-    WebInspector.DataGridNode.call(this, data, hasChildren);
-    this.isCreationNode = true;
-}
-
-WebInspector.CreationDataGridNode.prototype = {
-    makeNormal: function()
-    {
-        delete this.isCreationNode;
-        delete this.makeNormal;
-    }
-}
-
-WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-/* CookieItemsView.js */
-
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CookieItemsView = function(cookieDomain)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
-    this.deleteButton.visible = false;
-    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-    
-    this._cookieDomain = cookieDomain;
-}
-
-WebInspector.CookieItemsView.prototype = {
-    get statusBarItems()
-    {
-        return [this.refreshButton.element, this.deleteButton.element];
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this.deleteButton.visible = false;
-    },
-
-    update: function()
-    {
-        this.element.removeChildren();
-
-        var self = this;
-        function callback(allCookies, isAdvanced) {
-            var cookies = self._cookiesForDomain(allCookies);
-            var dataGrid = (isAdvanced ? self.dataGridForCookies(cookies) : self.simpleDataGridForCookies(cookies));
-            if (dataGrid) {
-                self._dataGrid = dataGrid;
-                self.element.appendChild(dataGrid.element);
-                self._dataGrid.updateWidths();
-                if (isAdvanced)
-                    self.deleteButton.visible = true;
-            } else {
-                var emptyMsgElement = document.createElement("div");
-                emptyMsgElement.className = "storage-table-empty";
-                emptyMsgElement.textContent = WebInspector.UIString("This site has no cookies.");
-                self.element.appendChild(emptyMsgElement);
-                self._dataGrid = null;
-                self.deleteButton.visible = false;
-            }
-        }
-
-        WebInspector.Cookies.getCookiesAsync(callback);
-    },
-
-    _cookiesForDomain: function(allCookies)
-    {
-        var cookiesForDomain = [];
-        var resourceURLsForDocumentURL = [];
-
-        for (var id in WebInspector.resources) {
-            var resource = WebInspector.resources[id];
-            var match = resource.documentURL.match(WebInspector.URLRegExp);
-            if (match && match[2] === this._cookieDomain)
-                resourceURLsForDocumentURL.push(resource.url);
-        }
-
-        for (var i = 0; i < allCookies.length; ++i) {
-            for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {
-                var resourceURL = resourceURLsForDocumentURL[j];
-                if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {
-                    cookiesForDomain.push(allCookies[i]);
-                    break;
-                }
-            }
-        }
-        return cookiesForDomain;
-    },
-
-    dataGridForCookies: function(cookies)
-    {
-        if (!cookies.length)
-            return null;
-
-        for (var i = 0; i < cookies.length; ++i)
-            cookies[i].expires = new Date(cookies[i].expires);
-
-        var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };
-        columns[0].title = WebInspector.UIString("Name");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-        columns[2].title = WebInspector.UIString("Domain");
-        columns[2].width = columns[2].title.length;
-        columns[3].title = WebInspector.UIString("Path");
-        columns[3].width = columns[3].title.length;
-        columns[4].title = WebInspector.UIString("Expires");
-        columns[4].width = columns[4].title.length;
-        columns[5].title = WebInspector.UIString("Size");
-        columns[5].width = columns[5].title.length;
-        columns[5].aligned = "right";
-        columns[6].title = WebInspector.UIString("HTTP");
-        columns[6].width = columns[6].title.length;
-        columns[6].aligned = "centered";
-        columns[7].title = WebInspector.UIString("Secure");
-        columns[7].width = columns[7].title.length;
-        columns[7].aligned = "centered";
-
-        function updateDataAndColumn(index, value) {
-            data[index] = value;
-            if (value.length > columns[index].width)
-                columns[index].width = value.length;
-        }
-
-        var data;
-        var nodes = [];
-        for (var i = 0; i < cookies.length; ++i) {
-            var cookie = cookies[i];
-            data = {};
-
-            updateDataAndColumn(0, cookie.name);
-            updateDataAndColumn(1, cookie.value);
-            updateDataAndColumn(2, cookie.domain);
-            updateDataAndColumn(3, cookie.path);
-            updateDataAndColumn(4, (cookie.session ? WebInspector.UIString("Session") : cookie.expires.toGMTString()));
-            updateDataAndColumn(5, Number.bytesToString(cookie.size, WebInspector.UIString));
-            updateDataAndColumn(6, (cookie.httpOnly ? "\u2713" : "")); // Checkmark
-            updateDataAndColumn(7, (cookie.secure ? "\u2713" : "")); // Checkmark
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.cookie = cookie;
-            node.selectable = true;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = 0;
-        for (var columnIdentifier in columns)
-            totalColumnWidths += columns[columnIdentifier].width;
-
-        // Enforce the Value column (the 2nd column) to be a max of 33%
-        // tweaking the raw total width because may massively outshadow the others
-        var valueColumnWidth = columns[1].width;
-        if (valueColumnWidth / totalColumnWidths > 0.33) {
-            totalColumnWidths -= valueColumnWidth;
-            totalColumnWidths *= 1.33;
-            columns[1].width = totalColumnWidths * 0.33;
-        }
-
-        // Calculate the percentage width for the columns.
-        const minimumPrecent = 6;
-        var recoupPercent = 0;
-        for (var columnIdentifier in columns) {
-            var width = columns[columnIdentifier].width;
-            width = Math.round((width / totalColumnWidths) * 100);
-            if (width < minimumPrecent) {
-                recoupPercent += (minimumPrecent - width);
-                width = minimumPrecent;
-            }
-            columns[columnIdentifier].width = width;
-        }
-
-        // Enforce the minimum percentage width. (need to narrow total percentage due to earlier additions)
-        while (recoupPercent > 0) {
-            for (var columnIdentifier in columns) {
-                if (columns[columnIdentifier].width > minimumPrecent) {
-                    --columns[columnIdentifier].width;
-                    --recoupPercent;
-                    if (!recoupPercent)
-                        break;
-                }
-            }
-        }
-
-        for (var columnIdentifier in columns)
-            columns[columnIdentifier].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns, null, this._deleteCookieCallback.bind(this));
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        if (length > 0)
-            nodes[0].selected = true;
-
-        return dataGrid;
-    },
-
-    simpleDataGridForCookies: function(cookies)
-    {
-        if (!cookies.length)
-            return null;
-
-        var columns = {};
-        columns[0] = {};
-        columns[1] = {};
-        columns[0].title = WebInspector.UIString("Name");
-        columns[0].width = columns[0].title.length;
-        columns[1].title = WebInspector.UIString("Value");
-        columns[1].width = columns[1].title.length;
-
-        var nodes = [];
-        for (var i = 0; i < cookies.length; ++i) {
-            var cookie = cookies[i];
-            var data = {};
-
-            var name = cookie.name;
-            data[0] = name;
-            if (name.length > columns[0].width)
-                columns[0].width = name.length;
-
-            var value = cookie.value;
-            data[1] = value;
-            if (value.length > columns[1].width)
-                columns[1].width = value.length;
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = true;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = columns[0].width + columns[1].width;
-        var width = Math.round((columns[0].width * 100) / totalColumnWidths);
-        const minimumPrecent = 20;
-        if (width < minimumPrecent)
-            width = minimumPrecent;
-        if (width > 100 - minimumPrecent)
-            width = 100 - minimumPrecent;
-        columns[0].width = width;
-        columns[1].width = 100 - width;
-        columns[0].width += "%";
-        columns[1].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns);
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-        if (length > 0)
-            nodes[0].selected = true;
-
-        return dataGrid;
-    },
-    
-    resize: function()
-    {
-        if (this._dataGrid)
-            this._dataGrid.updateWidths();
-    },
-
-    _deleteButtonClicked: function(event)
-    {
-        if (!this._dataGrid || !this._dataGrid.selectedNode)
-            return;
-
-        this._deleteCookieCallback(this._dataGrid.selectedNode);
-    },
-    
-    _deleteCookieCallback: function(node)
-    {
-        var cookie = node.cookie;
-        InspectorBackend.deleteCookie(cookie.name, this._cookieDomain);
-        this.update();
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    }
-}
-
-WebInspector.CookieItemsView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* Script.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
-{
-    this.sourceID = sourceID;
-    this.sourceURL = sourceURL;
-    this.source = source;
-    this.startingLine = startingLine;
-    this.errorLine = errorLine;
-    this.errorMessage = errorMessage;
-
-    // if no URL, look for "//@ sourceURL=" decorator
-    // note that this sourceURL comment decorator is behavior that FireBug added
-    // in it's 1.1 release as noted in the release notes:
-    // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
-    if (!sourceURL) {
-        // use of [ \t] rather than \s is to prevent \n from matching
-        var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
-        var match = pattern.exec(source);
-
-        if (match)
-            this.sourceURL = WebInspector.UIString("(program): %s", match[1]);
-    }
-}
-
-WebInspector.Script.prototype = {
-}
-
-/* Breakpoint.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Breakpoint = function(url, line, sourceID, condition)
-{
-    this.url = url;
-    this.line = line;
-    this.sourceID = sourceID;
-    this._enabled = true;
-    this._sourceText = "";
-    this._condition = condition || "";
-}
-
-WebInspector.Breakpoint.prototype = {
-    get enabled()
-    {
-        return this._enabled;
-    },
-
-    set enabled(x)
-    {
-        if (this._enabled === x)
-            return;
-
-        this._enabled = x;
-
-        if (this._enabled)
-            this.dispatchEventToListeners("enabled");
-        else
-            this.dispatchEventToListeners("disabled");
-    },
-
-    get sourceText()
-    {
-        return this._sourceText;
-    },
-
-    set sourceText(text)
-    {
-        this._sourceText = text;
-        this.dispatchEventToListeners("text-changed");
-    },
-
-    get label()
-    {
-        var displayName = (this.url ? WebInspector.displayNameForURL(this.url) : WebInspector.UIString("(program)"));
-        return displayName + ":" + this.line;
-    },
-
-    get id()
-    {
-        return this.sourceID + ":" + this.line;
-    },
-
-    get condition()
-    {
-        return this._condition;
-    },
-
-    set condition(c)
-    {
-        c = c || "";
-        if (this._condition === c)
-            return;
-
-        this._condition = c;
-        this.dispatchEventToListeners("condition-changed");
-
-        if (this.enabled)
-            InspectorBackend.updateBreakpoint(this.sourceID, this.line, c);
-    }
-}
-
-WebInspector.Breakpoint.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SidebarPane = function(title)
-{
-    this.element = document.createElement("div");
-    this.element.className = "pane";
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-    this.titleElement.tabIndex = 0;
-    this.titleElement.addEventListener("click", this.toggleExpanded.bind(this), false);
-    this.titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
-
-    this.bodyElement = document.createElement("div");
-    this.bodyElement.className = "body";
-
-    this.element.appendChild(this.titleElement);
-    this.element.appendChild(this.bodyElement);
-
-    this.title = title;
-    this.growbarVisible = false;
-    this.expanded = false;
-}
-
-WebInspector.SidebarPane.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.titleElement.textContent = x;
-    },
-
-    get growbarVisible()
-    {
-        return this._growbarVisible;
-    },
-
-    set growbarVisible(x)
-    {
-        if (this._growbarVisible === x)
-            return;
-
-        this._growbarVisible = x;
-
-        if (x && !this._growbarElement) {
-            this._growbarElement = document.createElement("div");
-            this._growbarElement.className = "growbar";
-            this.element.appendChild(this._growbarElement);
-        } else if (!x && this._growbarElement) {
-            if (this._growbarElement.parentNode)
-                this._growbarElement.parentNode(this._growbarElement);
-            delete this._growbarElement;
-        }
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    expand: function()
-    {
-        if (this._expanded)
-            return;
-        this._expanded = true;
-        this.element.addStyleClass("expanded");
-        if (this.onexpand)
-            this.onexpand(this);
-    },
-
-    collapse: function()
-    {
-        if (!this._expanded)
-            return;
-        this._expanded = false;
-        this.element.removeStyleClass("expanded");
-        if (this.oncollapse)
-            this.oncollapse(this);
-    },
-
-    toggleExpanded: function()
-    {
-        this.expanded = !this.expanded;
-    },
-
-    _onTitleKeyDown: function(event)
-    {
-        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Space)
-            this.toggleExpanded();
-    }
-}
-
-WebInspector.SidebarPane.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ElementsTreeOutline.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008 Matt Lilek <[email protected]>
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ElementsTreeOutline = function() {
-    this.element = document.createElement("ol");
-    this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);
-    this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);
-    this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);
-
-    TreeOutline.call(this, this.element);
-
-    this.includeRootDOMNode = true;
-    this.selectEnabled = false;
-    this.showInElementsPanelEnabled = false;
-    this.rootDOMNode = null;
-    this.focusedDOMNode = null;
-
-    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);
-    this.element.addEventListener("keydown", this._keyDown.bind(this), true);
-}
-
-WebInspector.ElementsTreeOutline.prototype = {
-    get rootDOMNode()
-    {
-        return this._rootDOMNode;
-    },
-
-    set rootDOMNode(x)
-    {
-        if (this._rootDOMNode === x)
-            return;
-
-        this._rootDOMNode = x;
-
-        this.update();
-    },
-
-    get focusedDOMNode()
-    {
-        return this._focusedDOMNode;
-    },
-
-    set focusedDOMNode(x)
-    {
-        if (this._focusedDOMNode === x) {
-            this.revealAndSelectNode(x);
-            return;
-        }
-
-        this._focusedDOMNode = x;
-
-        this.revealAndSelectNode(x);
-
-        // The revealAndSelectNode() method might find a different element if there is inlined text,
-        // and the select() call would change the focusedDOMNode and reenter this setter. So to
-        // avoid calling focusedNodeChanged() twice, first check if _focusedDOMNode is the same
-        // node as the one passed in.
-        if (this._focusedDOMNode === x) {
-            this.focusedNodeChanged();
-
-            if (x && !this.suppressSelectHighlight) {
-                InspectorBackend.highlightDOMNode(x.id);
-
-                if ("_restorePreviousHighlightNodeTimeout" in this)
-                    clearTimeout(this._restorePreviousHighlightNodeTimeout);
-
-                function restoreHighlightToHoveredNode()
-                {
-                    var hoveredNode = WebInspector.hoveredDOMNode;
-                    if (hoveredNode)
-                        InspectorBackend.highlightDOMNode(hoveredNode.id);
-                    else
-                        InspectorBackend.hideDOMNodeHighlight();
-                }
-
-                this._restorePreviousHighlightNodeTimeout = setTimeout(restoreHighlightToHoveredNode, 2000);
-            }
-        }
-    },
-
-    update: function()
-    {
-        var selectedNode = this.selectedTreeElement ? this.selectedTreeElement.representedObject : null;
-
-        this.removeChildren();
-
-        if (!this.rootDOMNode)
-            return;
-
-        var treeElement;
-        if (this.includeRootDOMNode) {
-            treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);
-            treeElement.selectable = this.selectEnabled;
-            this.appendChild(treeElement);
-        } else {
-            // FIXME: this could use findTreeElement to reuse a tree element if it already exists
-            var node = this.rootDOMNode.firstChild;
-            while (node) {
-                treeElement = new WebInspector.ElementsTreeElement(node);
-                treeElement.selectable = this.selectEnabled;
-                this.appendChild(treeElement);
-                node = node.nextSibling;
-            }
-        }
-
-        if (selectedNode)
-            this.revealAndSelectNode(selectedNode);
-    },
-
-    updateSelection: function()
-    {
-        if (!this.selectedTreeElement)
-            return;
-        var element = this.treeOutline.selectedTreeElement;
-        element.updateSelection();
-    },
-
-    focusedNodeChanged: function(forceUpdate) {},
-
-    findTreeElement: function(node)
-    {
-        var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestorNode, parentNode);
-        if (!treeElement && node.nodeType === Node.TEXT_NODE) {
-            // The text node might have been inlined if it was short, so try to find the parent element.
-            treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestorNode, parentNode);
-        }
-
-        return treeElement;
-    },
-
-    revealAndSelectNode: function(node)
-    {
-        if (!node)
-            return;
-
-        var treeElement = this.findTreeElement(node);
-        if (!treeElement)
-            return;
-
-        treeElement.reveal();
-        treeElement.select();
-    },
-
-    _treeElementFromEvent: function(event)
-    {
-        var root = this.element;
-
-        // We choose this X coordinate based on the knowledge that our list
-        // items extend nearly to the right edge of the outer <ol>.
-        var x = root.totalOffsetLeft + root.offsetWidth - 20;
-
-        var y = event.pageY;
-
-        // Our list items have 1-pixel cracks between them vertically. We avoid
-        // the cracks by checking slightly above and slightly below the mouse
-        // and seeing if we hit the same element each time.
-        var elementUnderMouse = this.treeElementFromPoint(x, y);
-        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);
-        var element;
-        if (elementUnderMouse === elementAboveMouse)
-            element = elementUnderMouse;
-        else
-            element = this.treeElementFromPoint(x, y + 2);
-
-        return element;
-    },
-    
-    _keyDown: function(event)
-    {
-        if (event.target !== this.treeOutline.element)
-            return;
-
-        var selectedElement = this.selectedTreeElement;
-        if (!selectedElement)
-            return;
-
-        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Backspace ||
-                event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Delete) {
-            selectedElement.remove();
-            event.preventDefault();
-            event.stopPropagation();
-            return;
-        }
-
-        // On Enter or Return start editing the first attribute
-        // or create a new attribute on the selected element.
-        if (isEnterKey(event)) {
-            if (this._editing)
-                return;
-
-            selectedElement._startEditing();
-
-            // prevent a newline from being immediately inserted
-            event.preventDefault();
-            event.stopPropagation();
-            return;
-        }
-    },
-
-    _onmousedown: function(event)
-    {
-        var element = this._treeElementFromEvent(event);
-
-        if (!element || element.isEventWithinDisclosureTriangle(event))
-            return;
-
-        element.select();
-    },
-
-    _onmousemove: function(event)
-    {
-        var element = this._treeElementFromEvent(event);
-        if (element && this._previousHoveredElement === element)
-            return;
-
-        if (this._previousHoveredElement) {
-            this._previousHoveredElement.hovered = false;
-            delete this._previousHoveredElement;
-        }
-
-        if (element && !element.elementCloseTag) {
-            element.hovered = true;
-            this._previousHoveredElement = element;
-        }
-
-        WebInspector.hoveredDOMNode = (element && !element.elementCloseTag ? element.representedObject : null);
-    },
-
-    _onmouseout: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.element))
-            return;
-
-        if (this._previousHoveredElement) {
-            this._previousHoveredElement.hovered = false;
-            delete this._previousHoveredElement;
-        }
-
-        WebInspector.hoveredDOMNode = null;
-    },
-
-    _contextMenuEventFired: function(event)
-    {
-        var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");
-        if (!listItem || !listItem.treeElement)
-            return;
-
-        var contextMenu = new WebInspector.ContextMenu();
-
-        var tag = event.target.enclosingNodeOrSelfWithClass("webkit-html-tag");
-        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
-        if (tag)
-            listItem.treeElement._populateTagContextMenu(contextMenu, event);
-        else if (textNode)
-            listItem.treeElement._populateTextContextMenu(contextMenu, textNode);
-        contextMenu.show(event);
-    }
-}
-
-WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;
-
-WebInspector.ElementsTreeElement = function(node)
-{
-    var hasChildrenOverride = node.hasChildNodes() && !this._showInlineText(node);
-
-    // The title will be updated in onattach.
-    TreeElement.call(this, "", node, hasChildrenOverride);
-
-    if (this.representedObject.nodeType == Node.ELEMENT_NODE)
-        this._canAddAttributes = true;
-}
-
-WebInspector.ElementsTreeElement.prototype = {
-    get highlighted()
-    {
-        return this._highlighted;
-    },
-
-    set highlighted(x)
-    {
-        if (this._highlighted === x)
-            return;
-
-        this._highlighted = x;
-
-        if (this.listItemElement) {
-            if (x)
-                this.listItemElement.addStyleClass("highlighted");
-            else
-                this.listItemElement.removeStyleClass("highlighted");
-        }
-    },
-
-    get hovered()
-    {
-        return this._hovered;
-    },
-
-    set hovered(x)
-    {
-        if (this._hovered === x)
-            return;
-
-        this._hovered = x;
-
-        if (this.listItemElement) {
-            if (x) {
-                this.updateSelection();
-                this.listItemElement.addStyleClass("hovered");
-            } else {
-                this.listItemElement.removeStyleClass("hovered");
-            }
-        }
-    },
-
-    createTooltipForImageNode: function(node, callback)
-    {
-        function createTooltipThenCallback(properties)
-        {
-            if (!properties) {
-                callback();
-                return;
-            }
-
-            var tooltipText = null;
-            if (properties.offsetHeight === properties.naturalHeight && properties.offsetWidth === properties.naturalWidth)
-                tooltipText = WebInspector.UIString("%d × %d pixels", properties.offsetWidth, properties.offsetHeight);
-            else
-                tooltipText = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);
-            callback(tooltipText);
-        }
-        var objectProxy = new WebInspector.ObjectProxy(node.id);
-        WebInspector.ObjectProxy.getPropertiesAsync(objectProxy, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], createTooltipThenCallback);
-    },
-
-    updateSelection: function()
-    {
-        var listItemElement = this.listItemElement;
-        if (!listItemElement)
-            return;
-
-        if (document.body.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        if (!this.selectionElement) {
-            this.selectionElement = document.createElement("div");
-            this.selectionElement.className = "selection selected";
-            listItemElement.insertBefore(this.selectionElement, listItemElement.firstChild);
-        }
-
-        this.selectionElement.style.height = listItemElement.offsetHeight + "px";
-    },
-
-    onattach: function()
-    {
-        this.listItemElement.addEventListener("mousedown", this.onmousedown.bind(this), false);
-
-        if (this._highlighted)
-            this.listItemElement.addStyleClass("highlighted");
-
-        if (this._hovered) {
-            this.updateSelection();
-            this.listItemElement.addStyleClass("hovered");
-        }
-
-        this._updateTitle();
-
-        this._preventFollowingLinksOnDoubleClick();
-    },
-
-    _preventFollowingLinksOnDoubleClick: function()
-    {
-        var links = this.listItemElement.querySelectorAll("li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");
-        if (!links)
-            return;
-
-        for (var i = 0; i < links.length; ++i)
-            links[i].preventFollowOnDoubleClick = true;
-    },
-
-    onpopulate: function()
-    {
-        if (this.children.length || this._showInlineText(this.representedObject))
-            return;
-
-        this.updateChildren();
-    },
-    
-    updateChildren: function(fullRefresh)
-    {
-        WebInspector.domAgent.getChildNodesAsync(this.representedObject, this._updateChildren.bind(this, fullRefresh));
-    },
-
-    _updateChildren: function(fullRefresh)
-    {
-        if (fullRefresh) {
-            var selectedTreeElement = this.treeOutline.selectedTreeElement;
-            if (selectedTreeElement && selectedTreeElement.hasAncestor(this))
-                this.select();
-            this.removeChildren();
-        }
-
-        var treeElement = this;
-        var treeChildIndex = 0;
-
-        function updateChildrenOfNode(node)
-        {
-            var treeOutline = treeElement.treeOutline;
-            var child = node.firstChild;
-            while (child) {
-                var currentTreeElement = treeElement.children[treeChildIndex];
-                if (!currentTreeElement || currentTreeElement.representedObject !== child) {
-                    // Find any existing element that is later in the children list.
-                    var existingTreeElement = null;
-                    for (var i = (treeChildIndex + 1); i < treeElement.children.length; ++i) {
-                        if (treeElement.children[i].representedObject === child) {
-                            existingTreeElement = treeElement.children[i];
-                            break;
-                        }
-                    }
-
-                    if (existingTreeElement && existingTreeElement.parent === treeElement) {
-                        // If an existing element was found and it has the same parent, just move it.
-                        var wasSelected = existingTreeElement.selected;
-                        treeElement.removeChild(existingTreeElement);
-                        treeElement.insertChild(existingTreeElement, treeChildIndex);
-                        if (wasSelected)
-                            existingTreeElement.select();
-                    } else {
-                        // No existing element found, insert a new element.
-                        var newElement = new WebInspector.ElementsTreeElement(child);
-                        newElement.selectable = treeOutline.selectEnabled;
-                        treeElement.insertChild(newElement, treeChildIndex);
-                    }
-                }
-
-                child = child.nextSibling;
-                ++treeChildIndex;
-            }
-        }
-
-        // Remove any tree elements that no longer have this node (or this node's contentDocument) as their parent.
-        for (var i = (this.children.length - 1); i >= 0; --i) {
-            if ("elementCloseTag" in this.children[i])
-                continue;
-
-            var currentChild = this.children[i];
-            var currentNode = currentChild.representedObject;
-            var currentParentNode = currentNode.parentNode;
-
-            if (currentParentNode === this.representedObject)
-                continue;
-
-            var selectedTreeElement = this.treeOutline.selectedTreeElement;
-            if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild)))
-                this.select();
-
-            this.removeChildAtIndex(i);
-        }
-
-        updateChildrenOfNode(this.representedObject);
-
-        var lastChild = this.children[this.children.length - 1];
-        if (this.representedObject.nodeType == Node.ELEMENT_NODE && (!lastChild || !lastChild.elementCloseTag)) {
-            var title = "<span class=\"webkit-html-tag close\">&lt;/" + this.representedObject.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
-            var item = new TreeElement(title, null, false);
-            item.selectable = false;
-            item.elementCloseTag = true;
-            this.appendChild(item);
-        }
-    },
-
-    onexpand: function()
-    {
-        this.treeOutline.updateSelection();
-    },
-
-    oncollapse: function()
-    {
-        this.treeOutline.updateSelection();
-    },
-
-    onreveal: function()
-    {
-        if (this.listItemElement)
-            this.listItemElement.scrollIntoViewIfNeeded(false);
-    },
-
-    onselect: function()
-    {
-        this.treeOutline.focusedDOMNode = this.representedObject;
-        this.updateSelection();
-    },
-
-    onmousedown: function(event)
-    {
-        if (this._editing)
-            return;
-
-        if (this.isEventWithinDisclosureTriangle(event))
-            return;
-
-        if (this.treeOutline.showInElementsPanelEnabled) {    
-            WebInspector.showElementsPanel();
-            WebInspector.panels.elements.focusedDOMNode = this.representedObject;
-        }
-
-        // Prevent selecting the nearest word on double click.
-        if (event.detail >= 2)
-            event.preventDefault();
-    },
-
-    ondblclick: function(event)
-    {
-        if (this._editing)
-            return;
-
-        if (this._startEditingFromEvent(event))
-            return;
-
-        if (this.hasChildren && !this.expanded)
-            this.expand();
-    },
-
-    _insertInLastAttributePosition: function(tag, node)
-    {
-        if (tag.getElementsByClassName("webkit-html-attribute").length > 0)
-            tag.insertBefore(node, tag.lastChild);
-        else {
-            var nodeName = tag.textContent.match(/^<(.*?)>$/)[1];
-            tag.textContent = '';
-            tag.appendChild(document.createTextNode('<'+nodeName));
-            tag.appendChild(node);
-            tag.appendChild(document.createTextNode('>'));
-        }
-
-        this.updateSelection();
-    },
-
-    _startEditingFromEvent: function(event)
-    {
-        if (this.treeOutline.focusedDOMNode != this.representedObject)
-            return;
-
-        if (this.representedObject.nodeType != Node.ELEMENT_NODE && this.representedObject.nodeType != Node.TEXT_NODE)
-            return false;
-
-        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
-        if (textNode)
-            return this._startEditingTextNode(textNode);
-
-        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
-        if (attribute)
-            return this._startEditingAttribute(attribute, event.target);
-
-        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
-        if (newAttribute)
-            return this._addNewAttribute();
-
-        return false;
-    },
-
-    _populateTagContextMenu: function(contextMenu, event)
-    {
-        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
-        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
-
-        // Add attribute-related actions.
-        contextMenu.appendItem(WebInspector.UIString("Add Attribute"), this._addNewAttribute.bind(this));
-        if (attribute && !newAttribute)
-            contextMenu.appendItem(WebInspector.UIString("Edit Attribute"), this._startEditingAttribute.bind(this, attribute, event.target));
-        contextMenu.appendSeparator();
-
-        // Add node-related actions.
-        contextMenu.appendItem(WebInspector.UIString("Edit as HTML"), this._editAsHTML.bind(this));
-        contextMenu.appendItem(WebInspector.UIString("Copy as HTML"), this._copyHTML.bind(this));
-        contextMenu.appendItem(WebInspector.UIString("Delete Node"), this.remove.bind(this));
-    },
-
-    _populateTextContextMenu: function(contextMenu, textNode)
-    {
-        contextMenu.appendItem(WebInspector.UIString("Edit Text"), this._startEditingTextNode.bind(this, textNode));
-    },
-
-    _startEditing: function()
-    {
-        if (this.treeOutline.focusedDOMNode !== this.representedObject)
-            return;
-
-        var listItem = this._listItemNode;
-
-        if (this._canAddAttributes) {
-            var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];
-            if (attribute)
-                return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-value")[0]);
-
-            return this._addNewAttribute();
-        }
-
-        if (this.representedObject.nodeType === Node.TEXT_NODE) {
-            var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];
-            if (textNode)
-                return this._startEditingTextNode(textNode);
-            return;
-        }
-    },
-
-    _addNewAttribute: function()
-    {
-        var attr = document.createElement("span");
-        attr.className = "webkit-html-attribute";
-        attr.style.marginLeft = "2px"; // overrides the .editing margin rule
-        attr.style.marginRight = "2px"; // overrides the .editing margin rule
-        var name = document.createElement("span");
-        name.className = "webkit-html-attribute-name new-attribute";
-        name.textContent = " ";
-        var value = document.createElement("span");
-        value.className = "webkit-html-attribute-value";
-        attr.appendChild(name);
-        attr.appendChild(value);
-
-        var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];
-        this._insertInLastAttributePosition(tag, attr);
-        return this._startEditingAttribute(attr, attr);
-    },
-
-    _triggerEditAttribute: function(attributeName)
-    {
-        var attributeElements = this.listItemElement.getElementsByClassName("webkit-html-attribute-name");
-        for (var i = 0, len = attributeElements.length; i < len; ++i) {
-            if (attributeElements[i].textContent === attributeName) {
-                for (var elem = attributeElements[i].nextSibling; elem; elem = elem.nextSibling) {
-                    if (elem.nodeType !== Node.ELEMENT_NODE)
-                        continue;
-
-                    if (elem.hasStyleClass("webkit-html-attribute-value"))
-                        return this._startEditingAttribute(attributeElements[i].parentNode, elem);
-                }
-            }
-        }
-    },
-
-    _startEditingAttribute: function(attribute, elementForSelection)
-    {
-        if (WebInspector.isBeingEdited(attribute))
-            return true;
-
-        var attributeNameElement = attribute.getElementsByClassName("webkit-html-attribute-name")[0];
-        if (!attributeNameElement)
-            return false;
-
-        var attributeName = attributeNameElement.innerText;
-
-        function removeZeroWidthSpaceRecursive(node)
-        {
-            if (node.nodeType === Node.TEXT_NODE) {
-                node.nodeValue = node.nodeValue.replace(/\u200B/g, "");
-                return;
-            }
-
-            if (node.nodeType !== Node.ELEMENT_NODE)
-                return;
-
-            for (var child = node.firstChild; child; child = child.nextSibling)
-                removeZeroWidthSpaceRecursive(child);
-        }
-
-        // Remove zero-width spaces that were added by nodeTitleInfo.
-        removeZeroWidthSpaceRecursive(attribute);
-
-        this._editing = true;
-
-        WebInspector.startEditing(attribute, this._attributeEditingCommitted.bind(this), this._editingCancelled.bind(this), attributeName);
-        window.getSelection().setBaseAndExtent(elementForSelection, 0, elementForSelection, 1);
-
-        return true;
-    },
-
-    _startEditingTextNode: function(textNode)
-    {
-        if (WebInspector.isBeingEdited(textNode))
-            return true;
-
-        this._editing = true;
-
-        WebInspector.startEditing(textNode, this._textNodeEditingCommitted.bind(this), this._editingCancelled.bind(this));
-        window.getSelection().setBaseAndExtent(textNode, 0, textNode, 1);
-
-        return true;
-    },
-
-    _startEditingAsHTML: function(commitCallback, initialValue)
-    {
-        if (this._htmlEditElement && WebInspector.isBeingEdited(this._htmlEditElement))
-            return true;
-
-        this._editing = true;
-
-        this._htmlEditElement = document.createElement("div");
-        this._htmlEditElement.className = "source-code elements-tree-editor";
-        this._htmlEditElement.textContent = initialValue;
-
-        // Hide header items.
-        var child = this.listItemElement.firstChild;
-        while (child) {
-            child.style.display = "none";
-            child = child.nextSibling;
-        }
-        // Hide children item.
-        if (this._childrenListNode)
-            this._childrenListNode.style.display = "none";
-        // Append editor.
-        this.listItemElement.appendChild(this._htmlEditElement);
-
-        this.updateSelection();
-
-        function commit()
-        {
-            commitCallback(this._htmlEditElement.textContent);
-            dispose.call(this);
-        }
-
-        function dispose()
-        {
-            delete this._editing;
-
-            // Remove editor.
-            this.listItemElement.removeChild(this._htmlEditElement);
-            delete this._htmlEditElement;
-            // Unhide children item.
-            if (this._childrenListNode)
-                this._childrenListNode.style.removeProperty("display");
-            // Unhide header items.
-            var child = this.listItemElement.firstChild;
-            while (child) {
-                child.style.removeProperty("display");
-                child = child.nextSibling;
-            }
-
-            this.updateSelection();
-        }
-
-        WebInspector.startEditing(this._htmlEditElement, commit.bind(this), dispose.bind(this), null, true);
-    },
-
-    _attributeEditingCommitted: function(element, newText, oldText, attributeName, moveDirection)
-    {
-        delete this._editing;
-
-        // Before we do anything, determine where we should move
-        // next based on the current element's settings
-        var moveToAttribute;
-        var newAttribute;
-        if (moveDirection) {
-            var found = false;
-            var attributes = this.representedObject.attributes;
-            for (var i = 0, len = attributes.length; i < len; ++i) {
-                if (attributes[i].name === attributeName) {
-                    found = true;
-                    if (moveDirection === "backward" && i > 0)
-                        moveToAttribute = attributes[i - 1].name;
-                    else if (moveDirection === "forward" && i < attributes.length - 1)
-                        moveToAttribute = attributes[i + 1].name;
-                    else if (moveDirection === "forward" && i === attributes.length - 1)
-                        newAttribute = true;
-                }
-            }
-
-            if (!found && moveDirection === "backward" && attributes.length > 0)
-                moveToAttribute = attributes[attributes.length - 1].name;
-            else if (!found && moveDirection === "forward" && !/^\s*$/.test(newText))
-                newAttribute = true;
-        }
-
-        function moveToNextAttributeIfNeeded() {
-            if (moveToAttribute)
-                this._triggerEditAttribute(moveToAttribute);
-            else if (newAttribute)
-                this._addNewAttribute(this.listItemElement);
-        }
-
-        var parseContainerElement = document.createElement("span");
-        parseContainerElement.innerHTML = "<span " + newText + "></span>";
-        var parseElement = parseContainerElement.firstChild;
-
-        if (!parseElement) {
-            this._editingCancelled(element, attributeName);
-            moveToNextAttributeIfNeeded.call(this);
-            return;
-        }
-
-        if (!parseElement.hasAttributes()) {
-            this.representedObject.removeAttribute(attributeName);
-            moveToNextAttributeIfNeeded.call(this);
-            return;
-        }
-
-        var foundOriginalAttribute = false;
-        for (var i = 0; i < parseElement.attributes.length; ++i) {
-            var attr = parseElement.attributes[i];
-            foundOriginalAttribute = foundOriginalAttribute || attr.name === attributeName;
-            try {
-                this.representedObject.setAttribute(attr.name, attr.value);
-            } catch(e) {} // ignore invalid attribute (innerHTML doesn't throw errors, but this can)
-        }
-
-        if (!foundOriginalAttribute)
-            this.representedObject.removeAttribute(attributeName);
-
-        this.treeOutline.focusedNodeChanged(true);
-
-        moveToNextAttributeIfNeeded.call(this);
-    },
-
-    _textNodeEditingCommitted: function(element, newText)
-    {
-        delete this._editing;
-
-        var textNode;
-        if (this.representedObject.nodeType == Node.ELEMENT_NODE) {
-            // We only show text nodes inline in elements if the element only
-            // has a single child, and that child is a text node.
-            textNode = this.representedObject.firstChild;
-        } else if (this.representedObject.nodeType == Node.TEXT_NODE)
-            textNode = this.representedObject;
-
-        textNode.nodeValue = newText;
-
-        // Need to restore attributes / node structure.
-        this._updateTitle();
-    },
-
-    _editingCancelled: function(element, context)
-    {
-        delete this._editing;
-
-        // Need to restore attributes structure.
-        this._updateTitle();
-    },
-
-    _updateTitle: function()
-    {
-        // If we are editing, return early to prevent canceling the edit.
-        // After editing is committed _updateTitle will be called.
-        if (this._editing)
-            return;
-
-        var self = this;
-        function callback(tooltipText)
-        {
-            var title = self._nodeTitleInfo(self.representedObject, self.hasChildren, WebInspector.linkifyURL, tooltipText).title;
-            self.title = "<span class=\"highlight\">" + title + "</span>";
-            delete self.selectionElement;
-            self.updateSelection();
-            self._preventFollowingLinksOnDoubleClick();
-        };
-
-        // TODO: Replace with InjectedScriptAccess.getBasicProperties(obj, [names]).
-        if (this.representedObject.nodeName.toLowerCase() !== "img")
-            callback();
-        else
-            this.createTooltipForImageNode(this.representedObject, callback);
-    },
-
-    _nodeTitleInfo: function(node, hasChildren, linkify, tooltipText)
-    {
-        var info = {title: "", hasChildren: hasChildren};
-        
-        switch (node.nodeType) {
-            case Node.DOCUMENT_NODE:
-                info.title = "Document";
-                break;
-                
-            case Node.ELEMENT_NODE:
-                info.title = "<span class=\"webkit-html-tag\">&lt;" + node.nodeName.toLowerCase().escapeHTML();
-                
-                if (node.hasAttributes()) {
-                    for (var i = 0; i < node.attributes.length; ++i) {
-                        var attr = node.attributes[i];
-                        info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
-                        
-                        var value = attr.value;
-                        if (linkify && (attr.name === "src" || attr.name === "href")) {
-                            var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
-                            info.title += linkify(attr.value, value, "webkit-html-attribute-value", node.nodeName.toLowerCase() == "a", tooltipText);
-                        } else {
-                            var value = value.escapeHTML();
-                            value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
-                            info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
-                        }
-                        info.title += "\"</span>";
-                    }
-                }
-                info.title += "&gt;</span>&#8203;";
-                
-                // If this element only has a single child that is a text node,
-                // just show that text and the closing tag inline rather than
-                // create a subtree for them
-                
-                var textChild = onlyTextChild.call(node);
-                var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
-                
-                if (showInlineText) {
-                    info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;<span class=\"webkit-html-tag\">&lt;/" + node.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
-                    info.hasChildren = false;
-                }
-                break;
-                
-            case Node.TEXT_NODE:
-                if (isNodeWhitespace.call(node))
-                    info.title = "(whitespace)";
-                else {
-                    if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "script") {
-                        var newNode = document.createElement("span");
-                        newNode.textContent = node.textContent;
-
-                        var javascriptSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(null, null);
-                        javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);
-                        
-                        info.title = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
-                    } else if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "style") {
-                        var newNode = document.createElement("span");
-                        newNode.textContent = node.textContent;
-                        
-                        var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighlighter(null, null);
-                        cssSyntaxHighlighter.syntaxHighlightNode(newNode);
-                        
-                        info.title = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
-                    } else {
-                        info.title = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\""; 
-                    }
-                } 
-                break;
-                
-            case Node.COMMENT_NODE:
-                info.title = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";
-                break;
-                
-            case Node.DOCUMENT_TYPE_NODE:
-                info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;
-                if (node.publicId) {
-                    info.title += " PUBLIC \"" + node.publicId + "\"";
-                    if (node.systemId)
-                        info.title += " \"" + node.systemId + "\"";
-                } else if (node.systemId)
-                    info.title += " SYSTEM \"" + node.systemId + "\"";
-                if (node.internalSubset)
-                    info.title += " [" + node.internalSubset + "]";
-                info.title += "&gt;</span>";
-                break;
-            default:
-                info.title = node.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
-        }
-        
-        return info;
-    },
-
-    _showInlineText: function(node)
-    {
-        if (node.nodeType === Node.ELEMENT_NODE) {
-            var textChild = onlyTextChild.call(node);
-            if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)
-                return true;
-        }
-        return false;
-    },
-    
-    remove: function()
-    {
-        var parentElement = this.parent;
-        if (!parentElement)
-            return;
-
-        var self = this;
-        function removeNodeCallback(removedNodeId)
-        {
-            // -1 is an error code, which means removing the node from the DOM failed,
-            // so we shouldn't remove it from the tree.
-            if (removedNodeId === -1)
-                return;
-
-            parentElement.removeChild(self);
-        }
-
-        var callId = WebInspector.Callback.wrap(removeNodeCallback);
-        InspectorBackend.removeNode(callId, this.representedObject.id);
-    },
-
-    _editAsHTML: function()
-    {
-        var treeOutline = this.treeOutline;
-        var node = this.representedObject;
-        var wasExpanded = this.expanded;
-
-        function selectNode(nodeId)
-        {
-            if (!nodeId)
-                return;
-
-            // Select it and expand if necessary. We force tree update so that it processes dom events and is up to date.
-            WebInspector.panels.elements.updateModifiedNodes();
-
-            WebInspector.updateFocusedNode(nodeId);
-            if (wasExpanded) {
-                var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));
-                if (newTreeItem)
-                    newTreeItem.expand();
-            }
-        }
-
-        function commitChange(value)
-        {
-            InjectedScriptAccess.setOuterHTML(node.id, value, wasExpanded, selectNode.bind(this));
-        }
-
-        InjectedScriptAccess.getNodePropertyValue(node.id, "outerHTML", this._startEditingAsHTML.bind(this, commitChange));
-    },
-
-    _copyHTML: function()
-    {
-        InspectorBackend.copyNode(this.representedObject.id);
-    }
-}
-
-WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.didRemoveNode = WebInspector.Callback.processCallback;
-
-/* SidebarTreeElement.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)
-{
-    TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);
-}
-
-WebInspector.SidebarSectionTreeElement.prototype = {
-    selectable: false,
-
-    get smallChildren()
-    {
-        return this._smallChildren;
-    },
-
-    set smallChildren(x)
-    {
-        if (this._smallChildren === x)
-            return;
-
-        this._smallChildren = x;
-
-        if (this._smallChildren)
-            this._childrenListNode.addStyleClass("small");
-        else
-            this._childrenListNode.removeStyleClass("small");
-    },
-
-    onattach: function()
-    {
-        this._listItemNode.addStyleClass("sidebar-tree-section");
-    },
-
-    onreveal: function()
-    {
-        if (this.listItemElement)
-            this.listItemElement.scrollIntoViewIfNeeded(false);
-    }
-}
-
-WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)
-{
-    TreeElement.call(this, "", representedObject || {}, hasChildren);
-
-    if (hasChildren) {
-        this.disclosureButton = document.createElement("button");
-        this.disclosureButton.className = "disclosure-button";
-    }
-
-    if (!this.iconElement) {
-        this.iconElement = document.createElement("img");
-        this.iconElement.className = "icon";
-    }
-
-    this.statusElement = document.createElement("div");
-    this.statusElement.className = "status";
-
-    this.titlesElement = document.createElement("div");
-    this.titlesElement.className = "titles";
-
-    this.titleElement = document.createElement("span");
-    this.titleElement.className = "title";
-    this.titlesElement.appendChild(this.titleElement);
-
-    this.subtitleElement = document.createElement("span");
-    this.subtitleElement.className = "subtitle";
-    this.titlesElement.appendChild(this.subtitleElement);
-
-    this.className = className;
-    this.mainTitle = title;
-    this.subtitle = subtitle;
-}
-
-WebInspector.SidebarTreeElement.prototype = {
-    get small()
-    {
-        return this._small;
-    },
-
-    set small(x)
-    {
-        this._small = x;
-
-        if (this._listItemNode) {
-            if (this._small)
-                this._listItemNode.addStyleClass("small");
-            else
-                this._listItemNode.removeStyleClass("small");
-        }
-    },
-
-    get mainTitle()
-    {
-        return this._mainTitle;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        this._subtitle = x;
-        this.refreshTitles();
-    },
-
-    get bubbleText()
-    {
-        return this._bubbleText;
-    },
-
-    set bubbleText(x)
-    {
-        if (!this.bubbleElement) {
-            this.bubbleElement = document.createElement("div");
-            this.bubbleElement.className = "bubble";
-            this.statusElement.appendChild(this.bubbleElement);
-        }
-
-        this._bubbleText = x;
-        this.bubbleElement.textContent = x;
-    },
-
-    refreshTitles: function()
-    {
-        var mainTitle = this.mainTitle;
-        if (this.titleElement.textContent !== mainTitle)
-            this.titleElement.textContent = mainTitle;
-
-        var subtitle = this.subtitle;
-        if (subtitle) {
-            if (this.subtitleElement.textContent !== subtitle)
-                this.subtitleElement.textContent = subtitle;
-            this.titlesElement.removeStyleClass("no-subtitle");
-        } else
-            this.titlesElement.addStyleClass("no-subtitle");
-    },
-
-    isEventWithinDisclosureTriangle: function(event)
-    {
-        return event.target === this.disclosureButton;
-    },
-
-    onattach: function()
-    {
-        this._listItemNode.addStyleClass("sidebar-tree-item");
-
-        if (this.className)
-            this._listItemNode.addStyleClass(this.className);
-
-        if (this.small)
-            this._listItemNode.addStyleClass("small");
-
-        if (this.hasChildren && this.disclosureButton)
-            this._listItemNode.appendChild(this.disclosureButton);
-
-        this._listItemNode.appendChild(this.iconElement);
-        this._listItemNode.appendChild(this.statusElement);
-        this._listItemNode.appendChild(this.titlesElement);
-    },
-
-    onreveal: function()
-    {
-        if (this._listItemNode)
-            this._listItemNode.scrollIntoViewIfNeeded(false);
-    }
-}
-
-WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* Section.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Section = function(title, subtitle)
-{
-    this.element = document.createElement("div");
-    this.element.className = "section";
-
-    this.headerElement = document.createElement("div");
-    this.headerElement.className = "header";
-
-    this.titleElement = document.createElement("div");
-    this.titleElement.className = "title";
-
-    this.subtitleElement = document.createElement("div");
-    this.subtitleElement.className = "subtitle";
-
-    this.headerElement.appendChild(this.subtitleElement);
-    this.headerElement.appendChild(this.titleElement);
-
-    this.headerElement.addEventListener("click", this.toggleExpanded.bind(this), false);
-    this.element.appendChild(this.headerElement);
-
-    this.title = title;
-    this.subtitle = subtitle;
-    this._expanded = false;
-}
-
-WebInspector.Section.prototype = {
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-
-        if (x instanceof Node) {
-            this.titleElement.removeChildren();
-            this.titleElement.appendChild(x);
-        } else
-          this.titleElement.textContent = x;
-    },
-
-    get subtitle()
-    {
-        return this._subtitle;
-    },
-
-    set subtitle(x)
-    {
-        if (this._subtitle === x)
-            return;
-        this._subtitle = x;
-        this.subtitleElement.innerHTML = x;
-    },
-
-    get expanded()
-    {
-        return this._expanded;
-    },
-
-    set expanded(x)
-    {
-        if (x)
-            this.expand();
-        else
-            this.collapse();
-    },
-
-    get populated()
-    {
-        return this._populated;
-    },
-
-    set populated(x)
-    {
-        this._populated = x;
-        if (!x && this.onpopulate && this._expanded) {
-            this.onpopulate(this);
-            this._populated = true;
-        }
-    },
-
-    expand: function()
-    {
-        if (this._expanded)
-            return;
-        this._expanded = true;
-        this.element.addStyleClass("expanded");
-
-        if (!this._populated && this.onpopulate) {
-            this.onpopulate(this);
-            this._populated = true;
-        }
-    },
-
-    collapse: function()
-    {
-        if (!this._expanded)
-            return;
-        this._expanded = false;
-        this.element.removeStyleClass("expanded");
-    },
-
-    toggleExpanded: function()
-    {
-        this.expanded = !this.expanded;
-    }
-}
-
-/* PropertiesSection.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PropertiesSection = function(title, subtitle)
-{
-    WebInspector.Section.call(this, title, subtitle);
-
-    this.propertiesElement = document.createElement("ol");
-    this.propertiesElement.className = "properties source-code";
-    this.propertiesElement.tabIndex = 0;
-    this.propertiesTreeOutline = new TreeOutline(this.propertiesElement);
-    this.propertiesTreeOutline.section = this;
-
-    this.element.appendChild(this.propertiesElement);
-}
-
-WebInspector.PropertiesSection.prototype.__proto__ = WebInspector.Section.prototype;
-
-/* ObjectProxy.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ObjectProxy = function(objectId, path, protoDepth, description, hasChildren)
-{
-    this.objectId = objectId;
-    this.path = path || [];
-    this.protoDepth = protoDepth || 0;
-    this.description = description;
-    this.hasChildren = hasChildren;
-}
-
-WebInspector.ObjectProxy.wrapPrimitiveValue = function(value)
-{
-    var proxy = new WebInspector.ObjectProxy();
-    proxy.type = typeof value;
-    proxy.description = value;
-    return proxy;
-}
-
-WebInspector.ObjectProxy.getPropertiesAsync = function(objectProxy, propertiesToQueryFor, callback)
-{
-    function createPropertiesMapThenCallback(propertiesPayload)
-    {
-        if (!propertiesPayload) {
-            callback();
-            return;
-        }
-
-        var result = [];
-        for (var i = 0; i < propertiesPayload.length; ++i)
-            if (propertiesToQueryFor.indexOf(propertiesPayload[i].name) !== -1)
-                result[propertiesPayload[i].name] = propertiesPayload[i].value.description;
-        callback(result);
-    };
-    InjectedScriptAccess.getProperties(objectProxy, true, false, createPropertiesMapThenCallback);
-}
-
-WebInspector.ObjectPropertyProxy = function(name, value)
-{
-    this.name = name;
-    this.value = value;
-}
-
-/* ObjectPropertiesSection.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ObjectPropertiesSection = function(object, title, subtitle, emptyPlaceholder, ignoreHasOwnProperty, extraProperties, treeElementConstructor)
-{
-    this.emptyPlaceholder = (emptyPlaceholder || WebInspector.UIString("No Properties"));
-    this.object = object;
-    this.ignoreHasOwnProperty = ignoreHasOwnProperty;
-    this.extraProperties = extraProperties;
-    this.treeElementConstructor = treeElementConstructor || WebInspector.ObjectPropertyTreeElement;
-    this.editable = true;
-
-    WebInspector.PropertiesSection.call(this, title, subtitle);
-}
-
-WebInspector.ObjectPropertiesSection.prototype = {
-    onpopulate: function()
-    {
-        this.update();
-    },
-
-    update: function()
-    {
-        var self = this;
-        var callback = function(properties) {
-            if (!properties)
-                return;
-            self.updateProperties(properties);
-        };
-        InjectedScriptAccess.getProperties(this.object, this.ignoreHasOwnProperty, true, callback);
-    },
-
-    updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)
-    {
-        if (!rootTreeElementConstructor)
-            rootTreeElementConstructor = this.treeElementConstructor;
-            
-        if (!rootPropertyComparer)
-            rootPropertyComparer = WebInspector.ObjectPropertiesSection.CompareProperties;
-            
-        if (this.extraProperties)
-            for (var i = 0; i < this.extraProperties.length; ++i)
-                properties.push(this.extraProperties[i]);
-                
-        properties.sort(rootPropertyComparer);
-
-        this.propertiesTreeOutline.removeChildren();
-
-        for (var i = 0; i < properties.length; ++i)
-            this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));
-
-        if (!this.propertiesTreeOutline.children.length) {
-            var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";
-            var infoElement = new TreeElement(title, null, false);
-            this.propertiesTreeOutline.appendChild(infoElement);
-        }
-    }
-}
-
-WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) 
-{
-    var a = propertyA.name;
-    var b = propertyB.name;
-
-    // if used elsewhere make sure to
-    //  - convert a and b to strings (not needed here, properties are all strings)
-    //  - check if a == b (not needed here, no two properties can be the same)
-
-    var diff = 0;
-    var chunk = /^\d+|^\D+/;
-    var chunka, chunkb, anum, bnum;
-    while (diff === 0) {
-        if (!a && b)
-            return -1;
-        if (!b && a)
-            return 1;
-        chunka = a.match(chunk)[0];
-        chunkb = b.match(chunk)[0];
-        anum = !isNaN(chunka);
-        bnum = !isNaN(chunkb);
-        if (anum && !bnum)
-            return -1;
-        if (bnum && !anum)
-            return 1;
-        if (anum && bnum) {
-            diff = chunka - chunkb;
-            if (diff === 0 && chunka.length !== chunkb.length) {
-                if (!+chunka && !+chunkb) // chunks are strings of all 0s (special case)
-                    return chunka.length - chunkb.length;
-                else
-                    return chunkb.length - chunka.length;
-            }
-        } else if (chunka !== chunkb)
-            return (chunka < chunkb) ? -1 : 1;
-        a = a.substring(chunka.length);
-        b = b.substring(chunkb.length);
-    }
-    return diff;
-}
-
-WebInspector.ObjectPropertyTreeElement = function(property)
-{
-    this.property = property;
-
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, false);
-}
-
-WebInspector.ObjectPropertyTreeElement.prototype = {
-    onpopulate: function()
-    {
-        if (this.children.length && !this.shouldRefreshChildren)
-            return;
-
-        var callback = function(properties) {
-            this.removeChildren();
-            if (!properties)
-                return;
-
-            properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);
-            for (var i = 0; i < properties.length; ++i) {
-                this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));
-            }
-        };
-        InjectedScriptAccess.getProperties(this.property.value, false, true, callback.bind(this));
-    },
-
-    ondblclick: function(event)
-    {
-        this.startEditing();
-    },
-
-    onattach: function()
-    {
-        this.update();
-    },
-
-    update: function()
-    {
-        this.nameElement = document.createElement("span");
-        this.nameElement.className = "name";
-        this.nameElement.textContent = this.property.name;
-
-        var separatorElement = document.createElement("span");
-        separatorElement.className = "separator";
-        separatorElement.textContent = ": ";
-        
-        this.valueElement = document.createElement("span");
-        this.valueElement.className = "value";
-        this.valueElement.textContent = this.property.value.description;
-        if (this.property.isGetter)
-           this.valueElement.addStyleClass("dimmed");
-
-        this.listItemElement.removeChildren();
-
-        this.listItemElement.appendChild(this.nameElement);
-        this.listItemElement.appendChild(separatorElement);
-        this.listItemElement.appendChild(this.valueElement);
-        this.hasChildren = this.property.value.hasChildren;
-    },
-
-    updateSiblings: function()
-    {
-        if (this.parent.root)
-            this.treeOutline.section.update();
-        else
-            this.parent.shouldRefreshChildren = true;
-    },
-
-    startEditing: function()
-    {
-        if (WebInspector.isBeingEdited(this.valueElement) || !this.treeOutline.section.editable)
-            return;
-
-        var context = { expanded: this.expanded };
-
-        // Lie about our children to prevent expanding on double click and to collapse subproperties.
-        this.hasChildren = false;
-
-        this.listItemElement.addStyleClass("editing-sub-part");
-
-        WebInspector.startEditing(this.valueElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingEnded: function(context)
-    {
-        this.listItemElement.scrollLeft = 0;
-        this.listItemElement.removeStyleClass("editing-sub-part");
-        if (context.expanded)
-            this.expand();
-    },
-
-    editingCancelled: function(element, context)
-    {
-        this.update();
-        this.editingEnded(context);
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context)
-    {
-        if (userInput === previousContent)
-            return this.editingCancelled(element, context); // nothing changed, so cancel
-
-        this.applyExpression(userInput, true);
-
-        this.editingEnded(context);
-    },
-
-    applyExpression: function(expression, updateInterface)
-    {
-        expression = expression.trimWhitespace();
-        var expressionLength = expression.length;
-        var self = this;
-        var callback = function(success) {
-            if (!updateInterface)
-                return;
-
-            if (!success)
-                self.update();
-
-            if (!expressionLength) {
-                // The property was deleted, so remove this tree element.
-                self.parent.removeChild(this);
-            } else {
-                // Call updateSiblings since their value might be based on the value that just changed.
-                self.updateSiblings();
-            }
-        };
-        InjectedScriptAccess.setPropertyValue(this.property.parentObjectProxy, this.property.name, expression.trimWhitespace(), callback);
-    }
-}
-
-WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* BreakpointsSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.BreakpointsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
-
-    this.breakpoints = {};
-
-    this.listElement = document.createElement("ol");
-    this.listElement.className = "breakpoint-list";
-
-    this.emptyElement = document.createElement("div");
-    this.emptyElement.className = "info";
-    this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
-
-    this.bodyElement.appendChild(this.emptyElement);
-}
-
-WebInspector.BreakpointsSidebarPane.prototype = {
-    addBreakpoint: function(breakpoint)
-    {
-        if (this.breakpoints[breakpoint.id])
-            return;
-
-        this.breakpoints[breakpoint.id] = breakpoint;
-
-        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("text-changed", this._breakpointTextChanged, this);
-
-        this._appendBreakpointElement(breakpoint);
-
-        if (this.emptyElement.parentElement) {
-            this.bodyElement.removeChild(this.emptyElement);
-            this.bodyElement.appendChild(this.listElement);
-        }
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        if (breakpoint.enabled)
-            InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-    },
-
-    _appendBreakpointElement: function(breakpoint)
-    {
-        function checkboxClicked(event)
-        {
-            breakpoint.enabled = !breakpoint.enabled;
-
-            // without this, we'd switch to the source of the clicked breakpoint
-            event.stopPropagation();
-        }
-
-        function breakpointClicked()
-        {
-            var script = WebInspector.panels.scripts.scriptOrResourceForID(breakpoint.sourceID);
-            if (script)
-                WebInspector.panels.scripts.showScript(script, breakpoint.line);
-        }
-
-        var breakpointElement = document.createElement("li");
-        breakpoint._breakpointListElement = breakpointElement;
-        breakpointElement._breakpointObject = breakpoint;
-        breakpointElement.addEventListener("click", breakpointClicked, false);
-
-        var checkboxElement = document.createElement("input");
-        checkboxElement.className = "checkbox-elem";
-        checkboxElement.type = "checkbox";
-        checkboxElement.checked = breakpoint.enabled;
-        checkboxElement.addEventListener("click", checkboxClicked, false);
-        breakpointElement.appendChild(checkboxElement);
-
-        var labelElement = document.createTextNode(breakpoint.label);
-        breakpointElement.appendChild(labelElement);
-
-        var sourceTextElement = document.createElement("div");
-        sourceTextElement.textContent = breakpoint.sourceText;
-        sourceTextElement.className = "source-text";
-        breakpointElement.appendChild(sourceTextElement);
-
-        var currentElement = this.listElement.firstChild;
-        while (currentElement) {
-            var currentBreak = currentElement._breakpointObject;
-            if (currentBreak.url > breakpoint.url) {
-                this.listElement.insertBefore(breakpointElement, currentElement);
-                return;
-            } else if (currentBreak.url == breakpoint.url && currentBreak.line > breakpoint.line) {
-                this.listElement.insertBefore(breakpointElement, currentElement);
-                return;
-            }
-            currentElement = currentElement.nextSibling;
-        }
-        this.listElement.appendChild(breakpointElement);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        if (!this.breakpoints[breakpoint.id])
-            return;
-        delete this.breakpoints[breakpoint.id];
-
-        breakpoint.removeEventListener("enabled", null, this);
-        breakpoint.removeEventListener("disabled", null, this);
-        breakpoint.removeEventListener("text-changed", null, this);
-
-        var element = breakpoint._breakpointListElement;
-        element.parentElement.removeChild(element);
-
-        if (!this.listElement.firstChild) {
-            this.bodyElement.removeChild(this.listElement);
-            this.bodyElement.appendChild(this.emptyElement);
-        }
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
-    },
-
-    _breakpointEnableChanged: function(event)
-    {
-        var breakpoint = event.target;
-
-        var checkbox = breakpoint._breakpointListElement.firstChild;
-        checkbox.checked = breakpoint.enabled;
-
-        if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
-            return;
-
-        if (breakpoint.enabled)
-            InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-        else
-            InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
-    },
-
-    _breakpointTextChanged: function(event)
-    {
-        var breakpoint = event.target;
-
-        var sourceTextElement = breakpoint._breakpointListElement.firstChild.nextSibling.nextSibling;
-        sourceTextElement.textContent = breakpoint.sourceText;
-    }
-}
-
-WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* CallStackSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CallStackSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
-    
-    this._shortcuts = {};
-
-    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Period,
-                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = this._selectNextCallFrameOnStack.bind(this);
-
-    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Comma,
-                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
-    this._shortcuts[shortcut] = this._selectPreviousCallFrameOnStack.bind(this);
-}
-
-WebInspector.CallStackSidebarPane.prototype = {
-    update: function(callFrames, sourceIDMap)
-    {
-        this.bodyElement.removeChildren();
-
-        this.placards = [];
-        delete this._selectedCallFrame;
-
-        if (!callFrames) {
-            var infoElement = document.createElement("div");
-            infoElement.className = "info";
-            infoElement.textContent = WebInspector.UIString("Not Paused");
-            this.bodyElement.appendChild(infoElement);
-            return;
-        }
-
-        var title;
-        var subtitle;
-        var scriptOrResource;
-
-        for (var i = 0; i < callFrames.length; ++i) {
-            var callFrame = callFrames[i];
-            switch (callFrame.type) {
-            case "function":
-                title = callFrame.functionName || WebInspector.UIString("(anonymous function)");
-                break;
-            case "program":
-                title = WebInspector.UIString("(program)");
-                break;
-            }
-
-            scriptOrResource = sourceIDMap[callFrame.sourceID];
-            subtitle = WebInspector.displayNameForURL(scriptOrResource.sourceURL || scriptOrResource.url);
-
-            if (callFrame.line > 0) {
-                if (subtitle)
-                    subtitle += ":" + callFrame.line;
-                else
-                    subtitle = WebInspector.UIString("line %d", callFrame.line);
-            }
-
-            var placard = new WebInspector.Placard(title, subtitle);
-            placard.callFrame = callFrame;
-
-            placard.element.addEventListener("click", this._placardSelected.bind(this), false);
-
-            this.placards.push(placard);
-            this.bodyElement.appendChild(placard.element);
-        }
-    },
-
-    get selectedCallFrame()
-    {
-        return this._selectedCallFrame;
-    },
-
-    set selectedCallFrame(x)
-    {
-        if (this._selectedCallFrame === x)
-            return;
-
-        this._selectedCallFrame = x;
-
-        for (var i = 0; i < this.placards.length; ++i) {
-            var placard = this.placards[i];
-            placard.selected = (placard.callFrame === this._selectedCallFrame);
-        }
-
-        this.dispatchEventToListeners("call frame selected");
-    },
-
-    handleShortcut: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.handled = true;
-        }
-    },
-
-    _selectNextCallFrameOnStack: function()
-    {
-        var index = this._selectedCallFrameIndex();
-        if (index == -1)
-            return;
-        this._selectedPlacardByIndex(index + 1);
-    },
-
-    _selectPreviousCallFrameOnStack: function()
-    {
-        var index = this._selectedCallFrameIndex();
-        if (index == -1)
-            return;
-        this._selectedPlacardByIndex(index - 1);
-    },
-
-    _selectedPlacardByIndex: function(index)
-    {
-        if (index < 0 || index >= this.placards.length)
-            return;
-        var placard = this.placards[index];
-        this.selectedCallFrame = placard.callFrame
-    },
-
-    _selectedCallFrameIndex: function()
-    {
-        if (!this._selectedCallFrame)
-            return -1;
-        for (var i = 0; i < this.placards.length; ++i) {
-            var placard = this.placards[i];
-            if (placard.callFrame === this._selectedCallFrame)
-                return i;
-        }
-        return -1;
-    },
-
-    _placardSelected: function(event)
-    {
-        var placardElement = event.target.enclosingNodeOrSelfWithClass("placard");
-        this.selectedCallFrame = placardElement.placard.callFrame;
-    }
-}
-
-WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* ScopeChainSidebarPane.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScopeChainSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Scope Variables"));
-    this._expandedProperties = [];
-}
-
-WebInspector.ScopeChainSidebarPane.prototype = {
-    update: function(callFrame)
-    {
-        this.bodyElement.removeChildren();
-
-        this.sections = [];
-        this.callFrame = callFrame;
-
-        if (!callFrame) {
-            var infoElement = document.createElement("div");
-            infoElement.className = "info";
-            infoElement.textContent = WebInspector.UIString("Not Paused");
-            this.bodyElement.appendChild(infoElement);
-            return;
-        }
-
-        var foundLocalScope = false;
-        var scopeChain = callFrame.scopeChain;
-        for (var i = 0; i < scopeChain.length; ++i) {
-            var scopeObjectProxy = scopeChain[i];
-            var title = null;
-            var subtitle = scopeObjectProxy.description;
-            var emptyPlaceholder = null;
-            var extraProperties = null;
-
-            if (scopeObjectProxy.isLocal) {
-                foundLocalScope = true;
-                title = WebInspector.UIString("Local");
-                emptyPlaceholder = WebInspector.UIString("No Variables");
-                subtitle = null;
-                if (scopeObjectProxy.thisObject)
-                    extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
-            } else if (scopeObjectProxy.isClosure) {
-                title = WebInspector.UIString("Closure");
-                emptyPlaceholder = WebInspector.UIString("No Variables");
-                subtitle = null;
-            } else if (i === (scopeChain.length - 1))
-                title = WebInspector.UIString("Global");
-            else if (scopeObjectProxy.isElement)
-                title = WebInspector.UIString("Event Target");
-            else if (scopeObjectProxy.isDocument)
-                title = WebInspector.UIString("Event Document");
-            else if (scopeObjectProxy.isWithBlock)
-                title = WebInspector.UIString("With Block");
-
-            if (!title || title === subtitle)
-                subtitle = null;
-
-            var section = new WebInspector.ObjectPropertiesSection(scopeObjectProxy, title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
-            section.editInSelectedCallFrameWhenPaused = true;
-            section.pane = this;
-
-            if (!foundLocalScope || scopeObjectProxy.isLocal)
-                section.expanded = true;
-
-            this.sections.push(section);
-            this.bodyElement.appendChild(section.element);
-        }
-    }
-}
-
-WebInspector.ScopeChainSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.ScopeVariableTreeElement = function(property)
-{
-    WebInspector.ObjectPropertyTreeElement.call(this, property);
-}
-
-WebInspector.ScopeVariableTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);
-        if (this.hasChildren && this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)
-            this.expand();
-    },
-
-    onexpand: function()
-    {
-        this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier] = true;
-    },
-
-    oncollapse: function()
-    {
-        delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];
-    },
-
-    get propertyIdentifier()
-    {
-        if ("_propertyIdentifier" in this)
-            return this._propertyIdentifier;
-        var section = this.treeOutline.section;
-        this._propertyIdentifier = section.title + ":" + (section.subtitle ? section.subtitle + ":" : "") + this.propertyPath;
-        return this._propertyIdentifier;
-    },
-
-    get propertyPath()
-    {
-        if ("_propertyPath" in this)
-            return this._propertyPath;
-
-        var current = this;
-        var result;
-
-        do {
-            if (result)
-                result = current.property.name + "." + result;
-            else
-                result = current.property.name;
-            current = current.parent;
-        } while (current && !current.root);
-
-        this._propertyPath = result;
-        return result;
-    }
-}
-
-WebInspector.ScopeVariableTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
-
-/* WatchExpressionsSidebarPane.js */
-
-/*
- * Copyright (C) IBM Corp. 2009  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of IBM Corp. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.WatchExpressionsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-}
-
-WebInspector.WatchExpressionsSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        this.expanded = WebInspector.settings.watchExpressions.length > 0;
-        this.section = new WebInspector.WatchExpressionsSection();
-        this.bodyElement.appendChild(this.section.element);
-
-        var addElement = document.createElement("button");
-        addElement.setAttribute("type", "button");
-        addElement.textContent = WebInspector.UIString("Add");
-        addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);
-
-        var refreshElement = document.createElement("button");
-        refreshElement.setAttribute("type", "button");
-        refreshElement.textContent = WebInspector.UIString("Refresh");
-        refreshElement.addEventListener("click", this.section.update.bind(this.section), false);
-
-        var centerElement = document.createElement("div");
-        centerElement.addStyleClass("watch-expressions-buttons-container");
-        centerElement.appendChild(addElement);
-        centerElement.appendChild(refreshElement);
-        this.bodyElement.appendChild(centerElement);
-
-        this.onexpand = this.refreshExpressions.bind(this);
-    },
-
-    refreshExpressions: function()
-    {
-        if (this.section)
-            this.section.update();
-    }
-}
-
-WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.WatchExpressionsSection = function()
-{
-    this._watchObjectGroupId = "watch-group";
-
-    WebInspector.ObjectPropertiesSection.call(this);
-
-    this.watchExpressions = WebInspector.settings.watchExpressions;
-
-    this.headerElement.className = "hidden";
-    this.editable = true;
-    this.expanded = true;
-    this.propertiesElement.addStyleClass("watch-expressions");
-}
-
-WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
-
-WebInspector.WatchExpressionsSection.prototype = {
-    update: function()
-    {
-        function appendResult(expression, watchIndex, result, exception)
-        {
-            if (exception) {
-                // Exception results are not wrappers, but text messages.
-                result = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
-            } else if (result.type === "string") {
-                // Evaluation result is intentionally not abbreviated. However, we'd like to distinguish between null and "null"
-                result.description = "\"" + result.description + "\"";
-            }
-
-            var property = new WebInspector.ObjectPropertyProxy(expression, result);
-            property.watchIndex = watchIndex;
-            property.isException = exception;
-
-            // For newly added, empty expressions, set description to "",
-            // since otherwise you get DOMWindow
-            if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) 
-                property.value.description = "";
-
-            // To clarify what's going on here: 
-            // In the outer function, we calculate the number of properties
-            // that we're going to be updating, and set that in the
-            // propertyCount variable.  
-            // In this function, we test to see when we are processing the 
-            // last property, and then call the superclass's updateProperties() 
-            // method to get all the properties refreshed at once.
-            properties.push(property);
-            
-            if (properties.length == propertyCount) {
-                this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
-
-                // check to see if we just added a new watch expression,
-                // which will always be the last property
-                if (this._newExpressionAdded) {
-                    delete this._newExpressionAdded;
-
-                    treeElement = this.findAddedTreeElement();
-                    if (treeElement)
-                        treeElement.startEditing();
-                }
-            }
-        }
-
-        InspectorBackend.releaseWrapperObjectGroup(this._watchObjectGroupId)
-        var properties = [];
-
-        // Count the properties, so we known when to call this.updateProperties()
-        // in appendResult()
-        var propertyCount = 0;
-        for (var i = 0; i < this.watchExpressions.length; ++i) {
-            if (!this.watchExpressions[i]) 
-                continue;
-            ++propertyCount;
-        }
-
-        // Now process all the expressions, since we have the actual count,
-        // which is checked in the appendResult inner function.
-        for (var i = 0; i < this.watchExpressions.length; ++i) {
-            var expression = this.watchExpressions[i];
-            if (!expression)
-                continue;
-
-            WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));
-        }
-
-        // note this is setting the expansion of the tree, not the section;
-        // with no expressions, and expanded tree, we get some extra vertical
-        // white space
-        // FIXME: should change to use header buttons instead of the buttons
-        // at the bottom of the section, then we can add a "No Watch Expressions
-        // element when there are no watch expressions, and this issue should
-        // go away.
-        this.expanded = (propertyCount != 0);
-    },
-
-    addExpression: function()
-    {
-        this._newExpressionAdded = true;
-        this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);
-        this.update();
-    },
-
-    updateExpression: function(element, value)
-    {
-        this.watchExpressions[element.property.watchIndex] = value;
-        this.saveExpressions();
-        this.update();
-    },
-
-    findAddedTreeElement: function()
-    {
-        var children = this.propertiesTreeOutline.children;
-        for (var i = 0; i < children.length; ++i)
-            if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
-                return children[i];
-    },
-
-    saveExpressions: function()
-    {
-        var toSave = [];
-        for (var i = 0; i < this.watchExpressions.length; i++)
-            if (this.watchExpressions[i])
-                toSave.push(this.watchExpressions[i]);
-
-        WebInspector.settings.watchExpressions = toSave;
-        return toSave.length;
-    }
-}
-
-WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
-
-WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) 
-{
-    if (propertyA.watchIndex == propertyB.watchIndex)
-        return 0;
-    else if (propertyA.watchIndex < propertyB.watchIndex)
-        return -1;
-    else
-        return 1;
-}
-
-WebInspector.WatchExpressionTreeElement = function(property)
-{
-    WebInspector.ObjectPropertyTreeElement.call(this, property);
-}
-
-WebInspector.WatchExpressionTreeElement.prototype = {
-    update: function()
-    {
-        WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
-
-        if (this.property.isException)
-            this.valueElement.addStyleClass("watch-expressions-error-level");
-
-        var deleteButton = document.createElement("input");
-        deleteButton.type = "button";
-        deleteButton.title = WebInspector.UIString("Delete watch expression.");
-        deleteButton.addStyleClass("enabled-button");
-        deleteButton.addStyleClass("delete-button");
-        deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
-
-        this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);
-    },
-
-    _deleteButtonClicked: function()
-    {
-        this.treeOutline.section.updateExpression(this, null);
-    },
-
-    startEditing: function()
-    {
-        if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)
-            return;
-
-        this.nameElement.textContent = this.property.name.trimWhitespace();
-
-        var context = { expanded: this.expanded };
-
-        // collapse temporarily, if required
-        this.hasChildren = false;
-
-        this.listItemElement.addStyleClass("editing-sub-part");
-
-        WebInspector.startEditing(this.nameElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingCancelled: function(element, context)
-    {
-        if (!this.nameElement.textContent)
-            this.treeOutline.section.updateExpression(this, null);
-            
-        this.update();
-        this.editingEnded(context);
-    },
-
-    applyExpression: function(expression, updateInterface)
-    {
-        expression = expression.trimWhitespace();
-
-        if (!expression)
-            expression = null;
-
-        this.property.name = expression;
-        this.treeOutline.section.updateExpression(this, expression);
-    }
-}
-
-WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
-
-/* MetricsSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.MetricsSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));
-    this._inlineStyleId = null;
-}
-
-WebInspector.MetricsSidebarPane.prototype = {
-    update: function(node)
-    {
-        if (node)
-            this.node = node;
-        else
-            node = this.node;
-
-        if (!node || !node.ownerDocument.defaultView || node.nodeType !== Node.ELEMENT_NODE) {
-            this.bodyElement.removeChildren();
-            return;
-        }
-
-        var self = this;
-        var callback = function(stylePayload) {
-            if (!stylePayload)
-                return;
-            var style = WebInspector.CSSStyleDeclaration.parseStyle(stylePayload);
-            self._update(style);
-        };
-        InjectedScriptAccess.getComputedStyle(node.id, callback);
-
-        var inlineStyleCallback = function(stylePayload) {
-            if (!stylePayload)
-                return;
-            self._inlineStyleId = stylePayload.id;
-        };
-        InjectedScriptAccess.getInlineStyle(node.id, inlineStyleCallback);
-    },
-
-    _update: function(style)
-    {
-        var metricsElement = document.createElement("div");
-        metricsElement.className = "metrics";
-
-        function createBoxPartElement(style, name, side, suffix)
-        {
-            var propertyName = (name !== "position" ? name + "-" : "") + side + suffix;
-            var value = style.getPropertyValue(propertyName);
-            if (value === "" || (name !== "position" && value === "0px"))
-                value = "\u2012";
-            else if (name === "position" && value === "auto")
-                value = "\u2012";
-            value = value.replace(/px$/, "");
-
-            var element = document.createElement("div");
-            element.className = side;
-            element.textContent = value;
-            element.addEventListener("dblclick", this.startEditing.bind(this, element, name, propertyName), false);
-            return element;
-        }
-
-        // Display types for which margin is ignored.
-        var noMarginDisplayType = {
-            "table-cell": true,
-            "table-column": true,
-            "table-column-group": true,
-            "table-footer-group": true,
-            "table-header-group": true,
-            "table-row": true,
-            "table-row-group": true
-        };
-
-        // Display types for which padding is ignored.
-        var noPaddingDisplayType = {
-            "table-column": true,
-            "table-column-group": true,
-            "table-footer-group": true,
-            "table-header-group": true,
-            "table-row": true,
-            "table-row-group": true
-        };
-
-        // Position types for which top, left, bottom and right are ignored.
-        var noPositionType = {
-            "static": true
-        };
-
-        var boxes = ["content", "padding", "border", "margin", "position"];
-        var boxLabels = [WebInspector.UIString("content"), WebInspector.UIString("padding"), WebInspector.UIString("border"), WebInspector.UIString("margin"), WebInspector.UIString("position")];
-        var previousBox;
-        for (var i = 0; i < boxes.length; ++i) {
-            var name = boxes[i];
-
-            if (name === "margin" && noMarginDisplayType[style.display])
-                continue;
-            if (name === "padding" && noPaddingDisplayType[style.display])
-                continue;
-            if (name === "position" && noPositionType[style.position])
-                continue;
-
-            var boxElement = document.createElement("div");
-            boxElement.className = name;
-
-            if (name === "content") {
-                var width = style.width.replace(/px$/, "");
-                var widthElement = document.createElement("span");
-                widthElement.textContent = width;
-                widthElement.addEventListener("dblclick", this.startEditing.bind(this, widthElement, "width", "width"), false);
-
-                var height = style.height.replace(/px$/, "");
-                var heightElement = document.createElement("span");
-                heightElement.textContent = height;
-                heightElement.addEventListener("dblclick", this.startEditing.bind(this, heightElement, "height", "height"), false);
-
-                boxElement.appendChild(widthElement);
-                boxElement.appendChild(document.createTextNode(" \u00D7 "));
-                boxElement.appendChild(heightElement);
-            } else {
-                var suffix = (name === "border" ? "-width" : "");
-
-                var labelElement = document.createElement("div");
-                labelElement.className = "label";
-                labelElement.textContent = boxLabels[i];
-                boxElement.appendChild(labelElement);
-
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "top", suffix));
-                boxElement.appendChild(document.createElement("br"));
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "left", suffix));
-
-                if (previousBox)
-                    boxElement.appendChild(previousBox);
-
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "right", suffix));
-                boxElement.appendChild(document.createElement("br"));
-                boxElement.appendChild(createBoxPartElement.call(this, style, name, "bottom", suffix));
-            }
-
-            previousBox = boxElement;
-        }
-
-        metricsElement.appendChild(previousBox);
-        this.bodyElement.removeChildren();
-        this.bodyElement.appendChild(metricsElement);
-    },
-
-    startEditing: function(targetElement, box, styleProperty)
-    {
-        if (WebInspector.isBeingEdited(targetElement))
-            return;
-
-        var context = { box: box, styleProperty: styleProperty };
-
-        WebInspector.startEditing(targetElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-    },
-
-    editingCancelled: function(element, context)
-    {
-        this.update();
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context)
-    {
-        if (userInput === previousContent)
-            return this.editingCancelled(element, context); // nothing changed, so cancel
-
-        if (context.box !== "position" && (!userInput || userInput === "\u2012"))
-            userInput = "0px";
-        else if (context.box === "position" && (!userInput || userInput === "\u2012"))
-            userInput = "auto";
-
-        // Append a "px" unit if the user input was just a number.
-        if (/^\d+$/.test(userInput))
-            userInput += "px";
-
-        var self = this;
-        var callback = function(success) {
-            if (!success)
-                return;
-            self.dispatchEventToListeners("metrics edited");
-            self.update();
-        };
-        InjectedScriptAccess.setStyleProperty(this._inlineStyleId, context.styleProperty, userInput, callback);
-    }
-}
-
-WebInspector.MetricsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* PropertiesSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PropertiesSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Properties"));
-}
-
-WebInspector.PropertiesSidebarPane.prototype = {
-    update: function(node)
-    {
-        var body = this.bodyElement;
-
-        if (!node) {
-            body.removeChildren();
-            this.sections = [];
-            return;
-        }
-
-        var self = this;
-        var callback = function(prototypes) {
-            var body = self.bodyElement;
-            body.removeChildren();
-            self.sections = [];
-
-            // Get array of prototype user-friendly names.
-            for (var i = 0; i < prototypes.length; ++i) {
-                var prototype = new WebInspector.ObjectProxy(node.id, [], i);
-                var section = new WebInspector.ObjectPropertiesSection(prototype, prototypes[i], WebInspector.UIString("Prototype"));
-                self.sections.push(section);
-                body.appendChild(section.element);
-            }
-        };
-        InjectedScriptAccess.getPrototypes(node.id, callback);
-    }
-}
-
-WebInspector.PropertiesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-/* EventListenersSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.EventListenersSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners"));
-    this.bodyElement.addStyleClass("events-pane");
-
-    this.sections = [];
-
-    this.settingsSelectElement = document.createElement("select");
-
-    var option = document.createElement("option");
-    option.value = "all";
-    option.label = WebInspector.UIString("All Nodes");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "selected";
-    option.label = WebInspector.UIString("Selected Node Only");
-    this.settingsSelectElement.appendChild(option);
-
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
-    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
-
-    this.titleElement.appendChild(this.settingsSelectElement);
-}
-
-WebInspector.EventListenersSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        var filter = WebInspector.settings.eventListenersFilter;
-        if (filter === "all")
-            this.settingsSelectElement[0].selected = true;
-        if (filter === "selected")
-            this.settingsSelectElement[1].selected = true;
-    },
-
-    update: function(node)
-    {
-        var body = this.bodyElement;
-        body.removeChildren();
-        this.sections = [];
-
-        var self = this;
-        function callback(nodeId, eventListeners) {
-            var sectionNames = [];
-            var sectionMap = {};
-            for (var i = 0; i < eventListeners.length; ++i) {
-                var eventListener = eventListeners[i];
-                eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);
-                delete eventListener.nodeId; // no longer needed
-                if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString()))
-                    continue; // ignore event listeners generated by monitorEvent
-                var type = eventListener.type;
-                var section = sectionMap[type];
-                if (!section) {
-                    section = new WebInspector.EventListenersSection(type, nodeId);
-                    sectionMap[type] = section;
-                    sectionNames.push(type);
-                    self.sections.push(section);
-                }
-                section.addListener(eventListener);
-            }
-            
-            if (sectionNames.length === 0) {
-                var div = document.createElement("div");
-                div.className = "info";
-                div.textContent = WebInspector.UIString("No Event Listeners");
-                body.appendChild(div);
-                return;
-            }
-
-            sectionNames.sort();
-            for (var i = 0; i < sectionNames.length; ++i) {
-                var section = sectionMap[sectionNames[i]];
-                section.update();
-                body.appendChild(section.element);
-            }
-        }
-
-        WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback);
-    },
-
-    _changeSetting: function(event)
-    {
-        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
-        WebInspector.settings.eventListenersFilter = selectedOption.value;
-
-        for (var i = 0; i < this.sections.length; ++i)
-            this.sections[i].update();
-    }
-}
-
-WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.EventListenersSection = function(title, nodeId)
-{
-    this.eventListeners = [];
-    this._nodeId = nodeId;
-    WebInspector.PropertiesSection.call(this, title);
-
-    // Changed from a Properties List
-    this.propertiesElement.parentNode.removeChild(this.propertiesElement);
-    delete this.propertiesElement;
-    delete this.propertiesTreeOutline;
-
-    this.eventBars = document.createElement("div");
-    this.eventBars.className = "event-bars";
-    this.element.appendChild(this.eventBars);
-}
-
-WebInspector.EventListenersSection.prototype = {
-    update: function()
-    {
-        // A Filtered Array simplifies when to create connectors
-        var filteredEventListeners = this.eventListeners;
-        if (WebInspector.settings.eventListenersFilter === "selected") {
-            filteredEventListeners = [];
-            for (var i = 0; i < this.eventListeners.length; ++i) {
-                var eventListener = this.eventListeners[i];
-                if (eventListener.node.id === this._nodeId)
-                    filteredEventListeners.push(eventListener);
-            }
-        }
-
-        this.eventBars.removeChildren();
-        var length = filteredEventListeners.length;
-        for (var i = 0; i < length; ++i) {
-            var eventListener = filteredEventListeners[i];
-            var eventListenerBar = new WebInspector.EventListenerBar(eventListener);
-            if (i < length - 1) {
-                var connector = document.createElement("div");
-                connector.className = "event-bar-connector";
-                eventListenerBar.element.appendChild(connector);
-            }
-
-            this.eventBars.appendChild(eventListenerBar.element);
-        }
-    },
-
-    addListener: function(eventListener)
-    {
-        this.eventListeners.push(eventListener);
-    }
-}
-
-WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.EventListenerBar = function(eventListener)
-{
-    this.eventListener = eventListener;
-    WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName());
-    this.editable = false;
-    this.element.className = "event-bar"; /* Changed from "section" */
-    this.propertiesElement.className = "event-properties"; /* Changed from "properties" */
-}
-
-WebInspector.EventListenerBar.prototype = {
-    update: function()
-    {
-        var properties = [];
-        for (var propertyName in this.eventListener) {
-            // Just build properties in place - no need to reach out for injected script.
-            var value = this.eventListener[propertyName];
-            if (value instanceof WebInspector.DOMNode)
-                value = new WebInspector.ObjectProxy(value.id, [], 0, appropriateSelectorForNode(value), true);
-            else
-                value = WebInspector.ObjectProxy.wrapPrimitiveValue(value);
-            properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value));
-        }
-        this.updateProperties(properties);
-    },
-
-    _getNodeDisplayName: function()
-    {
-        var node = this.eventListener.node;
-        if (!node)
-            return "";
-
-        if (node.nodeType === Node.DOCUMENT_NODE)
-            return "document";
-
-        return appropriateSelectorForNode(node);
-    },
-
-    _getFunctionDisplayName: function()
-    {
-        // Requires that Function.toString() return at least the function's signature.
-        var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/);
-        return (match ? match[1] : WebInspector.UIString("(anonymous function)"));
-    }
-}
-
-WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
-
-/* Color.js */
-
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Color = function(str)
-{
-    this.value = str;
-    this._parse();
-}
-
-WebInspector.Color.prototype = {
-    get shorthex()
-    {
-        if ("_short" in this)
-            return this._short;
-
-        if (!this.simple)
-            return null;
-
-        var hex = this.hex;
-        if (hex.charAt(0) === hex.charAt(1) && hex.charAt(2) === hex.charAt(3) && hex.charAt(4) === hex.charAt(5))
-            this._short = hex.charAt(0) + hex.charAt(2) + hex.charAt(4);
-        else
-            this._short = hex;
-
-        return this._short;
-    },
-
-    get hex()
-    {
-        if (!this.simple)
-            return null;
-
-        return this._hex;
-    },
-
-    set hex(x)
-    {
-        this._hex = x;
-    },
-
-    get rgb()
-    {
-        if ("_rgb" in this)
-            return this._rgb;
-
-        if (this.simple)
-            this._rgb = this._hexToRGB(this.hex);
-        else {
-            var rgba = this.rgba;
-            this._rgb = [rgba[0], rgba[1], rgba[2]];
-        }
-
-        return this._rgb;
-    },
-
-    set rgb(x)
-    {
-        this._rgb = x;
-    },
-
-    get hsl()
-    {
-        if ("_hsl" in this)
-            return this._hsl;
-
-        this._hsl = this._rgbToHSL(this.rgb);
-        return this._hsl;
-    },
-
-    set hsl(x)
-    {
-        this._hsl = x;
-    },
-
-    get nickname()
-    {
-        if (typeof this._nickname !== "undefined") // would be set on parse if there was a nickname
-            return this._nickname;
-        else
-            return null;
-    },
-
-    set nickname(x)
-    {
-        this._nickname = x;
-    },
-
-    get rgba()
-    {
-        return this._rgba;
-    },
-
-    set rgba(x)
-    {
-        this._rgba = x;
-    },
-
-    get hsla()
-    {
-        return this._hsla;
-    },
-
-    set hsla(x)
-    {
-        this._hsla = x;
-    },
-
-    hasShortHex: function()
-    {
-        var shorthex = this.shorthex;
-        return (shorthex && shorthex.length === 3);
-    },
-
-    toString: function(format)
-    {
-        if (!format)
-            format = this.format;
-
-        switch (format) {
-            case "rgb":
-                return "rgb(" + this.rgb.join(", ") + ")";
-            case "rgba":
-                return "rgba(" + this.rgba.join(", ") + ")";
-            case "hsl":
-                var hsl = this.hsl;
-                return "hsl(" + hsl[0] + ", " + hsl[1] + "%, " + hsl[2] + "%)";
-            case "hsla":
-                var hsla = this.hsla;
-                return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
-            case "hex":
-                return "#" + this.hex;
-            case "shorthex":
-                return "#" + this.shorthex;
-            case "nickname":
-                return this.nickname;
-        }
-
-        throw "invalid color format";
-    },
-
-    _rgbToHex: function(rgb)
-    {
-        var r = parseInt(rgb[0]).toString(16);
-        var g = parseInt(rgb[1]).toString(16);
-        var b = parseInt(rgb[2]).toString(16);
-        if (r.length === 1)
-            r = "0" + r;
-        if (g.length === 1)
-            g = "0" + g;
-        if (b.length === 1)
-            b = "0" + b;
-
-        return (r + g + b).toUpperCase();
-    },
-
-    _hexToRGB: function(hex)
-    {
-        var r = parseInt(hex.substring(0,2), 16);
-        var g = parseInt(hex.substring(2,4), 16);
-        var b = parseInt(hex.substring(4,6), 16);
-
-        return [r, g, b];
-    },
-
-    _rgbToHSL: function(rgb)
-    {
-        var r = parseInt(rgb[0]) / 255;
-        var g = parseInt(rgb[1]) / 255;
-        var b = parseInt(rgb[2]) / 255;
-        var max = Math.max(r, g, b);
-        var min = Math.min(r, g, b);
-        var diff = max - min;
-        var add = max + min;
-
-        if (min === max)
-            var h = 0;
-        else if (r === max)
-            var h = ((60 * (g - b) / diff) + 360) % 360;
-        else if (g === max)
-            var h = (60 * (b - r) / diff) + 120;
-        else
-            var h = (60 * (r - g) / diff) + 240;
-
-        var l = 0.5 * add;
-
-        if (l === 0)
-            var s = 0;
-        else if (l === 1)
-            var s = 1;
-        else if (l <= 0.5)
-            var s = diff / add;
-        else
-            var s = diff / (2 - add);
-
-        h = Math.round(h);
-        s = Math.round(s*100);
-        l = Math.round(l*100);
-
-        return [h, s, l];
-    },
-
-    _hslToRGB: function(hsl)
-    {
-        var h = parseFloat(hsl[0]) / 360;
-        var s = parseFloat(hsl[1]) / 100;
-        var l = parseFloat(hsl[2]) / 100;
-
-        if (l <= 0.5)
-            var q = l * (1 + s);
-        else
-            var q = l + s - (l * s);
-
-        var p = 2 * l - q;
-
-        var tr = h + (1 / 3);
-        var tg = h;
-        var tb = h - (1 / 3);
-
-        var r = Math.round(hueToRGB(p, q, tr) * 255);
-        var g = Math.round(hueToRGB(p, q, tg) * 255);
-        var b = Math.round(hueToRGB(p, q, tb) * 255);
-        return [r, g, b];
-
-        function hueToRGB(p, q, h) {
-            if (h < 0)
-                h += 1;
-            else if (h > 1)
-                h -= 1;
-
-            if ((h * 6) < 1)
-                return p + (q - p) * h * 6;
-            else if ((h * 2) < 1)
-                return q;
-            else if ((h * 3) < 2)
-                return p + (q - p) * ((2 / 3) - h) * 6;
-            else
-                return p;
-        }
-    },
-
-    _rgbaToHSLA: function(rgba)
-    {
-        var alpha = rgba[3];
-        var hsl = this._rgbToHSL(rgba)
-        hsl.push(alpha);
-        return hsl;
-    },
-
-    _hslaToRGBA: function(hsla)
-    {
-        var alpha = hsla[3];
-        var rgb = this._hslToRGB(hsla);
-        rgb.push(alpha);
-        return rgb;
-    },
-
-    _parse: function()
-    {
-        // Special Values - Advanced but Must Be Parsed First - transparent
-        var value = this.value.toLowerCase().replace(/%|\s+/g, "");
-        if (value in WebInspector.Color.AdvancedNickNames) {
-            this.format = "nickname";
-            var set = WebInspector.Color.AdvancedNickNames[value];
-            this.simple = false;
-            this.rgba = set[0];
-            this.hsla = set[1];
-            this.nickname = set[2];
-            this.alpha = set[0][3];
-            return;
-        }
-
-        // Simple - #hex, rgb(), nickname, hsl()
-        var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;
-        var match = this.value.match(simple);
-        if (match) {
-            this.simple = true;
-
-            if (match[1]) { // hex
-                var hex = match[1].toUpperCase();
-                if (hex.length === 3) {
-                    this.format = "shorthex";
-                    this.hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
-                } else {
-                    this.format = "hex";
-                    this.hex = hex;
-                }
-            } else if (match[2]) { // rgb
-                this.format = "rgb";
-                var rgb = match[2].split(/\s*,\s*/);
-                this.rgb = rgb;
-                this.hex = this._rgbToHex(rgb);
-            } else if (match[3]) { // nickname
-                var nickname = match[3].toLowerCase();
-                if (nickname in WebInspector.Color.Nicknames) {
-                    this.format = "nickname";
-                    this.hex = WebInspector.Color.Nicknames[nickname];
-                } else // unknown name
-                    throw "unknown color name";
-            } else if (match[4]) { // hsl
-                this.format = "hsl";
-                var hsl = match[4].replace(/%g/, "").split(/\s*,\s*/);
-                this.hsl = hsl;
-                this.rgb = this._hslToRGB(hsl);
-                this.hex = this._rgbToHex(this.rgb);
-            }
-
-            // Fill in the values if this is a known hex color
-            var hex = this.hex;
-            if (hex && hex in WebInspector.Color.HexTable) {
-                var set = WebInspector.Color.HexTable[hex];
-                this.rgb = set[0];
-                this.hsl = set[1];
-                this.nickname = set[2];
-            }
-
-            return;
-        }
-
-        // Advanced - rgba(), hsla()
-        var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;
-        match = this.value.match(advanced);
-        if (match) {
-            this.simple = false;
-            if (match[1]) { // rgba
-                this.format = "rgba";
-                this.rgba = match[1].split(/\s*,\s*/);
-                this.hsla = this._rgbaToHSLA(this.rgba);
-                this.alpha = this.rgba[3];
-            } else if (match[2]) { // hsla
-                this.format = "hsla";
-                this.hsla = match[2].replace(/%/g, "").split(/\s*,\s*/);
-                this.rgba = this._hslaToRGBA(this.hsla);
-                this.alpha = this.hsla[3];
-            }
-
-            return;
-        }
-
-        // Could not parse as a valid color
-        throw "could not parse color";
-    }
-}
-
-// Simple Values: [rgb, hsl, nickname]
-WebInspector.Color.HexTable = {
-    "000000": [[0, 0, 0], [0, 0, 0], "black"],
-    "000080": [[0, 0, 128], [240, 100, 25], "navy"],
-    "00008B": [[0, 0, 139], [240, 100, 27], "darkBlue"],
-    "0000CD": [[0, 0, 205], [240, 100, 40], "mediumBlue"],
-    "0000FF": [[0, 0, 255], [240, 100, 50], "blue"],
-    "006400": [[0, 100, 0], [120, 100, 20], "darkGreen"],
-    "008000": [[0, 128, 0], [120, 100, 25], "green"],
-    "008080": [[0, 128, 128], [180, 100, 25], "teal"],
-    "008B8B": [[0, 139, 139], [180, 100, 27], "darkCyan"],
-    "00BFFF": [[0, 191, 255], [195, 100, 50], "deepSkyBlue"],
-    "00CED1": [[0, 206, 209], [181, 100, 41], "darkTurquoise"],
-    "00FA9A": [[0, 250, 154], [157, 100, 49], "mediumSpringGreen"],
-    "00FF00": [[0, 255, 0], [120, 100, 50], "lime"],
-    "00FF7F": [[0, 255, 127], [150, 100, 50], "springGreen"],
-    "00FFFF": [[0, 255, 255], [180, 100, 50], "cyan"],
-    "191970": [[25, 25, 112], [240, 64, 27], "midnightBlue"],
-    "1E90FF": [[30, 144, 255], [210, 100, 56], "dodgerBlue"],
-    "20B2AA": [[32, 178, 170], [177, 70, 41], "lightSeaGreen"],
-    "228B22": [[34, 139, 34], [120, 61, 34], "forestGreen"],
-    "2E8B57": [[46, 139, 87], [146, 50, 36], "seaGreen"],
-    "2F4F4F": [[47, 79, 79], [180, 25, 25], "darkSlateGray"],
-    "32CD32": [[50, 205, 50], [120, 61, 50], "limeGreen"],
-    "3CB371": [[60, 179, 113], [147, 50, 47], "mediumSeaGreen"],
-    "40E0D0": [[64, 224, 208], [174, 72, 56], "turquoise"],
-    "4169E1": [[65, 105, 225], [225, 73, 57], "royalBlue"],
-    "4682B4": [[70, 130, 180], [207, 44, 49], "steelBlue"],
-    "483D8B": [[72, 61, 139], [248, 39, 39], "darkSlateBlue"],
-    "48D1CC": [[72, 209, 204], [178, 60, 55], "mediumTurquoise"],
-    "4B0082": [[75, 0, 130], [275, 100, 25], "indigo"],
-    "556B2F": [[85, 107, 47], [82, 39, 30], "darkOliveGreen"],
-    "5F9EA0": [[95, 158, 160], [182, 25, 50], "cadetBlue"],
-    "6495ED": [[100, 149, 237], [219, 79, 66], "cornflowerBlue"],
-    "66CDAA": [[102, 205, 170], [160, 51, 60], "mediumAquaMarine"],
-    "696969": [[105, 105, 105], [0, 0, 41], "dimGray"],
-    "6A5ACD": [[106, 90, 205], [248, 53, 58], "slateBlue"],
-    "6B8E23": [[107, 142, 35], [80, 60, 35], "oliveDrab"],
-    "708090": [[112, 128, 144], [210, 13, 50], "slateGray"],
-    "778899": [[119, 136, 153], [210, 14, 53], "lightSlateGray"],
-    "7B68EE": [[123, 104, 238], [249, 80, 67], "mediumSlateBlue"],
-    "7CFC00": [[124, 252, 0], [90, 100, 49], "lawnGreen"],
-    "7FFF00": [[127, 255, 0], [90, 100, 50], "chartreuse"],
-    "7FFFD4": [[127, 255, 212], [160, 100, 75], "aquamarine"],
-    "800000": [[128, 0, 0], [0, 100, 25], "maroon"],
-    "800080": [[128, 0, 128], [300, 100, 25], "purple"],
-    "808000": [[128, 128, 0], [60, 100, 25], "olive"],
-    "808080": [[128, 128, 128], [0, 0, 50], "gray"],
-    "87CEEB": [[135, 206, 235], [197, 71, 73], "skyBlue"],
-    "87CEFA": [[135, 206, 250], [203, 92, 75], "lightSkyBlue"],
-    "8A2BE2": [[138, 43, 226], [271, 76, 53], "blueViolet"],
-    "8B0000": [[139, 0, 0], [0, 100, 27], "darkRed"],
-    "8B008B": [[139, 0, 139], [300, 100, 27], "darkMagenta"],
-    "8B4513": [[139, 69, 19], [25, 76, 31], "saddleBrown"],
-    "8FBC8F": [[143, 188, 143], [120, 25, 65], "darkSeaGreen"],
-    "90EE90": [[144, 238, 144], [120, 73, 75], "lightGreen"],
-    "9370D8": [[147, 112, 219], [260, 60, 65], "mediumPurple"],
-    "9400D3": [[148, 0, 211], [282, 100, 41], "darkViolet"],
-    "98FB98": [[152, 251, 152], [120, 93, 79], "paleGreen"],
-    "9932CC": [[153, 50, 204], [280, 61, 50], "darkOrchid"],
-    "9ACD32": [[154, 205, 50], [80, 61, 50], "yellowGreen"],
-    "A0522D": [[160, 82, 45], [19, 56, 40], "sienna"],
-    "A52A2A": [[165, 42, 42], [0, 59, 41], "brown"],
-    "A9A9A9": [[169, 169, 169], [0, 0, 66], "darkGray"],
-    "ADD8E6": [[173, 216, 230], [195, 53, 79], "lightBlue"],
-    "ADFF2F": [[173, 255, 47], [84, 100, 59], "greenYellow"],
-    "AFEEEE": [[175, 238, 238], [180, 65, 81], "paleTurquoise"],
-    "B0C4DE": [[176, 196, 222], [214, 41, 78], "lightSteelBlue"],
-    "B0E0E6": [[176, 224, 230], [187, 52, 80], "powderBlue"],
-    "B22222": [[178, 34, 34], [0, 68, 42], "fireBrick"],
-    "B8860B": [[184, 134, 11], [43, 89, 38], "darkGoldenrod"],
-    "BA55D3": [[186, 85, 211], [288, 59, 58], "mediumOrchid"],
-    "BC8F8F": [[188, 143, 143], [0, 25, 65], "rosyBrown"],
-    "BDB76B": [[189, 183, 107], [56, 38, 58], "darkKhaki"],
-    "C0C0C0": [[192, 192, 192], [0, 0, 75], "silver"],
-    "C71585": [[199, 21, 133], [322, 81, 43], "mediumVioletRed"],
-    "CD5C5C": [[205, 92, 92], [0, 53, 58], "indianRed"],
-    "CD853F": [[205, 133, 63], [30, 59, 53], "peru"],
-    "D2691E": [[210, 105, 30], [25, 75, 47], "chocolate"],
-    "D2B48C": [[210, 180, 140], [34, 44, 69], "tan"],
-    "D3D3D3": [[211, 211, 211], [0, 0, 83], "lightGrey"],
-    "D87093": [[219, 112, 147], [340, 60, 65], "paleVioletRed"],
-    "D8BFD8": [[216, 191, 216], [300, 24, 80], "thistle"],
-    "DA70D6": [[218, 112, 214], [302, 59, 65], "orchid"],
-    "DAA520": [[218, 165, 32], [43, 74, 49], "goldenrod"],
-    "DC143C": [[237, 164, 61], [35, 83, 58], "crimson"],
-    "DCDCDC": [[220, 220, 220], [0, 0, 86], "gainsboro"],
-    "DDA0DD": [[221, 160, 221], [300, 47, 75], "plum"],
-    "DEB887": [[222, 184, 135], [34, 57, 70], "burlyWood"],
-    "E0FFFF": [[224, 255, 255], [180, 100, 94], "lightCyan"],
-    "E6E6FA": [[230, 230, 250], [240, 67, 94], "lavender"],
-    "E9967A": [[233, 150, 122], [15, 72, 70], "darkSalmon"],
-    "EE82EE": [[238, 130, 238], [300, 76, 72], "violet"],
-    "EEE8AA": [[238, 232, 170], [55, 67, 80], "paleGoldenrod"],
-    "F08080": [[240, 128, 128], [0, 79, 72], "lightCoral"],
-    "F0E68C": [[240, 230, 140], [54, 77, 75], "khaki"],
-    "F0F8FF": [[240, 248, 255], [208, 100, 97], "aliceBlue"],
-    "F0FFF0": [[240, 255, 240], [120, 100, 97], "honeyDew"],
-    "F0FFFF": [[240, 255, 255], [180, 100, 97], "azure"],
-    "F4A460": [[244, 164, 96], [28, 87, 67], "sandyBrown"],
-    "F5DEB3": [[245, 222, 179], [39, 77, 83], "wheat"],
-    "F5F5DC": [[245, 245, 220], [60, 56, 91], "beige"],
-    "F5F5F5": [[245, 245, 245], [0, 0, 96], "whiteSmoke"],
-    "F5FFFA": [[245, 255, 250], [150, 100, 98], "mintCream"],
-    "F8F8FF": [[248, 248, 255], [240, 100, 99], "ghostWhite"],
-    "FA8072": [[250, 128, 114], [6, 93, 71], "salmon"],
-    "FAEBD7": [[250, 235, 215], [34, 78, 91], "antiqueWhite"],
-    "FAF0E6": [[250, 240, 230], [30, 67, 94], "linen"],
-    "FAFAD2": [[250, 250, 210], [60, 80, 90], "lightGoldenrodYellow"],
-    "FDF5E6": [[253, 245, 230], [39, 85, 95], "oldLace"],
-    "FF0000": [[255, 0, 0], [0, 100, 50], "red"],
-    "FF00FF": [[255, 0, 255], [300, 100, 50], "magenta"],
-    "FF1493": [[255, 20, 147], [328, 100, 54], "deepPink"],
-    "FF4500": [[255, 69, 0], [16, 100, 50], "orangeRed"],
-    "FF6347": [[255, 99, 71], [9, 100, 64], "tomato"],
-    "FF69B4": [[255, 105, 180], [330, 100, 71], "hotPink"],
-    "FF7F50": [[255, 127, 80], [16, 100, 66], "coral"],
-    "FF8C00": [[255, 140, 0], [33, 100, 50], "darkOrange"],
-    "FFA07A": [[255, 160, 122], [17, 100, 74], "lightSalmon"],
-    "FFA500": [[255, 165, 0], [39, 100, 50], "orange"],
-    "FFB6C1": [[255, 182, 193], [351, 100, 86], "lightPink"],
-    "FFC0CB": [[255, 192, 203], [350, 100, 88], "pink"],
-    "FFD700": [[255, 215, 0], [51, 100, 50], "gold"],
-    "FFDAB9": [[255, 218, 185], [28, 100, 86], "peachPuff"],
-    "FFDEAD": [[255, 222, 173], [36, 100, 84], "navajoWhite"],
-    "FFE4B5": [[255, 228, 181], [38, 100, 85], "moccasin"],
-    "FFE4C4": [[255, 228, 196], [33, 100, 88], "bisque"],
-    "FFE4E1": [[255, 228, 225], [6, 100, 94], "mistyRose"],
-    "FFEBCD": [[255, 235, 205], [36, 100, 90], "blanchedAlmond"],
-    "FFEFD5": [[255, 239, 213], [37, 100, 92], "papayaWhip"],
-    "FFF0F5": [[255, 240, 245], [340, 100, 97], "lavenderBlush"],
-    "FFF5EE": [[255, 245, 238], [25, 100, 97], "seaShell"],
-    "FFF8DC": [[255, 248, 220], [48, 100, 93], "cornsilk"],
-    "FFFACD": [[255, 250, 205], [54, 100, 90], "lemonChiffon"],
-    "FFFAF0": [[255, 250, 240], [40, 100, 97], "floralWhite"],
-    "FFFAFA": [[255, 250, 250], [0, 100, 99], "snow"],
-    "FFFF00": [[255, 255, 0], [60, 100, 50], "yellow"],
-    "FFFFE0": [[255, 255, 224], [60, 100, 94], "lightYellow"],
-    "FFFFF0": [[255, 255, 240], [60, 100, 97], "ivory"],
-    "FFFFFF": [[255, 255, 255], [0, 100, 100], "white"]
-};
-
-// Simple Values
-WebInspector.Color.Nicknames = {
-    "aliceblue": "F0F8FF",
-    "antiquewhite": "FAEBD7",
-    "aqua": "00FFFF",
-    "aquamarine": "7FFFD4",
-    "azure": "F0FFFF",
-    "beige": "F5F5DC",
-    "bisque": "FFE4C4",
-    "black": "000000",
-    "blanchedalmond": "FFEBCD",
-    "blue": "0000FF",
-    "blueviolet": "8A2BE2",
-    "brown": "A52A2A",
-    "burlywood": "DEB887",
-    "cadetblue": "5F9EA0",
-    "chartreuse": "7FFF00",
-    "chocolate": "D2691E",
-    "coral": "FF7F50",
-    "cornflowerblue": "6495ED",
-    "cornsilk": "FFF8DC",
-    "crimson": "DC143C",
-    "cyan": "00FFFF",
-    "darkblue": "00008B",
-    "darkcyan": "008B8B",
-    "darkgoldenrod": "B8860B",
-    "darkgray": "A9A9A9",
-    "darkgreen": "006400",
-    "darkkhaki": "BDB76B",
-    "darkmagenta": "8B008B",
-    "darkolivegreen": "556B2F",
-    "darkorange": "FF8C00",
-    "darkorchid": "9932CC",
-    "darkred": "8B0000",
-    "darksalmon": "E9967A",
-    "darkseagreen": "8FBC8F",
-    "darkslateblue": "483D8B",
-    "darkslategray": "2F4F4F",
-    "darkturquoise": "00CED1",
-    "darkviolet": "9400D3",
-    "deeppink": "FF1493",
-    "deepskyblue": "00BFFF",
-    "dimgray": "696969",
-    "dodgerblue": "1E90FF",
-    "firebrick": "B22222",
-    "floralwhite": "FFFAF0",
-    "forestgreen": "228B22",
-    "fuchsia": "FF00FF",
-    "gainsboro": "DCDCDC",
-    "ghostwhite": "F8F8FF",
-    "gold": "FFD700",
-    "goldenrod": "DAA520",
-    "gray": "808080",
-    "green": "008000",
-    "greenyellow": "ADFF2F",
-    "honeydew": "F0FFF0",
-    "hotpink": "FF69B4",
-    "indianred": "CD5C5C",
-    "indigo": "4B0082",
-    "ivory": "FFFFF0",
-    "khaki": "F0E68C",
-    "lavender": "E6E6FA",
-    "lavenderblush": "FFF0F5",
-    "lawngreen": "7CFC00",
-    "lemonchiffon": "FFFACD",
-    "lightblue": "ADD8E6",
-    "lightcoral": "F08080",
-    "lightcyan": "E0FFFF",
-    "lightgoldenrodyellow": "FAFAD2",
-    "lightgreen": "90EE90",
-    "lightgrey": "D3D3D3",
-    "lightpink": "FFB6C1",
-    "lightsalmon": "FFA07A",
-    "lightseagreen": "20B2AA",
-    "lightskyblue": "87CEFA",
-    "lightslategray": "778899",
-    "lightsteelblue": "B0C4DE",
-    "lightyellow": "FFFFE0",
-    "lime": "00FF00",
-    "limegreen": "32CD32",
-    "linen": "FAF0E6",
-    "magenta": "FF00FF",
-    "maroon": "800000",
-    "mediumaquamarine": "66CDAA",
-    "mediumblue": "0000CD",
-    "mediumorchid": "BA55D3",
-    "mediumpurple": "9370D8",
-    "mediumseagreen": "3CB371",
-    "mediumslateblue": "7B68EE",
-    "mediumspringgreen": "00FA9A",
-    "mediumturquoise": "48D1CC",
-    "mediumvioletred": "C71585",
-    "midnightblue": "191970",
-    "mintcream": "F5FFFA",
-    "mistyrose": "FFE4E1",
-    "moccasin": "FFE4B5",
-    "navajowhite": "FFDEAD",
-    "navy": "000080",
-    "oldlace": "FDF5E6",
-    "olive": "808000",
-    "olivedrab": "6B8E23",
-    "orange": "FFA500",
-    "orangered": "FF4500",
-    "orchid": "DA70D6",
-    "palegoldenrod": "EEE8AA",
-    "palegreen": "98FB98",
-    "paleturquoise": "AFEEEE",
-    "palevioletred": "D87093",
-    "papayawhip": "FFEFD5",
-    "peachpuff": "FFDAB9",
-    "peru": "CD853F",
-    "pink": "FFC0CB",
-    "plum": "DDA0DD",
-    "powderblue": "B0E0E6",
-    "purple": "800080",
-    "red": "FF0000",
-    "rosybrown": "BC8F8F",
-    "royalblue": "4169E1",
-    "saddlebrown": "8B4513",
-    "salmon": "FA8072",
-    "sandybrown": "F4A460",
-    "seagreen": "2E8B57",
-    "seashell": "FFF5EE",
-    "sienna": "A0522D",
-    "silver": "C0C0C0",
-    "skyblue": "87CEEB",
-    "slateblue": "6A5ACD",
-    "slategray": "708090",
-    "snow": "FFFAFA",
-    "springgreen": "00FF7F",
-    "steelblue": "4682B4",
-    "tan": "D2B48C",
-    "teal": "008080",
-    "thistle": "D8BFD8",
-    "tomato": "FF6347",
-    "turquoise": "40E0D0",
-    "violet": "EE82EE",
-    "wheat": "F5DEB3",
-    "white": "FFFFFF",
-    "whitesmoke": "F5F5F5",
-    "yellow": "FFFF00",
-    "yellowgreen": "9ACD32"
-};
-
-// Advanced Values [rgba, hsla, nickname]
-WebInspector.Color.AdvancedNickNames = {
-    "transparent": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-    "rgba(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-    "hsla(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
-};
-
-/* StylesSidebarPane.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StylesSidebarPane = function()
-{
-    WebInspector.SidebarPane.call(this, WebInspector.UIString("Styles"));
-
-    this.settingsSelectElement = document.createElement("select");
-
-    var option = document.createElement("option");
-    option.value = "hex";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("Hex Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "rgb";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("RGB Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    option = document.createElement("option");
-    option.value = "hsl";
-    option.action = this._changeColorFormat.bind(this);
-    option.label = WebInspector.UIString("HSL Colors");
-    this.settingsSelectElement.appendChild(option);
-
-    this.settingsSelectElement.appendChild(document.createElement("hr"));
-
-    option = document.createElement("option");
-    option.action = this._createNewRule.bind(this);
-    option.label = WebInspector.UIString("New Style Rule");
-    this.settingsSelectElement.appendChild(option);
-
-    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
-    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
-    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);        
-    
-    this.titleElement.appendChild(this.settingsSelectElement);
-}
-
-WebInspector.StylesSidebarPane.prototype = {
-    _settingsLoaded: function()
-    {
-        var format = WebInspector.settings.colorFormat;
-        if (format === "hex")
-            this.settingsSelectElement[0].selected = true;
-        if (format === "rgb")
-            this.settingsSelectElement[1].selected = true;
-        if (format === "hsl")
-            this.settingsSelectElement[2].selected = true;
-    },
-
-    update: function(node, editedSection, forceUpdate)
-    {
-        var refresh = false;
-
-        if (forceUpdate)
-            delete this.node;
-
-        if (!forceUpdate && (!node || node === this.node))
-            refresh = true;
-
-        if (node && node.nodeType === Node.TEXT_NODE && node.parentNode)
-            node = node.parentNode;
-
-        if (node && node.nodeType !== Node.ELEMENT_NODE)
-            node = null;
-
-        if (node)
-            this.node = node;
-        else
-            node = this.node;
-
-        var body = this.bodyElement;
-
-        if (!node) {
-            body.removeChildren();
-            this.sections = [];
-            return;
-        }
-
-        var self = this;
-        function callback(styles)
-        {
-            if (!styles)
-                return;
-            node._setStyles(styles.computedStyle, styles.inlineStyle, styles.styleAttributes, styles.matchedCSSRules);
-            self._update(refresh, body, node, editedSection, forceUpdate);
-        }
-
-        InjectedScriptAccess.getStyles(node.id, !WebInspector.settings.showUserAgentStyles, callback);
-    },
-
-    _update: function(refresh, body, node, editedSection, forceUpdate)
-    {
-        if (!refresh) {
-            body.removeChildren();
-            this.sections = [];
-        }
-
-        var styleRules = [];
-
-        if (refresh) {
-            for (var i = 0; i < this.sections.length; ++i) {
-                var section = this.sections[i];
-                if (section instanceof WebInspector.BlankStylePropertiesSection)
-                    continue;
-                if (section.computedStyle)
-                    section.styleRule.style = node.ownerDocument.defaultView.getComputedStyle(node);
-                var styleRule = { section: section, style: section.styleRule.style, computedStyle: section.computedStyle, rule: section.rule };
-                styleRules.push(styleRule);
-            }
-        } else {
-            var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);
-            styleRules.push({ computedStyle: true, selectorText: WebInspector.UIString("Computed Style"), style: computedStyle, editable: false });
-
-            var nodeName = node.nodeName.toLowerCase();
-            for (var i = 0; i < node.attributes.length; ++i) {
-                var attr = node.attributes[i];
-                if (attr.style) {
-                    var attrStyle = { style: attr.style, editable: false };
-                    attrStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", attr.name);
-                    attrStyle.selectorText = nodeName + "[" + attr.name;
-                    if (attr.value.length)
-                        attrStyle.selectorText += "=" + attr.value;
-                    attrStyle.selectorText += "]";
-                    styleRules.push(attrStyle);
-                }
-            }
-
-            // Always Show element's Style Attributes
-            if (node.nodeType === Node.ELEMENT_NODE) {
-                var inlineStyle = { selectorText: WebInspector.UIString("Style Attribute"), style: node.style, isAttribute: true };
-                inlineStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", "style");
-                styleRules.push(inlineStyle);
-            }
-
-            var matchedStyleRules = node.ownerDocument.defaultView.getMatchedCSSRules(node, "", !WebInspector.settings.showUserAgentStyles);
-            if (matchedStyleRules) {
-                // Add rules in reverse order to match the cascade order.
-                for (var i = (matchedStyleRules.length - 1); i >= 0; --i) {
-                    var rule = matchedStyleRules[i];
-                    styleRules.push({ style: rule.style, selectorText: rule.selectorText, parentStyleSheet: rule.parentStyleSheet, rule: rule });
-                }
-            }
-        }
-
-        function deleteDisabledProperty(style, name)
-        {
-            if (!style || !name)
-                return;
-            if (style.__disabledPropertyValues)
-                delete style.__disabledPropertyValues[name];
-            if (style.__disabledPropertyPriorities)
-                delete style.__disabledPropertyPriorities[name];
-            if (style.__disabledProperties)
-                delete style.__disabledProperties[name];
-        }
-
-        var usedProperties = {};
-        var disabledComputedProperties = {};
-        var priorityUsed = false;
-
-        // Walk the style rules and make a list of all used and overloaded properties.
-        for (var i = 0; i < styleRules.length; ++i) {
-            var styleRule = styleRules[i];
-            if (styleRule.computedStyle)
-                continue;
-            if (styleRule.section && styleRule.section.noAffect)
-                continue;
-
-            styleRule.usedProperties = {};
-
-            var style = styleRule.style;
-            for (var j = 0; j < style.length; ++j) {
-                var name = style[j];
-
-                if (!priorityUsed && style.getPropertyPriority(name).length)
-                    priorityUsed = true;
-
-                // If the property name is already used by another rule then this rule's
-                // property is overloaded, so don't add it to the rule's usedProperties.
-                if (!(name in usedProperties))
-                    styleRule.usedProperties[name] = true;
-
-                if (name === "font") {
-                    // The font property is not reported as a shorthand. Report finding the individual
-                    // properties so they are visible in computed style.
-                    // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15598 is fixed.
-                    styleRule.usedProperties["font-family"] = true;
-                    styleRule.usedProperties["font-size"] = true;
-                    styleRule.usedProperties["font-style"] = true;
-                    styleRule.usedProperties["font-variant"] = true;
-                    styleRule.usedProperties["font-weight"] = true;
-                    styleRule.usedProperties["line-height"] = true;
-                }
-
-                // Delete any disabled properties, since the property does exist.
-                // This prevents it from showing twice.
-                deleteDisabledProperty(style, name);
-                deleteDisabledProperty(style, style.getPropertyShorthand(name));
-            }
-
-            // Add all the properties found in this style to the used properties list.
-            // Do this here so only future rules are affect by properties used in this rule.
-            for (var name in styleRules[i].usedProperties)
-                usedProperties[name] = true;
-
-            // Remember all disabled properties so they show up in computed style.
-            if (style.__disabledProperties)
-                for (var name in style.__disabledProperties)
-                    disabledComputedProperties[name] = true;
-        }
-
-        if (priorityUsed) {
-            // Walk the properties again and account for !important.
-            var foundPriorityProperties = [];
-
-            // Walk in reverse to match the order !important overrides.
-            for (var i = (styleRules.length - 1); i >= 0; --i) {
-                if (styleRules[i].computedStyle)
-                    continue;
-
-                var style = styleRules[i].style;
-                var uniqueProperties = style.uniqueStyleProperties;
-                for (var j = 0; j < uniqueProperties.length; ++j) {
-                    var name = uniqueProperties[j];
-                    if (style.getPropertyPriority(name).length) {
-                        if (!(name in foundPriorityProperties))
-                            styleRules[i].usedProperties[name] = true;
-                        else
-                            delete styleRules[i].usedProperties[name];
-                        foundPriorityProperties[name] = true;
-                    } else if (name in foundPriorityProperties)
-                        delete styleRules[i].usedProperties[name];
-                }
-            }
-        }
-
-        if (refresh) {
-            // Walk the style rules and update the sections with new overloaded and used properties.
-            for (var i = 0; i < styleRules.length; ++i) {
-                var styleRule = styleRules[i];
-                var section = styleRule.section;
-                if (styleRule.computedStyle)
-                    section.disabledComputedProperties = disabledComputedProperties;
-                section._usedProperties = (styleRule.usedProperties || usedProperties);
-                section.update((section === editedSection) || styleRule.computedStyle);
-            }
-        } else {
-            // Make a property section for each style rule.
-            for (var i = 0; i < styleRules.length; ++i) {
-                var styleRule = styleRules[i];
-                var subtitle = styleRule.subtitle;
-                delete styleRule.subtitle;
-
-                var computedStyle = styleRule.computedStyle;
-                delete styleRule.computedStyle;
-
-                var ruleUsedProperties = styleRule.usedProperties;
-                delete styleRule.usedProperties;
-
-                var editable = styleRule.editable;
-                delete styleRule.editable;
-
-                var isAttribute = styleRule.isAttribute;
-                delete styleRule.isAttribute;
-
-                // Default editable to true if it was omitted.
-                if (typeof editable === "undefined")
-                    editable = true;
-
-                var section = new WebInspector.StylePropertiesSection(styleRule, subtitle, computedStyle, (ruleUsedProperties || usedProperties), editable);
-                if (computedStyle)
-                    section.disabledComputedProperties = disabledComputedProperties;
-                section.pane = this;
-
-                if (Preferences.styleRulesExpandedState && section.identifier in Preferences.styleRulesExpandedState)
-                    section.expanded = Preferences.styleRulesExpandedState[section.identifier];
-                else if (computedStyle)
-                    section.collapse(true);
-                else if (isAttribute && styleRule.style.length === 0)
-                    section.collapse(true);
-                else
-                    section.expand(true);
-
-                body.appendChild(section.element);
-                this.sections.push(section);
-            }
-        }
-    },
-
-    _changeSetting: function(event)
-    {
-        var options = this.settingsSelectElement.options;
-        var selectedOption = options[this.settingsSelectElement.selectedIndex];
-        selectedOption.action(event);
-
-        // Select the correct color format setting again, since it needs to be selected.
-        var selectedIndex = 0;
-        for (var i = 0; i < options.length; ++i) {
-            if (options[i].value === WebInspector.settings.colorFormat) {
-                selectedIndex = i;
-                break;
-            }
-        }
-
-        this.settingsSelectElement.selectedIndex = selectedIndex;
-    },
-
-    _changeColorFormat: function(event)
-    {
-        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
-        WebInspector.settings.colorFormat = selectedOption.value;
-
-        for (var i = 0; i < this.sections.length; ++i)
-            this.sections[i].update(true);
-    },
-
-    _createNewRule: function(event)
-    {
-        this.addBlankSection().startEditingSelector();
-    },
-
-    addBlankSection: function()
-    {
-        var blankSection = new WebInspector.BlankStylePropertiesSection(appropriateSelectorForNode(this.node, true));
-        blankSection.pane = this;
-
-        var elementStyleSection = this.sections[1];        
-        this.bodyElement.insertBefore(blankSection.element, elementStyleSection.element.nextSibling);
-
-        this.sections.splice(2, 0, blankSection);
-
-        return blankSection;
-    },
-
-    removeSection: function(section)
-    {
-        var index = this.sections.indexOf(section);
-        if (index === -1)
-            return;
-        this.sections.splice(index, 1);
-        if (section.element.parentNode)
-            section.element.parentNode.removeChild(section.element);
-    }
-}
-
-WebInspector.StylesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-WebInspector.StylePropertiesSection = function(styleRule, subtitle, computedStyle, usedProperties, editable)
-{
-    WebInspector.PropertiesSection.call(this, styleRule.selectorText);
-
-    this.titleElement.addEventListener("click", this._clickSelector.bind(this), false);
-    this.titleElement.addEventListener("dblclick", this._dblclickSelector.bind(this), false);
-    this.element.addEventListener("dblclick", this._dblclickEmptySpace.bind(this), false);
-
-    this.styleRule = styleRule;
-    this.rule = this.styleRule.rule;
-    this.computedStyle = computedStyle;
-    this.editable = (editable && !computedStyle);
-
-    // Prevent editing the user agent and user rules.
-    var isUserAgent = this.rule && this.rule.isUserAgent;
-    var isUser = this.rule && this.rule.isUser;
-    var isViaInspector = this.rule && this.rule.isViaInspector;
-
-    if (isUserAgent || isUser)
-        this.editable = false;
-
-    this._usedProperties = usedProperties;
-
-    if (computedStyle) {
-        this.element.addStyleClass("computed-style");
-
-        if (WebInspector.settings.showInheritedComputedStyleProperties)
-            this.element.addStyleClass("show-inherited");
-
-        var showInheritedLabel = document.createElement("label");
-        var showInheritedInput = document.createElement("input");
-        showInheritedInput.type = "checkbox";
-        showInheritedInput.checked = WebInspector.settings.showInheritedComputedStyleProperties;
-
-        var computedStyleSection = this;
-        var showInheritedToggleFunction = function(event) {
-            WebInspector.settings.showInheritedComputedStyleProperties = showInheritedInput.checked;
-            if (WebInspector.settings.showInheritedComputedStyleProperties)
-                computedStyleSection.element.addStyleClass("show-inherited");
-            else
-                computedStyleSection.element.removeStyleClass("show-inherited");
-            event.stopPropagation();
-        };
-
-        showInheritedLabel.addEventListener("click", showInheritedToggleFunction, false);
-
-        showInheritedLabel.appendChild(showInheritedInput);
-        showInheritedLabel.appendChild(document.createTextNode(WebInspector.UIString("Show inherited")));
-        this.subtitleElement.appendChild(showInheritedLabel);
-    } else {
-        if (!subtitle) {
-            if (this.styleRule.parentStyleSheet && this.styleRule.parentStyleSheet.href) {
-                var url = this.styleRule.parentStyleSheet.href;
-                subtitle = WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));
-                this.subtitleElement.addStyleClass("file");
-            } else if (isUserAgent)
-                subtitle = WebInspector.UIString("user agent stylesheet");
-            else if (isUser)
-                subtitle = WebInspector.UIString("user stylesheet");
-            else if (isViaInspector)
-                subtitle = WebInspector.UIString("via inspector");
-            else
-                subtitle = WebInspector.UIString("inline stylesheet");
-        }
-
-        this.subtitle = subtitle;
-    }
-
-    this.identifier = styleRule.selectorText;
-    if (this.subtitle)
-        this.identifier += ":" + this.subtitleElement.textContent;    
-}
-
-WebInspector.StylePropertiesSection.prototype = {
-    get usedProperties()
-    {
-        return this._usedProperties || {};
-    },
-
-    set usedProperties(x)
-    {
-        this._usedProperties = x;
-        this.update();
-    },
-
-    expand: function(dontRememberState)
-    {
-        WebInspector.PropertiesSection.prototype.expand.call(this);
-        if (dontRememberState)
-            return;
-
-        if (!Preferences.styleRulesExpandedState)
-            Preferences.styleRulesExpandedState = {};
-        Preferences.styleRulesExpandedState[this.identifier] = true;
-    },
-
-    collapse: function(dontRememberState)
-    {
-        WebInspector.PropertiesSection.prototype.collapse.call(this);
-        if (dontRememberState)
-            return;
-
-        if (!Preferences.styleRulesExpandedState)
-            Preferences.styleRulesExpandedState = {};
-        Preferences.styleRulesExpandedState[this.identifier] = false;
-    },
-
-    isPropertyInherited: function(property)
-    {
-        if (!this.computedStyle || !this._usedProperties || this.noAffect)
-            return false;
-        // These properties should always show for Computed Style.
-        var alwaysShowComputedProperties = { "display": true, "height": true, "width": true };
-        return !(property in this.usedProperties) && !(property in alwaysShowComputedProperties) && !(property in this.disabledComputedProperties);
-    },
-
-    isPropertyOverloaded: function(property, shorthand)
-    {
-        if (this.computedStyle || !this._usedProperties || this.noAffect)
-            return false;
-
-        var used = (property in this.usedProperties);
-        if (used || !shorthand)
-            return !used;
-
-        // Find out if any of the individual longhand properties of the shorthand
-        // are used, if none are then the shorthand is overloaded too.
-        var longhandProperties = this.styleRule.style.getLonghandProperties(property);
-        for (var j = 0; j < longhandProperties.length; ++j) {
-            var individualProperty = longhandProperties[j];
-            if (individualProperty in this.usedProperties)
-                return false;
-        }
-
-        return true;
-    },
-
-    isInspectorStylesheet: function()
-    {
-        return (this.styleRule.parentStyleSheet === WebInspector.panels.elements.stylesheet);
-    },
-
-    update: function(full)
-    {
-        if (full || this.computedStyle) {
-            this.propertiesTreeOutline.removeChildren();
-            this.populated = false;
-        } else {
-            var child = this.propertiesTreeOutline.children[0];
-            while (child) {
-                child.overloaded = this.isPropertyOverloaded(child.name, child.shorthand);
-                child = child.traverseNextTreeElement(false, null, true);
-            }
-        }
-
-        if (this._afterUpdate) {
-            this._afterUpdate(this);
-            delete this._afterUpdate;
-        }
-    },
-
-    onpopulate: function()
-    {
-        var style = this.styleRule.style;
-
-        var foundShorthands = {};
-        var uniqueProperties = style.uniqueStyleProperties;
-        var disabledProperties = style.__disabledPropertyValues || {};
-
-        for (var name in disabledProperties)
-            uniqueProperties.push(name);
-
-        uniqueProperties.sort();
-
-        for (var i = 0; i < uniqueProperties.length; ++i) {
-            var name = uniqueProperties[i];
-            var disabled = name in disabledProperties;
-            if (!disabled && this.disabledComputedProperties && !(name in this.usedProperties) && name in this.disabledComputedProperties)
-                disabled = true;
-
-            var shorthand = !disabled ? style.getPropertyShorthand(name) : null;
-
-            if (shorthand && shorthand in foundShorthands)
-                continue;
-
-            if (shorthand) {
-                foundShorthands[shorthand] = true;
-                name = shorthand;
-            }
-
-            var isShorthand = (shorthand ? true : false);
-            var inherited = this.isPropertyInherited(name);
-            var overloaded = this.isPropertyOverloaded(name, isShorthand);
-
-            var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, name, isShorthand, inherited, overloaded, disabled);
-            this.propertiesTreeOutline.appendChild(item);
-        }
-    },
-
-    findTreeElementWithName: function(name)
-    {
-        var treeElement = this.propertiesTreeOutline.children[0];
-        while (treeElement) {
-            if (treeElement.name === name)
-                return treeElement;
-            treeElement = treeElement.traverseNextTreeElement(true, null, true);
-        }
-        return null;
-    },
-
-    addNewBlankProperty: function()
-    {
-        var item = new WebInspector.StylePropertyTreeElement(this.styleRule, this.styleRule.style, "", false, false, false, false);
-        this.propertiesTreeOutline.appendChild(item);
-        item.listItemElement.textContent = "";
-        item._newProperty = true;
-        return item;
-    },
-
-    _clickSelector: function(event)
-    {
-        event.stopPropagation();
-
-        // Don't search "Computed Styles", "Style Attribute", or Mapped Attributes.
-        if (this.computedStyle || !this.rule || this.rule.isUser)
-            return;
-
-        var searchElement = document.getElementById("search");
-        searchElement.value = this.styleRule.selectorText;
-        WebInspector.performSearch({ target: searchElement });
-    },
-
-    _dblclickEmptySpace: function(event)
-    {
-        this.expand();
-        this.addNewBlankProperty().startEditing();
-    },
-
-    _dblclickSelector: function(event)
-    {
-        if (!this.editable)
-            return;
-
-        if (!this.rule && this.propertiesTreeOutline.children.length === 0) {
-            this.expand();
-            this.addNewBlankProperty().startEditing();
-            return;
-        }
-
-        if (!this.rule)
-            return;
-
-        this.startEditingSelector();
-        event.stopPropagation();
-    },
-
-    startEditingSelector: function()
-    {
-        var element = this.titleElement;
-        if (WebInspector.isBeingEdited(element))
-            return;
-
-        WebInspector.startEditing(this.titleElement, this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this), null);
-        window.getSelection().setBaseAndExtent(element, 0, element, 1);
-    },
-
-    editingSelectorCommitted: function(element, newContent, oldContent, context, moveDirection)
-    {
-        function moveToNextIfNeeded() {
-            if (!moveDirection || moveDirection !== "forward")
-                return;
-
-            this.expand();
-            if (this.propertiesTreeOutline.children.length === 0)
-                this.addNewBlankProperty().startEditing();
-            else {
-                var item = this.propertiesTreeOutline.children[0]
-                item.startEditing(item.valueElement);
-            }
-        }
-
-        if (newContent === oldContent)
-            return moveToNextIfNeeded.call(this);
-
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // Invalid Syntax for a Selector
-                moveToNextIfNeeded.call(self);
-                return;
-            }
-
-            var newRulePayload = result[0];
-            var doesAffectSelectedNode = result[1];
-            if (!doesAffectSelectedNode) {
-                self.noAffect = true;
-                self.element.addStyleClass("no-affect");
-            } else {
-                delete self.noAffect;
-                self.element.removeStyleClass("no-affect");
-            }
-
-            var newRule = WebInspector.CSSStyleDeclaration.parseRule(newRulePayload);
-            self.rule = newRule;
-            self.styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, parentStyleSheet: newRule.parentStyleSheet, rule: newRule };
-
-            var oldIdentifier = this.identifier;
-            self.identifier = newRule.selectorText + ":" + self.subtitleElement.textContent;
-
-            self.pane.update();
-
-            WebInspector.panels.elements.renameSelector(oldIdentifier, this.identifier, oldContent, newContent);
-
-            moveToNextIfNeeded.call(self);
-        }
-
-        InjectedScriptAccess.applyStyleRuleText(this.rule.id, newContent, this.pane.node.id, callback);
-    },
-
-    editingSelectorCancelled: function()
-    {
-        // Do nothing, this is overridden by BlankStylePropertiesSection.
-    }
-}
-
-WebInspector.StylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
-
-WebInspector.BlankStylePropertiesSection = function(defaultSelectorText)
-{
-    WebInspector.StylePropertiesSection.call(this, {selectorText: defaultSelectorText, rule: {isViaInspector: true}}, "", false, {}, false);
-
-    this.element.addStyleClass("blank-section");
-}
-
-WebInspector.BlankStylePropertiesSection.prototype = {
-    expand: function()
-    {
-        // Do nothing, blank sections are not expandable.
-    },
-
-    editingSelectorCommitted: function(element, newContent, oldContent, context)
-    {
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // Invalid Syntax for a Selector
-                self.editingSelectorCancelled();
-                return;
-            }
-
-            var rule = result[0];
-            var doesSelectorAffectSelectedNode = result[1];
-
-            var styleRule = WebInspector.CSSStyleDeclaration.parseRule(rule);
-            styleRule.rule = rule;
-
-            self.makeNormal(styleRule);
-
-            if (!doesSelectorAffectSelectedNode) {
-                self.noAffect = true;
-                self.element.addStyleClass("no-affect");
-            }
-
-            self.subtitleElement.textContent = WebInspector.UIString("via inspector");
-            self.expand();
-
-            self.addNewBlankProperty().startEditing();
-        }
-
-        InjectedScriptAccess.addStyleSelector(newContent, this.pane.node.id, callback);
-    },
-
-    editingSelectorCancelled: function()
-    {
-        this.pane.removeSection(this);
-    },
-
-    makeNormal: function(styleRule)
-    {
-        this.element.removeStyleClass("blank-section");
-
-        this.styleRule = styleRule;
-        this.rule = styleRule.rule;
-        this.computedStyle = false;
-        this.editable = true;
-        this.identifier = styleRule.selectorText + ":via inspector";
-
-        this.__proto__ = WebInspector.StylePropertiesSection.prototype;
-    }
-}
-
-WebInspector.BlankStylePropertiesSection.prototype.__proto__ = WebInspector.StylePropertiesSection.prototype;
-
-WebInspector.StylePropertyTreeElement = function(styleRule, style, name, shorthand, inherited, overloaded, disabled)
-{
-    this._styleRule = styleRule;
-    this.style = style;
-    this.name = name;
-    this.shorthand = shorthand;
-    this._inherited = inherited;
-    this._overloaded = overloaded;
-    this._disabled = disabled;
-
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, shorthand);
-}
-
-WebInspector.StylePropertyTreeElement.prototype = {
-    get inherited()
-    {
-        return this._inherited;
-    },
-
-    set inherited(x)
-    {
-        if (x === this._inherited)
-            return;
-        this._inherited = x;
-        this.updateState();
-    },
-
-    get overloaded()
-    {
-        return this._overloaded;
-    },
-
-    set overloaded(x)
-    {
-        if (x === this._overloaded)
-            return;
-        this._overloaded = x;
-        this.updateState();
-    },
-
-    get disabled()
-    {
-        return this._disabled;
-    },
-
-    set disabled(x)
-    {
-        if (x === this._disabled)
-            return;
-        this._disabled = x;
-        this.updateState();
-    },
-
-    get priority()
-    {
-        if (this.disabled && this.style.__disabledPropertyPriorities && this.name in this.style.__disabledPropertyPriorities)
-            return this.style.__disabledPropertyPriorities[this.name];
-        return (this.shorthand ? this.style.getShorthandPriority(this.name) : this.style.getPropertyPriority(this.name));
-    },
-
-    get value()
-    {
-        if (this.disabled && this.style.__disabledPropertyValues && this.name in this.style.__disabledPropertyValues)
-            return this.style.__disabledPropertyValues[this.name];
-        return (this.shorthand ? this.style.getShorthandValue(this.name) : this.style.getPropertyValue(this.name));
-    },
-
-    onattach: function()
-    {
-        this.updateTitle();
-    },
-
-    updateTitle: function()
-    {
-        var priority = this.priority;
-        var value = this.value;
-
-        if (priority && !priority.length)
-            delete priority;
-        if (priority)
-            priority = "!" + priority;
-
-        this.updateState();
-
-        var enabledCheckboxElement = document.createElement("input");
-        enabledCheckboxElement.className = "enabled-button";
-        enabledCheckboxElement.type = "checkbox";
-        enabledCheckboxElement.checked = !this.disabled;
-        enabledCheckboxElement.addEventListener("change", this.toggleEnabled.bind(this), false);
-
-        var nameElement = document.createElement("span");
-        nameElement.className = "name";
-        nameElement.textContent = this.name;
-        this.nameElement = nameElement;
-
-        var valueElement = document.createElement("span");
-        valueElement.className = "value";
-        this.valueElement = valueElement;
-
-        if (value) {
-            function processValue(regex, processor, nextProcessor, valueText)
-            {
-                var container = document.createDocumentFragment();
-
-                var items = valueText.replace(regex, "\0$1\0").split("\0");
-                for (var i = 0; i < items.length; ++i) {
-                    if ((i % 2) === 0) {
-                        if (nextProcessor)
-                            container.appendChild(nextProcessor(items[i]));
-                        else
-                            container.appendChild(document.createTextNode(items[i]));
-                    } else {
-                        var processedNode = processor(items[i]);
-                        if (processedNode)
-                            container.appendChild(processedNode);
-                    }
-                }
-
-                return container;
-            }
-
-            function linkifyURL(url)
-            {
-                var container = document.createDocumentFragment();
-                container.appendChild(document.createTextNode("url("));
-                container.appendChild(WebInspector.linkifyURLAsNode(url, url, null, (url in WebInspector.resourceURLMap)));
-                container.appendChild(document.createTextNode(")"));
-                return container;
-            }
-
-            function processColor(text)
-            {
-                try {
-                    var color = new WebInspector.Color(text);
-                } catch (e) {
-                    return document.createTextNode(text);
-                }
-
-                var swatchElement = document.createElement("span");
-                swatchElement.title = WebInspector.UIString("Click to change color format");
-                swatchElement.className = "swatch";
-                swatchElement.style.setProperty("background-color", text);
-
-                swatchElement.addEventListener("click", changeColorDisplay, false);
-                swatchElement.addEventListener("dblclick", function(event) { event.stopPropagation() }, false);
-
-                var format;
-                if (Preferences.showColorNicknames && color.nickname)
-                    format = "nickname";
-                else if (WebInspector.settings.colorFormat === "rgb")
-                    format = (color.simple ? "rgb" : "rgba");
-                else if (WebInspector.settings.colorFormat === "hsl")
-                    format = (color.simple ? "hsl" : "hsla");
-                else if (color.simple)
-                    format = (color.hasShortHex() ? "shorthex" : "hex");
-                else
-                    format = "rgba";
-
-                var colorValueElement = document.createElement("span");
-                colorValueElement.textContent = color.toString(format);
-
-                function changeColorDisplay(event)
-                {
-                    switch (format) {
-                        case "rgb":
-                            format = "hsl";
-                            break;
-
-                        case "shorthex":
-                            format = "hex";
-                            break;
-
-                        case "hex":
-                            format = "rgb";
-                            break;
-
-                        case "nickname":
-                            if (color.simple) {
-                                if (color.hasShortHex())
-                                    format = "shorthex";
-                                else
-                                    format = "hex";
-                                break;
-                            }
-
-                            format = "rgba";
-                            break;
-
-                        case "hsl":
-                            if (color.nickname)
-                                format = "nickname";
-                            else if (color.hasShortHex())
-                                format = "shorthex";
-                            else
-                                format = "hex";
-                            break;
-
-                        case "rgba":
-                            format = "hsla";
-                            break;
-
-                        case "hsla":
-                            if (color.nickname)
-                                format = "nickname";
-                            else
-                                format = "rgba";
-                            break;
-                    }
-
-                    colorValueElement.textContent = color.toString(format);
-                }
-
-                var container = document.createDocumentFragment();
-                container.appendChild(swatchElement);
-                container.appendChild(colorValueElement);
-                return container;
-            }
-
-            var colorRegex = /((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b)/g;
-            var colorProcessor = processValue.bind(window, colorRegex, processColor, null);
-
-            valueElement.appendChild(processValue(/url\(([^)]+)\)/g, linkifyURL, colorProcessor, value));
-        }
-
-        if (priority) {
-            var priorityElement = document.createElement("span");
-            priorityElement.className = "priority";
-            priorityElement.textContent = priority;
-        }
-
-        this.listItemElement.removeChildren();
-
-        // Append the checkbox for root elements of an editable section.
-        if (this.treeOutline.section && this.treeOutline.section.editable && this.parent.root)
-            this.listItemElement.appendChild(enabledCheckboxElement);
-        this.listItemElement.appendChild(nameElement);
-        this.listItemElement.appendChild(document.createTextNode(": "));
-        this.listItemElement.appendChild(valueElement);
-
-        if (priorityElement) {
-            this.listItemElement.appendChild(document.createTextNode(" "));
-            this.listItemElement.appendChild(priorityElement);
-        }
-
-        this.listItemElement.appendChild(document.createTextNode(";"));
-
-        this.tooltip = this.name + ": " + valueElement.textContent + (priority ? " " + priority : "");
-    },
-
-    updateAll: function(updateAllRules)
-    {
-        if (updateAllRules && this.treeOutline.section && this.treeOutline.section.pane)
-            this.treeOutline.section.pane.update(null, this.treeOutline.section);
-        else if (this.treeOutline.section)
-            this.treeOutline.section.update(true);
-        else
-            this.updateTitle(); // FIXME: this will not show new properties. But we don't hit his case yet.
-    },
-
-    toggleEnabled: function(event)
-    {
-        var disabled = !event.target.checked;
-
-        var self = this;
-        function callback(newPayload)
-        {
-            if (!newPayload)
-                return;
-
-            self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
-            self._styleRule.style = self.style;
-
-            // Set the disabled property here, since the code above replies on it not changing
-            // until after the value and priority are retrieved.
-            self.disabled = disabled;
-
-            if (self.treeOutline.section && self.treeOutline.section.pane)
-                self.treeOutline.section.pane.dispatchEventToListeners("style property toggled");
-
-            self.updateAll(true);
-        }
-
-        InjectedScriptAccess.toggleStyleEnabled(this.style.id, this.name, disabled, callback);
-    },
-
-    updateState: function()
-    {
-        if (!this.listItemElement)
-            return;
-
-        if (this.style.isPropertyImplicit(this.name) || this.value === "initial")
-            this.listItemElement.addStyleClass("implicit");
-        else
-            this.listItemElement.removeStyleClass("implicit");
-
-        if (this.inherited)
-            this.listItemElement.addStyleClass("inherited");
-        else
-            this.listItemElement.removeStyleClass("inherited");
-
-        if (this.overloaded)
-            this.listItemElement.addStyleClass("overloaded");
-        else
-            this.listItemElement.removeStyleClass("overloaded");
-
-        if (this.disabled)
-            this.listItemElement.addStyleClass("disabled");
-        else
-            this.listItemElement.removeStyleClass("disabled");
-    },
-
-    onpopulate: function()
-    {
-        // Only populate once and if this property is a shorthand.
-        if (this.children.length || !this.shorthand)
-            return;
-
-        var longhandProperties = this.style.getLonghandProperties(this.name);
-        for (var i = 0; i < longhandProperties.length; ++i) {
-            var name = longhandProperties[i];
-
-            if (this.treeOutline.section) {
-                var inherited = this.treeOutline.section.isPropertyInherited(name);
-                var overloaded = this.treeOutline.section.isPropertyOverloaded(name);
-            }
-
-            var item = new WebInspector.StylePropertyTreeElement(this._styleRule, this.style, name, false, inherited, overloaded);
-            this.appendChild(item);
-        }
-    },
-
-    ondblclick: function(event)
-    {
-        this.startEditing(event.target);
-        event.stopPropagation();
-    },
-
-    startEditing: function(selectElement)
-    {
-        // FIXME: we don't allow editing of longhand properties under a shorthand right now.
-        if (this.parent.shorthand)
-            return;
-
-        if (WebInspector.isBeingEdited(this.listItemElement) || (this.treeOutline.section && !this.treeOutline.section.editable))
-            return;
-
-        var context = { expanded: this.expanded, hasChildren: this.hasChildren };
-
-        // Lie about our children to prevent expanding on double click and to collapse shorthands.
-        this.hasChildren = false;
-
-        if (!selectElement)
-            selectElement = this.listItemElement;
-
-        this.listItemElement.handleKeyEvent = this.editingKeyDown.bind(this);
-
-        WebInspector.startEditing(this.listItemElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
-        window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1);
-    },
-
-    editingKeyDown: function(event)
-    {
-        var arrowKeyPressed = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down");
-        var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");
-        if (!arrowKeyPressed && !pageKeyPressed)
-            return;
-
-        var selection = window.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var selectionRange = selection.getRangeAt(0);
-        if (selectionRange.commonAncestorContainer !== this.listItemElement && !selectionRange.commonAncestorContainer.isDescendant(this.listItemElement))
-            return;
-
-        const styleValueDelimeters = " \t\n\"':;,/()";
-        var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.listItemElement);
-        var wordString = wordRange.toString();
-        var replacementString = wordString;
-
-        var matches = /(.*?)(-?\d+(?:\.\d+)?)(.*)/.exec(wordString);
-        if (matches && matches.length) {
-            var prefix = matches[1];
-            var number = parseFloat(matches[2]);
-            var suffix = matches[3];
-
-            // If the number is near zero or the number is one and the direction will take it near zero.
-            var numberNearZero = (number < 1 && number > -1);
-            if (number === 1 && event.keyIdentifier === "Down")
-                numberNearZero = true;
-            else if (number === -1 && event.keyIdentifier === "Up")
-                numberNearZero = true;
-
-            if (numberNearZero && event.altKey && arrowKeyPressed) {
-                if (event.keyIdentifier === "Down")
-                    number = Math.ceil(number - 1);
-                else
-                    number = Math.floor(number + 1);
-            } else {
-                // Jump by 10 when shift is down or jump by 0.1 when near zero or Alt/Option is down.
-                // Also jump by 10 for page up and down, or by 100 if shift is held with a page key.
-                var changeAmount = 1;
-                if (event.shiftKey && pageKeyPressed)
-                    changeAmount = 100;
-                else if (event.shiftKey || pageKeyPressed)
-                    changeAmount = 10;
-                else if (event.altKey || numberNearZero)
-                    changeAmount = 0.1;
-
-                if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")
-                    changeAmount *= -1;
-
-                // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
-                // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
-                number = Number((number + changeAmount).toFixed(6));
-            }
-
-            replacementString = prefix + number + suffix;
-        } else {
-            // FIXME: this should cycle through known keywords for the current property name.
-            return;
-        }
-
-        var replacementTextNode = document.createTextNode(replacementString);
-
-        wordRange.deleteContents();
-        wordRange.insertNode(replacementTextNode);
-
-        var finalSelectionRange = document.createRange();
-        finalSelectionRange.setStart(replacementTextNode, 0);
-        finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
-
-        selection.removeAllRanges();
-        selection.addRange(finalSelectionRange);
-
-        event.preventDefault();
-        event.handled = true;
-
-        if (!this.originalCSSText) {
-            // Remember the rule's original CSS text, so it can be restored
-            // if the editing is canceled and before each apply.
-            this.originalCSSText = this.style.styleTextWithShorthands();
-        } else {
-            // Restore the original CSS text before applying user changes. This is needed to prevent
-            // new properties from sticking around if the user adds one, then removes it.
-            InjectedScriptAccess.setStyleText(this.style.id, this.originalCSSText);
-        }
-
-        this.applyStyleText(this.listItemElement.textContent);
-    },
-
-    editingEnded: function(context)
-    {
-        this.hasChildren = context.hasChildren;
-        if (context.expanded)
-            this.expand();
-        delete this.listItemElement.handleKeyEvent;
-        delete this.originalCSSText;
-    },
-
-    editingCancelled: function(element, context)
-    {
-        if (this._newProperty)
-            this.treeOutline.removeChild(this);
-        else if (this.originalCSSText) {
-            InjectedScriptAccess.setStyleText(this.style.id, this.originalCSSText);
-
-            if (this.treeOutline.section && this.treeOutline.section.pane)
-                this.treeOutline.section.pane.dispatchEventToListeners("style edited");
-
-            this.updateAll();
-        } else
-            this.updateTitle();
-
-        this.editingEnded(context);
-    },
-
-    editingCommitted: function(element, userInput, previousContent, context, moveDirection)
-    {
-        this.editingEnded(context);
-
-        // Determine where to move to before making changes
-        var newProperty, moveToPropertyName, moveToSelector;
-        var moveTo = (moveDirection === "forward" ? this.nextSibling : this.previousSibling);
-        if (moveTo)
-            moveToPropertyName = moveTo.name;
-        else if (moveDirection === "forward")
-            newProperty = true;
-        else if (moveDirection === "backward" && this.treeOutline.section.rule)
-            moveToSelector = true;
-
-        // Make the Changes and trigger the moveToNextCallback after updating
-        var blankInput = /^\s*$/.test(userInput);
-        if (userInput !== previousContent || (this._newProperty && blankInput)) { // only if something changed, or adding a new style and it was blank
-            this.treeOutline.section._afterUpdate = moveToNextCallback.bind(this, this._newProperty, !blankInput);
-            this.applyStyleText(userInput, true);
-        } else
-            moveToNextCallback(this._newProperty, false, this.treeOutline.section, false);
-
-        // The Callback to start editing the next property
-        function moveToNextCallback(alreadyNew, valueChanged, section)
-        {
-            if (!moveDirection)
-                return;
-
-            // User just tabbed through without changes
-            if (moveTo && moveTo.parent) {
-                moveTo.startEditing(moveTo.valueElement);
-                return;
-            }
-
-            // User has made a change then tabbed, wiping all the original treeElements,
-            // recalculate the new treeElement for the same property we were going to edit next
-            if (moveTo && !moveTo.parent) {
-                var treeElement = section.findTreeElementWithName(moveToPropertyName);
-                if (treeElement)
-                    treeElement.startEditing(treeElement.valueElement);
-                return;
-            }
-
-            // Create a new attribute in this section
-            if (newProperty) {
-                if (alreadyNew && !valueChanged)
-                    return;
-
-                var item = section.addNewBlankProperty();
-                item.startEditing();
-                return;
-            }
-
-            if (moveToSelector)
-                section.startEditingSelector();
-        }
-    },
-
-    applyStyleText: function(styleText, updateInterface)
-    {
-        var section = this.treeOutline.section;
-        var elementsPanel = WebInspector.panels.elements;
-        var styleTextLength = styleText.trimWhitespace().length;
-        if (!styleTextLength && updateInterface) {
-            if (this._newProperty) {
-                // The user deleted everything, so remove the tree element and update.
-                this.parent.removeChild(this);
-                return;
-            } else {
-                delete section._afterUpdate;
-            }
-        }
-
-        var self = this;
-        function callback(result)
-        {
-            if (!result) {
-                // The user typed something, but it didn't parse. Just abort and restore
-                // the original title for this property.  If this was a new attribute and
-                // we couldn't parse, then just remove it.
-                if (self._newProperty) {
-                    self.parent.removeChild(self);
-                    return;
-                }
-                if (updateInterface)
-                    self.updateTitle();
-                return;
-            }
-
-            var newPayload = result[0];
-            var changedProperties = result[1];
-            elementsPanel.removeStyleChange(section.identifier, self.style, self.name);
-
-            if (!styleTextLength) {
-                // Do remove ourselves from UI when the property removal is confirmed.
-                self.parent.removeChild(self);
-            } else {
-                self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
-                for (var i = 0; i < changedProperties.length; ++i)
-                    elementsPanel.addStyleChange(section.identifier, self.style, changedProperties[i]);
-                self._styleRule.style = self.style;
-            }
-
-            if (section && section.pane)
-                section.pane.dispatchEventToListeners("style edited");
-
-            if (updateInterface)
-                self.updateAll(true);
-
-            if (!section.rule)
-                WebInspector.panels.elements.treeOutline.update();
-        }
-
-        InjectedScriptAccess.applyStyleText(this.style.id, styleText.trimWhitespace(), this.name, callback);
-    }
-}
-
-WebInspector.StylePropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-/* PanelEnablerView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.PanelEnablerView = function(identifier, headingText, disclaimerText, buttonTitle)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("panel-enabler-view");
-    this.element.addStyleClass(identifier);
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.className = "panel-enabler-view-content";
-    this.element.appendChild(this.contentElement);
-
-    this.imageElement = document.createElement("img");
-    this.contentElement.appendChild(this.imageElement);
-
-    this.choicesForm = document.createElement("form");
-    this.contentElement.appendChild(this.choicesForm);
-
-    this.headerElement = document.createElement("h1");
-    this.headerElement.textContent = headingText;
-    this.choicesForm.appendChild(this.headerElement);
-
-    var self = this;
-    function enableOption(text, checked) {
-        var label = document.createElement("label");
-        var option = document.createElement("input");
-        option.type = "radio";
-        option.name = "enable-option";
-        if (checked)
-            option.checked = true;
-        label.appendChild(option);
-        label.appendChild(document.createTextNode(text));
-        self.choicesForm.appendChild(label);
-        return option;
-    };
-
-    this.enabledForSession = enableOption(WebInspector.UIString("Only enable for this session"), true);
-    this.enabledAlways = enableOption(WebInspector.UIString("Always enable"));
-
-    this.disclaimerElement = document.createElement("div");
-    this.disclaimerElement.className = "panel-enabler-disclaimer";
-    this.disclaimerElement.textContent = disclaimerText;
-    this.choicesForm.appendChild(this.disclaimerElement);
-
-    this.enableButton = document.createElement("button");
-    this.enableButton.setAttribute("type", "button");
-    this.enableButton.textContent = buttonTitle;
-    this.enableButton.addEventListener("click", this._enableButtonCicked.bind(this), false);
-    this.choicesForm.appendChild(this.enableButton);
-
-    window.addEventListener("resize", this._windowResized.bind(this), true);
-}
-
-WebInspector.PanelEnablerView.prototype = {
-    _enableButtonCicked: function()
-    {
-        this.dispatchEventToListeners("enable clicked");
-    },
-
-    _windowResized: function()
-    {
-        this.imageElement.removeStyleClass("hidden");
-
-        if (this.element.offsetWidth < (this.choicesForm.offsetWidth + this.imageElement.offsetWidth))
-            this.imageElement.addStyleClass("hidden");
-    },
-
-    get alwaysEnabled() {
-        return this.enabledAlways.checked;
-    }
-}
-
-WebInspector.PanelEnablerView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* StatusBarButton.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StatusBarButton = function(title, className)
-{
-    this.element = document.createElement("button");
-    this.element.className = className + " status-bar-item";
-    this.element.addEventListener("click", this._clicked.bind(this), false);
-
-    this.glyph = document.createElement("div");
-    this.glyph.className = "glyph";
-    this.element.appendChild(this.glyph);
-
-    this.glyphShadow = document.createElement("div");
-    this.glyphShadow.className = "glyph shadow";
-    this.element.appendChild(this.glyphShadow);
-
-    this.title = title;
-    this.disabled = false;
-    this._toggled = false;
-    this._visible = true;
-}
-
-WebInspector.StatusBarButton.prototype = {
-    _clicked: function()
-    {
-        this.dispatchEventToListeners("click");
-    },
-
-    get disabled()
-    {
-        return this._disabled;
-    },
-
-    set disabled(x)
-    {
-        if (this._disabled === x)
-            return;
-        this._disabled = x;
-        this.element.disabled = x;
-    },
-
-    get title()
-    {
-        return this._title;
-    },
-
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-        this.element.title = x;
-    },
-
-    get toggled()
-    {
-        return this._toggled;
-    },
-
-    set toggled(x)
-    {
-        if (this._toggled === x)
-            return;
-
-        if (x)
-            this.element.addStyleClass("toggled-on");
-        else
-            this.element.removeStyleClass("toggled-on");
-        this._toggled = x;
-    },
-
-    get visible()
-    {
-        return this._visible;
-    },
-
-    set visible(x)
-    {
-        if (this._visible === x)
-            return;
-
-        if (x)
-            this.element.removeStyleClass("hidden");
-        else
-            this.element.addStyleClass("hidden");
-        this._visible = x;
-    }
-}
-
-WebInspector.StatusBarButton.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SummaryBar.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SummaryBar = function(categories)
-{
-    this.categories = categories;
-
-    this.element = document.createElement("div");
-    this.element.className = "summary-bar";
-
-    this.graphElement = document.createElement("canvas");
-    this.graphElement.setAttribute("width", "450");
-    this.graphElement.setAttribute("height", "38");
-    this.graphElement.className = "summary-graph";
-    this.element.appendChild(this.graphElement);
-
-    this.legendElement = document.createElement("div");
-    this.legendElement.className = "summary-graph-legend";
-    this.element.appendChild(this.legendElement);
-}
-
-WebInspector.SummaryBar.prototype = {
-
-    get calculator() {
-        return this._calculator;
-    },
-
-    set calculator(x) {
-        this._calculator = x;
-    },
-
-    reset: function()
-    {
-        this.legendElement.removeChildren();
-        this._drawSummaryGraph();
-    },
-
-    update: function(data)
-    {
-        var graphInfo = this.calculator.computeSummaryValues(data);
-
-        var fillSegments = [];
-
-        this.legendElement.removeChildren();
-
-        for (var category in this.categories) {
-            var size = graphInfo.categoryValues[category];
-            if (!size)
-                continue;
-
-            var colorString = this.categories[category].color;
-
-            var fillSegment = {color: colorString, value: size};
-            fillSegments.push(fillSegment);
-
-            var legendLabel = this._makeLegendElement(this.categories[category].title, this.calculator.formatValue(size), colorString);
-            this.legendElement.appendChild(legendLabel);
-        }
-
-        if (graphInfo.total) {
-            var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));
-            totalLegendLabel.addStyleClass("total");
-            this.legendElement.appendChild(totalLegendLabel);
-        }
-
-        this._drawSummaryGraph(fillSegments);
-    },
-
-    _drawSwatch: function(canvas, color)
-    {
-        var ctx = canvas.getContext("2d");
-
-        function drawSwatchSquare() {
-            ctx.fillStyle = color;
-            ctx.fillRect(0, 0, 13, 13);
-
-            var gradient = ctx.createLinearGradient(0, 0, 13, 13);
-            gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");
-            gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
-
-            ctx.fillStyle = gradient;
-            ctx.fillRect(0, 0, 13, 13);
-
-            gradient = ctx.createLinearGradient(13, 13, 0, 0);
-            gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");
-            gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
-
-            ctx.fillStyle = gradient;
-            ctx.fillRect(0, 0, 13, 13);
-
-            ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";
-            ctx.strokeRect(0.5, 0.5, 12, 12);
-        }
-
-        ctx.clearRect(0, 0, 13, 24);
-
-        drawSwatchSquare();
-
-        ctx.save();
-
-        ctx.translate(0, 25);
-        ctx.scale(1, -1);
-
-        drawSwatchSquare();
-
-        ctx.restore();
-
-        this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);
-    },
-
-    _drawSummaryGraph: function(segments)
-    {
-        if (!segments || !segments.length) {
-            segments = [{color: "white", value: 1}];
-            this._showingEmptySummaryGraph = true;
-        } else
-            delete this._showingEmptySummaryGraph;
-
-        // Calculate the total of all segments.
-        var total = 0;
-        for (var i = 0; i < segments.length; ++i)
-            total += segments[i].value;
-
-        // Calculate the percentage of each segment, rounded to the nearest percent.
-        var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });
-
-        // Calculate the total percentage.
-        var percentTotal = 0;
-        for (var i = 0; i < percents.length; ++i)
-            percentTotal += percents[i];
-
-        // Make sure our percentage total is not greater-than 100, it can be greater
-        // if we rounded up for a few segments.
-        while (percentTotal > 100) {
-            for (var i = 0; i < percents.length && percentTotal > 100; ++i) {
-                if (percents[i] > 1) {
-                    --percents[i];
-                    --percentTotal;
-                }
-            }
-        }
-
-        // Make sure our percentage total is not less-than 100, it can be less
-        // if we rounded down for a few segments.
-        while (percentTotal < 100) {
-            for (var i = 0; i < percents.length && percentTotal < 100; ++i) {
-                ++percents[i];
-                ++percentTotal;
-            }
-        }
-
-        var ctx = this.graphElement.getContext("2d");
-
-        var x = 0;
-        var y = 0;
-        var w = 450;
-        var h = 19;
-        var r = (h / 2);
-
-        function drawPillShadow()
-        {
-            // This draws a line with a shadow that is offset away from the line. The line is stroked
-            // twice with different X shadow offsets to give more feathered edges. Later we erase the
-            // line with destination-out 100% transparent black, leaving only the shadow. This only
-            // works if nothing has been drawn into the canvas yet.
-
-            ctx.beginPath();
-            ctx.moveTo(x + 4, y + h - 3 - 0.5);
-            ctx.lineTo(x + w - 4, y + h - 3 - 0.5);
-            ctx.closePath();
-
-            ctx.save();
-
-            ctx.shadowBlur = 2;
-            ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
-            ctx.shadowOffsetX = 3;
-            ctx.shadowOffsetY = 5;
-
-            ctx.strokeStyle = "white";
-            ctx.lineWidth = 1;
-
-            ctx.stroke();
-
-            ctx.shadowOffsetX = -3;
-
-            ctx.stroke();
-
-            ctx.restore();
-
-            ctx.save();
-
-            ctx.globalCompositeOperation = "destination-out";
-            ctx.strokeStyle = "rgba(0, 0, 0, 1)";
-            ctx.lineWidth = 1;
-
-            ctx.stroke();
-
-            ctx.restore();
-        }
-
-        function drawPill()
-        {
-            // Make a rounded rect path.
-            ctx.beginPath();
-            ctx.moveTo(x, y + r);
-            ctx.lineTo(x, y + h - r);
-            ctx.quadraticCurveTo(x, y + h, x + r, y + h);
-            ctx.lineTo(x + w - r, y + h);
-            ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
-            ctx.lineTo(x + w, y + r);
-            ctx.quadraticCurveTo(x + w, y, x + w - r, y);
-            ctx.lineTo(x + r, y);
-            ctx.quadraticCurveTo(x, y, x, y + r);
-            ctx.closePath();
-
-            // Clip to the rounded rect path.
-            ctx.save();
-            ctx.clip();
-
-            // Fill the segments with the associated color.
-            var previousSegmentsWidth = 0;
-            for (var i = 0; i < segments.length; ++i) {
-                var segmentWidth = Math.round(w * percents[i] / 100);
-                ctx.fillStyle = segments[i].color;
-                ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);
-                previousSegmentsWidth += segmentWidth;
-            }
-
-            // Draw the segment divider lines.
-            ctx.lineWidth = 1;
-            for (var i = 1; i < 20; ++i) {
-                ctx.beginPath();
-                ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);
-                ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);
-                ctx.closePath();
-
-                ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";
-                ctx.stroke();
-
-                ctx.beginPath();
-                ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);
-                ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);
-                ctx.closePath();
-
-                ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";
-                ctx.stroke();
-            }
-
-            // Draw the pill shading.
-            var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));
-            lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");
-            lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");
-            lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
-
-            var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);
-            darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
-            darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");
-            darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");
-
-            ctx.fillStyle = darkGradient;
-            ctx.fillRect(x, y, w, h);
-
-            ctx.fillStyle = lightGradient;
-            ctx.fillRect(x, y, w, h);
-
-            ctx.restore();
-        }
-
-        ctx.clearRect(x, y, w, (h * 2));
-
-        drawPillShadow();
-        drawPill();
-
-        ctx.save();
-
-        ctx.translate(0, (h * 2) + 1);
-        ctx.scale(1, -1);
-
-        drawPill();
-
-        ctx.restore();
-
-        this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);
-    },
-
-    _fadeOutRect: function(ctx, x, y, w, h, a1, a2)
-    {
-        ctx.save();
-
-        var gradient = ctx.createLinearGradient(x, y, x, y + h);
-        gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");
-        gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");
-        gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");
-
-        ctx.globalCompositeOperation = "destination-out";
-
-        ctx.fillStyle = gradient;
-        ctx.fillRect(x, y, w, h);
-
-        ctx.restore();
-    },
-
-    _makeLegendElement: function(label, value, color)
-    {
-        var legendElement = document.createElement("label");
-        legendElement.className = "summary-graph-legend-item";
-
-        if (color) {
-            var swatch = document.createElement("canvas");
-            swatch.className = "summary-graph-legend-swatch";
-            swatch.setAttribute("width", "13");
-            swatch.setAttribute("height", "24");
-
-            legendElement.appendChild(swatch);
-
-            this._drawSwatch(swatch, color);
-        }
-
-        var labelElement = document.createElement("div");
-        labelElement.className = "summary-graph-legend-label";
-        legendElement.appendChild(labelElement);
-
-        var headerElement = document.createElement("div");
-        headerElement.className = "summary-graph-legend-header";
-        headerElement.textContent = label;
-        labelElement.appendChild(headerElement);
-
-        var valueElement = document.createElement("div");
-        valueElement.className = "summary-graph-legend-value";
-        valueElement.textContent = value;
-        labelElement.appendChild(valueElement);
-
-        return legendElement;
-    }
-}
-
-WebInspector.SummaryBar.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* ElementsPanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008 Matt Lilek <[email protected]>
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ElementsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.element.addStyleClass("elements");
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.id = "elements-content";
-    this.contentElement.className = "outline-disclosure source-code";
-
-    this.treeOutline = new WebInspector.ElementsTreeOutline();
-    this.treeOutline.panel = this;
-    this.treeOutline.includeRootDOMNode = false;
-    this.treeOutline.selectEnabled = true;
-
-    this.treeOutline.focusedNodeChanged = function(forceUpdate)
-    {
-        if (this.panel.visible && WebInspector.currentFocusElement !== document.getElementById("search"))
-            WebInspector.currentFocusElement = this.element;
-
-        this.panel.updateBreadcrumb(forceUpdate);
-
-        for (var pane in this.panel.sidebarPanes)
-           this.panel.sidebarPanes[pane].needsUpdate = true;
-
-        this.panel.updateStyles(true);
-        this.panel.updateMetrics();
-        this.panel.updateProperties();
-        this.panel.updateEventListeners();
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.panel.nodeSearchButton.toggled = false;
-        }
-        if (this._focusedDOMNode)
-            InjectedScriptAccess.addInspectedNode(this._focusedDOMNode.id, function() {});
-    };
-
-    this.contentElement.appendChild(this.treeOutline.element);
-
-    this.crumbsElement = document.createElement("div");
-    this.crumbsElement.className = "crumbs";
-    this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false);
-    this.crumbsElement.addEventListener("mouseout", this._mouseMovedOutOfCrumbs.bind(this), false);
-
-    this.sidebarPanes = {};
-    this.sidebarPanes.styles = new WebInspector.StylesSidebarPane();
-    this.sidebarPanes.metrics = new WebInspector.MetricsSidebarPane();
-    this.sidebarPanes.properties = new WebInspector.PropertiesSidebarPane();
-    this.sidebarPanes.eventListeners = new WebInspector.EventListenersSidebarPane();
-
-    this.sidebarPanes.styles.onexpand = this.updateStyles.bind(this);
-    this.sidebarPanes.metrics.onexpand = this.updateMetrics.bind(this);
-    this.sidebarPanes.properties.onexpand = this.updateProperties.bind(this);
-    this.sidebarPanes.eventListeners.onexpand = this.updateEventListeners.bind(this);
-
-    this.sidebarPanes.styles.expanded = true;
-
-    this.sidebarPanes.styles.addEventListener("style edited", this._stylesPaneEdited, this);
-    this.sidebarPanes.styles.addEventListener("style property toggled", this._stylesPaneEdited, this);
-    this.sidebarPanes.metrics.addEventListener("metrics edited", this._metricsPaneEdited, this);
-
-    this.sidebarElement = document.createElement("div");
-    this.sidebarElement.id = "elements-sidebar";
-
-    this.sidebarElement.appendChild(this.sidebarPanes.styles.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.metrics.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.properties.element);
-    this.sidebarElement.appendChild(this.sidebarPanes.eventListeners.element);
-
-    this.sidebarResizeElement = document.createElement("div");
-    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-    this.sidebarResizeElement.addEventListener("mousedown", this.rightSidebarResizerDragStart.bind(this), false);
-
-    this.nodeSearchButton = new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."), "node-search-status-bar-item");
-    this.nodeSearchButton.addEventListener("click", this._nodeSearchButtonClicked.bind(this), false);
-
-    this.searchingForNode = false;
-
-    this.element.appendChild(this.contentElement);
-    this.element.appendChild(this.sidebarElement);
-    this.element.appendChild(this.sidebarResizeElement);
-
-    this._changedStyles = {};
-
-    this.reset();
-}
-
-WebInspector.ElementsPanel.prototype = {
-    toolbarItemClass: "elements",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Elements");
-    },
-
-    get statusBarItems()
-    {
-        return [this.nodeSearchButton.element, this.crumbsElement];
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.treeOutline.element;
-    },
-
-    updateStatusBarItems: function()
-    {
-        this.updateBreadcrumbSizes();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
-        this.updateBreadcrumb();
-        this.treeOutline.updateSelection();
-        if (this.recentlyModifiedNodes.length)
-            this.updateModifiedNodes();
-    },
-
-    hide: function()
-    {
-        WebInspector.Panel.prototype.hide.call(this);
-
-        WebInspector.hoveredDOMNode = null;
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.nodeSearchButton.toggled = false;
-        }
-    },
-
-    resize: function()
-    {
-        this.treeOutline.updateSelection();
-        this.updateBreadcrumbSizes();
-    },
-
-    reset: function()
-    {
-        if (this.focusedDOMNode) {
-            this._selectedPathOnReset = [];
-            var node = this.focusedDOMNode;
-            while ("index" in node) {
-                this._selectedPathOnReset.push(node.nodeName);
-                this._selectedPathOnReset.push(node.index);
-                node = node.parentNode;
-            }
-            this._selectedPathOnReset.reverse();
-        }
-
-        this.rootDOMNode = null;
-        this.focusedDOMNode = null;
-
-        WebInspector.hoveredDOMNode = null;
-
-        if (InspectorBackend.searchingForNode()) {
-            InspectorBackend.toggleNodeSearch();
-            this.nodeSearchButton.toggled = false;
-        }
-
-        this.recentlyModifiedNodes = [];
-
-        delete this.currentQuery;
-        this.searchCanceled();
-    },
-
-    setDocument: function(inspectedRootDocument)
-    {
-        this.reset();
-
-        if (!inspectedRootDocument)
-            return;
-
-        inspectedRootDocument.addEventListener("DOMNodeInserted", this._nodeInserted.bind(this));
-        inspectedRootDocument.addEventListener("DOMNodeRemoved", this._nodeRemoved.bind(this));
-
-        this.treeOutline.suppressSelectHighlight = true;
-        this.rootDOMNode = inspectedRootDocument;
-        this.treeOutline.suppressSelectHighlight = false;
-
-        function selectNode(candidateFocusNode)
-        {
-            if (!candidateFocusNode)
-                candidateFocusNode = inspectedRootDocument.body || inspectedRootDocument.documentElement;
-
-            if (!candidateFocusNode)
-                return;
-
-            this.treeOutline.suppressSelectHighlight = true;
-            this.focusedDOMNode = candidateFocusNode;
-            if (this.treeOutline.selectedTreeElement)
-                this.treeOutline.selectedTreeElement.expand();
-            this.treeOutline.suppressSelectHighlight = false;
-        }
-
-        function selectLastSelectedNode(nodeId)
-        {
-            var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : 0;
-            selectNode.call(this, node);
-        }
-
-        if (this._selectedPathOnReset)
-            InjectedScriptAccess.nodeByPath(this._selectedPathOnReset, selectLastSelectedNode.bind(this));
-        else
-            selectNode.call(this);
-        delete this._selectedPathOnReset;
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var treeElement = this.treeOutline.findTreeElement(this._searchResults[i]);
-                if (treeElement)
-                    treeElement.highlighted = false;
-            }
-        }
-
-        WebInspector.updateSearchMatchesCount(0, this);
-
-        this._currentSearchResultIndex = 0;
-        this._searchResults = [];
-        InjectedScriptAccess.searchCanceled(function() {});
-    },
-
-    performSearch: function(query)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        const whitespaceTrimmedQuery = query.trimWhitespace();
-        if (!whitespaceTrimmedQuery.length)
-            return;
-
-        this._updatedMatchCountOnce = false;
-        this._matchesCountUpdateTimeout = null;
-
-        InjectedScriptAccess.performSearch(whitespaceTrimmedQuery, function() {});
-    },
-
-    _updateMatchesCount: function()
-    {
-        WebInspector.updateSearchMatchesCount(this._searchResults.length, this);
-        this._matchesCountUpdateTimeout = null;
-        this._updatedMatchCountOnce = true;
-    },
-
-    _updateMatchesCountSoon: function()
-    {
-        if (!this._updatedMatchCountOnce)
-            return this._updateMatchesCount();
-        if (this._matchesCountUpdateTimeout)
-            return;
-        // Update the matches count every half-second so it doesn't feel twitchy.
-        this._matchesCountUpdateTimeout = setTimeout(this._updateMatchesCount.bind(this), 500);
-    },
-
-    addNodesToSearchResult: function(nodeIds)
-    {
-        if (!nodeIds)
-            return;
-
-        var nodeIdsArray = nodeIds.split(",");
-        for (var i = 0; i < nodeIdsArray.length; ++i) {
-            var nodeId = nodeIdsArray[i];
-            var node = WebInspector.domAgent.nodeForId(nodeId);
-            if (!node)
-                continue;
-
-            if (!this._searchResults.length) {
-                this._currentSearchResultIndex = 0;
-
-                // Only change the focusedDOMNode if the search was manually performed, because
-                // the search may have been performed programmatically and we wouldn't want to
-                // change the current focusedDOMNode.
-                if (WebInspector.currentFocusElement === document.getElementById("search"))
-                    this.focusedDOMNode = node;
-            }
-
-            this._searchResults.push(node);
-
-            // Highlight the tree element to show it matched the search.
-            // FIXME: highlight the substrings in text nodes and attributes.
-            var treeElement = this.treeOutline.findTreeElement(node);
-            if (treeElement)
-                treeElement.highlighted = true;
-        }
-
-        this._updateMatchesCountSoon();
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this.focusedDOMNode = this._searchResults[this._currentSearchResultIndex];
-    },
-
-    renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)
-    {
-        // TODO: Implement Shifting the oldSelector, and its contents to a newSelector
-    },
-
-    addStyleChange: function(identifier, style, property)
-    {
-        if (!style.parentRule)
-            return;
-
-        var selector = style.parentRule.selectorText;
-        if (!this._changedStyles[identifier])
-            this._changedStyles[identifier] = {};
-
-        if (!this._changedStyles[identifier][selector])
-            this._changedStyles[identifier][selector] = {};
-
-        if (!this._changedStyles[identifier][selector][property])
-            WebInspector.styleChanges += 1;
-
-        this._changedStyles[identifier][selector][property] = style.getPropertyValue(property);
-    },
-
-    removeStyleChange: function(identifier, style, property)
-    {
-        if (!style.parentRule)
-            return;
-
-        var selector = style.parentRule.selectorText;
-        if (!this._changedStyles[identifier] || !this._changedStyles[identifier][selector])
-            return;
-
-        if (this._changedStyles[identifier][selector][property]) {
-            delete this._changedStyles[identifier][selector][property];
-            WebInspector.styleChanges -= 1;
-        }
-    },
-
-    generateStylesheet: function()
-    {
-        if (!WebInspector.styleChanges)
-            return;
-
-        // Merge Down to Just Selectors
-        var mergedSelectors = {};
-        for (var identifier in this._changedStyles) {
-            for (var selector in this._changedStyles[identifier]) {
-                if (!mergedSelectors[selector])
-                    mergedSelectors[selector] = this._changedStyles[identifier][selector];
-                else { // merge on selector
-                    var merge = {};
-                    for (var property in mergedSelectors[selector])
-                        merge[property] = mergedSelectors[selector][property];
-                    for (var property in this._changedStyles[identifier][selector]) {
-                        if (!merge[property])
-                            merge[property] = this._changedStyles[identifier][selector][property];
-                        else { // merge on property within a selector, include comment to notify user
-                            var value1 = merge[property];
-                            var value2 = this._changedStyles[identifier][selector][property];
-
-                            if (value1 === value2)
-                                merge[property] = [value1];
-                            else if (value1 instanceof Array)
-                                merge[property].push(value2);
-                            else
-                                merge[property] = [value1, value2];
-                        }
-                    }
-                    mergedSelectors[selector] = merge;
-                }
-            }
-        }
-
-        var builder = [];
-        builder.push("/**");
-        builder.push(" * Inspector Generated Stylesheet"); // UIString?
-        builder.push(" */\n");
-
-        var indent = "  ";
-        function displayProperty(property, value, comment) {
-            if (comment)
-                return indent + "/* " + property + ": " + value + "; */";
-            else
-                return indent + property + ": " + value + ";";
-        }
-
-        for (var selector in mergedSelectors) {
-            var psuedoStyle = mergedSelectors[selector];
-            var properties = Object.properties(psuedoStyle);
-            if (properties.length) {
-                builder.push(selector + " {");
-                for (var i = 0; i < properties.length; ++i) {
-                    var property = properties[i];
-                    var value = psuedoStyle[property];
-                    if (!(value instanceof Array))
-                        builder.push(displayProperty(property, value));
-                    else {
-                        if (value.length === 1)
-                            builder.push(displayProperty(property, value) + " /* merged from equivalent edits */"); // UIString?
-                        else {                        
-                            builder.push(indent + "/* There was a Conflict... There were Multiple Edits for '" + property + "' */"); // UIString?
-                            for (var j = 0; j < value.length; ++j)
-                                builder.push(displayProperty(property, value, true));
-                        }
-                    }
-                }
-                builder.push("}\n");
-            }
-        }
-
-        WebInspector.showConsole();
-        WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(builder.join("\n")));
-    },
-
-    get rootDOMNode()
-    {
-        return this.treeOutline.rootDOMNode;
-    },
-
-    set rootDOMNode(x)
-    {
-        this.treeOutline.rootDOMNode = x;
-    },
-
-    get focusedDOMNode()
-    {
-        return this.treeOutline.focusedDOMNode;
-    },
-
-    set focusedDOMNode(x)
-    {
-        this.treeOutline.focusedDOMNode = x;
-    },
-
-    _nodeInserted: function(event)
-    {
-        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, inserted: true});
-        if (this.visible)
-            this._updateModifiedNodesSoon();
-    },
-
-    _nodeRemoved: function(event)
-    {
-        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, removed: true});
-        if (this.visible)
-            this._updateModifiedNodesSoon();
-    },
-
-    _updateModifiedNodesSoon: function()
-    {
-        if ("_updateModifiedNodesTimeout" in this)
-            return;
-        this._updateModifiedNodesTimeout = setTimeout(this.updateModifiedNodes.bind(this), 0);
-    },
-
-    updateModifiedNodes: function()
-    {
-        if ("_updateModifiedNodesTimeout" in this) {
-            clearTimeout(this._updateModifiedNodesTimeout);
-            delete this._updateModifiedNodesTimeout;
-        }
-
-        var updatedParentTreeElements = [];
-        var updateBreadcrumbs = false;
-
-        for (var i = 0; i < this.recentlyModifiedNodes.length; ++i) {
-            var replaced = this.recentlyModifiedNodes[i].replaced;
-            var parent = this.recentlyModifiedNodes[i].parent;
-            if (!parent)
-                continue;
-
-            var parentNodeItem = this.treeOutline.findTreeElement(parent);
-            if (parentNodeItem && !parentNodeItem.alreadyUpdatedChildren) {
-                parentNodeItem.updateChildren(replaced);
-                parentNodeItem.alreadyUpdatedChildren = true;
-                updatedParentTreeElements.push(parentNodeItem);
-            }
-
-            if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))
-                updateBreadcrumbs = true;
-        }
-
-        for (var i = 0; i < updatedParentTreeElements.length; ++i)
-            delete updatedParentTreeElements[i].alreadyUpdatedChildren;
-
-        this.recentlyModifiedNodes = [];
-
-        if (updateBreadcrumbs)
-            this.updateBreadcrumb(true);
-    },
-
-    _stylesPaneEdited: function()
-    {
-        this.sidebarPanes.metrics.needsUpdate = true;
-        this.updateMetrics();
-    },
-
-    _metricsPaneEdited: function()
-    {
-        this.sidebarPanes.styles.needsUpdate = true;
-        this.updateStyles(true);
-    },
-
-    _mouseMovedInCrumbs: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");
-
-        WebInspector.hoveredDOMNode = (crumbElement ? crumbElement.representedObject : null);
-
-        if ("_mouseOutOfCrumbsTimeout" in this) {
-            clearTimeout(this._mouseOutOfCrumbsTimeout);
-            delete this._mouseOutOfCrumbsTimeout;
-        }
-    },
-
-    _mouseMovedOutOfCrumbs: function(event)
-    {
-        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
-        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.crumbsElement))
-            return;
-
-        WebInspector.hoveredDOMNode = null;
-
-        this._mouseOutOfCrumbsTimeout = setTimeout(this.updateBreadcrumbSizes.bind(this), 1000);
-    },
-
-    updateBreadcrumb: function(forceUpdate)
-    {
-        if (!this.visible)
-            return;
-
-        var crumbs = this.crumbsElement;
-
-        var handled = false;
-        var foundRoot = false;
-        var crumb = crumbs.firstChild;
-        while (crumb) {
-            if (crumb.representedObject === this.rootDOMNode)
-                foundRoot = true;
-
-            if (foundRoot)
-                crumb.addStyleClass("dimmed");
-            else
-                crumb.removeStyleClass("dimmed");
-
-            if (crumb.representedObject === this.focusedDOMNode) {
-                crumb.addStyleClass("selected");
-                handled = true;
-            } else {
-                crumb.removeStyleClass("selected");
-            }
-
-            crumb = crumb.nextSibling;
-        }
-
-        if (handled && !forceUpdate) {
-            // We don't need to rebuild the crumbs, but we need to adjust sizes
-            // to reflect the new focused or root node.
-            this.updateBreadcrumbSizes();
-            return;
-        }
-
-        crumbs.removeChildren();
-
-        var panel = this;
-
-        function selectCrumbFunction(event)
-        {
-            var crumb = event.currentTarget;
-            if (crumb.hasStyleClass("collapsed")) {
-                // Clicking a collapsed crumb will expose the hidden crumbs.
-                if (crumb === panel.crumbsElement.firstChild) {
-                    // If the focused crumb is the first child, pick the farthest crumb
-                    // that is still hidden. This allows the user to expose every crumb.
-                    var currentCrumb = crumb;
-                    while (currentCrumb) {
-                        var hidden = currentCrumb.hasStyleClass("hidden");
-                        var collapsed = currentCrumb.hasStyleClass("collapsed");
-                        if (!hidden && !collapsed)
-                            break;
-                        crumb = currentCrumb;
-                        currentCrumb = currentCrumb.nextSibling;
-                    }
-                }
-
-                panel.updateBreadcrumbSizes(crumb);
-            } else {
-                // Clicking a dimmed crumb or double clicking (event.detail >= 2)
-                // will change the root node in addition to the focused node.
-                if (event.detail >= 2 || crumb.hasStyleClass("dimmed"))
-                    panel.rootDOMNode = crumb.representedObject.parentNode;
-                panel.focusedDOMNode = crumb.representedObject;
-            }
-
-            event.preventDefault();
-        }
-
-        foundRoot = false;
-        for (var current = this.focusedDOMNode; current; current = current.parentNode) {
-            if (current.nodeType === Node.DOCUMENT_NODE)
-                continue;
-
-            if (current === this.rootDOMNode)
-                foundRoot = true;
-
-            var crumb = document.createElement("span");
-            crumb.className = "crumb";
-            crumb.representedObject = current;
-            crumb.addEventListener("mousedown", selectCrumbFunction, false);
-
-            var crumbTitle;
-            switch (current.nodeType) {
-                case Node.ELEMENT_NODE:
-                    crumbTitle = current.nodeName.toLowerCase();
-
-                    var nameElement = document.createElement("span");
-                    nameElement.textContent = crumbTitle;
-                    crumb.appendChild(nameElement);
-
-                    var idAttribute = current.getAttribute("id");
-                    if (idAttribute) {
-                        var idElement = document.createElement("span");
-                        crumb.appendChild(idElement);
-
-                        var part = "#" + idAttribute;
-                        crumbTitle += part;
-                        idElement.appendChild(document.createTextNode(part));
-
-                        // Mark the name as extra, since the ID is more important.
-                        nameElement.className = "extra";
-                    }
-
-                    var classAttribute = current.getAttribute("class");
-                    if (classAttribute) {
-                        var classes = classAttribute.split(/\s+/);
-                        var foundClasses = {};
-
-                        if (classes.length) {
-                            var classesElement = document.createElement("span");
-                            classesElement.className = "extra";
-                            crumb.appendChild(classesElement);
-
-                            for (var i = 0; i < classes.length; ++i) {
-                                var className = classes[i];
-                                if (className && !(className in foundClasses)) {
-                                    var part = "." + className;
-                                    crumbTitle += part;
-                                    classesElement.appendChild(document.createTextNode(part));
-                                    foundClasses[className] = true;
-                                }
-                            }
-                        }
-                    }
-
-                    break;
-
-                case Node.TEXT_NODE:
-                    if (isNodeWhitespace.call(current))
-                        crumbTitle = WebInspector.UIString("(whitespace)");
-                    else
-                        crumbTitle = WebInspector.UIString("(text)");
-                    break
-
-                case Node.COMMENT_NODE:
-                    crumbTitle = "<!-->";
-                    break;
-
-                case Node.DOCUMENT_TYPE_NODE:
-                    crumbTitle = "<!DOCTYPE>";
-                    break;
-
-                default:
-                    crumbTitle = current.nodeName.toLowerCase();
-            }
-
-            if (!crumb.childNodes.length) {
-                var nameElement = document.createElement("span");
-                nameElement.textContent = crumbTitle;
-                crumb.appendChild(nameElement);
-            }
-
-            crumb.title = crumbTitle;
-
-            if (foundRoot)
-                crumb.addStyleClass("dimmed");
-            if (current === this.focusedDOMNode)
-                crumb.addStyleClass("selected");
-            if (!crumbs.childNodes.length)
-                crumb.addStyleClass("end");
-
-            crumbs.appendChild(crumb);
-        }
-
-        if (crumbs.hasChildNodes())
-            crumbs.lastChild.addStyleClass("start");
-
-        this.updateBreadcrumbSizes();
-    },
-
-    updateBreadcrumbSizes: function(focusedCrumb)
-    {
-        if (!this.visible)
-            return;
-
-        if (document.body.offsetWidth <= 0) {
-            // The stylesheet hasn't loaded yet or the window is closed,
-            // so we can't calculate what is need. Return early.
-            return;
-        }
-
-        var crumbs = this.crumbsElement;
-        if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)
-            return; // No crumbs, do nothing.
-
-        // A Zero index is the right most child crumb in the breadcrumb.
-        var selectedIndex = 0;
-        var focusedIndex = 0;
-        var selectedCrumb;
-
-        var i = 0;
-        var crumb = crumbs.firstChild;
-        while (crumb) {
-            // Find the selected crumb and index. 
-            if (!selectedCrumb && crumb.hasStyleClass("selected")) {
-                selectedCrumb = crumb;
-                selectedIndex = i;
-            }
-
-            // Find the focused crumb index. 
-            if (crumb === focusedCrumb)
-                focusedIndex = i;
-
-            // Remove any styles that affect size before
-            // deciding to shorten any crumbs.
-            if (crumb !== crumbs.lastChild)
-                crumb.removeStyleClass("start");
-            if (crumb !== crumbs.firstChild)
-                crumb.removeStyleClass("end");
-
-            crumb.removeStyleClass("compact");
-            crumb.removeStyleClass("collapsed");
-            crumb.removeStyleClass("hidden");
-
-            crumb = crumb.nextSibling;
-            ++i;
-        }
-
-        // Restore the start and end crumb classes in case they got removed in coalesceCollapsedCrumbs().
-        // The order of the crumbs in the document is opposite of the visual order.
-        crumbs.firstChild.addStyleClass("end");
-        crumbs.lastChild.addStyleClass("start");
-
-        function crumbsAreSmallerThanContainer()
-        {
-            var rightPadding = 20;
-            var errorWarningElement = document.getElementById("error-warning-count");
-            if (!WebInspector.drawer.visible && errorWarningElement)
-                rightPadding += errorWarningElement.offsetWidth;
-            return ((crumbs.totalOffsetLeft + crumbs.offsetWidth + rightPadding) < window.innerWidth);
-        }
-
-        if (crumbsAreSmallerThanContainer())
-            return; // No need to compact the crumbs, they all fit at full size.
-
-        var BothSides = 0;
-        var AncestorSide = -1;
-        var ChildSide = 1;
-
-        function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb)
-        {
-            if (!significantCrumb)
-                significantCrumb = (focusedCrumb || selectedCrumb);
-
-            if (significantCrumb === selectedCrumb)
-                var significantIndex = selectedIndex;
-            else if (significantCrumb === focusedCrumb)
-                var significantIndex = focusedIndex;
-            else {
-                var significantIndex = 0;
-                for (var i = 0; i < crumbs.childNodes.length; ++i) {
-                    if (crumbs.childNodes[i] === significantCrumb) {
-                        significantIndex = i;
-                        break;
-                    }
-                }
-            }
-
-            function shrinkCrumbAtIndex(index)
-            {
-                var shrinkCrumb = crumbs.childNodes[index];
-                if (shrinkCrumb && shrinkCrumb !== significantCrumb)
-                    shrinkingFunction(shrinkCrumb);
-                if (crumbsAreSmallerThanContainer())
-                    return true; // No need to compact the crumbs more.
-                return false;
-            }
-
-            // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs
-            // fit in the container or we run out of crumbs to shrink.
-            if (direction) {
-                // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb.
-                var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1);
-                while (index !== significantIndex) {
-                    if (shrinkCrumbAtIndex(index))
-                        return true;
-                    index += (direction > 0 ? 1 : -1);
-                }
-            } else {
-                // Crumbs are shrunk in order of descending distance from the signifcant crumb,
-                // with a tie going to child crumbs.
-                var startIndex = 0;
-                var endIndex = crumbs.childNodes.length - 1;
-                while (startIndex != significantIndex || endIndex != significantIndex) {
-                    var startDistance = significantIndex - startIndex;
-                    var endDistance = endIndex - significantIndex;
-                    if (startDistance >= endDistance)
-                        var index = startIndex++;
-                    else
-                        var index = endIndex--;
-                    if (shrinkCrumbAtIndex(index))
-                        return true;
-                }
-            }
-
-            // We are not small enough yet, return false so the caller knows.
-            return false;
-        }
-
-        function coalesceCollapsedCrumbs()
-        {
-            var crumb = crumbs.firstChild;
-            var collapsedRun = false;
-            var newStartNeeded = false;
-            var newEndNeeded = false;
-            while (crumb) {
-                var hidden = crumb.hasStyleClass("hidden");
-                if (!hidden) {
-                    var collapsed = crumb.hasStyleClass("collapsed"); 
-                    if (collapsedRun && collapsed) {
-                        crumb.addStyleClass("hidden");
-                        crumb.removeStyleClass("compact");
-                        crumb.removeStyleClass("collapsed");
-
-                        if (crumb.hasStyleClass("start")) {
-                            crumb.removeStyleClass("start");
-                            newStartNeeded = true;
-                        }
-
-                        if (crumb.hasStyleClass("end")) {
-                            crumb.removeStyleClass("end");
-                            newEndNeeded = true;
-                        }
-
-                        continue;
-                    }
-
-                    collapsedRun = collapsed;
-
-                    if (newEndNeeded) {
-                        newEndNeeded = false;
-                        crumb.addStyleClass("end");
-                    }
-                } else
-                    collapsedRun = true;
-                crumb = crumb.nextSibling;
-            }
-
-            if (newStartNeeded) {
-                crumb = crumbs.lastChild;
-                while (crumb) {
-                    if (!crumb.hasStyleClass("hidden")) {
-                        crumb.addStyleClass("start");
-                        break;
-                    }
-                    crumb = crumb.previousSibling;
-                }
-            }
-        }
-
-        function compact(crumb)
-        {
-            if (crumb.hasStyleClass("hidden"))
-                return;
-            crumb.addStyleClass("compact");
-        }
-
-        function collapse(crumb, dontCoalesce)
-        {
-            if (crumb.hasStyleClass("hidden"))
-                return;
-            crumb.addStyleClass("collapsed");
-            crumb.removeStyleClass("compact");
-            if (!dontCoalesce)
-                coalesceCollapsedCrumbs();
-        }
-
-        function compactDimmed(crumb)
-        {
-            if (crumb.hasStyleClass("dimmed"))
-                compact(crumb);
-        }
-
-        function collapseDimmed(crumb)
-        {
-            if (crumb.hasStyleClass("dimmed"))
-                collapse(crumb);
-        }
-
-        if (!focusedCrumb) {
-            // When not focused on a crumb we can be biased and collapse less important
-            // crumbs that the user might not care much about.
-
-            // Compact child crumbs.
-            if (makeCrumbsSmaller(compact, ChildSide))
-                return;
-
-            // Collapse child crumbs.
-            if (makeCrumbsSmaller(collapse, ChildSide))
-                return;
-
-            // Compact dimmed ancestor crumbs.
-            if (makeCrumbsSmaller(compactDimmed, AncestorSide))
-                return;
-
-            // Collapse dimmed ancestor crumbs.
-            if (makeCrumbsSmaller(collapseDimmed, AncestorSide))
-                return;
-        }
-
-        // Compact ancestor crumbs, or from both sides if focused.
-        if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide)))
-            return;
-
-        // Collapse ancestor crumbs, or from both sides if focused.
-        if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide)))
-            return;
-
-        if (!selectedCrumb)
-            return;
-
-        // Compact the selected crumb.
-        compact(selectedCrumb);
-        if (crumbsAreSmallerThanContainer())
-            return;
-
-        // Collapse the selected crumb as a last resort. Pass true to prevent coalescing.
-        collapse(selectedCrumb, true);
-    },
-
-    updateStyles: function(forceUpdate)
-    {
-        var stylesSidebarPane = this.sidebarPanes.styles;
-        if (!stylesSidebarPane.expanded || !stylesSidebarPane.needsUpdate)
-            return;
-
-        stylesSidebarPane.update(this.focusedDOMNode, null, forceUpdate);
-        stylesSidebarPane.needsUpdate = false;
-    },
-
-    updateMetrics: function()
-    {
-        var metricsSidebarPane = this.sidebarPanes.metrics;
-        if (!metricsSidebarPane.expanded || !metricsSidebarPane.needsUpdate)
-            return;
-
-        metricsSidebarPane.update(this.focusedDOMNode);
-        metricsSidebarPane.needsUpdate = false;
-    },
-
-    updateProperties: function()
-    {
-        var propertiesSidebarPane = this.sidebarPanes.properties;
-        if (!propertiesSidebarPane.expanded || !propertiesSidebarPane.needsUpdate)
-            return;
-
-        propertiesSidebarPane.update(this.focusedDOMNode);
-        propertiesSidebarPane.needsUpdate = false;
-    },
-
-    updateEventListeners: function()
-    {
-        var eventListenersSidebarPane = this.sidebarPanes.eventListeners;
-        if (!eventListenersSidebarPane.expanded || !eventListenersSidebarPane.needsUpdate)
-            return;
-
-        eventListenersSidebarPane.update(this.focusedDOMNode);
-        eventListenersSidebarPane.needsUpdate = false;
-    },
-
-    handleShortcut: function(event)
-    {
-        // Cmd/Control + Shift + C should be a shortcut to clicking the Node Search Button.
-        // This shortcut matches Firebug.
-        if (event.keyIdentifier === "U+0043") {     // C key
-            if (WebInspector.isMac())
-                var isNodeSearchKey = event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey;
-            else
-                var isNodeSearchKey = event.ctrlKey && !event.metaKey && !event.altKey && event.shiftKey;
-
-            if (isNodeSearchKey) {
-                this._nodeSearchButtonClicked(event);
-                event.handled = true;
-                return;
-            }
-        }
-    },
-
-    handleCopyEvent: function(event)
-    {
-        // Don't prevent the normal copy if the user has a selection.
-        if (!window.getSelection().isCollapsed)
-            return;
-        event.clipboardData.clearData();
-        event.preventDefault();
-        InspectorBackend.copyNode(this.focusedDOMNode.id);
-    },
-
-    rightSidebarResizerDragStart: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarElement, this.rightSidebarResizerDrag.bind(this), this.rightSidebarResizerDragEnd.bind(this), event, "col-resize");
-    },
-
-    rightSidebarResizerDragEnd: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    },
-
-    rightSidebarResizerDrag: function(event)
-    {
-        var x = event.pageX;
-        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minElementsSidebarWidth, window.innerWidth * 0.66);
-
-        this.sidebarElement.style.width = newWidth + "px";
-        this.contentElement.style.right = newWidth + "px";
-        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
-
-        this.treeOutline.updateSelection();
-
-        event.preventDefault();
-    },
-
-    _nodeSearchButtonClicked: function(event)
-    {
-        InspectorBackend.toggleNodeSearch();
-
-        this.nodeSearchButton.toggled = InspectorBackend.searchingForNode();
-    }
-}
-
-WebInspector.ElementsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* ResourcesPanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourcesPanel = function()
-{
-    WebInspector.AbstractTimelinePanel.call(this);
-
-    this.element.addStyleClass("resources");
-
-    this._createPanelEnabler();
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "resource-views";
-    this.element.appendChild(this.viewsContainerElement);
-
-    this.createFilterPanel();
-    this.createInterface();
-
-    this._createStatusbarButtons();
-
-    this.reset();
-    this.filter(this.filterAllElement, false);
-    this.graphsTreeElement.children[0].select();
-}
-
-WebInspector.ResourcesPanel.prototype = {
-    toolbarItemClass: "resources",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Resources");
-    },
-
-    get statusBarItems()
-    {
-        return [this.enableToggleButton.element, this.largerResourcesButton.element, this.sortingSelectElement];
-    },
-
-    get categories()
-    {
-        return WebInspector.resourceCategories;
-    },
-
-    createItemTreeElement: function(item)
-    {
-        return new WebInspector.ResourceSidebarTreeElement(item);
-    },
-
-    createItemGraph: function(item)
-    {
-        return new WebInspector.ResourceGraph(item);
-    },
-
-    isCategoryVisible: function(categoryName)
-    {
-        return (this.itemsGraphsElement.hasStyleClass("filter-all") || this.itemsGraphsElement.hasStyleClass("filter-" + categoryName.toLowerCase()));
-    },
-
-    populateSidebar: function()
-    {
-        var timeGraphItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Time"));
-        timeGraphItem.onselect = this._graphSelected.bind(this);
-
-        var transferTimeCalculator = new WebInspector.ResourceTransferTimeCalculator();
-        var transferDurationCalculator = new WebInspector.ResourceTransferDurationCalculator();
-
-        timeGraphItem.sortingOptions = [
-            { name: WebInspector.UIString("Sort by Start Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by Response Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by End Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime, calculator: transferTimeCalculator },
-            { name: WebInspector.UIString("Sort by Duration"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration, calculator: transferDurationCalculator },
-            { name: WebInspector.UIString("Sort by Latency"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency, calculator: transferDurationCalculator },
-        ];
-
-        timeGraphItem.selectedSortingOptionIndex = 1;
-
-        var sizeGraphItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Size"));
-        sizeGraphItem.onselect = this._graphSelected.bind(this);
-
-        var transferSizeCalculator = new WebInspector.ResourceTransferSizeCalculator();
-        sizeGraphItem.sortingOptions = [
-            { name: WebInspector.UIString("Sort by Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize, calculator: transferSizeCalculator },
-        ];
-
-        sizeGraphItem.selectedSortingOptionIndex = 0;
-
-        this.graphsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("GRAPHS"), {}, true);
-        this.sidebarTree.appendChild(this.graphsTreeElement);
-
-        this.graphsTreeElement.appendChild(timeGraphItem);
-        this.graphsTreeElement.appendChild(sizeGraphItem);
-        this.graphsTreeElement.expand();
-
-        this.itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESOURCES"), {}, true);
-        this.sidebarTree.appendChild(this.itemsTreeElement);
-
-        this.itemsTreeElement.expand();
-    },
-
-    _createPanelEnabler: function()
-    {
-        var panelEnablerHeading = WebInspector.UIString("You need to enable resource tracking to use this panel.");
-        var panelEnablerDisclaimer = WebInspector.UIString("Enabling resource tracking will reload the page and make page loading slower.");
-        var panelEnablerButton = WebInspector.UIString("Enable resource tracking");
-
-        this.panelEnablerView = new WebInspector.PanelEnablerView("resources", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-        this.panelEnablerView.addEventListener("enable clicked", this._enableResourceTracking, this);
-
-        this.element.appendChild(this.panelEnablerView.element);
-
-        this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-        this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
-    },
-
-    _createStatusbarButtons: function()
-    {
-        this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
-
-        WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
-        this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
-        this.sortingSelectElement = document.createElement("select");
-        this.sortingSelectElement.className = "status-bar-item";
-        this.sortingSelectElement.addEventListener("change", this._changeSortingFunction.bind(this), false);
-    },
-
-    _settingsLoaded: function()
-    {
-        this.largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
-        if (!WebInspector.settings.resourcesLargeRows)
-            this._setLargerResources(WebInspector.settings.resourcesLargeRows);
-    },
-
-    get mainResourceLoadTime()
-    {
-        return this._mainResourceLoadTime || -1;
-    },
-    
-    set mainResourceLoadTime(x)
-    {
-        if (this._mainResourceLoadTime === x)
-            return;
-        
-        this._mainResourceLoadTime = x;
-        
-        // Update the dividers to draw the new line
-        this.updateGraphDividersIfNeeded(true);
-    },
-    
-    get mainResourceDOMContentTime()
-    {
-        return this._mainResourceDOMContentTime || -1;
-    },
-    
-    set mainResourceDOMContentTime(x)
-    {
-        if (this._mainResourceDOMContentTime === x)
-            return;
-        
-        this._mainResourceDOMContentTime = x;
-        
-        this.updateGraphDividersIfNeeded(true);
-    },
-
-    show: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.show.call(this);
-
-        var visibleView = this.visibleView;
-        if (visibleView) {
-            visibleView.headersVisible = true;
-            visibleView.show(this.viewsContainerElement);
-        }
-
-        // Hide any views that are visible that are not this panel's current visible view.
-        // This can happen when a ResourceView is visible in the Scripts panel then switched
-        // to the this panel.
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            var view = resource._resourcesView;
-            if (!view || view === visibleView)
-                continue;
-            view.visible = false;
-        }
-    },
-
-    resize: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.resize.call(this);
-
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch)
-            views.push(visibleView);
-
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            if (!resource._itemsTreeElement)
-                continue;
-            var resourceView = this.resourceViewForResource(resource);
-            if (!resourceView.performSearch || resourceView === visibleView)
-                continue;
-            views.push(resourceView);
-        }
-
-        return views;
-    },
-
-    get searchResultsSortFunction()
-    {
-        const resourceTreeElementSortFunction = this.sortingFunction;
-
-        function sortFuction(a, b)
-        {
-            return resourceTreeElementSortFunction(a.resource._itemsTreeElement, b.resource._itemsTreeElement);
-        }
-
-        return sortFuction;
-    },
-
-    searchMatchFound: function(view, matches)
-    {
-        view.resource._itemsTreeElement.searchMatches = matches;
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
-
-        if (startingNewSearch || !this._resources)
-            return;
-
-        for (var i = 0; i < this._resources.length; ++i) {
-            var resource = this._resources[i];
-            if (resource._itemsTreeElement)
-                resource._itemsTreeElement.updateErrorsAndWarnings();
-        }
-    },
-
-    performSearch: function(query)
-    {
-        for (var i = 0; i < this._resources.length; ++i) {
-            var resource = this._resources[i];
-            if (resource._itemsTreeElement)
-                resource._itemsTreeElement.resetBubble();
-        }
-
-        WebInspector.Panel.prototype.performSearch.call(this, query);
-    },
-
-    get visibleView()
-    {
-        if (this.visibleResource)
-            return this.visibleResource._resourcesView;
-        return null;
-    },
-
-    get sortingFunction()
-    {
-        return this._sortingFunction;
-    },
-
-    set sortingFunction(x)
-    {
-        this._sortingFunction = x;
-        this._sortResourcesIfNeeded();
-    },
-
-    refresh: function()
-    {
-        WebInspector.AbstractTimelinePanel.prototype.refresh.call(this);
-
-        this._sortResourcesIfNeeded();
-        this._updateSummaryGraph();
-    },
-
-    _updateSummaryGraph: function()
-    {
-        this.summaryBar.update(this._resources);
-    },
-
-    resourceTrackingWasEnabled: function()
-    {
-        this.reset();
-    },
-
-    resourceTrackingWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        this.closeVisibleResource();
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        if (this._resources) {
-            var resourcesLength = this._resources.length;
-            for (var i = 0; i < resourcesLength; ++i) {
-                var resource = this._resources[i];
-
-                resource.warnings = 0;
-                resource.errors = 0;
-
-                delete resource._resourcesView;
-            }
-        }
-
-        WebInspector.AbstractTimelinePanel.prototype.reset.call(this);
-        
-        this.mainResourceLoadTime = -1;
-        this.mainResourceDOMContentTime = -1;
- 
-        this.viewsContainerElement.removeChildren();
-
-        this.summaryBar.reset();
-
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Resource tracking enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            this.largerResourcesButton.visible = true;
-            this.sortingSelectElement.removeStyleClass("hidden");
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Resource tracking disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            this.largerResourcesButton.visible = false;
-            this.sortingSelectElement.addStyleClass("hidden");
-            this.panelEnablerView.visible = true;
-        }
-    },
-
-    addResource: function(resource)
-    {
-        this._resources.push(resource);
-        this.refreshResource(resource);
-    },
-
-    removeResource: function(resource)
-    {
-        if (this.visibleView === resource._resourcesView)
-            this.closeVisibleResource();
-
-        this.removeItem(resource);
-
-        resource.warnings = 0;
-        resource.errors = 0;
-
-        delete resource._resourcesView;
-    },
-
-    addMessageToResource: function(resource, msg)
-    {
-        if (!resource)
-            return;
-
-        switch (msg.level) {
-        case WebInspector.ConsoleMessage.MessageLevel.Warning:
-            resource.warnings += msg.repeatDelta;
-            break;
-        case WebInspector.ConsoleMessage.MessageLevel.Error:
-            resource.errors += msg.repeatDelta;
-            break;
-        }
-
-        if (!this.currentQuery && resource._itemsTreeElement)
-            resource._itemsTreeElement.updateErrorsAndWarnings();
-
-        var view = this.resourceViewForResource(resource);
-        if (view.addMessage)
-            view.addMessage(msg);
-    },
-
-    clearMessages: function()
-    {
-        var resourcesLength = this._resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = this._resources[i];
-            resource.warnings = 0;
-            resource.errors = 0;
-
-            if (!this.currentQuery && resource._itemsTreeElement)
-                resource._itemsTreeElement.updateErrorsAndWarnings();
-
-            var view = resource._resourcesView;
-            if (!view || !view.clearMessages)
-                continue;
-            view.clearMessages();
-        }
-    },
-
-    refreshResource: function(resource)
-    {
-        this.refreshItem(resource);
-    },
-
-    recreateViewForResourceIfNeeded: function(resource)
-    {
-        if (!resource || !resource._resourcesView)
-            return;
-
-        var newView = this._createResourceView(resource);
-        if (newView.prototype === resource._resourcesView.prototype)
-            return;
-
-        resource.warnings = 0;
-        resource.errors = 0;
-
-        if (!this.currentQuery && resource._itemsTreeElement)
-            resource._itemsTreeElement.updateErrorsAndWarnings();
-
-        var oldView = resource._resourcesView;
-
-        resource._resourcesView.detach();
-        delete resource._resourcesView;
-
-        resource._resourcesView = newView;
-
-        newView.headersVisible = oldView.headersVisible;
-
-        if (oldView.visible && oldView.element.parentNode)
-            newView.show(oldView.element.parentNode);
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return !!WebInspector.resourceForURL(url);
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        this.showResource(WebInspector.resourceForURL(url), line);
-    },
-
-    showResource: function(resource, line)
-    {
-        if (!resource)
-            return;
-
-        this.containerElement.addStyleClass("viewing-resource");
-
-        if (this.visibleResource && this.visibleResource._resourcesView)
-            this.visibleResource._resourcesView.hide();
-
-        var view = this.resourceViewForResource(resource);
-        view.headersVisible = true;
-        view.show(this.viewsContainerElement);
-
-        if (line) {
-            if (view.revealLine)
-                view.revealLine(line);
-            if (view.highlightLine)
-                view.highlightLine(line);
-        }
-
-        this.revealAndSelectItem(resource);
-
-        this.visibleResource = resource;
-
-        this.updateSidebarWidth();
-    },
-
-    showView: function(view)
-    {
-        if (!view)
-            return;
-        this.showResource(view.resource);
-    },
-
-    closeVisibleResource: function()
-    {
-        this.containerElement.removeStyleClass("viewing-resource");
-        this._updateDividersLabelBarPosition();
-
-        if (this.visibleResource && this.visibleResource._resourcesView)
-            this.visibleResource._resourcesView.hide();
-        delete this.visibleResource;
-
-        if (this._lastSelectedGraphTreeElement)
-            this._lastSelectedGraphTreeElement.select(true);
-
-        this.updateSidebarWidth();
-    },
-
-    resourceViewForResource: function(resource)
-    {
-        if (!resource)
-            return null;
-        if (!resource._resourcesView)
-            resource._resourcesView = this._createResourceView(resource);
-        return resource._resourcesView;
-    },
-
-    sourceFrameForResource: function(resource)
-    {
-        var view = this.resourceViewForResource(resource);
-        if (!view)
-            return null;
-
-        if (!view.setupSourceFrameIfNeeded)
-            return null;
-
-        // Setting up the source frame requires that we be attached.
-        if (!this.element.parentNode)
-            this.attach();
-
-        view.setupSourceFrameIfNeeded();
-        return view.sourceFrame;
-    },
-
-    _sortResourcesIfNeeded: function()
-    {
-        this.sortItems(this.sortingFunction);
-    },
-
-    updateGraphDividersIfNeeded: function(force)
-    {
-        var proceed = WebInspector.AbstractTimelinePanel.prototype.updateGraphDividersIfNeeded.call(this, force);
-        
-        if (!proceed)
-            return;
-
-        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
-            // If our current sorting method starts at zero, that means it shows all
-            // resources starting at the same point, and so onLoad event and DOMContent
-            // event lines really wouldn't make much sense here, so don't render them.
-            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
-            // function defined, we are probably sorting by size, and event times aren't relevant
-            // in this case.
-            return;
-        }
-
-        if (this.mainResourceLoadTime !== -1) {
-            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceLoadTime);
-
-            var loadDivider = document.createElement("div");
-            loadDivider.className = "resources-onload-divider";
-
-            var loadDividerPadding = document.createElement("div");
-            loadDividerPadding.className = "resources-event-divider-padding";
-            loadDividerPadding.style.left = percent + "%";
-            loadDividerPadding.title = WebInspector.UIString("Load event fired");
-            loadDividerPadding.appendChild(loadDivider);
-
-            this.addEventDivider(loadDividerPadding);
-        }
-        
-        if (this.mainResourceDOMContentTime !== -1) {
-            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceDOMContentTime);
-
-            var domContentDivider = document.createElement("div");
-            domContentDivider.className = "resources-ondomcontent-divider";
-            
-            var domContentDividerPadding = document.createElement("div");
-            domContentDividerPadding.className = "resources-event-divider-padding";
-            domContentDividerPadding.style.left = percent + "%";
-            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
-            domContentDividerPadding.appendChild(domContentDivider);
-
-            this.addEventDivider(domContentDividerPadding);
-        }
-    },
-
-    _graphSelected: function(treeElement)
-    {
-        if (this._lastSelectedGraphTreeElement)
-            this._lastSelectedGraphTreeElement.selectedSortingOptionIndex = this.sortingSelectElement.selectedIndex;
-
-        this._lastSelectedGraphTreeElement = treeElement;
-
-        this.sortingSelectElement.removeChildren();
-        for (var i = 0; i < treeElement.sortingOptions.length; ++i) {
-            var sortingOption = treeElement.sortingOptions[i];
-            var option = document.createElement("option");
-            option.label = sortingOption.name;
-            option.sortingFunction = sortingOption.sortingFunction;
-            option.calculator = sortingOption.calculator;
-            this.sortingSelectElement.appendChild(option);
-        }
-
-        this.sortingSelectElement.selectedIndex = treeElement.selectedSortingOptionIndex;
-        this._changeSortingFunction();
-
-        this.closeVisibleResource();
-        this.containerElement.scrollTop = 0;
-    },
-
-    _toggleLargerResources: function()
-    {
-        if (!this.itemsTreeElement._childrenListNode)
-            return;
-
-        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
-        this._setLargerResources(this.itemsTreeElement.smallChildren);
-    },
-
-    _setLargerResources: function(enabled)
-    {
-        this.largerResourcesButton.toggled = enabled;
-        this.itemsTreeElement.smallChildren = !enabled;
-        if (!enabled) {
-            this.itemsGraphsElement.addStyleClass("small");
-            this.largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
-            this.adjustScrollPosition();
-        } else {
-            this.itemsGraphsElement.removeStyleClass("small");
-            this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
-        }
-    },
-
-    _changeSortingFunction: function()
-    {
-        var selectedOption = this.sortingSelectElement[this.sortingSelectElement.selectedIndex];
-        this.sortingFunction = selectedOption.sortingFunction;
-        this.calculator = this.summaryBar.calculator = selectedOption.calculator;
-    },
-
-    _createResourceView: function(resource)
-    {
-        switch (resource.category) {
-            case WebInspector.resourceCategories.documents:
-            case WebInspector.resourceCategories.stylesheets:
-            case WebInspector.resourceCategories.scripts:
-            case WebInspector.resourceCategories.xhr:
-                return new WebInspector.SourceView(resource);
-            case WebInspector.resourceCategories.images:
-                return new WebInspector.ImageView(resource);
-            case WebInspector.resourceCategories.fonts:
-                return new WebInspector.FontView(resource);
-            default:
-                return new WebInspector.ResourceView(resource);
-        }
-    },
-
-    setSidebarWidth: function(width)
-    {
-        if (this.visibleResource) {
-            this.containerElement.style.width = width + "px";
-            this.sidebarElement.style.removeProperty("width");
-        } else {
-            this.sidebarElement.style.width = width + "px";
-            this.containerElement.style.removeProperty("width");
-        }
-
-        this.sidebarResizeElement.style.left = (width - 3) + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        WebInspector.AbstractTimelinePanel.prototype.updateMainViewWidth.call(this, width);
-        this.viewsContainerElement.style.left = width + "px";
-    },
-
-    _enableResourceTracking: function()
-    {
-        if (InspectorBackend.resourceTrackingEnabled())
-            return;
-        this._toggleResourceTracking(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleResourceTracking: function(optionalAlways)
-    {
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this.largerResourcesButton.visible = false;
-            this.sortingSelectElement.visible = false;
-            InspectorBackend.disableResourceTracking(true);
-        } else {
-            this.largerResourcesButton.visible = true;
-            this.sortingSelectElement.visible = true;
-            InspectorBackend.enableResourceTracking(!!optionalAlways);
-        }
-    },
-
-    get _resources()
-    {
-        return this.items;
-    }
-}
-
-WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.AbstractTimelinePanel.prototype;
-
-WebInspector.ResourceTimeCalculator = function(startAtZero)
-{
-    WebInspector.AbstractTimelineCalculator.call(this);
-    this.startAtZero = startAtZero;
-}
-
-WebInspector.ResourceTimeCalculator.prototype = {
-    computeSummaryValues: function(resources)
-    {
-        var resourcesByCategory = {};
-        var resourcesLength = resources.length;
-        for (var i = 0; i < resourcesLength; ++i) {
-            var resource = resources[i];
-            if (!(resource.category.name in resourcesByCategory))
-                resourcesByCategory[resource.category.name] = [];
-            resourcesByCategory[resource.category.name].push(resource);
-        }
-
-        var earliestStart;
-        var latestEnd;
-        var categoryValues = {};
-        for (var category in resourcesByCategory) {
-            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
-            categoryValues[category] = 0;
-
-            var segment = {start: -1, end: -1};
-
-            var categoryResources = resourcesByCategory[category];
-            var resourcesLength = categoryResources.length;
-            for (var i = 0; i < resourcesLength; ++i) {
-                var resource = categoryResources[i];
-                if (resource.startTime === -1 || resource.endTime === -1)
-                    continue;
-
-                if (typeof earliestStart === "undefined")
-                    earliestStart = resource.startTime;
-                else
-                    earliestStart = Math.min(earliestStart, resource.startTime);
-
-                if (typeof latestEnd === "undefined")
-                    latestEnd = resource.endTime;
-                else
-                    latestEnd = Math.max(latestEnd, resource.endTime);
-
-                if (resource.startTime <= segment.end) {
-                    segment.end = Math.max(segment.end, resource.endTime);
-                    continue;
-                }
-
-                categoryValues[category] += segment.end - segment.start;
-
-                segment.start = resource.startTime;
-                segment.end = resource.endTime;
-            }
-
-            // Add the last segment
-            categoryValues[category] += segment.end - segment.start;
-        }
-
-        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
-    },
-
-    computeBarGraphPercentages: function(resource)
-    {
-        if (resource.startTime !== -1)
-            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var start = 0;
-
-        if (resource.responseReceivedTime !== -1)
-            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var middle = (this.startAtZero ? start : 100);
-
-        if (resource.endTime !== -1)
-            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
-        else
-            var end = (this.startAtZero ? middle : 100);
-
-        if (this.startAtZero) {
-            end -= start;
-            middle -= start;
-            start = 0;
-        }
-
-        return {start: start, middle: middle, end: end};
-    },
-    
-    computePercentageFromEventTime: function(eventTime)
-    {
-        // This function computes a percentage in terms of the total loading time
-        // of a specific event. If startAtZero is set, then this is useless, and we
-        // want to return 0.
-        if (eventTime !== -1 && !this.startAtZero)
-            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
-
-        return 0;
-    },
-
-    computeBarGraphLabels: function(resource)
-    {
-        var leftLabel = "";
-        if (resource.latency > 0)
-            leftLabel = this.formatValue(resource.latency);
-
-        var rightLabel = "";
-        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
-            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
-
-        if (leftLabel && rightLabel) {
-            var total = this.formatValue(resource.duration);
-            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
-        } else if (leftLabel)
-            var tooltip = WebInspector.UIString("%s latency", leftLabel);
-        else if (rightLabel)
-            var tooltip = WebInspector.UIString("%s download", rightLabel);
-
-        if (resource.cached)
-            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
-
-        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
-    },
-
-    updateBoundaries: function(resource)
-    {
-        var didChange = false;
-
-        var lowerBound;
-        if (this.startAtZero)
-            lowerBound = 0;
-        else
-            lowerBound = this._lowerBound(resource);
-
-        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
-            this.minimumBoundary = lowerBound;
-            didChange = true;
-        }
-
-        var upperBound = this._upperBound(resource);
-        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
-            this.maximumBoundary = upperBound;
-            didChange = true;
-        }
-
-        return didChange;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _lowerBound: function(resource)
-    {
-        return 0;
-    },
-
-    _upperBound: function(resource)
-    {
-        return 0;
-    }
-}
-
-WebInspector.ResourceTimeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
-
-WebInspector.ResourceTransferTimeCalculator = function()
-{
-    WebInspector.ResourceTimeCalculator.call(this, false);
-}
-
-WebInspector.ResourceTransferTimeCalculator.prototype = {
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _lowerBound: function(resource)
-    {
-        return resource.startTime;
-    },
-
-    _upperBound: function(resource)
-    {
-        return resource.endTime;
-    }
-}
-
-WebInspector.ResourceTransferTimeCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
-
-WebInspector.ResourceTransferDurationCalculator = function()
-{
-    WebInspector.ResourceTimeCalculator.call(this, true);
-}
-
-WebInspector.ResourceTransferDurationCalculator.prototype = {
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
-    },
-
-    _upperBound: function(resource)
-    {
-        return resource.duration;
-    }
-}
-
-WebInspector.ResourceTransferDurationCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
-
-WebInspector.ResourceTransferSizeCalculator = function()
-{
-    WebInspector.AbstractTimelineCalculator.call(this);
-}
-
-WebInspector.ResourceTransferSizeCalculator.prototype = {
-    computeBarGraphLabels: function(resource)
-    {
-        const label = this.formatValue(this._value(resource));
-        var tooltip = label;
-        if (resource.cached)
-            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
-        return {left: label, right: label, tooltip: tooltip};
-    },
-
-    _value: function(resource)
-    {
-        return resource.contentLength;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.bytesToString(value, WebInspector.UIString.bind(WebInspector));
-    }
-}
-
-WebInspector.ResourceTransferSizeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
-
-WebInspector.ResourceSidebarTreeElement = function(resource)
-{
-    this.resource = resource;
-
-    this.createIconElement();
-
-    WebInspector.SidebarTreeElement.call(this, "resource-sidebar-tree-item", "", "", resource);
-
-    this.refreshTitles();
-}
-
-WebInspector.ResourceSidebarTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
-
-        this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
-        this._listItemNode.draggable = true;
-        
-        // FIXME: should actually add handler to parent, to be resolved via
-        // https://bugs.webkit.org/show_bug.cgi?id=30227
-        this._listItemNode.addEventListener("dragstart", this.ondragstart.bind(this), false);
-        this.updateErrorsAndWarnings();
-    },
-
-    onselect: function()
-    {
-        WebInspector.panels.resources.showResource(this.resource);
-    },
-    
-    ondblclick: function(event)
-    {
-        InjectedScriptAccess.openInInspectedWindow(this.resource.url, function() {});
-    },
-
-    ondragstart: function(event) {
-        event.dataTransfer.setData("text/plain", this.resource.url);
-        event.dataTransfer.setData("text/uri-list", this.resource.url + "\r\n");
-        event.dataTransfer.effectAllowed = "copy";
-        return true;
-    },
-
-    get mainTitle()
-    {
-        return this.resource.displayName;
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        var subtitle = this.resource.displayDomain;
-
-        if (this.resource.path && this.resource.lastPathComponent) {
-            var lastPathComponentIndex = this.resource.path.lastIndexOf("/" + this.resource.lastPathComponent);
-            if (lastPathComponentIndex != -1)
-                subtitle += this.resource.path.substring(0, lastPathComponentIndex);
-        }
-
-        return subtitle;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    },
-
-    get selectable()
-    {
-        return WebInspector.panels.resources.isCategoryVisible(this.resource.category.name);
-    },
-
-    createIconElement: function()
-    {
-        var previousIconElement = this.iconElement;
-
-        if (this.resource.category === WebInspector.resourceCategories.images) {
-            var previewImage = document.createElement("img");
-            previewImage.className = "image-resource-icon-preview";
-            previewImage.src = this.resource.url;
-
-            this.iconElement = document.createElement("div");
-            this.iconElement.className = "icon";
-            this.iconElement.appendChild(previewImage);
-        } else {
-            this.iconElement = document.createElement("img");
-            this.iconElement.className = "icon";
-        }
-
-        if (previousIconElement)
-            previousIconElement.parentNode.replaceChild(this.iconElement, previousIconElement);
-    },
-
-    refresh: function()
-    {
-        this.refreshTitles();
-
-        if (!this._listItemNode.hasStyleClass("resources-category-" + this.resource.category.name)) {
-            this._listItemNode.removeMatchingStyleClasses("resources-category-\\w+");
-            this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
-
-            this.createIconElement();
-        }
-
-        this.tooltip = this.resource.url;
-    },
-
-    resetBubble: function()
-    {
-        this.bubbleText = "";
-        this.bubbleElement.removeStyleClass("search-matches");
-        this.bubbleElement.removeStyleClass("warning");
-        this.bubbleElement.removeStyleClass("error");
-    },
-
-    set searchMatches(matches)
-    {
-        this.resetBubble();
-
-        if (!matches)
-            return;
-
-        this.bubbleText = matches;
-        this.bubbleElement.addStyleClass("search-matches");
-    },
-
-    updateErrorsAndWarnings: function()
-    {
-        this.resetBubble();
-
-        if (this.resource.warnings || this.resource.errors)
-            this.bubbleText = (this.resource.warnings + this.resource.errors);
-
-        if (this.resource.warnings)
-            this.bubbleElement.addStyleClass("warning");
-
-        if (this.resource.errors)
-            this.bubbleElement.addStyleClass("error");
-    }
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime = function(a, b)
-{
-    return WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
-        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareByDuration(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareByLatency(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize = function(a, b)
-{
-    return -1 * WebInspector.Resource.CompareBySize(a.resource, b.resource);
-}
-
-WebInspector.ResourceSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.ResourceGraph = function(resource)
-{
-    this.resource = resource;
-
-    this._graphElement = document.createElement("div");
-    this._graphElement.className = "resources-graph-side";
-    this._graphElement.addEventListener("mouseover", this.refreshLabelPositions.bind(this), false);
-
-    if (resource.cached)
-        this._graphElement.addStyleClass("resource-cached");
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "resources-graph-bar-area hidden";
-    this._graphElement.appendChild(this._barAreaElement);
-
-    this._barLeftElement = document.createElement("div");
-    this._barLeftElement.className = "resources-graph-bar waiting";
-    this._barAreaElement.appendChild(this._barLeftElement);
-
-    this._barRightElement = document.createElement("div");
-    this._barRightElement.className = "resources-graph-bar";
-    this._barAreaElement.appendChild(this._barRightElement);
-
-    this._labelLeftElement = document.createElement("div");
-    this._labelLeftElement.className = "resources-graph-label waiting";
-    this._barAreaElement.appendChild(this._labelLeftElement);
-
-    this._labelRightElement = document.createElement("div");
-    this._labelRightElement.className = "resources-graph-label";
-    this._barAreaElement.appendChild(this._labelRightElement);
-
-    this._graphElement.addStyleClass("resources-category-" + resource.category.name);
-}
-
-WebInspector.ResourceGraph.prototype = {
-    get graphElement()
-    {
-        return this._graphElement;
-    },
-
-    refreshLabelPositions: function()
-    {
-        this._labelLeftElement.style.removeProperty("left");
-        this._labelLeftElement.style.removeProperty("right");
-        this._labelLeftElement.removeStyleClass("before");
-        this._labelLeftElement.removeStyleClass("hidden");
-
-        this._labelRightElement.style.removeProperty("left");
-        this._labelRightElement.style.removeProperty("right");
-        this._labelRightElement.removeStyleClass("after");
-        this._labelRightElement.removeStyleClass("hidden");
-
-        const labelPadding = 10;
-        const rightBarWidth = (this._barRightElement.offsetWidth - labelPadding);
-        const leftBarWidth = ((this._barLeftElement.offsetWidth - this._barRightElement.offsetWidth) - labelPadding);
-
-        var labelBefore = (this._labelLeftElement.offsetWidth > leftBarWidth);
-        var labelAfter = (this._labelRightElement.offsetWidth > rightBarWidth);
-
-        if (labelBefore) {
-            if ((this._graphElement.offsetWidth * (this._percentages.start / 100)) < (this._labelLeftElement.offsetWidth + 10))
-                this._labelLeftElement.addStyleClass("hidden");
-            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
-            this._labelLeftElement.addStyleClass("before");
-        } else {
-            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
-            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
-        }
-
-        if (labelAfter) {
-            if ((this._graphElement.offsetWidth * ((100 - this._percentages.end) / 100)) < (this._labelRightElement.offsetWidth + 10))
-                this._labelRightElement.addStyleClass("hidden");
-            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
-            this._labelRightElement.addStyleClass("after");
-        } else {
-            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
-            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
-        }
-    },
-
-    refresh: function(calculator)
-    {
-        var percentages = calculator.computeBarGraphPercentages(this.resource);
-        var labels = calculator.computeBarGraphLabels(this.resource);
-
-        this._percentages = percentages;
-
-        this._barAreaElement.removeStyleClass("hidden");
-
-        if (!this._graphElement.hasStyleClass("resources-category-" + this.resource.category.name)) {
-            this._graphElement.removeMatchingStyleClasses("resources-category-\\w+");
-            this._graphElement.addStyleClass("resources-category-" + this.resource.category.name);
-        }
-
-        this._barLeftElement.style.setProperty("left", percentages.start + "%");
-        this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
-
-        this._barRightElement.style.setProperty("left", percentages.middle + "%");
-        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
-
-        this._labelLeftElement.textContent = labels.left;
-        this._labelRightElement.textContent = labels.right;
-
-        var tooltip = (labels.tooltip || "");
-        this._barLeftElement.title = tooltip;
-        this._labelLeftElement.title = tooltip;
-        this._labelRightElement.title = tooltip;
-        this._barRightElement.title = tooltip;
-    }
-}
-
-/* ScriptsPanel.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScriptsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.element.addStyleClass("scripts");
-
-    this.topStatusBar = document.createElement("div");
-    this.topStatusBar.className = "status-bar";
-    this.topStatusBar.id = "scripts-status-bar";
-    this.element.appendChild(this.topStatusBar);
-
-    this.backButton = document.createElement("button");
-    this.backButton.className = "status-bar-item";
-    this.backButton.id = "scripts-back";
-    this.backButton.title = WebInspector.UIString("Show the previous script resource.");
-    this.backButton.disabled = true;
-    this.backButton.appendChild(document.createElement("img"));
-    this.backButton.addEventListener("click", this._goBack.bind(this), false);
-    this.topStatusBar.appendChild(this.backButton);
-
-    this.forwardButton = document.createElement("button");
-    this.forwardButton.className = "status-bar-item";
-    this.forwardButton.id = "scripts-forward";
-    this.forwardButton.title = WebInspector.UIString("Show the next script resource.");
-    this.forwardButton.disabled = true;
-    this.forwardButton.appendChild(document.createElement("img"));
-    this.forwardButton.addEventListener("click", this._goForward.bind(this), false);
-    this.topStatusBar.appendChild(this.forwardButton);
-
-    this.filesSelectElement = document.createElement("select");
-    this.filesSelectElement.className = "status-bar-item";
-    this.filesSelectElement.id = "scripts-files";
-    this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false);
-    this.topStatusBar.appendChild(this.filesSelectElement);
-
-    this.functionsSelectElement = document.createElement("select");
-    this.functionsSelectElement.className = "status-bar-item";
-    this.functionsSelectElement.id = "scripts-functions";
-
-    // FIXME: append the functions select element to the top status bar when it is implemented.
-    // this.topStatusBar.appendChild(this.functionsSelectElement);
-
-    this.sidebarButtonsElement = document.createElement("div");
-    this.sidebarButtonsElement.id = "scripts-sidebar-buttons";
-    this.topStatusBar.appendChild(this.sidebarButtonsElement);
-
-    this.pauseButton = document.createElement("button");
-    this.pauseButton.className = "status-bar-item";
-    this.pauseButton.id = "scripts-pause";
-    this.pauseButton.title = WebInspector.UIString("Pause script execution.");
-    this.pauseButton.disabled = true;
-    this.pauseButton.appendChild(document.createElement("img"));
-    this.pauseButton.addEventListener("click", this._togglePause.bind(this), false);
-    this.sidebarButtonsElement.appendChild(this.pauseButton);
-
-    this.stepOverButton = document.createElement("button");
-    this.stepOverButton.className = "status-bar-item";
-    this.stepOverButton.id = "scripts-step-over";
-    this.stepOverButton.title = WebInspector.UIString("Step over next function call.");
-    this.stepOverButton.disabled = true;
-    this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false);
-    this.stepOverButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepOverButton);
-
-    this.stepIntoButton = document.createElement("button");
-    this.stepIntoButton.className = "status-bar-item";
-    this.stepIntoButton.id = "scripts-step-into";
-    this.stepIntoButton.title = WebInspector.UIString("Step into next function call.");
-    this.stepIntoButton.disabled = true;
-    this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false);
-    this.stepIntoButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepIntoButton);
-
-    this.stepOutButton = document.createElement("button");
-    this.stepOutButton.className = "status-bar-item";
-    this.stepOutButton.id = "scripts-step-out";
-    this.stepOutButton.title = WebInspector.UIString("Step out of current function.");
-    this.stepOutButton.disabled = true;
-    this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false);
-    this.stepOutButton.appendChild(document.createElement("img"));
-    this.sidebarButtonsElement.appendChild(this.stepOutButton);
-
-    this.debuggerStatusElement = document.createElement("div");
-    this.debuggerStatusElement.id = "scripts-debugger-status";
-    this.sidebarButtonsElement.appendChild(this.debuggerStatusElement);
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "script-resource-views";
-
-    this.sidebarElement = document.createElement("div");
-    this.sidebarElement.id = "scripts-sidebar";
-
-    this.sidebarResizeElement = document.createElement("div");
-    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
-    this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
-
-    this.sidebarResizeWidgetElement = document.createElement("div");
-    this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget";
-    this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
-    this.topStatusBar.appendChild(this.sidebarResizeWidgetElement);
-
-    this.sidebarPanes = {};
-    this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
-    this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
-    this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
-    this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane();
-
-    for (var pane in this.sidebarPanes)
-        this.sidebarElement.appendChild(this.sidebarPanes[pane].element);
-
-    this.sidebarPanes.callstack.expanded = true;
-    this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this);
-
-    this.sidebarPanes.scopechain.expanded = true;
-    this.sidebarPanes.breakpoints.expanded = true;
-
-    var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel.");
-    var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower.");
-    var panelEnablerButton = WebInspector.UIString("Enable Debugging");
-
-    this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-    this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this);
-
-    this.element.appendChild(this.panelEnablerView.element);
-    this.element.appendChild(this.viewsContainerElement);
-    this.element.appendChild(this.sidebarElement);
-    this.element.appendChild(this.sidebarResizeElement);
-
-    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-    this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false);
-
-    this.pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item");
-    this.pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false);
-
-    this._breakpointsURLMap = {};
-
-    this._shortcuts = {};
-    var handler, shortcut;
-    var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-
-    // Continue.
-    handler = this.pauseButton.click.bind(this.pauseButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F8);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Slash, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step over.
-    handler = this.stepOverButton.click.bind(this.stepOverButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F10);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.SingleQuote, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step into.
-    handler = this.stepIntoButton.click.bind(this.stepIntoButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    // Step out.
-    handler = this.stepOutButton.click.bind(this.stepOutButton);
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11, WebInspector.KeyboardShortcut.Modifiers.Shift);
-    this._shortcuts[shortcut] = handler;
-    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift, platformSpecificModifier);
-    this._shortcuts[shortcut] = handler;
-
-    this.reset();
-}
-
-WebInspector.ScriptsPanel.prototype = {
-    toolbarItemClass: "scripts",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Scripts");
-    },
-
-    get statusBarItems()
-    {
-        return [this.enableToggleButton.element, this.pauseOnExceptionButton.element];
-    },
-
-    get defaultFocusedElement()
-    {
-        return this.filesSelectElement;
-    },
-
-    get paused()
-    {
-        return this._paused;
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
-
-        if (this.visibleView) {
-            if (this.visibleView instanceof WebInspector.ResourceView)
-                this.visibleView.headersVisible = false;
-            this.visibleView.show(this.viewsContainerElement);
-        }
-
-        // Hide any views that are visible that are not this panel's current visible view.
-        // This can happen when a ResourceView is visible in the Resources panel then switched
-        // to the this panel.
-        for (var sourceID in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceID];
-            var view = this._sourceViewForScriptOrResource(scriptOrResource);
-            if (!view || view === this.visibleView)
-                continue;
-            view.visible = false;
-        }
-        if (this._attachDebuggerWhenShown) {
-            InspectorBackend.enableDebugger(false);
-            delete this._attachDebuggerWhenShown;
-        }
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch) {
-            visibleView.alreadySearching = true;
-            views.push(visibleView);
-        }
-
-        for (var sourceID in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceID];
-            var view = this._sourceViewForScriptOrResource(scriptOrResource);
-            if (!view || !view.performSearch || view.alreadySearching)
-                continue;
-
-            view.alreadySearching = true;
-            views.push(view);
-        }
-
-        for (var i = 0; i < views.length; ++i)
-            delete views[i].alreadySearching;
-
-        return views;
-    },
-
-    addScript: function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
-    {
-        var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, errorLine, errorMessage);
-
-        if (sourceURL in WebInspector.resourceURLMap) {
-            var resource = WebInspector.resourceURLMap[sourceURL];
-            resource.addScript(script);
-        }
-
-        sourceURL = script.sourceURL;
-
-        if (sourceID)
-            this._sourceIDMap[sourceID] = (resource || script);
-
-        if (sourceURL in this._breakpointsURLMap && sourceID) {
-            var breakpoints = this._breakpointsURLMap[sourceURL];
-            var breakpointsLength = breakpoints.length;
-            for (var i = 0; i < breakpointsLength; ++i) {
-                var breakpoint = breakpoints[i];
-
-                if (startingLine <= breakpoint.line) {
-                    // remove and add the breakpoint, to clean up things like the sidebar
-                    this.removeBreakpoint(breakpoint);
-                    breakpoint.sourceID = sourceID;
-                    this.addBreakpoint(breakpoint);
-                    
-                    if (breakpoint.enabled)
-                        InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
-                }
-            }
-        }
-
-        this._addScriptToFilesMenu(script);
-    },
-
-    scriptOrResourceForID: function(id)
-    {
-        return this._sourceIDMap[id];
-    },
-
-    scriptForURL: function(url)
-    {
-        return this._scriptsForURLsInFilesSelect[url];
-    },
-
-    addBreakpoint: function(breakpoint)
-    {
-        this.sidebarPanes.breakpoints.addBreakpoint(breakpoint);
-
-        var sourceFrame;
-        if (breakpoint.url) {
-            if (!(breakpoint.url in this._breakpointsURLMap))
-                this._breakpointsURLMap[breakpoint.url] = [];
-            this._breakpointsURLMap[breakpoint.url].unshift(breakpoint);
-
-            if (breakpoint.url in WebInspector.resourceURLMap) {
-                var resource = WebInspector.resourceURLMap[breakpoint.url];
-                sourceFrame = this._sourceFrameForScriptOrResource(resource);
-            }
-        }
-
-        if (breakpoint.sourceID && !sourceFrame) {
-            var object = this._sourceIDMap[breakpoint.sourceID]
-            sourceFrame = this._sourceFrameForScriptOrResource(object);
-        }
-
-        if (sourceFrame)
-            sourceFrame.addBreakpoint(breakpoint);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        this.sidebarPanes.breakpoints.removeBreakpoint(breakpoint);
-
-        var sourceFrame;
-        if (breakpoint.url && breakpoint.url in this._breakpointsURLMap) {
-            var breakpoints = this._breakpointsURLMap[breakpoint.url];
-            breakpoints.remove(breakpoint);
-            if (!breakpoints.length)
-                delete this._breakpointsURLMap[breakpoint.url];
-
-            if (breakpoint.url in WebInspector.resourceURLMap) {
-                var resource = WebInspector.resourceURLMap[breakpoint.url];
-                sourceFrame = this._sourceFrameForScriptOrResource(resource);
-            }
-        }
-
-        if (breakpoint.sourceID && !sourceFrame) {
-            var object = this._sourceIDMap[breakpoint.sourceID]
-            sourceFrame = this._sourceFrameForScriptOrResource(object);
-        }
-
-        if (sourceFrame)
-            sourceFrame.removeBreakpoint(breakpoint);
-    },
-
-    selectedCallFrameId: function()
-    {
-        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
-        if (!selectedCallFrame)
-            return null;
-        return selectedCallFrame.id;
-    },
-
-    evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)
-    {
-        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
-        if (!this._paused || !selectedCallFrame)
-            return;
-
-        if (typeof updateInterface === "undefined")
-            updateInterface = true;
-
-        var self = this;
-        function updatingCallbackWrapper(result, exception)
-        {
-            callback(result, exception);
-            if (updateInterface)
-                self.sidebarPanes.scopechain.update(selectedCallFrame);
-        }
-        this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);
-    },
-
-    doEvalInCallFrame: function(callFrame, code, objectGroup, callback)
-    {
-        function evalCallback(result)
-        {
-            if (result)
-                callback(result.value, result.isException);
-        }
-        InjectedScriptAccess.evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
-    },
-
-    debuggerPaused: function(callFrames)
-    {
-        this._paused = true;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        this._updateDebuggerButtons();
-
-        this.sidebarPanes.callstack.update(callFrames, this._sourceIDMap);
-        this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];
-
-        WebInspector.currentPanel = this;
-        window.focus();
-    },
-
-    debuggerResumed: function()
-    {
-        this._paused = false;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        this._clearInterface();
-    },
-
-    attachDebuggerWhenShown: function()
-    {
-        if (this.element.parentElement) {
-            InspectorBackend.enableDebugger(false);
-        } else {
-            this._attachDebuggerWhenShown = true;
-        }
-    },
-
-    debuggerWasEnabled: function()
-    {
-        this.reset();
-    },
-
-    debuggerWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        this.visibleView = null;
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        if (!InspectorBackend.debuggerEnabled()) {
-            this._paused = false;
-            this._waitingToPause = false;
-            this._stepping = false;
-        }
-
-        this._clearInterface();
-
-        this._backForwardList = [];
-        this._currentBackForwardIndex = -1;
-        this._updateBackAndForwardButtons();
-
-        this._scriptsForURLsInFilesSelect = {};
-        this.filesSelectElement.removeChildren();
-        this.functionsSelectElement.removeChildren();
-        this.viewsContainerElement.removeChildren();
-
-        if (this._sourceIDMap) {
-            for (var sourceID in this._sourceIDMap) {
-                var object = this._sourceIDMap[sourceID];
-                if (object instanceof WebInspector.Resource)
-                    object.removeAllScripts();
-            }
-        }
-
-        this._sourceIDMap = {};
-        
-        this.sidebarPanes.watchExpressions.refreshExpressions();
-    },
-
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    set visibleView(x)
-    {
-        if (this._visibleView === x)
-            return;
-
-        if (this._visibleView)
-            this._visibleView.hide();
-
-        this._visibleView = x;
-
-        if (x)
-            x.show(this.viewsContainerElement);
-    },
-
-    canShowSourceLineForURL: function(url)
-    {
-        return InspectorBackend.debuggerEnabled() &&
-            !!(WebInspector.resourceForURL(url) || this.scriptForURL(url));
-    },
-
-    showSourceLineForURL: function(url, line)
-    {
-        var resource = WebInspector.resourceForURL(url);
-        if (resource)
-            this.showResource(resource, line);
-        else
-            this.showScript(this.scriptForURL(url), line);
-    },
-
-    showScript: function(script, line)
-    {
-        this._showScriptOrResource(script, {line: line, shouldHighlightLine: true});
-    },
-
-    showResource: function(resource, line)
-    {
-        this._showScriptOrResource(resource, {line: line, shouldHighlightLine: true});
-    },
-
-    showView: function(view)
-    {
-        if (!view)
-            return;
-        this._showScriptOrResource((view.resource || view.script));
-    },
-
-    handleShortcut: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.handled = true;
-        } else
-            this.sidebarPanes.callstack.handleShortcut(event);
-    },
-
-    scriptViewForScript: function(script)
-    {
-        if (!script)
-            return null;
-        if (!script._scriptView)
-            script._scriptView = new WebInspector.ScriptView(script);
-        return script._scriptView;
-    },
-
-    sourceFrameForScript: function(script)
-    {
-        var view = this.scriptViewForScript(script);
-        if (!view)
-            return null;
-
-        // Setting up the source frame requires that we be attached.
-        if (!this.element.parentNode)
-            this.attach();
-
-        view.setupSourceFrameIfNeeded();
-        return view.sourceFrame;
-    },
-
-    _sourceViewForScriptOrResource: function(scriptOrResource)
-    {
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            return WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
-        }
-        if (scriptOrResource instanceof WebInspector.Script)
-            return this.scriptViewForScript(scriptOrResource);
-    },
-
-    _sourceFrameForScriptOrResource: function(scriptOrResource)
-    {
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            return WebInspector.panels.resources.sourceFrameForResource(scriptOrResource);
-        }
-        if (scriptOrResource instanceof WebInspector.Script)
-            return this.sourceFrameForScript(scriptOrResource);
-    },
-
-    _showScriptOrResource: function(scriptOrResource, options)
-    {
-        // options = {line:, shouldHighlightLine:, fromBackForwardAction:, initialLoad:}
-        if (!options) 
-            options = {};
-
-        if (!scriptOrResource)
-            return;
-
-        var view;
-        if (scriptOrResource instanceof WebInspector.Resource) {
-            if (!WebInspector.panels.resources)
-                return null;
-            view = WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
-            view.headersVisible = false;
-
-            if (scriptOrResource.url in this._breakpointsURLMap) {
-                var sourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
-                if (sourceFrame && !sourceFrame.breakpoints.length) {
-                    var breakpoints = this._breakpointsURLMap[scriptOrResource.url];
-                    var breakpointsLength = breakpoints.length;
-                    for (var i = 0; i < breakpointsLength; ++i)
-                        sourceFrame.addBreakpoint(breakpoints[i]);
-                }
-            }
-        } else if (scriptOrResource instanceof WebInspector.Script)
-            view = this.scriptViewForScript(scriptOrResource);
-
-        if (!view)
-            return;
-
-        var url = scriptOrResource.url || scriptOrResource.sourceURL;
-        if (url && !options.initialLoad)
-            WebInspector.settings.lastViewedScriptFile = url;
-
-        if (!options.fromBackForwardAction) {
-            var oldIndex = this._currentBackForwardIndex;
-            if (oldIndex >= 0)
-                this._backForwardList.splice(oldIndex + 1, this._backForwardList.length - oldIndex);
-
-            // Check for a previous entry of the same object in _backForwardList.
-            // If one is found, remove it and update _currentBackForwardIndex to match.
-            var previousEntryIndex = this._backForwardList.indexOf(scriptOrResource);
-            if (previousEntryIndex !== -1) {
-                this._backForwardList.splice(previousEntryIndex, 1);
-                --this._currentBackForwardIndex;
-            }
-
-            this._backForwardList.push(scriptOrResource);
-            ++this._currentBackForwardIndex;
-
-            this._updateBackAndForwardButtons();
-        }
-
-        this.visibleView = view;
-
-        if (options.line) {
-            if (view.revealLine)
-                view.revealLine(options.line);
-            if (view.highlightLine && options.shouldHighlightLine)
-                view.highlightLine(options.line);
-        }
-
-        var option;
-        if (scriptOrResource instanceof WebInspector.Script) {
-            option = scriptOrResource.filesSelectOption;
-
-            // hasn't been added yet - happens for stepping in evals,
-            // so use the force option to force the script into the menu.
-            if (!option) {
-                this._addScriptToFilesMenu(scriptOrResource, {force: true});
-                option = scriptOrResource.filesSelectOption;
-            }
-
-            console.assert(option);
-        } else {
-            var script = this.scriptForURL(url);
-            if (script)
-               option = script.filesSelectOption;
-        }
-
-        if (option)
-            this.filesSelectElement.selectedIndex = option.index;
-    },
-
-    _addScriptToFilesMenu: function(script, options)
-    {
-        var force = options && options.force;
-
-        if (!script.sourceURL && !force)
-            return;
-
-        if (script.resource && this._scriptsForURLsInFilesSelect[script.sourceURL])
-            return;
-
-        this._scriptsForURLsInFilesSelect[script.sourceURL] = script;
-
-        var select = this.filesSelectElement;
-
-        var option = document.createElement("option");
-        option.representedObject = (script.resource || script);
-        option.text = (script.sourceURL ? WebInspector.displayNameForURL(script.sourceURL) : WebInspector.UIString("(program)"));
-
-        function optionCompare(a, b)
-        {
-            var aTitle = a.text.toLowerCase();
-            var bTitle = b.text.toLowerCase();
-            if (aTitle < bTitle)
-                return -1;
-            else if (aTitle > bTitle)
-                return 1;
-
-            var aSourceID = a.representedObject.sourceID;
-            var bSourceID = b.representedObject.sourceID;
-            if (aSourceID < bSourceID)
-                return -1;
-            else if (aSourceID > bSourceID)
-                return 1;
-            return 0;
-        }
-
-        var insertionIndex = insertionIndexForObjectInListSortedByFunction(option, select.childNodes, optionCompare);
-        if (insertionIndex < 0)
-            select.appendChild(option);
-        else
-            select.insertBefore(option, select.childNodes.item(insertionIndex));
-
-        script.filesSelectOption = option;
-
-        // Call _showScriptOrResource if the option we just appended ended up being selected.
-        // This will happen for the first item added to the menu.
-        if (select.options[select.selectedIndex] === option)
-            this._showScriptOrResource(option.representedObject, {initialLoad: true});
-        else {
-            // if not first item, check to see if this was the last viewed
-            var url = option.representedObject.url || option.representedObject.sourceURL;
-            var lastURL = WebInspector.settings.lastViewedScriptFile;
-            if (url && url === lastURL)
-                this._showScriptOrResource(option.representedObject, {initialLoad: true});
-        }
-    },
-
-    _clearCurrentExecutionLine: function()
-    {
-        if (this._executionSourceFrame)
-            this._executionSourceFrame.executionLine = 0;
-        delete this._executionSourceFrame;
-    },
-
-    _callFrameSelected: function()
-    {
-        this._clearCurrentExecutionLine();
-
-        var callStackPane = this.sidebarPanes.callstack;
-        var currentFrame = callStackPane.selectedCallFrame;
-        if (!currentFrame)
-            return;
-
-        this.sidebarPanes.scopechain.update(currentFrame);
-        this.sidebarPanes.watchExpressions.refreshExpressions();
-
-        var scriptOrResource = this._sourceIDMap[currentFrame.sourceID];
-        this._showScriptOrResource(scriptOrResource, {line: currentFrame.line});
-
-        this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
-        if (this._executionSourceFrame)
-            this._executionSourceFrame.executionLine = currentFrame.line;
-    },
-
-    _changeVisibleFile: function(event)
-    {
-        var select = this.filesSelectElement;
-        this._showScriptOrResource(select.options[select.selectedIndex].representedObject);
-    },
-
-    _startSidebarResizeDrag: function(event)
-    {
-        WebInspector.elementDragStart(this.sidebarElement, this._sidebarResizeDrag.bind(this), this._endSidebarResizeDrag.bind(this), event, "col-resize");
-
-        if (event.target === this.sidebarResizeWidgetElement)
-            this._dragOffset = (event.target.offsetWidth - (event.pageX - event.target.totalOffsetLeft));
-        else
-            this._dragOffset = 0;
-    },
-
-    _endSidebarResizeDrag: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-
-        delete this._dragOffset;
-    },
-
-    _sidebarResizeDrag: function(event)
-    {
-        var x = event.pageX + this._dragOffset;
-        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minScriptsSidebarWidth, window.innerWidth * 0.66);
-
-        this.sidebarElement.style.width = newWidth + "px";
-        this.sidebarButtonsElement.style.width = newWidth + "px";
-        this.viewsContainerElement.style.right = newWidth + "px";
-        this.sidebarResizeWidgetElement.style.right = newWidth + "px";
-        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
-
-        event.preventDefault();
-    },
-
-    _updatePauseOnExceptionsButton: function()
-    {
-        if (InspectorBackend.pauseOnExceptions()) {
-            this.pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.");
-            this.pauseOnExceptionButton.toggled = true;
-        } else {
-            this.pauseOnExceptionButton.title = WebInspector.UIString("Pause on exceptions.");
-            this.pauseOnExceptionButton.toggled = false;
-        }
-    },
-
-    _updateDebuggerButtons: function()
-    {
-        if (InspectorBackend.debuggerEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Debugging enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            this.pauseOnExceptionButton.visible = true;
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Debugging disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            this.pauseOnExceptionButton.visible = false;
-            this.panelEnablerView.visible = true;
-        }
-
-        this._updatePauseOnExceptionsButton();
-
-        if (this._paused) {
-            this.pauseButton.addStyleClass("paused");
-
-            this.pauseButton.disabled = false;
-            this.stepOverButton.disabled = false;
-            this.stepIntoButton.disabled = false;
-            this.stepOutButton.disabled = false;
-
-            this.debuggerStatusElement.textContent = WebInspector.UIString("Paused");
-        } else {
-            this.pauseButton.removeStyleClass("paused");
-
-            this.pauseButton.disabled = this._waitingToPause;
-            this.stepOverButton.disabled = true;
-            this.stepIntoButton.disabled = true;
-            this.stepOutButton.disabled = true;
-
-            if (this._waitingToPause)
-                this.debuggerStatusElement.textContent = WebInspector.UIString("Pausing");
-            else if (this._stepping)
-                this.debuggerStatusElement.textContent = WebInspector.UIString("Stepping");
-            else
-                this.debuggerStatusElement.textContent = "";
-        }
-    },
-
-    _updateBackAndForwardButtons: function()
-    {
-        this.backButton.disabled = this._currentBackForwardIndex <= 0;
-        this.forwardButton.disabled = this._currentBackForwardIndex >= (this._backForwardList.length - 1);
-    },
-
-    _clearInterface: function()
-    {
-        this.sidebarPanes.callstack.update(null);
-        this.sidebarPanes.scopechain.update(null);
-
-        this._clearCurrentExecutionLine();
-        this._updateDebuggerButtons();
-    },
-
-    _goBack: function()
-    {
-        if (this._currentBackForwardIndex <= 0) {
-            console.error("Can't go back from index " + this._currentBackForwardIndex);
-            return;
-        }
-
-        this._showScriptOrResource(this._backForwardList[--this._currentBackForwardIndex], {fromBackForwardAction: true});
-        this._updateBackAndForwardButtons();
-    },
-
-    _goForward: function()
-    {
-        if (this._currentBackForwardIndex >= this._backForwardList.length - 1) {
-            console.error("Can't go forward from index " + this._currentBackForwardIndex);
-            return;
-        }
-
-        this._showScriptOrResource(this._backForwardList[++this._currentBackForwardIndex], {fromBackForwardAction: true});
-        this._updateBackAndForwardButtons();
-    },
-
-    _enableDebugging: function()
-    {
-        if (InspectorBackend.debuggerEnabled())
-            return;
-        this._toggleDebugging(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleDebugging: function(optionalAlways)
-    {
-        this._paused = false;
-        this._waitingToPause = false;
-        this._stepping = false;
-
-        if (InspectorBackend.debuggerEnabled())
-            InspectorBackend.disableDebugger(true);
-        else
-            InspectorBackend.enableDebugger(!!optionalAlways);
-    },
-
-    _togglePauseOnExceptions: function()
-    {
-        InspectorBackend.setPauseOnExceptions(!InspectorBackend.pauseOnExceptions());
-        this._updatePauseOnExceptionsButton();
-    },
-
-    _togglePause: function()
-    {
-        if (this._paused) {
-            this._paused = false;
-            this._waitingToPause = false;
-            InspectorBackend.resumeDebugger();
-        } else {
-            this._stepping = false;
-            this._waitingToPause = true;
-            InspectorBackend.pauseInDebugger();
-        }
-
-        this._clearInterface();
-    },
-
-    _stepOverClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepOverStatementInDebugger();
-    },
-
-    _stepIntoClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepIntoStatementInDebugger();
-    },
-
-    _stepOutClicked: function()
-    {
-        this._paused = false;
-        this._stepping = true;
-
-        this._clearInterface();
-
-        InspectorBackend.stepOutOfFunctionInDebugger();
-    }
-}
-
-WebInspector.ScriptsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* StoragePanel.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.StoragePanel = function(database)
-{
-    WebInspector.Panel.call(this);
-
-    this.createSidebar();
-
-    this.databasesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("DATABASES"), {}, true);
-    this.sidebarTree.appendChild(this.databasesListTreeElement);
-    this.databasesListTreeElement.expand();
-
-    this.localStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("LOCAL STORAGE"), {}, true);
-    this.sidebarTree.appendChild(this.localStorageListTreeElement);
-    this.localStorageListTreeElement.expand();
-
-    this.sessionStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("SESSION STORAGE"), {}, true);
-    this.sidebarTree.appendChild(this.sessionStorageListTreeElement);
-    this.sessionStorageListTreeElement.expand();
-
-    this.cookieListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("COOKIES"), {}, true);
-    this.sidebarTree.appendChild(this.cookieListTreeElement);
-    this.cookieListTreeElement.expand();
-
-    this.storageViews = document.createElement("div");
-    this.storageViews.id = "storage-views";
-    this.element.appendChild(this.storageViews);
-
-    this.storageViewStatusBarItemsContainer = document.createElement("div");
-    this.storageViewStatusBarItemsContainer.id = "storage-view-status-bar-items";
-
-    this.reset();
-}
-
-WebInspector.StoragePanel.prototype = {
-    toolbarItemClass: "storage",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Storage");
-    },
-
-    get statusBarItems()
-    {
-        return [this.storageViewStatusBarItemsContainer];
-    },
-
-    reset: function()
-    {
-        if (this._databases) {
-            var databasesLength = this._databases.length;
-            for (var i = 0; i < databasesLength; ++i) {
-                var database = this._databases[i];
-
-                delete database._tableViews;
-                delete database._queryView;
-            }
-        }
-
-        this._databases = [];
-
-        if (this._domStorage) {
-            var domStorageLength = this._domStorage.length;
-            for (var i = 0; i < domStorageLength; ++i) {
-                var domStorage = this._domStorage[i];
-
-                delete domStorage._domStorageView;
-            }
-        }
-
-        this._domStorage = [];
-
-        this._cookieViews = {};
-
-        this.databasesListTreeElement.removeChildren();
-        this.localStorageListTreeElement.removeChildren();
-        this.sessionStorageListTreeElement.removeChildren();
-        this.cookieListTreeElement.removeChildren();
-
-        this.storageViews.removeChildren();        
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        
-        if (this.sidebarTree.selectedTreeElement)
-            this.sidebarTree.selectedTreeElement.deselect();
-    },
-
-    addDatabase: function(database)
-    {
-        this._databases.push(database);
-
-        var databaseTreeElement = new WebInspector.DatabaseSidebarTreeElement(database);
-        database._databasesTreeElement = databaseTreeElement;
-        this.databasesListTreeElement.appendChild(databaseTreeElement);
-    },
-    
-    addCookieDomain: function(domain)
-    {
-        var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
-        this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
-    },
-
-    addDOMStorage: function(domStorage)
-    {
-        this._domStorage.push(domStorage);
-        var domStorageTreeElement = new WebInspector.DOMStorageSidebarTreeElement(domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage"));
-        domStorage._domStorageTreeElement = domStorageTreeElement;
-        if (domStorage.isLocalStorage)
-            this.localStorageListTreeElement.appendChild(domStorageTreeElement);
-        else
-            this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
-    },
-
-    selectDatabase: function(databaseId)
-    {
-        var database;
-        for (var i = 0, len = this._databases.length; i < len; ++i) {
-            database = this._databases[i];
-            if (database.id === databaseId) {
-                this.showDatabase(database);
-                database._databasesTreeElement.select();
-                return;
-            }
-        }
-    },
-
-    selectDOMStorage: function(storageId)
-    {
-        var domStorage = this._domStorageForId(storageId);
-        if (domStorage) {
-            this.showDOMStorage(domStorage);
-            domStorage._domStorageTreeElement.select();
-        }
-    },
-
-    showDatabase: function(database, tableName)
-    {
-        if (!database)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view;
-        if (tableName) {
-            if (!("_tableViews" in database))
-                database._tableViews = {};
-            view = database._tableViews[tableName];
-            if (!view) {
-                view = new WebInspector.DatabaseTableView(database, tableName);
-                database._tableViews[tableName] = view;
-            }
-        } else {
-            view = database._queryView;
-            if (!view) {
-                view = new WebInspector.DatabaseQueryView(database);
-                database._queryView = view;
-            }
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems || [];
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i].element);
-    },
-
-    showDOMStorage: function(domStorage)
-    {
-        if (!domStorage)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view;
-        view = domStorage._domStorageView;
-        if (!view) {
-            view = new WebInspector.DOMStorageItemsView(domStorage);
-            domStorage._domStorageView = view;
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    showCookies: function(cookieDomain)
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view = this._cookieViews[cookieDomain];
-        if (!view) {
-            view = new WebInspector.CookieItemsView(cookieDomain);
-            this._cookieViews[cookieDomain] = view;
-        }
-
-        view.show(this.storageViews);
-
-        this.visibleView = view;
-
-        this.storageViewStatusBarItemsContainer.removeChildren();
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-        delete this.visibleView;
-    },
-
-    updateDatabaseTables: function(database)
-    {
-        if (!database || !database._databasesTreeElement)
-            return;
-
-        database._databasesTreeElement.shouldRefreshChildren = true;
-
-        if (!("_tableViews" in database))
-            return;
-
-        var tableNamesHash = {};
-        var self = this;
-        function tableNamesCallback(tableNames)
-        {
-            var tableNamesLength = tableNames.length;
-            for (var i = 0; i < tableNamesLength; ++i)
-                tableNamesHash[tableNames[i]] = true;
-
-            for (var tableName in database._tableViews) {
-                if (!(tableName in tableNamesHash)) {
-                    if (self.visibleView === database._tableViews[tableName])
-                        self.closeVisibleView();
-                    delete database._tableViews[tableName];
-                }
-            }
-        }
-        database.getTableNames(tableNamesCallback);
-    },
-
-    dataGridForResult: function(rows)
-    {
-        if (!rows.length)
-            return null;
-
-        var columns = {};
-        var numColumns = 0;
-
-        for (var columnIdentifier in rows[0]) {
-            var column = {};
-            column.width = columnIdentifier.length;
-            column.title = columnIdentifier;
-
-            columns[columnIdentifier] = column;
-            ++numColumns;
-        }
-
-        var nodes = [];
-        var length = rows.length;
-        for (var i = 0; i < length; ++i) {
-            var data = {};
-
-            var row = rows[i];
-            for (var columnIdentifier in row) {
-                var text = row[columnIdentifier];
-                data[columnIdentifier] = text;
-                if (text.length > columns[columnIdentifier].width)
-                    columns[columnIdentifier].width = text.length;
-            }
-
-            var node = new WebInspector.DataGridNode(data, false);
-            node.selectable = false;
-            nodes.push(node);
-        }
-
-        var totalColumnWidths = 0;
-        for (var columnIdentifier in columns)
-            totalColumnWidths += columns[columnIdentifier].width;
-
-        // Calculate the percentage width for the columns.
-        const minimumPrecent = Math.min(5, Math.floor(100/numColumns));
-        var recoupPercent = 0;
-        for (var columnIdentifier in columns) {
-            var width = columns[columnIdentifier].width;
-            width = Math.round((width / totalColumnWidths) * 100);
-            if (width < minimumPrecent) {
-                recoupPercent += (minimumPrecent - width);
-                width = minimumPrecent;
-            }
-
-            columns[columnIdentifier].width = width;
-        }
-
-        // Enforce the minimum percentage width.
-        while (recoupPercent > 0) {
-            for (var columnIdentifier in columns) {
-                if (columns[columnIdentifier].width > minimumPrecent) {
-                    --columns[columnIdentifier].width;
-                    --recoupPercent;
-                    if (!recoupPercent)
-                        break;
-                }
-            }
-        }
-
-        // Change the width property to a string suitable for a style width.
-        for (var columnIdentifier in columns)
-            columns[columnIdentifier].width += "%";
-
-        var dataGrid = new WebInspector.DataGrid(columns);
-        var length = nodes.length;
-        for (var i = 0; i < length; ++i)
-            dataGrid.appendChild(nodes[i]);
-
-        return dataGrid;
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    updateDOMStorage: function(storageId)
-    {
-        var domStorage = this._domStorageForId(storageId);
-        if (!domStorage)
-            return;
-
-        var view = domStorage._domStorageView;
-        if (this.visibleView && view === this.visibleView)
-            domStorage._domStorageView.update();
-    },
-
-    _domStorageForId: function(storageId)
-    {
-        if (!this._domStorage)
-            return null;
-        var domStorageLength = this._domStorage.length;
-        for (var i = 0; i < domStorageLength; ++i) {
-            var domStorage = this._domStorage[i];
-            if (domStorage.id == storageId)
-                return domStorage;
-        }
-        return null;
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.storageViews.style.left = width + "px";
-        this.storageViewStatusBarItemsContainer.style.left = width + "px";
-    }
-}
-
-WebInspector.StoragePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.DatabaseSidebarTreeElement = function(database)
-{
-    this.database = database;
-
-    WebInspector.SidebarTreeElement.call(this, "database-sidebar-tree-item", "", "", database, true);
-
-    this.refreshTitles();
-}
-
-WebInspector.DatabaseSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDatabase(this.database);
-    },
-
-    oncollapse: function()
-    {
-        // Request a refresh after every collapse so the next
-        // expand will have an updated table list.
-        this.shouldRefreshChildren = true;
-    },
-
-    onpopulate: function()
-    {
-        this.removeChildren();
-
-        var self = this;
-        function tableNamesCallback(tableNames)
-        {
-            var tableNamesLength = tableNames.length;
-            for (var i = 0; i < tableNamesLength; ++i)
-                self.appendChild(new WebInspector.SidebarDatabaseTableTreeElement(self.database, tableNames[i]));
-        }
-        this.database.getTableNames(tableNamesCallback);
-    },
-
-    get mainTitle()
-    {
-        return this.database.name;
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return this.database.displayDomain;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.DatabaseSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.SidebarDatabaseTableTreeElement = function(database, tableName)
-{
-    this.database = database;
-    this.tableName = tableName;
-
-    WebInspector.SidebarTreeElement.call(this, "database-table-sidebar-tree-item small", tableName, "", null, false);
-}
-
-WebInspector.SidebarDatabaseTableTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDatabase(this.database, this.tableName);
-    }
-}
-
-WebInspector.SidebarDatabaseTableTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.DOMStorageSidebarTreeElement = function(domStorage, className)
-{
-
-    this.domStorage = domStorage;
-
-    WebInspector.SidebarTreeElement.call(this, "domstorage-sidebar-tree-item " + className, domStorage, "", null, false);
-
-    this.refreshTitles();
-}
-
-WebInspector.DOMStorageSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showDOMStorage(this.domStorage);
-    },
-
-    get mainTitle()
-    {
-        return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files");
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return ""; //this.database.displayDomain;
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.CookieSidebarTreeElement = function(cookieDomain)
-{
-    WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
-    this._cookieDomain = cookieDomain;
-
-    this.refreshTitles();
-}
-
-WebInspector.CookieSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.storage.showCookies(this._cookieDomain);
-    },
-    
-    get mainTitle()
-    {
-        return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files");
-    },
-
-    set mainTitle(x)
-    {
-        // Do nothing.
-    },
-
-    get subtitle()
-    {
-        return "";
-    },
-
-    set subtitle(x)
-    {
-        // Do nothing.
-    }
-}
-
-WebInspector.CookieSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-/* ProfilesPanel.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
-
-WebInspector.ProfileType = function(id, name)
-{
-    this._id = id;
-    this._name = name;
-}
-
-WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;
-
-WebInspector.ProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return "";
-    },
-
-    get buttonStyle()
-    {
-        return undefined;
-    },
-
-    get buttonCaption()
-    {
-        return this.name;
-    },
-
-    get id()
-    {
-        return this._id;
-    },
-
-    get name()
-    {
-        return this._name;
-    },
-
-    buttonClicked: function()
-    {
-    },
-
-    viewForProfile: function(profile)
-    {
-        if (!profile._profileView)
-            profile._profileView = this.createView(profile);
-        return profile._profileView;
-    },
-
-    // Must be implemented by subclasses.
-    createView: function(profile)
-    {
-        throw new Error("Needs implemented.");
-    },
-
-    // Must be implemented by subclasses.
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        throw new Error("Needs implemented.");
-    }
-}
-
-WebInspector.ProfilesPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this.createSidebar();
-
-    this.element.addStyleClass("profiles");
-    this._profileTypesByIdMap = {};
-    this._profileTypeButtonsByIdMap = {};
-
-    var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
-    var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
-    var panelEnablerButton = WebInspector.UIString("Enable Profiling");
-    this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
-    this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);
-
-    this.element.appendChild(this.panelEnablerView.element);
-
-    this.profileViews = document.createElement("div");
-    this.profileViews.id = "profile-views";
-    this.element.appendChild(this.profileViews);
-
-    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
-    this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
-
-    this.profileViewStatusBarItemsContainer = document.createElement("div");
-    this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
-
-    this._profiles = [];
-    this.reset();
-}
-
-WebInspector.ProfilesPanel.prototype = {
-    toolbarItemClass: "profiles",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Profiles");
-    },
-
-    get statusBarItems()
-    {
-        function clickHandler(profileType, buttonElement)
-        {
-            profileType.buttonClicked.call(profileType);
-            this.updateProfileTypeButtons();
-        }
-
-        var items = [this.enableToggleButton.element];
-        // FIXME: Generate a single "combo-button".
-        for (var typeId in this._profileTypesByIdMap) {
-            var profileType = this.getProfileType(typeId);
-            if (profileType.buttonStyle) {
-                var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
-                this._profileTypeButtonsByIdMap[typeId] = button.element;
-                button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);
-                items.push(button.element);
-            }
-        }
-        items.push(this.profileViewStatusBarItemsContainer);
-        return items;
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-        if (this._shouldPopulateProfiles)
-            this._populateProfiles();
-    },
-
-    populateInterface: function()
-    {
-        if (this.visible)
-            this._populateProfiles();
-        else
-            this._shouldPopulateProfiles = true;
-    },
-
-    profilerWasEnabled: function()
-    {
-        this.reset();
-        this.populateInterface();
-    },
-
-    profilerWasDisabled: function()
-    {
-        this.reset();
-    },
-
-    reset: function()
-    {
-        for (var i = 0; i < this._profiles.length; ++i)
-            delete this._profiles[i]._profileView;
-
-        delete this.currentQuery;
-        this.searchCanceled();
-
-        this._profiles = [];
-        this._profilesIdMap = {};
-        this._profileGroups = {};
-        this._profileGroupsForLinks = {}
-
-        this.sidebarTreeElement.removeStyleClass("some-expandable");
-
-        for (var typeId in this._profileTypesByIdMap)
-            this.getProfileType(typeId).treeElement.removeChildren();
-
-        this.profileViews.removeChildren();
-
-        this.profileViewStatusBarItemsContainer.removeChildren();
-
-        this._updateInterface();
-    },
-
-    registerProfileType: function(profileType)
-    {
-        this._profileTypesByIdMap[profileType.id] = profileType;
-        profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);
-        this.sidebarTree.appendChild(profileType.treeElement);
-        profileType.treeElement.expand();
-    },
-
-    _makeKey: function(text, profileTypeId)
-    {
-        return escape(text) + '/' + escape(profileTypeId);
-    },
-
-    addProfileHeader: function(profile)
-    {
-        var typeId = profile.typeId;
-        var profileType = this.getProfileType(typeId);
-        var sidebarParent = profileType.treeElement;
-        var small = false;
-        var alternateTitle;
-
-        profile.__profilesPanelProfileType = profileType;
-        this._profiles.push(profile);
-        this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;
-
-        if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
-            var profileTitleKey = this._makeKey(profile.title, typeId);
-            if (!(profileTitleKey in this._profileGroups))
-                this._profileGroups[profileTitleKey] = [];
-
-            var group = this._profileGroups[profileTitleKey];
-            group.push(profile);
-
-            if (group.length === 2) {
-                // Make a group TreeElement now that there are 2 profiles.
-                group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
-
-                // Insert at the same index for the first profile of the group.
-                var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);
-                sidebarParent.insertChild(group._profilesTreeElement, index);
-
-                // Move the first profile to the group.
-                var selected = group[0]._profilesTreeElement.selected;
-                sidebarParent.removeChild(group[0]._profilesTreeElement);
-                group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
-                if (selected) {
-                    group[0]._profilesTreeElement.select();
-                    group[0]._profilesTreeElement.reveal();
-                }
-
-                group[0]._profilesTreeElement.small = true;
-                group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);
-
-                this.sidebarTreeElement.addStyleClass("some-expandable");
-            }
-
-            if (group.length >= 2) {
-                sidebarParent = group._profilesTreeElement;
-                alternateTitle = WebInspector.UIString("Run %d", group.length);
-                small = true;
-            }
-        }
-
-        var profileTreeElement = profileType.createSidebarTreeElementForProfile(profile);
-        profileTreeElement.small = small;
-        if (alternateTitle)
-            profileTreeElement.mainTitle = alternateTitle;
-        profile._profilesTreeElement = profileTreeElement;
-
-        sidebarParent.appendChild(profileTreeElement);
-        if (!this.visibleView)
-            this.showProfile(profile);
-    },
-
-    showProfile: function(profile)
-    {
-        if (!profile)
-            return;
-
-        if (this.visibleView)
-            this.visibleView.hide();
-
-        var view = profile.__profilesPanelProfileType.viewForProfile(profile);
-
-        view.show(this.profileViews);
-
-        profile._profilesTreeElement.select(true);
-        profile._profilesTreeElement.reveal();
-
-        this.visibleView = view;
-
-        this.profileViewStatusBarItemsContainer.removeChildren();
-
-        var statusBarItems = view.statusBarItems;
-        for (var i = 0; i < statusBarItems.length; ++i)
-            this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
-    },
-
-    showView: function(view)
-    {
-        this.showProfile(view.profile);
-    },
-
-    getProfileType: function(typeId)
-    {
-        return this._profileTypesByIdMap[typeId];
-    },
-
-    showProfileForURL: function(url)
-    {
-        var match = url.match(WebInspector.ProfileType.URLRegExp);
-        if (!match)
-            return;
-        this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);
-    },
-
-    updateProfileTypeButtons: function()
-    {
-        for (var typeId in this._profileTypeButtonsByIdMap) {
-            var buttonElement = this._profileTypeButtonsByIdMap[typeId];
-            var profileType = this.getProfileType(typeId);
-            buttonElement.className = profileType.buttonStyle;
-            buttonElement.title = profileType.buttonTooltip;
-            // FIXME: Apply profileType.buttonCaption once captions are added to button controls.
-        }
-    },
-
-    closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-        delete this.visibleView;
-    },
-
-    displayTitleForProfileLink: function(title, typeId)
-    {
-        title = unescape(title);
-        if (title.indexOf(UserInitiatedProfileName) === 0) {
-            title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
-        } else {
-            var titleKey = this._makeKey(title, typeId);
-            if (!(titleKey in this._profileGroupsForLinks))
-                this._profileGroupsForLinks[titleKey] = 0;
-
-            groupNumber = ++this._profileGroupsForLinks[titleKey];
-
-            if (groupNumber > 2)
-                // The title is used in the console message announcing that a profile has started so it gets
-                // incremented twice as often as it's displayed
-                title += " " + WebInspector.UIString("Run %d", groupNumber / 2);
-        }
-        
-        return title;
-    },
-
-    get searchableViews()
-    {
-        var views = [];
-
-        const visibleView = this.visibleView;
-        if (visibleView && visibleView.performSearch)
-            views.push(visibleView);
-
-        var profilesLength = this._profiles.length;
-        for (var i = 0; i < profilesLength; ++i) {
-            var profile = this._profiles[i];
-            var view = profile.__profilesPanelProfileType.viewForProfile(profile);
-            if (!view.performSearch || view === visibleView)
-                continue;
-            views.push(view);
-        }
-
-        return views;
-    },
-
-    searchMatchFound: function(view, matches)
-    {
-        view.profile._profilesTreeElement.searchMatches = matches;
-    },
-
-    searchCanceled: function(startingNewSearch)
-    {
-        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
-
-        if (!this._profiles)
-            return;
-
-        for (var i = 0; i < this._profiles.length; ++i) {
-            var profile = this._profiles[i];
-            profile._profilesTreeElement.searchMatches = 0;
-        }
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    _updateInterface: function()
-    {
-        // FIXME: Replace ProfileType-specific button visibility changes by a single ProfileType-agnostic "combo-button" visibility change.
-        if (InspectorBackend.profilerEnabled()) {
-            this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
-            this.enableToggleButton.toggled = true;
-            for (var typeId in this._profileTypeButtonsByIdMap)
-                this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");
-            this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
-            this.panelEnablerView.visible = false;
-        } else {
-            this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
-            this.enableToggleButton.toggled = false;
-            for (var typeId in this._profileTypeButtonsByIdMap)
-                this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");
-            this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
-            this.panelEnablerView.visible = true;
-        }
-    },
-
-    _enableProfiling: function()
-    {
-        if (InspectorBackend.profilerEnabled())
-            return;
-        this._toggleProfiling(this.panelEnablerView.alwaysEnabled);
-    },
-
-    _toggleProfiling: function(optionalAlways)
-    {
-        if (InspectorBackend.profilerEnabled())
-            InspectorBackend.disableProfiler(true);
-        else
-            InspectorBackend.enableProfiler(!!optionalAlways);
-    },
-
-    _populateProfiles: function()
-    {
-        var sidebarTreeChildrenCount = this.sidebarTree.children.length;
-        for (var i = 0; i < sidebarTreeChildrenCount; ++i) {
-            var treeElement = this.sidebarTree.children[i];
-            if (treeElement.children.length)
-                return;
-        }
-
-        function populateCallback(profileHeaders) {
-            profileHeaders.sort(function(a, b) { return a.uid - b.uid; });
-            var profileHeadersLength = profileHeaders.length;
-            for (var i = 0; i < profileHeadersLength; ++i)
-                WebInspector.addProfileHeader(profileHeaders[i]);
-        }
-
-        var callId = WebInspector.Callback.wrap(populateCallback);
-        InspectorBackend.getProfileHeaders(callId);
-
-        delete this._shouldPopulateProfiles;
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.profileViews.style.left = width + "px";
-        this.profileViewStatusBarItemsContainer.style.left = width + "px";
-    }
-}
-
-WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-WebInspector.ProfileSidebarTreeElement = function(profile)
-{
-    this.profile = profile;
-
-    if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
-        this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);
-
-    WebInspector.SidebarTreeElement.call(this, "profile-sidebar-tree-item", "", "", profile, false);
-
-    this.refreshTitles();
-}
-
-WebInspector.ProfileSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.profiles.showProfile(this.profile);
-    },
-
-    get mainTitle()
-    {
-        if (this._mainTitle)
-            return this._mainTitle;
-        if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
-            return WebInspector.UIString("Profile %d", this._profileNumber);
-        return this.profile.title;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        // There is no subtitle.
-    },
-
-    set subtitle(x)
-    {
-        // Can't change subtitle.
-    },
-
-    set searchMatches(matches)
-    {
-        if (!matches) {
-            if (!this.bubbleElement)
-                return;
-            this.bubbleElement.removeStyleClass("search-matches");
-            this.bubbleText = "";
-            return;
-        }
-
-        this.bubbleText = matches;
-        this.bubbleElement.addStyleClass("search-matches");
-    }
-}
-
-WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)
-{
-    WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);
-}
-
-WebInspector.ProfileGroupSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);
-    }
-}
-
-WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-WebInspector.didGetProfileHeaders = WebInspector.Callback.processCallback;
-WebInspector.didGetProfile = WebInspector.Callback.processCallback;
-
-/* ConsolePanel.js */
-
-/*
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ConsolePanel = function()
-{
-    WebInspector.Panel.call(this);
-}
-
-WebInspector.ConsolePanel.prototype = {
-    toolbarItemClass: "console",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Console");
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this._previousConsoleState = WebInspector.drawer.state;
-        WebInspector.drawer.enterPanelMode();
-        WebInspector.showConsole();
-        
-        // Move the scope bar to the top of the messages, like the resources filter.
-        var scopeBar = document.getElementById("console-filter");
-        var consoleMessages = document.getElementById("console-messages");
-
-        scopeBar.parentNode.removeChild(scopeBar);
-        document.getElementById("console-view").insertBefore(scopeBar, consoleMessages);
-        
-        // Update styles, and give console-messages a top margin so it doesn't overwrite the scope bar.
-        scopeBar.addStyleClass("console-filter-top");
-        scopeBar.removeStyleClass("status-bar-item");
-
-        consoleMessages.addStyleClass("console-filter-top");
-    },
-
-    hide: function()
-    {
-        WebInspector.Panel.prototype.hide.call(this);
-
-        if (this._previousConsoleState === WebInspector.Drawer.State.Hidden)
-            WebInspector.drawer.immediatelyExitPanelMode();
-        else
-            WebInspector.drawer.exitPanelMode();
-        delete this._previousConsoleState;
-        
-        // Move the scope bar back to the bottom bar, next to Clear Console.
-        var scopeBar = document.getElementById("console-filter");
-
-        scopeBar.parentNode.removeChild(scopeBar);
-        document.getElementById("other-drawer-status-bar-items").appendChild(scopeBar);
-        
-        // Update styles, and remove the top margin on console-messages.
-        scopeBar.removeStyleClass("console-filter-top");
-        scopeBar.addStyleClass("status-bar-item");
-
-        document.getElementById("console-messages").removeStyleClass("console-filter-top");
-    }
-}
-
-WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-/* AuditsPanel.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditsPanel = function()
-{
-    WebInspector.Panel.call(this);
-
-    this._constructCategories();
-
-    this.createSidebar();
-    this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);
-    this.sidebarTree.appendChild(this.auditsTreeElement);
-    this.auditsTreeElement.expand();
-
-    this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();
-    this.auditsTreeElement.appendChild(this.auditsItemTreeElement);
-
-    this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);
-    this.sidebarTree.appendChild(this.auditResultsTreeElement);
-    this.auditResultsTreeElement.expand();
-
-    this.element.addStyleClass("audits");
-
-    this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-audit-results-status-bar-item");
-    this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
-
-    this.viewsContainerElement = document.createElement("div");
-    this.viewsContainerElement.id = "audit-views";
-    this.element.appendChild(this.viewsContainerElement);
-}
-
-WebInspector.AuditsPanel.prototype = {
-    toolbarItemClass: "audits",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Audits");
-    },
-
-    get statusBarItems()
-    {
-        return [this.clearResultsButton.element];
-    },
-
-    get mainResourceLoadTime()
-    {
-        return this._mainResourceLoadTime;
-    },
-
-    set mainResourceLoadTime(x)
-    {
-        this._mainResourceLoadTime = x;
-        this._didMainResourceLoad();
-    },
-
-    get mainResourceDOMContentTime()
-    {
-        return this._mainResourceDOMContentTime;
-    },
-
-    set mainResourceDOMContentTime(x)
-    {
-        this._mainResourceDOMContentTime = x;
-    },
-
-    get categoriesById()
-    {
-        return this._auditCategoriesById;
-    },
-
-    get visibleView()
-    {
-        return this._visibleView;
-    },
-
-    _constructCategories: function()
-    {
-        this._auditCategoriesById = {};
-        for (var categoryCtorID in WebInspector.AuditCategories) {
-            var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();
-            this.categoriesById[auditCategory.id] = auditCategory;
-        }
-    },
-
-    _executeAudit: function(categories, resultCallback)
-    {
-        var resources = [];
-        for (var id in WebInspector.resources)
-            resources.push(WebInspector.resources[id]);
-
-        var rulesRemaining = 0;
-        for (var i = 0; i < categories.length; ++i)
-            rulesRemaining += categories[i].ruleCount;
-
-        var results = [];
-        var mainResourceURL = WebInspector.mainResource.url;
-
-        function ruleResultReadyCallback(categoryResult, ruleResult)
-        {
-            if (ruleResult.children)
-                categoryResult.entries.push(ruleResult);
-
-            --rulesRemaining;
-
-            if (!rulesRemaining && resultCallback)
-                resultCallback(mainResourceURL, results);
-        }
-
-        if (!rulesRemaining) {
-            resultCallback(mainResourceURL, results);
-            return;
-        }
-
-        for (var i = 0; i < categories.length; ++i) {
-            var category = categories[i];
-            var result = new WebInspector.AuditCategoryResult(category);
-            results.push(result);
-            category.runRules(resources, ruleResultReadyCallback.bind(null, result));
-        }
-    },
-
-    _auditFinishedCallback: function(launcherCallback, mainResourceURL, results)
-    {
-        var children = this.auditResultsTreeElement.children;
-        var ordinal = 1;
-        for (var i = 0; i < children.length; ++i) {
-            if (children[i].mainResourceURL === mainResourceURL)
-                ordinal++;
-        }
-
-        var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);
-        this.auditResultsTreeElement.appendChild(resultTreeElement);
-        resultTreeElement.reveal();
-        resultTreeElement.select();
-        if (launcherCallback)
-            launcherCallback();
-    },
-
-    initiateAudit: function(categoryIds, runImmediately, launcherCallback)
-    {
-        if (!categoryIds || !categoryIds.length)
-            return;
-
-        var categories = [];
-        for (var i = 0; i < categoryIds.length; ++i)
-            categories.push(this.categoriesById[categoryIds[i]]);
-
-        function initiateAuditCallback(categories, launcherCallback)
-        {
-            this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));
-        }
-
-        if (runImmediately)
-            initiateAuditCallback.call(this, categories, launcherCallback);
-        else
-            this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));
-    },
-
-    _reloadResources: function(callback)
-    {
-        function nullCallback()
-        {
-        }
-        this._resourceTrackingCallback = callback;
-        if (!InspectorBackend.resourceTrackingEnabled()) {
-            InspectorBackend.enableResourceTracking(false);
-            this._updateLauncherViewControls();
-        } else
-            InjectedScriptAccess.evaluate("window.location.reload()", nullCallback);
-    },
-
-    _didMainResourceLoad: function()
-    {
-        if (this._resourceTrackingCallback) {
-            var callback = this._resourceTrackingCallback;
-            this._resourceTrackingCallback = null;
-            callback();
-        }
-    },
-
-    showResults: function(categoryResults)
-    {
-        if (!categoryResults._resultView)
-            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
-
-        this.showView(categoryResults._resultView);
-    },
-
-    showLauncherView: function()
-    {
-        if (!this._launcherView)
-            this._launcherView = new WebInspector.AuditLauncherView(this.categoriesById, this.initiateAudit.bind(this));
-
-        this.showView(this._launcherView);
-    },
-
-    showView: function(view)
-    {
-        if (view) {
-            if (this._visibleView === view)
-                return;
-            this._closeVisibleView();
-            this._visibleView = view;
-        }
-        var visibleView = this.visibleView;
-        if (visibleView)
-            visibleView.show(this.viewsContainerElement);
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        this.showView();
-        this._updateLauncherViewControls();
-    },
-
-    attach: function()
-    {
-        WebInspector.Panel.prototype.attach.call(this);
-
-        this.auditsItemTreeElement.select();
-    },
-
-    resize: function()
-    {
-        var visibleView = this.visibleView;
-        if (visibleView && "resize" in visibleView)
-            visibleView.resize();
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this.viewsContainerElement.style.left = width + "px";
-    },
-
-    _updateLauncherViewControls: function()
-    {
-        if (this._launcherView)
-            this._launcherView.updateResourceTrackingState();
-    },
-
-    _clearButtonClicked: function()
-    {
-        this.auditsItemTreeElement.reveal();
-        this.auditsItemTreeElement.select();
-        this.auditResultsTreeElement.removeChildren();
-    },
-
-    _closeVisibleView: function()
-    {
-        if (this.visibleView)
-            this.visibleView.hide();
-    }
-}
-
-WebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-
-
-WebInspector.AuditCategory = function(id, displayName)
-{
-    this._id = id;
-    this._displayName = displayName;
-    this._rules = [];
-}
-
-WebInspector.AuditCategory.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get displayName()
-    {
-        return this._displayName;
-    },
-
-    get ruleCount()
-    {
-        return this._rules.length;
-    },
-
-    addRule: function(rule)
-    {
-        this._rules.push(rule);
-    },
-
-    runRules: function(resources, callback)
-    {
-        for (var i = 0; i < this._rules.length; ++i)
-            this._rules[i].run(resources, callback);
-    }
-}
-
-
-WebInspector.AuditRule = function(id, displayName, parametersObject)
-{
-    this._id = id;
-    this._displayName = displayName;
-    this._parametersObject = parametersObject;
-}
-
-WebInspector.AuditRule.prototype = {
-    get id()
-    {
-        return this._id;
-    },
-
-    get displayName()
-    {
-        return this._displayName;
-    },
-
-    run: function(resources, callback)
-    {
-        this.doRun(resources, new WebInspector.AuditRuleResult(this.displayName), callback);
-    },
-
-    doRun: function(resources, result, callback)
-    {
-        throw new Error("doRun() not implemented");
-    },
-
-    getValue: function(key)
-    {
-        if (key in this._parametersObject)
-            return this._parametersObject[key];
-        else
-            throw new Error(key + " not found in rule parameters");
-    }
-}
-
-
-WebInspector.AuditCategoryResult = function(category)
-{
-    this.categoryId = category.id;
-    this.title = category.displayName;
-    this.entries = [];
-}
-
-WebInspector.AuditCategoryResult.prototype = {
-    addEntry: function(value)
-    {
-        var entry = new WebInspector.AuditRuleResult(value);
-        this.entries.push(entry);
-        return entry;
-    }
-}
-
-/**
- * @param {string} value The result message HTML contents.
- */
-WebInspector.AuditRuleResult = function(value)
-{
-    this.value = value;
-    this.type = WebInspector.AuditRuleResult.Type.NA;
-}
-
-WebInspector.AuditRuleResult.Type = {
-    NA: 0,
-    Hint: 1,
-    Violation: 2
-}
-
-WebInspector.AuditRuleResult.prototype = {
-    appendChild: function(value)
-    {
-        if (!this.children)
-            this.children = [];
-        var entry = new WebInspector.AuditRuleResult(value);
-        this.children.push(entry);
-        return entry;
-    },
-
-    set type(x)
-    {
-        this._type = x;
-    },
-
-    get type()
-    {
-        return this._type;
-    }
-}
-
-
-WebInspector.AuditsSidebarTreeElement = function()
-{
-    this.small = false;
-
-    WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);
-}
-
-WebInspector.AuditsSidebarTreeElement.prototype = {
-    onattach: function()
-    {
-        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
-    },
-
-    onselect: function()
-    {
-        WebInspector.panels.audits.showLauncherView();
-    },
-
-    get selectable()
-    {
-        return true;
-    },
-
-    refresh: function()
-    {
-        this.refreshTitles();
-    }
-}
-
-WebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-
-WebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)
-{
-    this.results = results;
-    this.mainResourceURL = mainResourceURL;
-
-    WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);
-}
-
-WebInspector.AuditResultSidebarTreeElement.prototype = {
-    onselect: function()
-    {
-        WebInspector.panels.audits.showResults(this.results);
-    },
-
-    get selectable()
-    {
-        return true;
-    }
-}
-
-WebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-
-// Contributed audit rules should go into this namespace.
-WebInspector.AuditRules = {};
-
-// Contributed audit categories should go into this namespace.
-WebInspector.AuditCategories = {};
-
-/* AuditResultView.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditResultView = function(categoryResults)
-{
-    WebInspector.View.call(this);
-
-    this.element.id = "audit-result-view";
-
-    function entrySortFunction(a, b)
-    {
-        var result = b.type - a.type;
-        if (!result)
-            result = (a.value || "").localeCompare(b.value || "");
-        return result;
-    }
-
-    for (var i = 0; i < categoryResults.length; ++i) {
-        var entries = categoryResults[i].entries;
-        if (entries) {
-            entries.sort(entrySortFunction);
-            this.element.appendChild(new WebInspector.AuditCategoryResultPane(categoryResults[i]).element);
-        }
-    }
-}
-
-WebInspector.AuditResultView.prototype.__proto__ = WebInspector.View.prototype;
-
-
-WebInspector.AuditCategoryResultPane = function(categoryResult)
-{
-    WebInspector.SidebarPane.call(this, categoryResult.title);
-    this.expand();
-    for (var i = 0; i < categoryResult.entries.length; ++i)
-        this.bodyElement.appendChild(new WebInspector.AuditRuleResultPane(categoryResult.entries[i]).element);
-}
-
-WebInspector.AuditCategoryResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-
-WebInspector.AuditRuleResultPane = function(ruleResult)
-{
-    WebInspector.SidebarPane.call(this, ruleResult.value);
-    if (!ruleResult.children)
-        return;
-
-    this._decorateRuleResult(ruleResult);
-
-    for (var i = 0; i < ruleResult.children.length; ++i) {
-        var section = new WebInspector.AuditRuleResultChildSection(ruleResult.children[i]);
-        this.bodyElement.appendChild(section.element);
-    }
-}
-
-WebInspector.AuditRuleResultPane.prototype = {
-    _decorateRuleResult: function(ruleResult)
-    {
-        if (ruleResult.type == WebInspector.AuditRuleResult.Type.NA)
-            return;
-
-        var scoreElement = document.createElement("img");
-        scoreElement.className = "score";
-        var className = (ruleResult.type == WebInspector.AuditRuleResult.Type.Violation) ? "red" : "green";
-        scoreElement.addStyleClass(className);
-        this.element.insertBefore(scoreElement, this.element.firstChild);
-    }
-}
-
-WebInspector.AuditRuleResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
-
-
-WebInspector.AuditRuleResultChildSection = function(entry)
-{
-    WebInspector.Section.call(this, entry.value);
-    var children = entry.children;
-    this._hasChildren = !!children && children.length;
-    if (!this._hasChildren)
-        this.element.addStyleClass("blank-section");
-    else {
-        this.contentElement = document.createElement("div");
-        this.contentElement.addStyleClass("section-content");
-        for (var i = 0; i < children.length; ++i) {
-            var paraElement = document.createElement("p");
-            paraElement.innerHTML = children[i].value;
-            this.contentElement.appendChild(paraElement);
-        }
-        this.contentElement.appendChild(paraElement);
-        this.element.appendChild(this.contentElement);
-    }
-}
-
-WebInspector.AuditRuleResultChildSection.prototype = {
-
-    // title is considered pure HTML
-    set title(x)
-    {
-        if (this._title === x)
-            return;
-        this._title = x;
-
-        this.titleElement.innerHTML = x;
-    },
-
-    expand: function()
-    {
-        if (this._hasChildren)
-            WebInspector.Section.prototype.expand.call(this);
-    }
-}
-
-WebInspector.AuditRuleResultChildSection.prototype.__proto__ = WebInspector.Section.prototype;
-
-/* AuditLauncherView.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.AuditLauncherView = function(categoriesById, runnerCallback)
-{
-    WebInspector.View.call(this);
-    this._categoriesById = categoriesById;
-    this._runnerCallback = runnerCallback;
-    this._categoryIdPrefix = "audit-category-item-";
-    this._auditRunning = false;
-
-    this.element.addStyleClass("audit-launcher-view");
-
-    this._contentElement = document.createElement("div");
-    this._contentElement.className = "audit-launcher-view-content";
-    this.element.appendChild(this._contentElement);
-
-    function categorySortFunction(a, b)
-    {
-        var aTitle = a.displayName || "";
-        var bTitle = b.displayName || "";
-        return aTitle.localeCompare(bTitle);
-    }
-    var sortedCategories = [];
-    for (var id in this._categoriesById)
-        sortedCategories.push(this._categoriesById[id]);
-    sortedCategories.sort(categorySortFunction);
-
-    if (!sortedCategories.length) {
-        this._headerElement = document.createElement("h1");
-        this._headerElement.className = "no-audits";
-        this._headerElement.textContent = WebInspector.UIString("No audits to run");
-        this._contentElement.appendChild(this._headerElement);
-    } else
-        this._createLauncherUI(sortedCategories);
-}
-
-WebInspector.AuditLauncherView.prototype = {
-    updateResourceTrackingState: function()
-    {
-        if (!this._auditPresentStateLabelElement)
-            return;
-        if (InspectorBackend.resourceTrackingEnabled()) {
-            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State");
-            this._auditPresentStateElement.disabled = false;
-            this._auditPresentStateElement.parentElement.removeStyleClass("disabled");
-        } else {
-            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)");
-            this._auditPresentStateElement.disabled = true;
-            this._auditPresentStateElement.parentElement.addStyleClass("disabled");
-            this.auditReloadedStateElement.checked = true;
-        }
-    },
-
-    _setAuditRunning: function(auditRunning)
-    {
-        if (this._auditRunning === auditRunning)
-            return;
-        this._auditRunning = auditRunning;
-        this._updateButton();
-    },
-
-    _launchButtonClicked: function(event)
-    {
-        var catIds = [];
-        var childNodes = this._categoriesElement.childNodes;
-        for (var id in this._categoriesById) {
-            if (this._categoriesById[id]._checkboxElement.checked)
-                catIds.push(id);
-        }
-        function profilingFinishedCallback()
-        {
-            this._setAuditRunning(false);
-        }
-        this._setAuditRunning(true);
-        this._runnerCallback(catIds, this._auditPresentStateElement.checked, profilingFinishedCallback.bind(this));
-    },
-
-    _selectAllClicked: function(checkCategories)
-    {
-        var childNodes = this._categoriesElement.childNodes;
-        for (var i = 0, length = childNodes.length; i < length; ++i)
-            childNodes[i].firstChild.checked = checkCategories;
-        this._currentCategoriesCount = checkCategories ? this._totalCategoriesCount : 0;
-        this._updateButton();
-    },
-
-    _categoryClicked: function(event)
-    {
-        this._currentCategoriesCount += event.target.checked ? 1 : -1;
-        this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._totalCategoriesCount;
-        this._updateButton();
-    },
-
-    _createCategoryElement: function(title, id)
-    {
-        var element;
-        var labelElement = document.createElement("label");
-        labelElement.id = this._categoryIdPrefix + id;
-
-        element = document.createElement("input");
-        element.type = "checkbox";
-        labelElement.appendChild(element);
-        labelElement.appendChild(document.createTextNode(title));
-
-        return labelElement;
-    },
-
-    _createLauncherUI: function(sortedCategories)
-    {
-        this._headerElement = document.createElement("h1");
-        this._headerElement.textContent = WebInspector.UIString("Select audits to run");
-        this._contentElement.appendChild(this._headerElement);
-
-        function handleSelectAllClick(event)
-        {
-            this._selectAllClicked(event.target.checked);
-        }
-        var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");
-        categoryElement.id = "audit-launcher-selectall";
-        this._selectAllCheckboxElement = categoryElement.firstChild;
-        this._selectAllCheckboxElement.checked = true;
-        this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);
-        this._contentElement.appendChild(categoryElement);
-
-        this._categoriesElement = document.createElement("div");
-        this._categoriesElement.className = "audit-categories-container";
-        this._contentElement.appendChild(this._categoriesElement);
-
-        var boundCategoryClickListener = this._categoryClicked.bind(this);
-
-        for (var i = 0; i < sortedCategories.length; ++i) {
-            categoryElement = this._createCategoryElement(sortedCategories[i].displayName, sortedCategories[i].id);
-            categoryElement.firstChild.addEventListener("click", boundCategoryClickListener, false);
-            sortedCategories[i]._checkboxElement = categoryElement.firstChild;
-            this._categoriesElement.appendChild(categoryElement);
-        }
-
-        this._totalCategoriesCount = this._categoriesElement.childNodes.length;
-        this._currentCategoriesCount = 0;
-
-        this._buttonContainerElement = document.createElement("div");
-        this._buttonContainerElement.className = "button-container";
-
-        var labelElement = document.createElement("label");
-        this._auditPresentStateElement = document.createElement("input");
-        this._auditPresentStateElement.name = "audit-mode";
-        this._auditPresentStateElement.type = "radio";
-        this._auditPresentStateElement.checked = true;
-        this._auditPresentStateLabelElement = document.createTextNode("");
-        labelElement.appendChild(this._auditPresentStateElement);
-        labelElement.appendChild(this._auditPresentStateLabelElement);
-        this._buttonContainerElement.appendChild(labelElement);
-
-        labelElement = document.createElement("label");
-        this.auditReloadedStateElement = document.createElement("input");
-        this.auditReloadedStateElement.name = "audit-mode";
-        this.auditReloadedStateElement.type = "radio";
-        labelElement.appendChild(this.auditReloadedStateElement);
-        labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));
-        this._buttonContainerElement.appendChild(labelElement);
-
-        this._launchButton = document.createElement("button");
-        this._launchButton.setAttribute("type", "button");
-        this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);
-        this._buttonContainerElement.appendChild(this._launchButton);
-
-        this._contentElement.appendChild(this._buttonContainerElement);
-
-        this._selectAllClicked(this._selectAllCheckboxElement.checked);
-        this.updateResourceTrackingState();
-        this._updateButton();
-        this.resize();
-    },
-
-    _updateButton: function()
-    {
-        this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;
-        if (this._auditRunning)
-            this._launchButton.textContent = WebInspector.UIString("Running...");
-        else
-            this._launchButton.textContent = WebInspector.UIString("Run");
-    },
-
-    resize: function()
-    {
-        if (this._categoriesElement)
-            this._categoriesElement.style.height = (this._buttonContainerElement.totalOffsetTop - this._categoriesElement.totalOffsetTop) + "px";
-    }
-}
-
-WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ResourceView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) IBM Corp. 2009  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourceView = function(resource)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("resource-view");
-
-    this.resource = resource;
-
-    this.headersElement = document.createElement("div");
-    this.headersElement.className = "resource-view-headers";
-    this.element.appendChild(this.headersElement);
-
-    this.contentElement = document.createElement("div");
-    this.contentElement.className = "resource-view-content";
-    this.element.appendChild(this.contentElement);
-
-    this.headersListElement = document.createElement("ol");
-    this.headersListElement.className = "outline-disclosure";
-    this.headersElement.appendChild(this.headersListElement);
-
-    this.headersTreeOutline = new TreeOutline(this.headersListElement);
-    this.headersTreeOutline.expandTreeElementsWhenArrowing = true;
-
-    this.urlTreeElement = new TreeElement("", null, false);
-    this.urlTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.urlTreeElement);
-
-    this.requestMethodTreeElement = new TreeElement("", null, false);
-    this.requestMethodTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.requestMethodTreeElement);
-
-    this.statusCodeTreeElement = new TreeElement("", null, false);
-    this.statusCodeTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.statusCodeTreeElement);
-     
-    this.requestHeadersTreeElement = new TreeElement("", null, true);
-    this.requestHeadersTreeElement.expanded = false;
-    this.requestHeadersTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.requestHeadersTreeElement);
-
-    this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
-    this._decodeRequestParameters = true;
-
-    this.queryStringTreeElement = new TreeElement("", null, true);
-    this.queryStringTreeElement.expanded = false;
-    this.queryStringTreeElement.selectable = false;
-    this.queryStringTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.queryStringTreeElement);
-
-    this.formDataTreeElement = new TreeElement("", null, true);
-    this.formDataTreeElement.expanded = false;
-    this.formDataTreeElement.selectable = false;
-    this.formDataTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.formDataTreeElement);
-
-    this.requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);
-    this.requestPayloadTreeElement.expanded = false;
-    this.requestPayloadTreeElement.selectable = false;
-    this.requestPayloadTreeElement.hidden = true;
-    this.headersTreeOutline.appendChild(this.requestPayloadTreeElement);
-
-    this.responseHeadersTreeElement = new TreeElement("", null, true);
-    this.responseHeadersTreeElement.expanded = false;
-    this.responseHeadersTreeElement.selectable = false;
-    this.headersTreeOutline.appendChild(this.responseHeadersTreeElement);
-
-    this.headersVisible = true;
-
-    resource.addEventListener("url changed", this._refreshURL, this);
-    resource.addEventListener("requestHeaders changed", this._refreshRequestHeaders, this);
-    resource.addEventListener("responseHeaders changed", this._refreshResponseHeaders, this);
-    resource.addEventListener("finished", this._refreshHTTPInformation, this);
-
-    this._refreshURL();
-    this._refreshRequestHeaders();
-    this._refreshResponseHeaders();
-    this._refreshHTTPInformation();
-}
-
-WebInspector.ResourceView.prototype = {
-    get headersVisible()
-    {
-        return this._headersVisible;
-    },
-
-    set headersVisible(x)
-    {
-        if (x === this._headersVisible)
-            return;
-
-        this._headersVisible = x;
-
-        if (x)
-            this.element.addStyleClass("headers-visible");
-        else
-            this.element.removeStyleClass("headers-visible");
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode) {
-            var parentElement = (document.getElementById("resource-views") || document.getElementById("script-resource-views"));
-            if (parentElement)
-                parentElement.appendChild(this.element);
-        }
-    },
-
-    _refreshURL: function()
-    {
-        this.urlTreeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request URL") + ":</div>" +
-            "<div class=\"header-value source-code\">" + this.resource.url.escapeHTML() + "</div>";
-    },
-
-    _refreshQueryString: function()
-    {
-        var url = this.resource.url;
-        var hasQueryString = url.indexOf("?") >= 0;
-
-        if (!hasQueryString) {
-            this.queryStringTreeElement.hidden = true;
-            return;
-        }
-
-        this.queryStringTreeElement.hidden = false;
-        var parmString = url.split("?", 2)[1];
-        this._refreshParms(WebInspector.UIString("Query String Parameters"), parmString, this.queryStringTreeElement);
-    },
-
-    _refreshFormData: function()
-    {
-        this.formDataTreeElement.hidden = true;
-        this.requestPayloadTreeElement.hidden = true;
-
-        var isFormData = this.resource.requestFormData;
-        if (!isFormData)
-            return;
-
-        var isFormEncoded = false;
-        var requestContentType = this._getHeaderValue(this.resource.requestHeaders, "Content-Type");
-        if (requestContentType && requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
-            isFormEncoded = true;
-
-        if (isFormEncoded) {
-            this.formDataTreeElement.hidden = false;
-            this._refreshParms(WebInspector.UIString("Form Data"), this.resource.requestFormData, this.formDataTreeElement);
-        } else {
-            this.requestPayloadTreeElement.hidden = false;
-            this._refreshRequestPayload(this.resource.requestFormData);
-        }
-    },
-
-    _refreshRequestPayload: function(formData)
-    {
-        this.requestPayloadTreeElement.removeChildren();
-
-        var title = "<div class=\"header-name\">&nbsp;</div>";
-        title += "<div class=\"raw-form-data header-value source-code\">" + formData.escapeHTML() + "</div>";
-        var parmTreeElement = new TreeElement(title, null, false);
-        parmTreeElement.selectable = false;
-        this.requestPayloadTreeElement.appendChild(parmTreeElement);
-    },
-
-    _refreshParms: function(title, parmString, parmsTreeElement)
-    {
-        var parms = parmString.split("&");
-        for (var i = 0; i < parms.length; ++i) {
-            var parm = parms[i];
-            parm = parm.split("=", 2);
-            if (parm.length == 1)
-                parm.push("");
-            parms[i] = parm;
-        }
-
-        parmsTreeElement.removeChildren();
-
-        parmsTreeElement.title = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
-
-        for (var i = 0; i < parms.length; ++i) {
-            var key = parms[i][0];
-            var value = parms[i][1];
-
-            var errorDecoding = false;
-            if (this._decodeRequestParameters) {
-                if (value.indexOf("%") >= 0) {
-                    try {
-                        value = decodeURIComponent(value);
-                    } catch(e) {
-                        errorDecoding = true;
-                    }
-                }
-                    
-                value = value.replace(/\+/g, " ");
-            }
-
-            valueEscaped = value.escapeHTML();
-            if (errorDecoding)
-                valueEscaped += " <span class=\"error-message\">" + WebInspector.UIString("(unable to decode value)").escapeHTML() + "</span>";
-
-            var title = "<div class=\"header-name\">" + key.escapeHTML() + ":</div>";
-            title += "<div class=\"header-value source-code\">" + valueEscaped + "</div>";
-
-            var parmTreeElement = new TreeElement(title, null, false);
-            parmTreeElement.selectable = false;
-            parmTreeElement.tooltip = this._decodeHover;
-            parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
-            parmsTreeElement.appendChild(parmTreeElement);
-        }
-    },
-
-    _toggleURLdecoding: function(event)
-    {
-        this._decodeRequestParameters = !this._decodeRequestParameters;
-        this._refreshQueryString();
-        this._refreshFormData();
-    },
-
-    _getHeaderValue: function(headers, key)
-    {
-        var lowerKey = key.toLowerCase();
-        for (var testKey in headers) {
-            if (testKey.toLowerCase() === lowerKey)
-                return headers[testKey];
-        }
-    },
-
-    _refreshRequestHeaders: function()
-    {
-        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
-        this._refreshFormData();
-    },
-
-    _refreshResponseHeaders: function()
-    {
-        this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement);
-    },
-
-    _refreshHTTPInformation: function()
-    {
-        var requestMethodElement = this.requestMethodTreeElement;
-        requestMethodElement.hidden = !this.resource.statusCode;
-        var statusCodeElement = this.statusCodeTreeElement;
-        statusCodeElement.hidden = !this.resource.statusCode;
-        var statusCodeImage = "";
-
-        if (this.resource.statusCode) {
-            var statusImageSource = "";
-            if (this.resource.statusCode < 300)
-                statusImageSource = "Images/successGreenDot.png";
-            else if (this.resource.statusCode < 400)
-                statusImageSource = "Images/warningOrangeDot.png";
-            else
-                statusImageSource = "Images/errorRedDot.png";
-            statusCodeImage = "<img class=\"resource-status-image\" src=\"" + statusImageSource + "\" title=\"" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "\">";
-    
-            requestMethodElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request Method") + ":</div>" +
-                "<div class=\"header-value source-code\">" + this.resource.requestMethod + "</div>";
-
-            statusCodeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Status Code") + ":</div>" +
-                statusCodeImage + "<div class=\"header-value source-code\">" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "</div>";
-        }
-    },
-    
-    _refreshHeaders: function(title, headers, headersTreeElement)
-    {
-        headersTreeElement.removeChildren();
-
-        var length = headers.length;
-        headersTreeElement.title = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";
-        headersTreeElement.hidden = !length;
-
-        var length = headers.length;
-        for (var i = 0; i < length; ++i) {
-            var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";
-            title += "<div class=\"header-value source-code\">" + headers[i].value.escapeHTML() + "</div>"
-
-            var headerTreeElement = new TreeElement(title, null, false);
-            headerTreeElement.selectable = false;
-            headersTreeElement.appendChild(headerTreeElement);
-        }
-    }
-}
-
-WebInspector.ResourceView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* SourceFrame.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceFrame = function(element, addBreakpointDelegate)
-{
-    this.messages = [];
-    this.breakpoints = [];
-    this._shortcuts = {};
-
-    this.addBreakpointDelegate = addBreakpointDelegate;
-
-    this.element = element || document.createElement("iframe");
-    this.element.addStyleClass("source-view-frame");
-    this.element.setAttribute("viewsource", "true");
-
-    this.element.addEventListener("load", this._loaded.bind(this), false);
-}
-
-WebInspector.SourceFrame.prototype = {
-    get executionLine()
-    {
-        return this._executionLine;
-    },
-
-    set executionLine(x)
-    {
-        if (this._executionLine === x)
-            return;
-
-        var previousLine = this._executionLine;
-        this._executionLine = x;
-
-        this._updateExecutionLine(previousLine);
-    },
-
-    get autoSizesToFitContentHeight()
-    {
-        return this._autoSizesToFitContentHeight;
-    },
-
-    set autoSizesToFitContentHeight(x)
-    {
-        if (this._autoSizesToFitContentHeight === x)
-            return;
-
-        this._autoSizesToFitContentHeight = x;
-
-        if (this._autoSizesToFitContentHeight) {
-            this._windowResizeListener = this._windowResized.bind(this);
-            window.addEventListener("resize", this._windowResizeListener, false);
-            this.sizeToFitContentHeight();
-        } else {
-            this.element.style.removeProperty("height");
-            if (this.element.contentDocument)
-                this.element.contentDocument.body.removeStyleClass("webkit-height-sized-to-fit");
-            window.removeEventListener("resize", this._windowResizeListener, false);
-            delete this._windowResizeListener;
-        }
-    },
-
-    sourceRow: function(lineNumber)
-    {
-        if (!lineNumber || !this.element.contentDocument)
-            return;
-
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var rows = table.rows;
-
-        // Line numbers are a 1-based index, but the rows collection is 0-based.
-        --lineNumber;
-
-        return rows[lineNumber];
-    },
-
-    lineNumberForSourceRow: function(sourceRow)
-    {
-        // Line numbers are a 1-based index, but the rows collection is 0-based.
-        var lineNumber = 0;
-        while (sourceRow) {
-            ++lineNumber;
-            sourceRow = sourceRow.previousSibling;
-        }
-
-        return lineNumber;
-    },
-
-    revealLine: function(lineNumber)
-    {
-        if (!this._isContentLoaded()) {
-            this._lineNumberToReveal = lineNumber;
-            return;
-        }
-
-        var row = this.sourceRow(lineNumber);
-        if (row)
-            row.scrollIntoViewIfNeeded(true);
-    },
-
-    addBreakpoint: function(breakpoint)
-    {
-        this.breakpoints.push(breakpoint);
-        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
-        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
-        this._addBreakpointToSource(breakpoint);
-    },
-
-    removeBreakpoint: function(breakpoint)
-    {
-        this.breakpoints.remove(breakpoint);
-        breakpoint.removeEventListener("enabled", null, this);
-        breakpoint.removeEventListener("disabled", null, this);
-        this._removeBreakpointFromSource(breakpoint);
-    },
-
-    addMessage: function(msg)
-    {
-        // Don't add the message if there is no message or valid line or if the msg isn't an error or warning.
-        if (!msg.message || msg.line <= 0 || !msg.isErrorOrWarning())
-            return;
-        this.messages.push(msg);
-        this._addMessageToSource(msg);
-    },
-
-    clearMessages: function()
-    {
-        this.messages = [];
-
-        if (!this.element.contentDocument)
-            return;
-
-        var bubbles = this.element.contentDocument.querySelectorAll(".webkit-html-message-bubble");
-        if (!bubbles)
-            return;
-
-        for (var i = 0; i < bubbles.length; ++i) {
-            var bubble = bubbles[i];
-            bubble.parentNode.removeChild(bubble);
-        }
-    },
-
-    sizeToFitContentHeight: function()
-    {
-        if (this.element.contentDocument) {
-            this.element.style.setProperty("height", this.element.contentDocument.body.offsetHeight + "px");
-            this.element.contentDocument.body.addStyleClass("webkit-height-sized-to-fit");
-        }
-    },
-
-    _highlightLineEnds: function(event)
-    {
-        event.target.parentNode.removeStyleClass("webkit-highlighted-line");
-    },
-
-    highlightLine: function(lineNumber)
-    {
-        if (!this._isContentLoaded()) {
-            this._lineNumberToHighlight = lineNumber;
-            return;
-        }
-
-        var sourceRow = this.sourceRow(lineNumber);
-        if (!sourceRow)
-            return;
-        var line = sourceRow.getElementsByClassName('webkit-line-content')[0];
-        // Trick to reset the animation if the user clicks on the same link
-        // Using a timeout to avoid coalesced style updates
-        line.style.setProperty("-webkit-animation-name", "none");
-        setTimeout(function () {
-            line.style.removeProperty("-webkit-animation-name");
-            sourceRow.addStyleClass("webkit-highlighted-line");
-        }, 0);
-    },
-
-    _loaded: function()
-    {
-        WebInspector.addMainEventListeners(this.element.contentDocument);
-        this.element.contentDocument.addEventListener("contextmenu", this._documentContextMenu.bind(this), true);
-        this.element.contentDocument.addEventListener("mousedown", this._documentMouseDown.bind(this), true);
-        this.element.contentDocument.addEventListener("keydown", this._documentKeyDown.bind(this), true);
-        this.element.contentDocument.addEventListener("webkitAnimationEnd", this._highlightLineEnds.bind(this), false);
-
-        // Register 'eval' shortcut.
-        var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
-        var shortcut = WebInspector.KeyboardShortcut.makeKey(69 /* 'E' */, platformSpecificModifier | WebInspector.KeyboardShortcut.Modifiers.Shift);
-        this._shortcuts[shortcut] = this._evalSelectionInCallFrame.bind(this);
-
-        var headElement = this.element.contentDocument.head;
-        if (!headElement) {
-            headElement = this.element.contentDocument.createElement("head");
-            this.element.contentDocument.documentElement.insertBefore(headElement, this.element.contentDocument.documentElement.firstChild);
-        }
-        
-        var linkElement = this.element.contentDocument.createElement("link");
-        linkElement.type = "text/css";
-        linkElement.rel = "stylesheet";
-        linkElement.href = "inspectorSyntaxHighlight.css";
-        headElement.appendChild(linkElement);
-
-        var styleElement = this.element.contentDocument.createElement("style");
-        headElement.appendChild(styleElement);
-
-        // Add these style rules here since they are specific to the Inspector. They also behave oddly and not
-        // all properties apply if added to view-source.css (because it is a user agent sheet.)
-        var styleText = ".webkit-line-number { background-repeat: no-repeat; background-position: right 1px; }\n";
-        styleText += ".webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(program-counter); }\n";
-
-        styleText += ".webkit-breakpoint .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint); }\n";
-        styleText += ".webkit-breakpoint-disabled .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-disabled); }\n";
-        styleText += ".webkit-breakpoint.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-program-counter); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-disabled-program-counter); }\n";
-
-        styleText += ".webkit-breakpoint.webkit-breakpoint-conditional .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-conditional); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-breakpoint-conditional .webkit-line-number { color: white; background-image: -webkit-canvas(breakpoint-disabled-conditional); }\n";
-        styleText += ".webkit-breakpoint.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-conditional-program-counter); }\n";
-        styleText += ".webkit-breakpoint-disabled.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(breakpoint-disabled-conditional-program-counter); }\n";
-
-        styleText += ".webkit-execution-line .webkit-line-content { background-color: rgb(171, 191, 254); outline: 1px solid rgb(64, 115, 244); }\n";
-        styleText += ".webkit-height-sized-to-fit { overflow-y: hidden }\n";
-        styleText += ".webkit-line-content { background-color: white; }\n";
-        styleText += "@-webkit-keyframes fadeout {from {background-color: rgb(255, 255, 120);} to { background-color: white;}}\n";
-        styleText += ".webkit-highlighted-line .webkit-line-content { background-color: rgb(255, 255, 120); -webkit-animation: 'fadeout' 2s 500ms}\n";
-
-        // TODO: Move these styles into inspector.css once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed and popup moved into the top frame.
-        styleText += ".popup-content { position: absolute; z-index: 10000; padding: 4px; background-color: rgb(203, 226, 255); -webkit-border-radius: 7px; border: 2px solid rgb(169, 172, 203); }";
-        styleText += ".popup-glasspane { position: absolute; top: 0; left: 0; height: 100%; width: 100%; opacity: 0; z-index: 9900; }";
-        styleText += ".popup-message { background-color: transparent; font-family: Lucida Grande, sans-serif; font-weight: normal; font-size: 11px; text-align: left; text-shadow: none; color: rgb(85, 85, 85); cursor: default; margin: 0 0 2px 0; }";
-        styleText += ".popup-content.breakpoint-condition { width: 90%; }";
-        styleText += ".popup-content input#bp-condition { font-family: monospace; margin: 0; border: 1px inset rgb(190, 190, 190) !important; width: 100%; box-shadow: none !important; outline: none !important; -webkit-user-modify: read-write; }";
-        // This class is already in inspector.css
-        styleText += ".hidden { display: none !important; }";
-
-        styleElement.textContent = styleText;
-
-        this._needsProgramCounterImage = true;
-        this._needsBreakpointImages = true;
-
-        this.element.contentWindow.Element.prototype.addStyleClass = Element.prototype.addStyleClass;
-        this.element.contentWindow.Element.prototype.removeStyleClass = Element.prototype.removeStyleClass;
-        this.element.contentWindow.Element.prototype.removeChildren = Element.prototype.removeChildren;
-        this.element.contentWindow.Element.prototype.positionAt = Element.prototype.positionAt;
-        this.element.contentWindow.Element.prototype.removeMatchingStyleClasses = Element.prototype.removeMatchingStyleClasses;
-        this.element.contentWindow.Element.prototype.hasStyleClass = Element.prototype.hasStyleClass;
-        this.element.contentWindow.Element.prototype.pageOffsetRelativeToWindow = Element.prototype.pageOffsetRelativeToWindow;
-        this.element.contentWindow.Element.prototype.__defineGetter__("totalOffsetLeft", Element.prototype.__lookupGetter__("totalOffsetLeft"));
-        this.element.contentWindow.Element.prototype.__defineGetter__("totalOffsetTop", Element.prototype.__lookupGetter__("totalOffsetTop"));
-        this.element.contentWindow.Node.prototype.enclosingNodeOrSelfWithNodeName = Node.prototype.enclosingNodeOrSelfWithNodeName;
-        this.element.contentWindow.Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = Node.prototype.enclosingNodeOrSelfWithNodeNameInArray;
-
-        this._addExistingMessagesToSource();
-        this._addExistingBreakpointsToSource();
-        this._updateExecutionLine();
-        if (this._executionLine)
-            this.revealLine(this._executionLine);
-
-        if (this.autoSizesToFitContentHeight)
-            this.sizeToFitContentHeight();
-
-        if (this._lineNumberToReveal) {
-            this.revealLine(this._lineNumberToReveal);
-            delete this._lineNumberToReveal;
-        }
-
-        if (this._lineNumberToHighlight) {
-            this.highlightLine(this._lineNumberToHighlight);
-            delete this._lineNumberToHighlight;
-        }
-
-        this.dispatchEventToListeners("content loaded");
-    },
-
-    _isContentLoaded: function() {
-        var doc = this.element.contentDocument;
-        return doc && doc.getElementsByTagName("table")[0];
-    },
-
-    _windowResized: function(event)
-    {
-        if (!this._autoSizesToFitContentHeight)
-            return;
-        this.sizeToFitContentHeight();
-    },
-
-    _documentContextMenu: function(event)
-    {
-        if (!event.target.hasStyleClass("webkit-line-number"))
-            return;
-        var sourceRow = event.target.enclosingNodeOrSelfWithNodeName("tr");
-        if (!sourceRow._breakpointObject && this.addBreakpointDelegate)
-            this.addBreakpointDelegate(this.lineNumberForSourceRow(sourceRow));
-
-        var breakpoint = sourceRow._breakpointObject;
-        if (!breakpoint)
-            return;
-
-        this._editBreakpointCondition(event.target, sourceRow, breakpoint);
-        event.preventDefault();
-    },
-
-    _documentMouseDown: function(event)
-    {
-        if (!event.target.hasStyleClass("webkit-line-number"))
-            return;
-        if (event.button != 0 || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
-            return;
-        var sourceRow = event.target.enclosingNodeOrSelfWithNodeName("tr");
-        if (sourceRow._breakpointObject && sourceRow._breakpointObject.enabled)
-            sourceRow._breakpointObject.enabled = false;
-        else if (sourceRow._breakpointObject)
-            WebInspector.panels.scripts.removeBreakpoint(sourceRow._breakpointObject);
-        else if (this.addBreakpointDelegate)
-            this.addBreakpointDelegate(this.lineNumberForSourceRow(sourceRow));
-
-        event.preventDefault();
-    },
-
-    _editBreakpointCondition: function(eventTarget, sourceRow, breakpoint)
-    {
-        // TODO: Migrate the popup to the top-level document and remove the blur listener from conditionElement once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed.
-        var popupDocument = this.element.contentDocument;
-        this._showBreakpointConditionPopup(eventTarget, breakpoint.line, popupDocument);
-
-        function committed(element, newText)
-        {
-            breakpoint.condition = newText;
-            if (breakpoint.condition)
-                sourceRow.addStyleClass("webkit-breakpoint-conditional");
-            else
-                sourceRow.removeStyleClass("webkit-breakpoint-conditional");
-            dismissed.call(this);
-        }
-
-        function dismissed()
-        {
-            this._popup.hide();
-            delete this._conditionEditorElement;
-        }
-
-        var dismissedHandler = dismissed.bind(this);
-        this._conditionEditorElement.addEventListener("blur", dismissedHandler, false);
-
-        WebInspector.startEditing(this._conditionEditorElement, committed.bind(this), dismissedHandler);
-        this._conditionEditorElement.value = breakpoint.condition;
-        this._conditionEditorElement.select();
-    },
-
-    _showBreakpointConditionPopup: function(clickedElement, lineNumber, popupDocument)
-    {
-        var popupContentElement = this._createPopupElement(lineNumber, popupDocument);
-        var lineElement = clickedElement.enclosingNodeOrSelfWithNodeName("td").nextSibling;
-        if (this._popup) {
-            this._popup.hide();
-            this._popup.element = popupContentElement;
-        } else {
-            this._popup = new WebInspector.Popup(popupContentElement);
-            this._popup.autoHide = true;
-        }
-        this._popup.anchor = lineElement;
-        this._popup.show();
-    },
-
-    _createPopupElement: function(lineNumber, popupDocument)
-    {
-        var popupContentElement = popupDocument.createElement("div");
-        popupContentElement.className = "popup-content breakpoint-condition";
-
-        var labelElement = document.createElement("label");
-        labelElement.className = "popup-message";
-        labelElement.htmlFor = "bp-condition";
-        labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:", lineNumber)));
-        popupContentElement.appendChild(labelElement);
-
-        var editorElement = document.createElement("input");
-        editorElement.id = "bp-condition";
-        editorElement.type = "text"
-        popupContentElement.appendChild(editorElement);
-        this._conditionEditorElement = editorElement;
-
-        return popupContentElement;
-    },
-
-    _documentKeyDown: function(event)
-    {
-        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
-        var handler = this._shortcuts[shortcut];
-        if (handler) {
-            handler(event);
-            event.preventDefault();
-        } else {
-            WebInspector.documentKeyDown(event);
-        }
-    },
-
-    _evalSelectionInCallFrame: function(event)
-    {
-        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
-            return;
-
-        var selection = this.element.contentWindow.getSelection();
-        if (!selection.rangeCount)
-            return;
-
-        var expression = selection.getRangeAt(0).toString().trimWhitespace();
-        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result, exception) {
-            WebInspector.showConsole();
-            var commandMessage = new WebInspector.ConsoleCommand(expression);
-            WebInspector.console.addMessage(commandMessage);
-            WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
-        });
-    },
-
-    _breakpointEnableChanged: function(event)
-    {
-        var breakpoint = event.target;
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        sourceRow.addStyleClass("webkit-breakpoint");
-
-        if (breakpoint.enabled)
-            sourceRow.removeStyleClass("webkit-breakpoint-disabled");
-        else
-            sourceRow.addStyleClass("webkit-breakpoint-disabled");
-    },
-
-    _updateExecutionLine: function(previousLine)
-    {
-        if (previousLine) {
-            var sourceRow = this.sourceRow(previousLine);
-            if (sourceRow)
-                sourceRow.removeStyleClass("webkit-execution-line");
-        }
-
-        if (!this._executionLine)
-            return;
-
-        this._drawProgramCounterImageIfNeeded();
-
-        var sourceRow = this.sourceRow(this._executionLine);
-        if (sourceRow)
-            sourceRow.addStyleClass("webkit-execution-line");
-    },
-
-    _addExistingBreakpointsToSource: function()
-    {
-        var length = this.breakpoints.length;
-        for (var i = 0; i < length; ++i)
-            this._addBreakpointToSource(this.breakpoints[i]);
-    },
-
-    _addBreakpointToSource: function(breakpoint)
-    {
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        breakpoint.sourceText = sourceRow.getElementsByClassName('webkit-line-content')[0].textContent;
-
-        this._drawBreakpointImagesIfNeeded();
-
-        sourceRow._breakpointObject = breakpoint;
-
-        sourceRow.addStyleClass("webkit-breakpoint");
-        if (!breakpoint.enabled)
-            sourceRow.addStyleClass("webkit-breakpoint-disabled");
-        if (breakpoint.condition)
-            sourceRow.addStyleClass("webkit-breakpoint-conditional");
-    },
-
-    _removeBreakpointFromSource: function(breakpoint)
-    {
-        var sourceRow = this.sourceRow(breakpoint.line);
-        if (!sourceRow)
-            return;
-
-        delete sourceRow._breakpointObject;
-
-        sourceRow.removeStyleClass("webkit-breakpoint");
-        sourceRow.removeStyleClass("webkit-breakpoint-disabled");
-        sourceRow.removeStyleClass("webkit-breakpoint-conditional");
-    },
-
-    _incrementMessageRepeatCount: function(msg, repeatDelta)
-    {
-        if (!msg._resourceMessageLineElement)
-            return;
-
-        if (!msg._resourceMessageRepeatCountElement) {
-            var repeatedElement = document.createElement("span");
-            msg._resourceMessageLineElement.appendChild(repeatedElement);
-            msg._resourceMessageRepeatCountElement = repeatedElement;
-        }
-
-        msg.repeatCount += repeatDelta;
-        msg._resourceMessageRepeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", msg.repeatCount);
-    },
-
-    _addExistingMessagesToSource: function()
-    {
-        var length = this.messages.length;
-        for (var i = 0; i < length; ++i)
-            this._addMessageToSource(this.messages[i]);
-    },
-
-    _addMessageToSource: function(msg)
-    {
-        var row = this.sourceRow(msg.line);
-        if (!row)
-            return;
-
-        var cell = row.cells[1];
-        if (!cell)
-            return;
-
-        var messageBubbleElement = cell.lastChild;
-        if (!messageBubbleElement || messageBubbleElement.nodeType !== Node.ELEMENT_NODE || !messageBubbleElement.hasStyleClass("webkit-html-message-bubble")) {
-            messageBubbleElement = this.element.contentDocument.createElement("div");
-            messageBubbleElement.className = "webkit-html-message-bubble";
-            cell.appendChild(messageBubbleElement);
-        }
-
-        if (!row.messages)
-            row.messages = [];
-
-        for (var i = 0; i < row.messages.length; ++i) {
-            if (row.messages[i].isEqual(msg, true)) {
-                this._incrementMessageRepeatCount(row.messages[i], msg.repeatDelta);
-                return;
-            }
-        }
-
-        row.messages.push(msg);
-
-        var imageURL;
-        switch (msg.level) {
-            case WebInspector.ConsoleMessage.MessageLevel.Error:
-                messageBubbleElement.addStyleClass("webkit-html-error-message");
-                imageURL = "Images/errorIcon.png";
-                break;
-            case WebInspector.ConsoleMessage.MessageLevel.Warning:
-                messageBubbleElement.addStyleClass("webkit-html-warning-message");
-                imageURL = "Images/warningIcon.png";
-                break;
-        }
-
-        var messageLineElement = this.element.contentDocument.createElement("div");
-        messageLineElement.className = "webkit-html-message-line";
-        messageBubbleElement.appendChild(messageLineElement);
-
-        // Create the image element in the Inspector's document so we can use relative image URLs.
-        var image = document.createElement("img");
-        image.src = imageURL;
-        image.className = "webkit-html-message-icon";
-
-        // Adopt the image element since it wasn't created in element's contentDocument.
-        image = this.element.contentDocument.adoptNode(image);
-        messageLineElement.appendChild(image);
-        messageLineElement.appendChild(this.element.contentDocument.createTextNode(msg.message));
-
-        msg._resourceMessageLineElement = messageLineElement;
-    },
-
-    _drawProgramCounterInContext: function(ctx, glow)
-    {
-        if (glow)
-            ctx.save();
-
-        ctx.beginPath();
-        ctx.moveTo(17, 2);
-        ctx.lineTo(19, 2);
-        ctx.lineTo(19, 0);
-        ctx.lineTo(21, 0);
-        ctx.lineTo(26, 5.5);
-        ctx.lineTo(21, 11);
-        ctx.lineTo(19, 11);
-        ctx.lineTo(19, 9);
-        ctx.lineTo(17, 9);
-        ctx.closePath();
-        ctx.fillStyle = "rgb(142, 5, 4)";
-
-        if (glow) {
-            ctx.shadowBlur = 4;
-            ctx.shadowColor = "rgb(255, 255, 255)";
-            ctx.shadowOffsetX = -1;
-            ctx.shadowOffsetY = 0;
-        }
-
-        ctx.fill();
-        ctx.fill(); // Fill twice to get a good shadow and darker anti-aliased pixels.
-
-        if (glow)
-            ctx.restore();
-    },
-
-    _drawProgramCounterImageIfNeeded: function()
-    {
-        if (!this._needsProgramCounterImage || !this.element.contentDocument)
-            return;
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        delete this._needsProgramCounterImage;
-    },
-
-    _drawBreakpointImagesIfNeeded: function(conditional)
-    {
-        if (!this._needsBreakpointImages || !this.element.contentDocument)
-            return;
-
-        function drawBreakpoint(ctx, disabled, conditional)
-        {
-            ctx.beginPath();
-            ctx.moveTo(0, 2);
-            ctx.lineTo(2, 0);
-            ctx.lineTo(21, 0);
-            ctx.lineTo(26, 5.5);
-            ctx.lineTo(21, 11);
-            ctx.lineTo(2, 11);
-            ctx.lineTo(0, 9);
-            ctx.closePath();
-            ctx.fillStyle = conditional ? "rgb(217, 142, 1)" : "rgb(1, 142, 217)";
-            ctx.strokeStyle = conditional ? "rgb(205, 103, 0)" : "rgb(0, 103, 205)";
-            ctx.lineWidth = 3;
-            ctx.fill();
-            ctx.save();
-            ctx.clip();
-            ctx.stroke();
-            ctx.restore();
-
-            if (!disabled)
-                return;
-
-            ctx.save();
-            ctx.globalCompositeOperation = "destination-out";
-            ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
-            ctx.fillRect(0, 0, 26, 11);
-            ctx.restore();
-        }
-
-
-        // Unconditional breakpoints.
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-
-        // Conditional breakpoints.
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-conditional", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, false, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-conditional-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, false, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-conditional", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true, true);
-
-        var ctx = this.element.contentDocument.getCSSCanvasContext("2d", "breakpoint-disabled-conditional-program-counter", 26, 11);
-        ctx.clearRect(0, 0, 26, 11);
-        drawBreakpoint(ctx, true, true);
-        ctx.clearRect(20, 0, 6, 11);
-        this._drawProgramCounterInContext(ctx, true);
-
-        delete this._needsBreakpointImages;
-    },
-
-    syntaxHighlightJavascript: function()
-    {
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var jsSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(table, this);
-        jsSyntaxHighlighter.process();
-    },
-
-    syntaxHighlightCSS: function()
-    {
-        var table = this.element.contentDocument.getElementsByTagName("table")[0];
-        if (!table)
-            return;
-
-        var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighlighter(table, this);
-        cssSyntaxHighlighter.process();
-    }
-}
-
-WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
-
-/* SourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceSyntaxHighlighter = function(table, sourceFrame)
-{
-    this.table = table;
-    this.sourceFrame = sourceFrame;
-}
-
-WebInspector.SourceSyntaxHighlighter.prototype = {
-    createSpan: function(content, className)
-    {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(content));
-        return span;
-    },
-
-    process: function()
-    {
-        // Split up the work into chunks so we don't block the
-        // UI thread while processing.
-
-        var rows = this.table.rows;
-        var rowsLength = rows.length;
-        const tokensPerChunk = 100;
-        const lineLengthLimit = 20000;
-        
-        var boundProcessChunk = processChunk.bind(this);
-        var processChunkInterval = setInterval(boundProcessChunk, 25);
-        boundProcessChunk();
-        
-        function processChunk()
-        {
-            for (var i = 0; i < tokensPerChunk; i++) {
-                if (this.cursor >= this.lineCode.length)
-                    moveToNextLine.call(this);
-                if (this.lineIndex >= rowsLength) {
-                    this.sourceFrame.dispatchEventToListeners("syntax highlighting complete");
-                    return;
-                }
-                if (this.cursor > lineLengthLimit) {
-                    var codeFragment = this.lineCode.substring(this.cursor);
-                    this.nonToken += codeFragment;
-                    this.cursor += codeFragment.length;
-                }
-
-                this.lex();
-            }
-        }
-        
-        function moveToNextLine()
-        {
-            this.appendNonToken();
-            
-            var row = rows[this.lineIndex];
-            var line = row ? row.cells[1] : null;
-            if (line && this.newLine) {
-                line.removeChildren();
-                
-                if (this.messageBubble)
-                    this.newLine.appendChild(this.messageBubble);
-                
-                line.parentNode.insertBefore(this.newLine, line);
-                line.parentNode.removeChild(line);
-                
-                this.newLine = null;
-            }
-            this.lineIndex++;
-            if (this.lineIndex >= rowsLength && processChunkInterval) {
-                clearInterval(processChunkInterval);
-                this.sourceFrame.dispatchEventToListeners("syntax highlighting complete");
-                return;
-            }
-            row = rows[this.lineIndex];
-            line = row ? row.cells[1] : null;
-            
-            this.messageBubble = null;
-            if (line.lastChild && line.lastChild.nodeType === Node.ELEMENT_NODE && line.lastChild.hasStyleClass("webkit-html-message-bubble")) {
-                this.messageBubble = line.lastChild;
-                line.removeChild(this.messageBubble);
-            }
-
-            this.lineCode = line.textContent;
-            this.newLine = line.cloneNode(false);
-            this.cursor = 0;
-            if (!line)
-                moveToNextLine();
-        }
-    },
-    
-    lex: function()
-    {
-        var token = null;
-        var codeFragment = this.lineCode.substring(this.cursor);
-        
-        for (var i = 0; i < this.rules.length; i++) {
-            var rule = this.rules[i];
-            var ruleContinueStateCondition = ("preContinueState" in rule) ? rule.preContinueState : this.ContinueState.None;
-            if (this.continueState !== ruleContinueStateCondition)
-                continue;
-            if (("preLexState" in rule) && this.lexState !== rule.preLexState)
-                continue;
-
-            var match = rule.pattern.exec(codeFragment);
-            if (match) {
-                token = match[0];
-                if (token && (!rule.keywords || (token in rule.keywords))) {
-                    this.cursor += token.length;
-                    if (rule.style) {
-                        this.appendNonToken();
-                        var elem = this.createSpan(token, rule.style);
-                        this.newLine.appendChild(elem);
-                        if (rule.callback)
-                            rule.callback.call(this, elem);
-                    } else
-                        this.nonToken += token;
-
-                    if ("postLexState" in rule)
-                        this.lexState = rule.postLexState;
-                    if ("postContinueState" in rule)
-                        this.continueState = rule.postContinueState;
-                    return;
-                }
-            }
-        }
-        this.nonToken += codeFragment[0];
-        this.cursor++;
-    },
-    
-    appendNonToken: function ()
-    {
-        if (this.nonToken.length > 0) {
-            this.newLine.appendChild(document.createTextNode(this.nonToken));
-            this.nonToken = "";
-        }
-    },
-    
-    syntaxHighlightNode: function(node)
-    {
-        this.lineCode = node.textContent;
-        node.removeChildren();
-        this.newLine = node;
-        this.cursor = 0;
-        while (true) {
-            if (this.cursor >= this.lineCode.length) {
-                var codeFragment = this.lineCode.substring(this.cursor);
-                this.nonToken += codeFragment;
-                this.cursor += codeFragment.length;
-                this.appendNonToken();
-                this.newLine = null;
-                return;
-            }
-
-            this.lex();
-        }
-    }
-}
-
-/* CSSSourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.CSSSourceSyntaxHighlighter = function(table, sourceFrame) {
-    WebInspector.SourceSyntaxHighlighter.call(this, table, sourceFrame);
-
-    this.LexState = {
-        Initial: 1,
-        DeclarationProperty: 2,
-        DeclarationValue: 3,
-        AtMedia: 4,
-        AtRule: 5,
-        AtKeyframes: 6
-    };
-    this.ContinueState = {
-        None: 0,
-        Comment: 1
-    };
-    
-    this.nonToken = "";
-    this.cursor = 0;
-    this.lineIndex = -1;
-    this.lineCode = "";
-    this.newLine = null;
-    this.lexState = this.LexState.Initial;
-    this.continueState = this.ContinueState.None;
-    
-    const urlPattern = /^url\(\s*(?:(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*')|(?:[!#$%&*-~\w]|(?:\\[\da-f]{1,6}\s?|\.))*)\s*\)/i;
-    const stringPattern = /^(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*')/i;
-    const identPattern = /^-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*/i;
-    const startBlockPattern = /^{/i;
-    const endBlockPattern = /^}/i;
-
-    const propertyKeywords = [
-        "background", "background-attachment", "background-clip", "background-color", "background-image",
-        "background-origin", "background-position", "background-position-x", "background-position-y",
-        "background-repeat", "background-repeat-x", "background-repeat-y", "background-size", "border",
-        "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius",
-        "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-left",
-        "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right",
-        "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style",
-        "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style",
-        "border-top-width", "border-width", "bottom", "caption-side", "clear", "clip", "color", "content",
-        "counter-increment", "counter-reset", "cursor", "direction", "display", "empty-cells", "float",
-        "font", "font-family", "font-size", "font-stretch", "font-style", "font-variant", "font-weight",
-        "height", "left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position",
-        "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "max-height",
-        "max-width", "min-height", "min-width", "opacity", "orphans", "outline", "outline-color", "outline-offset",
-        "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y", "padding", "padding-bottom",
-        "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before",
-        "page-break-inside", "pointer-events", "position", "quotes", "resize", "right", "size", "src",
-        "table-layout", "text-align", "text-decoration", "text-indent", "text-line-through", "text-line-through-color",
-        "text-line-through-mode", "text-line-through-style", "text-line-through-width", "text-overflow", "text-overline",
-        "text-overline-color", "text-overline-mode", "text-overline-style", "text-overline-width", "text-rendering",
-        "text-shadow", "text-transform", "text-underline", "text-underline-color", "text-underline-mode",
-        "text-underline-style", "text-underline-width", "top", "unicode-bidi", "unicode-range", "vertical-align",
-        "visibility", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "zoom",
-        "-webkit-animation", "-webkit-animation-delay", "-webkit-animation-direction", "-webkit-animation-duration",
-        "-webkit-animation-iteration-count", "-webkit-animation-name", "-webkit-animation-play-state",
-        "-webkit-animation-timing-function", "-webkit-appearance", "-webkit-backface-visibility",
-        "-webkit-background-clip", "-webkit-background-composite", "-webkit-background-origin", "-webkit-background-size",
-        "-webkit-binding", "-webkit-border-fit", "-webkit-border-horizontal-spacing", "-webkit-border-image",
-        "-webkit-border-radius", "-webkit-border-vertical-spacing", "-webkit-box-align", "-webkit-box-direction",
-        "-webkit-box-flex", "-webkit-box-flex-group", "-webkit-box-lines", "-webkit-box-ordinal-group",
-        "-webkit-box-orient", "-webkit-box-pack", "-webkit-box-reflect", "-webkit-box-shadow", "-webkit-box-sizing",
-        "-webkit-column-break-after", "-webkit-column-break-before", "-webkit-column-break-inside", "-webkit-column-count",
-        "-webkit-column-gap", "-webkit-column-rule", "-webkit-column-rule-color", "-webkit-column-rule-style",
-        "-webkit-column-rule-width", "-webkit-column-width", "-webkit-columns", "-webkit-font-size-delta",
-        "-webkit-font-smoothing", "-webkit-highlight", "-webkit-line-break", "-webkit-line-clamp",
-        "-webkit-margin-bottom-collapse", "-webkit-margin-collapse", "-webkit-margin-start", "-webkit-margin-top-collapse",
-        "-webkit-marquee", "-webkit-marquee-direction", "-webkit-marquee-increment", "-webkit-marquee-repetition",
-        "-webkit-marquee-speed", "-webkit-marquee-style", "-webkit-mask", "-webkit-mask-attachment",
-        "-webkit-mask-box-image", "-webkit-mask-clip", "-webkit-mask-composite", "-webkit-mask-image",
-        "-webkit-mask-origin", "-webkit-mask-position", "-webkit-mask-position-x", "-webkit-mask-position-y",
-        "-webkit-mask-repeat", "-webkit-mask-repeat-x", "-webkit-mask-repeat-y", "-webkit-mask-size",
-        "-webkit-match-nearest-mail-blockquote-color", "-webkit-nbsp-mode", "-webkit-padding-start",
-        "-webkit-perspective", "-webkit-perspective-origin", "-webkit-perspective-origin-x", "-webkit-perspective-origin-y",
-        "-webkit-rtl-ordering", "-webkit-text-decorations-in-effect", "-webkit-text-fill-color", "-webkit-text-security",
-        "-webkit-text-size-adjust", "-webkit-text-stroke", "-webkit-text-stroke-color", "-webkit-text-stroke-width",
-        "-webkit-transform", "-webkit-transform-origin", "-webkit-transform-origin-x", "-webkit-transform-origin-y",
-        "-webkit-transform-origin-z", "-webkit-transform-style", "-webkit-transition", "-webkit-transition-delay",
-        "-webkit-transition-duration", "-webkit-transition-property", "-webkit-transition-timing-function",
-        "-webkit-user-drag", "-webkit-user-modify", "-webkit-user-select", "-webkit-variable-declaration-block"
-    ].keySet();
-    
-    const valueKeywords = [
-        "inherit", "initial", "none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed",
-        "solid", "double", "caption", "icon", "menu", "message-box", "small-caption", "-webkit-mini-control",
-        "-webkit-small-control", "-webkit-control", "status-bar", "italic", "oblique", "all", "small-caps",
-        "normal", "bold", "bolder", "lighter", "xx-small", "x-small", "small", "medium", "large", "x-large",
-        "xx-large", "-webkit-xxx-large", "smaller", "larger", "wider", "narrower", "ultra-condensed",
-        "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded",
-        "ultra-expanded", "serif", "sans-serif", "cursive", "fantasy", "monospace", "-webkit-body", "aqua",
-        "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "orange", "purple",
-        "red", "silver", "teal", "white", "yellow", "transparent", "-webkit-link", "-webkit-activelink",
-        "activeborder", "activecaption", "appworkspace", "background", "buttonface", "buttonhighlight",
-        "buttonshadow", "buttontext", "captiontext", "graytext", "highlight", "highlighttext", "inactiveborder",
-        "inactivecaption", "inactivecaptiontext", "infobackground", "infotext", "match", "menutext", "scrollbar",
-        "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "window",
-        "windowframe", "windowtext", "-webkit-focus-ring-color", "currentcolor", "grey", "-webkit-text", "repeat",
-        "repeat-x", "repeat-y", "no-repeat", "clear", "copy", "source-over", "source-in", "source-out",
-        "source-atop", "destination-over", "destination-in", "destination-out", "destination-atop", "xor",
-        "plus-darker", "plus-lighter", "baseline", "middle", "sub", "super", "text-top", "text-bottom", "top",
-        "bottom", "-webkit-baseline-middle", "-webkit-auto", "left", "right", "center", "justify", "-webkit-left",
-        "-webkit-right", "-webkit-center", "outside", "inside", "disc", "circle", "square", "decimal",
-        "decimal-leading-zero", "lower-roman", "upper-roman", "lower-greek", "lower-alpha", "lower-latin",
-        "upper-alpha", "upper-latin", "hebrew", "armenian", "georgian", "cjk-ideographic", "hiragana", "katakana",
-        "hiragana-iroha", "katakana-iroha", "inline", "block", "list-item", "run-in", "compact", "inline-block",
-        "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row",
-        "table-column-group", "table-column", "table-cell", "table-caption", "-webkit-box", "-webkit-inline-box",
-        "-wap-marquee", "auto", "crosshair", "default", "pointer", "move", "vertical-text", "cell", "context-menu",
-        "alias", "progress", "no-drop", "not-allowed", "-webkit-zoom-in", "-webkit-zoom-out", "e-resize", "ne-resize",
-        "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "ew-resize", "ns-resize", "nesw-resize",
-        "nwse-resize", "col-resize", "row-resize", "text", "wait", "help", "all-scroll", "-webkit-grab", "-webkit-grabbing",
-        "ltr", "rtl", "capitalize", "uppercase", "lowercase", "visible", "collapse", "above", "absolute", "always",
-        "avoid", "below", "bidi-override", "blink", "both", "close-quote", "crop", "cross", "embed", "fixed", "hand",
-        "hide", "higher", "invert", "landscape", "level", "line-through", "local", "loud", "lower", "-webkit-marquee",
-        "mix", "no-close-quote", "no-open-quote", "nowrap", "open-quote", "overlay", "overline", "portrait", "pre",
-        "pre-line", "pre-wrap", "relative", "scroll", "separate", "show", "static", "thick", "thin", "underline",
-        "-webkit-nowrap", "stretch", "start", "end", "reverse", "horizontal", "vertical", "inline-axis", "block-axis",
-        "single", "multiple", "forwards", "backwards", "ahead", "up", "down", "slow", "fast", "infinite", "slide",
-        "alternate", "read-only", "read-write", "read-write-plaintext-only", "element", "ignore", "intrinsic",
-        "min-intrinsic", "clip", "ellipsis", "discard", "dot-dash", "dot-dot-dash", "wave", "continuous",
-        "skip-white-space", "break-all", "break-word", "space", "after-white-space", "checkbox", "radio", "push-button",
-        "square-button", "button", "button-bevel", "default-button", "list-button", "listbox", "listitem", 
-        "media-fullscreen-button", "media-mute-button", "media-play-button", "media-seek-back-button",
-        "media-seek-forward-button", "media-rewind-button", "media-return-to-realtime-button", "media-slider",
-        "media-sliderthumb", "media-volume-slider-container", "media-volume-slider", "media-volume-sliderthumb",
-        "media-controls-background", "media-current-time-display", "media-time-remaining-display", "menulist",
-        "menulist-button", "menulist-text", "menulist-textfield", "slider-horizontal", "slider-vertical",
-        "sliderthumb-horizontal", "sliderthumb-vertical", "caret", "searchfield", "searchfield-decoration", 
-        "searchfield-results-decoration", "searchfield-results-button", "searchfield-cancel-button", "textfield",
-        "textarea", "caps-lock-indicator", "round", "border", "border-box", "content", "content-box", "padding",
-        "padding-box", "contain", "cover", "logical", "visual", "lines", "running", "paused", "flat", "preserve-3d",
-        "ease", "linear", "ease-in", "ease-out", "ease-in-out", "document", "reset", "visiblePainted", "visibleFill",
-        "visibleStroke", "painted", "fill", "stroke", "antialiased", "subpixel-antialiased", "optimizeSpeed",
-        "optimizeLegibility", "geometricPrecision"
-    ].keySet();
-
-    const mediaTypes = ["all", "aural", "braille", "embossed", "handheld", "print", "projection", "screen", "tty", "tv"].keySet();
-
-    this.rules = [{
-        name: "commentAction",
-        pattern: /^\/\*[^\*]*\*+([^\/*][^*]*\*+)*\//i,
-        style: "webkit-css-comment"
-    }, {
-        name: "commentStartAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*)/i,
-        style: "webkit-css-comment",
-        postContinueState: this.ContinueState.Comment
-    }, {
-        name: "commentEndAction",
-        pattern: /^(?:(?:[^\*]|\*[^\/])*\*+\/)/i,
-        style: "webkit-css-comment",
-        preContinueState: this.ContinueState.Comment,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "commentMiddleAction",
-        pattern: /^.*/i,
-        style: "webkit-css-comment",
-        preContinueState: this.ContinueState.Comment
-    }, {
-        name: "selectorAction",
-        pattern: /^(?:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\*)(?:#-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\.-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\[\s*-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*(?:(?:=|~=|\|=)\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*'))\s*)?\]|:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\(\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*)?\)))*|(?:#-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\.-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|\[\s*-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*(?:(?:=|~=|\|=)\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|(?:"(?:[^\\\"]|(?:\\[\da-f]{1,6}\s?|\.))*"|'(?:[^\\\']|(?:\\[\da-f]{1,6}\s?|\.))*'))\s*)?\]|:(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*|-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\(\s*(?:-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*\s*)?\)))+)/i,
-        style: "webkit-css-selector",
-        preLexState: this.LexState.Initial
-    }, {
-        name: "startRulesetBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.DeclarationProperty
-    }, {
-        name: "propertyAction",
-        pattern: identPattern,
-        style: "webkit-css-property",
-        keywords: propertyKeywords,
-        preLexState: this.LexState.DeclarationProperty,
-    }, {
-        name: "declarationColonAction",
-        pattern: /^:/i,
-        preLexState: this.LexState.DeclarationProperty,
-        postLexState: this.LexState.DeclarationValue
-    }, {
-        name: "colorAction",
-        pattern: /^(?:#(?:[\da-f]{6}|[\da-f]{3})|rgba\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|hsla\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|rgb\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\)|hsl\(\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*,\s*(?:\d+|\d*\.\d+)%?\s*\))/i,
-        style: "webkit-css-color",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "numvalueAction",
-        pattern: /^(?:-?(?:\d+|\d*\.\d+)(?:em|rem|__qem|ex|px|cm|mm|in|pt|pc|deg|rad|grad|turn|ms|s|Hz|kHz|%)?)/i,
-        style: "webkit-css-number",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "urlAction",
-        pattern: urlPattern,
-        style: "webkit-css-url",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "importantAction",
-        pattern: /^!\s*important/i,
-        style: "webkit-css-important",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "valueIdentAction",
-        pattern: identPattern,
-        keywords: valueKeywords,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.DeclarationValue
-    }, {
-        name: "declarationSemicolonAction",
-        pattern: /^;/i,
-        preLexState: this.LexState.DeclarationValue,
-        postLexState: this.LexState.DeclarationProperty
-    }, {
-        name: "endRulesetBlockAction",
-        pattern: endBlockPattern,
-        preLexState: this.LexState.DeclarationProperty,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atMediaAction",
-        pattern: /^@media/i,
-        style: "webkit-css-at-rule",
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtMedia
-    }, {
-        name: "startAtMediaBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtMedia,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atKeyframesAction",
-        pattern: /^@-webkit-keyframes/i,
-        style: "webkit-css-at-rule",
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtKeyframes
-    }, {
-        name: "startAtKeyframesBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtKeyframes,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "atRuleAction",
-        style: "webkit-css-at-rule",
-        pattern: /^@-?(?:\w|(?:\\[\da-f]{1,6}\s?|\.))(?:[-\w]|(?:\\[\da-f]{1,6}\s?|\.))*/i,
-        preLexState: this.LexState.Initial,
-        postLexState: this.LexState.AtRule
-    }, {
-        name: "endAtRuleAction",
-        pattern: /^;/i,
-        preLexState: this.LexState.AtRule,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "urlAction",
-        pattern: urlPattern,
-        style: "webkit-css-url",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "stringAction",
-        pattern: stringPattern,
-        style: "webkit-css-string",
-        preLexState: this.LexState.AtKeyframes
-    }, {
-        name: "atRuleIdentAction",
-        pattern: identPattern,
-        keywords: mediaTypes,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.AtRule
-    }, {
-        name: "atRuleIdentAction",
-        pattern: identPattern,
-        keywords: mediaTypes,
-        style: "webkit-css-keyword",
-        preLexState: this.LexState.AtMedia,
-    }, {
-        name: "startAtRuleBlockAction",
-        pattern: startBlockPattern,
-        preLexState: this.LexState.AtRule,
-        postLexState: this.LexState.DeclarationProperty
-    }];
-}
-
-WebInspector.CSSSourceSyntaxHighlighter.prototype.__proto__ = WebInspector.SourceSyntaxHighlighter.prototype;
-
-/* JavaScriptSourceSyntaxHighlighter.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.JavaScriptSourceSyntaxHighlighter = function(table, sourceFrame) {
-    WebInspector.SourceSyntaxHighlighter.call(this, table, sourceFrame);
-
-    this.LexState = {
-        Initial: 1,
-        DivisionAllowed: 2,
-    };
-    this.ContinueState = {
-        None: 0,
-        Comment: 1,
-        SingleQuoteString: 2,
-        DoubleQuoteString: 3,
-        RegExp: 4
-    };
-    
-    this.nonToken = "";
-    this.cursor = 0;
-    this.lineIndex = -1;
-    this.lineCode = "";
-    this.newLine = null;
-    this.lexState = this.LexState.Initial;
-    this.continueState = this.ContinueState.None;
-
-    const keywords = [
-        "null", "true", "false", "break", "case", "catch", "const", "default", "finally", "for",
-        "instanceof", "new", "var", "continue", "function", "return", "void", "delete", "if",
-        "this", "do", "while", "else", "in", "switch", "throw", "try", "typeof", "debugger",
-        "class", "enum", "export", "extends", "import", "super", "get", "set"
-    ].keySet();
-
-    this.rules = [{
-        name: "singleLineCommentAction",
-        pattern: /^(?:\/\/.*)/,
-        style: "webkit-javascript-comment"
-    }, {
-        name: "multiLineSingleLineCommentAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*\*+\/)/,
-        style: "webkit-javascript-comment"
-    }, {
-        name: "multiLineCommentStartAction",
-        pattern: /^(?:\/\*(?:[^\*]|\*[^\/])*)/,
-        style: "webkit-javascript-comment",
-        postContinueState: this.ContinueState.Comment
-    }, {
-        name: "multiLineCommentEndAction",
-        pattern: /^(?:(?:[^\*]|\*[^\/])*\*+\/)/,
-        style: "webkit-javascript-comment",
-        preContinueState: this.ContinueState.Comment,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "multiLineCommentMiddleAction",
-        pattern: /^.*/,
-        style: "webkit-javascript-comment",
-        preContinueState: this.ContinueState.Comment
-    }, {
-        name: "numericLiteralAction",
-        pattern: /^(?:(?:0|[1-9]\d*)\.\d+?(?:[eE](?:\d+|\+\d+|-\d+))?|\.\d+(?:[eE](?:\d+|\+\d+|-\d+))?|(?:0|[1-9]\d*)(?:[eE](?:\d+|\+\d+|-\d+))?|0x[0-9a-fA-F]+|0X[0-9a-fA-F]+)/,
-        style: "webkit-javascript-number",
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "stringLiteralAction",
-        pattern: /^(?:"(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*"|'(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*')/,
-        style: "webkit-javascript-string",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "singleQuoteStringStartAction",
-        pattern: /^(?:'(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        postContinueState:  this.ContinueState.SingleQuoteString
-    }, {
-        name: "singleQuoteStringEndAction",
-        pattern: /^(?:(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*')/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.SingleQuoteString,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "singleQuoteStringMiddleAction",
-        pattern: /^(?:(?:[^'\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.SingleQuoteString
-    }, {
-        name: "doubleQuoteStringStartAction",
-        pattern: /^(?:"(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        postContinueState: this.ContinueState.DoubleQuoteString
-    }, {
-        name: "doubleQuoteStringEndAction",
-        pattern: /^(?:(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*")/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.DoubleQuoteString,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "doubleQuoteStringMiddleAction",
-        pattern: /^(?:(?:[^"\\]|\\(?:['"\bfnrtv]|[^'"\bfnrtv0-9xu]|0|x[0-9a-fA-F][0-9a-fA-F]|(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])))*)\\$/,
-        style: "webkit-javascript-string",
-        preContinueState: this.ContinueState.DoubleQuoteString
-    }, {
-        name: "keywordAction",
-        pattern: /^(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        keywords: keywords,
-        style: "webkit-javascript-keyword",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "identAction",
-        pattern: /^(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-ident",
-        callback: function(identElement) { identElement.addEventListener("mouseover", showDatatip, false); },
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "rightParenAction",
-        pattern: /^\)/,
-        postLexState: this.LexState.DivisionAllowed
-    }, {
-        name: "punctuatorAction",
-        pattern: /^(?:<=|>=|===|==|!=|!==|\+\+|\-\-|<<|>>|>>>|&&|\|\||\+=|\-=|\*=|%=|<<=|>>=|>>>=|&=|\|=|^=|[{}\(\[\]\.;,<>\+\-\*%&\|\^!~\?:=])/,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "divPunctuatorAction",
-        pattern: /^(?:\/=?)/,
-        preLexState: this.LexState.DivisionAllowed,
-        postLexState: this.LexState.Initial
-    }, {
-        name: "regExpLiteralAction",
-        pattern: /^(?:\/(?:(?:\\.)|[^\\*\/])(?:(?:\\.)|[^\\/])*\/(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-regexp",
-        postLexState: this.LexState.Initial
-    }, {
-        name: "regExpStartAction",
-        pattern: /^(?:\/(?:(?:\\.)|[^\\*\/])(?:(?:\\.)|[^\\/])*)\\$/,
-        style: "webkit-javascript-regexp",
-        postContinueState: this.ContinueState.RegExp
-    }, {
-        name: "regExpEndAction",
-        pattern: /^(?:(?:(?:\\.)|[^\\/])*\/(?:(?:[a-zA-Z]|[$_]|\\(?:u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]))|[0-9])*)/,
-        style: "webkit-javascript-regexp",
-        preContinueState: this.ContinueState.RegExp,
-        postContinueState: this.ContinueState.None
-    }, {
-        name: "regExpMiddleAction",
-        pattern: /^(?:(?:(?:\\.)|[^\\/])*)\\$/,
-        style: "webkit-javascript-regexp",
-        preContinueState: this.ContinueState.RegExp
-    }];
-
-    function showDatatip(event) {
-        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
-            return;
-
-        var node = event.target;
-        var parts = [node.textContent];
-        while (node.previousSibling && node.previousSibling.textContent === ".") {
-            node = node.previousSibling.previousSibling;
-            if (!node || !node.hasStyleClass("webkit-javascript-ident"))
-                break;
-            parts.unshift(node.textContent);
-        }
-
-        var expression = parts.join(".");
-
-        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", callback);
-        function callback(result, exception)
-        {
-            if (exception)
-                return;
-            event.target.setAttribute("title", result.description);
-            event.target.addEventListener("mouseout", onmouseout, false);
-            
-            function onmouseout(event)
-            {
-                event.target.removeAttribute("title");
-                event.target.removeEventListener("mouseout", onmouseout, false);
-            }
-        }
-    }
-}
-
-WebInspector.JavaScriptSourceSyntaxHighlighter.prototype.__proto__ = WebInspector.SourceSyntaxHighlighter.prototype;
-
-/* SourceView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.SourceView = function(resource)
-{
-    // Set the sourceFrame first since WebInspector.ResourceView will set headersVisible
-    // and our override of headersVisible needs the sourceFrame.
-    this.sourceFrame = new WebInspector.SourceFrame(null, this._addBreakpoint.bind(this));
-
-    WebInspector.ResourceView.call(this, resource);
-
-    resource.addEventListener("finished", this._resourceLoadingFinished, this);
-
-    this.element.addStyleClass("source");
-
-    this._frameNeedsSetup = true;
-
-    this.contentElement.appendChild(this.sourceFrame.element);
-
-    var gutterElement = document.createElement("div");
-    gutterElement.className = "webkit-line-gutter-backdrop";
-    this.element.appendChild(gutterElement);
-}
-
-WebInspector.SourceView.prototype = {
-    set headersVisible(x)
-    {
-        if (x === this._headersVisible)
-            return;
-
-        var superSetter = WebInspector.ResourceView.prototype.__lookupSetter__("headersVisible");
-        if (superSetter)
-            superSetter.call(this, x);
-
-        this.sourceFrame.autoSizesToFitContentHeight = x;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.ResourceView.prototype.show.call(this, parentElement);
-        this.setupSourceFrameIfNeeded();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.sourceFrame.autoSizesToFitContentHeight)
-            this.sourceFrame.sizeToFitContentHeight();
-    },
-
-    detach: function()
-    {
-        WebInspector.ResourceView.prototype.detach.call(this);
-
-        // FIXME: We need to mark the frame for setup on detach because the frame DOM is cleared
-        // when it is removed from the document. Is this a bug?
-        this._frameNeedsSetup = true;
-        this._sourceFrameSetup = false;
-    },
-
-    setupSourceFrameIfNeeded: function()
-    {
-        if (!this._frameNeedsSetup)
-            return;
-
-        this.attach();
-
-        delete this._frameNeedsSetup;
-        this.sourceFrame.addEventListener("content loaded", this._contentLoaded, this);
-        InspectorFrontendHost.addResourceSourceToFrame(this.resource.identifier, this.sourceFrame.element);
-    },
-    
-    _contentLoaded: function()
-    {
-        delete this._frameNeedsSetup;
-        this.sourceFrame.removeEventListener("content loaded", this._contentLoaded, this);
-        
-        if (this.resource.type === WebInspector.Resource.Type.Script
-            || this.resource.mimeType === "application/json"
-            || this.resource.mimeType === "application/javascript"
-            || /\.js(on)?$/.test(this.resource.lastPathComponent) ) {
-            this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-            this.sourceFrame.syntaxHighlightJavascript();
-        } else if (this.resource.type === WebInspector.Resource.Type.Stylesheet
-            || this.resource.mimeType === "text/css"
-            || /\.css$/.test(this.resource.lastPathComponent) ) {
-            this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-            this.sourceFrame.syntaxHighlightCSS();
-        } else
-            this._sourceFrameSetupFinished();
-    },
-
-    _resourceLoadingFinished: function(event)
-    {
-        this._frameNeedsSetup = true;
-        this._sourceFrameSetup = false;
-        if (this.visible)
-            this.setupSourceFrameIfNeeded();
-        this.resource.removeEventListener("finished", this._resourceLoadingFinished, this);
-    },
-
-    _addBreakpoint: function(line)
-    {
-        var sourceID = null;
-        var closestStartingLine = 0;
-        var scripts = this.resource.scripts;
-        for (var i = 0; i < scripts.length; ++i) {
-            var script = scripts[i];
-            if (script.startingLine <= line && script.startingLine >= closestStartingLine) {
-                closestStartingLine = script.startingLine;
-                sourceID = script.sourceID;
-            }
-        }
-
-        if (WebInspector.panels.scripts) {
-            var breakpoint = new WebInspector.Breakpoint(this.resource.url, line, sourceID);
-            WebInspector.panels.scripts.addBreakpoint(breakpoint);
-        }
-    },
-
-    // The rest of the methods in this prototype need to be generic enough to work with a ScriptView.
-    // The ScriptView prototype pulls these methods into it's prototype to avoid duplicate code.
-
-    searchCanceled: function()
-    {
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-        delete this._delayedFindSearchMatches;
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        var lineQueryRegex = /(^|\s)(?:#|line:\s*)(\d+)(\s|$)/i;
-        var lineQueryMatch = query.match(lineQueryRegex);
-        if (lineQueryMatch) {
-            var lineToSearch = parseInt(lineQueryMatch[2]);
-
-            // If there was a space before and after the line query part, replace with a space.
-            // Otherwise replace with an empty string to eat the prefix or postfix space.
-            var lineQueryReplacement = (lineQueryMatch[1] && lineQueryMatch[3] ? " " : "");
-            var filterlessQuery = query.replace(lineQueryRegex, lineQueryReplacement);
-        }
-
-        this._searchFinishedCallback = finishedCallback;
-
-        function findSearchMatches(query, finishedCallback)
-        {
-            if (isNaN(lineToSearch)) {
-                // Search the whole document since there was no line to search.
-                this._searchResults = (InspectorFrontendHost.search(this.sourceFrame.element.contentDocument, query) || []);
-            } else {
-                var sourceRow = this.sourceFrame.sourceRow(lineToSearch);
-                if (sourceRow) {
-                    if (filterlessQuery) {
-                        // There is still a query string, so search for that string in the line.
-                        this._searchResults = (InspectorFrontendHost.search(sourceRow, filterlessQuery) || []);
-                    } else {
-                        // Match the whole line, since there was no remaining query string to match.
-                        var rowRange = this.sourceFrame.element.contentDocument.createRange();
-                        rowRange.selectNodeContents(sourceRow);
-                        this._searchResults = [rowRange];
-                    }
-                }
-
-                // Attempt to search for the whole query, just incase it matches a color like "#333".
-                var wholeQueryMatches = InspectorFrontendHost.search(this.sourceFrame.element.contentDocument, query);
-                if (wholeQueryMatches)
-                    this._searchResults = this._searchResults.concat(wholeQueryMatches);
-            }
-
-            if (this._searchResults)
-                finishedCallback(this, this._searchResults.length);
-        }
-
-        if (!this._sourceFrameSetup) {
-            // The search is performed in _sourceFrameSetupFinished by calling _delayedFindSearchMatches.
-            this._delayedFindSearchMatches = findSearchMatches.bind(this, query, finishedCallback);
-            this.setupSourceFrameIfNeeded();
-            return;
-        }
-
-        findSearchMatches.call(this, query, finishedCallback);
-    },
-
-    jumpToFirstSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToLastSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    showingFirstSearchResult: function()
-    {
-        return (this._currentSearchResultIndex === 0);
-    },
-
-    showingLastSearchResult: function()
-    {
-        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
-    },
-
-    revealLine: function(lineNumber)
-    {
-        this.setupSourceFrameIfNeeded();
-        this.sourceFrame.revealLine(lineNumber);
-    },
-
-    highlightLine: function(lineNumber)
-    {
-        this.setupSourceFrameIfNeeded();
-        this.sourceFrame.highlightLine(lineNumber);
-    },
-
-    addMessage: function(msg)
-    {
-        this.sourceFrame.addMessage(msg);
-    },
-
-    clearMessages: function()
-    {
-        this.sourceFrame.clearMessages();
-    },
-
-    _jumpToSearchResult: function(index)
-    {
-        var foundRange = this._searchResults[index];
-        if (!foundRange)
-            return;
-
-        var selection = this.sourceFrame.element.contentWindow.getSelection();
-        selection.removeAllRanges();
-        selection.addRange(foundRange);
-
-        if (foundRange.startContainer.scrollIntoViewIfNeeded)
-            foundRange.startContainer.scrollIntoViewIfNeeded(true);
-        else if (foundRange.startContainer.parentNode)
-            foundRange.startContainer.parentNode.scrollIntoViewIfNeeded(true);
-    },
-
-    _sourceFrameSetupFinished: function()
-    {
-        this._sourceFrameSetup = true;
-        if (this._delayedFindSearchMatches) {
-            this._delayedFindSearchMatches();
-            delete this._delayedFindSearchMatches;
-        }
-    },
-
-    _syntaxHighlightingComplete: function(event)
-    {
-        this._sourceFrameSetupFinished();
-        this.sourceFrame.removeEventListener("syntax highlighting complete", null, this);
-    }
-}
-
-WebInspector.SourceView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* FontView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.FontView = function(resource)
-{
-    WebInspector.ResourceView.call(this, resource);
-
-    this.element.addStyleClass("font");
-
-    var uniqueFontName = "WebInspectorFontPreview" + this.resource.identifier;
-
-    this.fontStyleElement = document.createElement("style");
-    this.fontStyleElement.textContent = "@font-face { font-family: \"" + uniqueFontName + "\"; src: url(" + this.resource.url + "); }";
-    document.head.appendChild(this.fontStyleElement);
-
-    this.fontPreviewElement = document.createElement("div");
-    this.fontPreviewElement.className = "preview";
-    this.contentElement.appendChild(this.fontPreviewElement);
-
-    this.fontPreviewElement.style.setProperty("font-family", uniqueFontName, null);
-    this.fontPreviewElement.innerHTML = "ABCDEFGHIJKLM<br>NOPQRSTUVWXYZ<br>abcdefghijklm<br>nopqrstuvwxyz<br>1234567890";
-
-    this.updateFontPreviewSize();
-}
-
-WebInspector.FontView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.ResourceView.prototype.show.call(this, parentElement);
-        this.updateFontPreviewSize();
-    },
-
-    resize: function()
-    {
-        this.updateFontPreviewSize();
-    },
-
-    updateFontPreviewSize: function ()
-    {
-        if (!this.fontPreviewElement || !this.visible)
-            return;
-
-        this.fontPreviewElement.removeStyleClass("preview");
-
-        var measureFontSize = 50;
-        this.fontPreviewElement.style.setProperty("position", "absolute", null);
-        this.fontPreviewElement.style.setProperty("font-size", measureFontSize + "px", null);
-        this.fontPreviewElement.style.removeProperty("height");
-
-        var height = this.fontPreviewElement.offsetHeight;
-        var width = this.fontPreviewElement.offsetWidth;
-
-        var containerWidth = this.contentElement.offsetWidth;
-
-        // Subtract some padding. This should match the padding in the CSS plus room for the scrollbar.
-        containerWidth -= 40;
-
-        if (!height || !width || !containerWidth) {
-            this.fontPreviewElement.style.removeProperty("font-size");
-            this.fontPreviewElement.style.removeProperty("position");
-            this.fontPreviewElement.addStyleClass("preview");
-            return;
-        }
-
-        var lineCount = this.fontPreviewElement.getElementsByTagName("br").length + 1;
-        var realLineHeight = Math.floor(height / lineCount);
-        var fontSizeLineRatio = measureFontSize / realLineHeight;
-        var widthRatio = containerWidth / width;
-        var finalFontSize = Math.floor(realLineHeight * widthRatio * fontSizeLineRatio) - 1;
-
-        this.fontPreviewElement.style.setProperty("font-size", finalFontSize + "px", null);
-        this.fontPreviewElement.style.setProperty("height", this.fontPreviewElement.offsetHeight + "px", null);
-        this.fontPreviewElement.style.removeProperty("position");
-
-        this.fontPreviewElement.addStyleClass("preview");
-    }
-}
-
-WebInspector.FontView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* ImageView.js */
-
-/*
- * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ImageView = function(resource)
-{
-    WebInspector.ResourceView.call(this, resource);
-
-    this.element.addStyleClass("image");
-
-    var container = document.createElement("div");
-    container.className = "image";
-    this.contentElement.appendChild(container);
-
-    this.imagePreviewElement = document.createElement("img");
-    this.imagePreviewElement.addStyleClass("resource-image-view");
-    this.imagePreviewElement.setAttribute("src", this.resource.url);
-
-    container.appendChild(this.imagePreviewElement);
-
-    container = document.createElement("div");
-    container.className = "info";
-    this.contentElement.appendChild(container);
-
-    var imageNameElement = document.createElement("h1");
-    imageNameElement.className = "title";
-    imageNameElement.textContent = this.resource.displayName;
-    container.appendChild(imageNameElement);
-
-    var infoListElement = document.createElement("dl");
-    infoListElement.className = "infoList";
-
-    var imageProperties = [
-        { name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", this.imagePreviewElement.naturalWidth, this.imagePreviewElement.height) },
-        { name: WebInspector.UIString("File size"), value: Number.bytesToString(this.resource.contentLength, WebInspector.UIString.bind(WebInspector)) },
-        { name: WebInspector.UIString("MIME type"), value: this.resource.mimeType }
-    ];
-
-    var listHTML = '';
-    for (var i = 0; i < imageProperties.length; ++i)
-        listHTML += "<dt>" + imageProperties[i].name + "</dt><dd>" + imageProperties[i].value + "</dd>";
-
-    infoListElement.innerHTML = listHTML;
-    container.appendChild(infoListElement);
-}
-
-WebInspector.ImageView.prototype = {
-    
-}
-
-WebInspector.ImageView.prototype.__proto__ = WebInspector.ResourceView.prototype;
-
-/* DatabaseTableView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DatabaseTableView = function(database, tableName)
-{
-    WebInspector.View.call(this);
-
-    this.database = database;
-    this.tableName = tableName;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("table");
-
-    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
-    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
-}
-
-WebInspector.DatabaseTableView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.update();
-    },
-
-    get statusBarItems()
-    {
-        return [this.refreshButton];
-    },
-
-    update: function()
-    {
-        this.database.executeSql("SELECT * FROM " + this.tableName, this._queryFinished.bind(this), this._queryError.bind(this));
-    },
-
-    _queryFinished: function(result)
-    {
-        this.element.removeChildren();
-
-        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
-        if (!dataGrid) {
-            var emptyMsgElement = document.createElement("div");
-            emptyMsgElement.className = "storage-table-empty";
-            emptyMsgElement.textContent = WebInspector.UIString("The “%s”\ntable is empty.", this.tableName);
-            this.element.appendChild(emptyMsgElement);
-            return;
-        }
-
-        this.element.appendChild(dataGrid.element);
-    },
-
-    _queryError: function(error)
-    {
-        this.element.removeChildren();
-
-        var errorMsgElement = document.createElement("div");
-        errorMsgElement.className = "storage-table-error";
-        errorMsgElement.textContent = WebInspector.UIString("An error occurred trying to\nread the “%s” table.", this.tableName);
-        this.element.appendChild(errorMsgElement);
-    },
-
-    _refreshButtonClicked: function(event)
-    {
-        this.update();
-    }
-}
-
-WebInspector.DatabaseTableView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* DatabaseQueryView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DatabaseQueryView = function(database)
-{
-    WebInspector.View.call(this);
-
-    this.database = database;
-
-    this.element.addStyleClass("storage-view");
-    this.element.addStyleClass("query");
-    this.element.tabIndex = 0;
-
-    this.element.addEventListener("selectstart", this._selectStart.bind(this), false);
-
-    this.promptElement = document.createElement("div");
-    this.promptElement.className = "database-query-prompt";
-    this.promptElement.appendChild(document.createElement("br"));
-    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
-    this.element.appendChild(this.promptElement);
-
-    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " ");
-}
-
-WebInspector.DatabaseQueryView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-
-        function moveBackIfOutside()
-        {
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-        }
-
-        setTimeout(moveBackIfOutside.bind(this), 0);
-    },
-
-    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
-    {
-        var prefix = wordRange.toString().toLowerCase();
-        if (!prefix.length)
-            return;
-
-        var results = [];
-
-        function accumulateMatches(textArray)
-        {
-            if (bestMatchOnly && results.length)
-                return;
-            for (var i = 0; i < textArray.length; ++i) {
-                var text = textArray[i].toLowerCase();
-                if (text.length < prefix.length)
-                    continue;
-                if (text.indexOf(prefix) !== 0)
-                    continue;
-                results.push(textArray[i]);
-                if (bestMatchOnly)
-                    return;
-            }
-        }
-        
-        function tableNamesCallback(tableNames)
-        {
-            accumulateMatches(tableNames.map(function(name) { return name + " " }));
-            accumulateMatches(["SELECT ", "FROM ", "WHERE ", "LIMIT ", "DELETE FROM ", "CREATE ", "DROP ", "TABLE ", "INDEX ", "UPDATE ", "INSERT INTO ", "VALUES ("]);
-
-            completionsReadyCallback(results);
-        }
-        this.database.getTableNames(tableNamesCallback);
-    },
-
-    _promptKeyDown: function(event)
-    {
-        if (isEnterKey(event)) {
-            this._enterKeyPressed(event);
-            return;
-        }
-    },
-
-    _selectStart: function(event)
-    {
-        if (this._selectionTimeout)
-            clearTimeout(this._selectionTimeout);
-
-        this.prompt.clearAutoComplete();
-
-        function moveBackIfOutside()
-        {
-            delete this._selectionTimeout;
-            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
-                this.prompt.moveCaretToEndOfPrompt();
-            this.prompt.autoCompleteSoon();
-        }
-
-        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
-    },
-
-    _enterKeyPressed: function(event)
-    {
-        event.preventDefault();
-        event.stopPropagation();
-
-        this.prompt.clearAutoComplete(true);
-
-        var query = this.prompt.text;
-        if (!query.length)
-            return;
-
-        this.prompt.history.push(query);
-        this.prompt.historyOffset = 0;
-        this.prompt.text = "";
-
-        this.database.executeSql(query, this._queryFinished.bind(this, query), this._queryError.bind(this, query));
-    },
-
-    _queryFinished: function(query, result)
-    {
-        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
-        if (!dataGrid)
-            return;
-        dataGrid.element.addStyleClass("inline");
-        this._appendQueryResult(query, dataGrid.element);
-
-        if (query.match(/^create /i) || query.match(/^drop table /i))
-            WebInspector.panels.storage.updateDatabaseTables(this.database);
-    },
-
-    _queryError: function(query, error)
-    {
-        if (error.code == 1)
-            var message = error.message;
-        else if (error.code == 2)
-            var message = WebInspector.UIString("Database no longer has expected version.");
-        else
-            var message = WebInspector.UIString("An unexpected error %s occurred.", error.code);
-
-        this._appendQueryResult(query, message, "error");
-    },
-
-    _appendQueryResult: function(query, result, resultClassName)
-    {
-        var element = document.createElement("div");
-        element.className = "database-user-query";
-
-        var commandTextElement = document.createElement("span");
-        commandTextElement.className = "database-query-text";
-        commandTextElement.textContent = query;
-        element.appendChild(commandTextElement);
-
-        var resultElement = document.createElement("div");
-        resultElement.className = "database-query-result";
-
-        if (resultClassName)
-            resultElement.addStyleClass(resultClassName);
-
-        if (typeof result === "string" || result instanceof String)
-            resultElement.textContent = result;
-        else if (result && result.nodeName)
-            resultElement.appendChild(result);
-
-        if (resultElement.childNodes.length)
-            element.appendChild(resultElement);
-
-        this.element.insertBefore(element, this.promptElement);
-        this.promptElement.scrollIntoView(false);
-    }
-}
-
-WebInspector.DatabaseQueryView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ScriptView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScriptView = function(script)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("script-view");
-
-    this.script = script;
-
-    this._frameNeedsSetup = true;
-    this._sourceFrameSetup = false;
-
-    this.sourceFrame = new WebInspector.SourceFrame(null, this._addBreakpoint.bind(this));
-
-    this.element.appendChild(this.sourceFrame.element);
-}
-
-WebInspector.ScriptView.prototype = {
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.setupSourceFrameIfNeeded();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    setupSourceFrameIfNeeded: function()
-    {
-        if (!this._frameNeedsSetup)
-            return;
-
-        this.attach();
-
-        if (!InspectorFrontendHost.addSourceToFrame("text/javascript", this.script.source, this.sourceFrame.element))
-            return;
-
-        delete this._frameNeedsSetup;
-
-        this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
-        this.sourceFrame.syntaxHighlightJavascript();
-    },
-
-    attach: function()
-    {
-        if (!this.element.parentNode)
-            document.getElementById("script-resource-views").appendChild(this.element);
-    },
-
-    _addBreakpoint: function(line)
-    {
-        var breakpoint = new WebInspector.Breakpoint(this.script.sourceURL, line, this.script.sourceID);
-        WebInspector.panels.scripts.addBreakpoint(breakpoint);
-    },
-
-    // The follow methods are pulled from SourceView, since they are
-    // generic and work with ScriptView just fine.
-
-    revealLine: WebInspector.SourceView.prototype.revealLine,
-    highlightLine: WebInspector.SourceView.prototype.highlightLine,
-    addMessage: WebInspector.SourceView.prototype.addMessage,
-    clearMessages: WebInspector.SourceView.prototype.clearMessages,
-    searchCanceled: WebInspector.SourceView.prototype.searchCanceled,
-    performSearch: WebInspector.SourceView.prototype.performSearch,
-    jumpToFirstSearchResult: WebInspector.SourceView.prototype.jumpToFirstSearchResult,
-    jumpToLastSearchResult: WebInspector.SourceView.prototype.jumpToLastSearchResult,
-    jumpToNextSearchResult: WebInspector.SourceView.prototype.jumpToNextSearchResult,
-    jumpToPreviousSearchResult: WebInspector.SourceView.prototype.jumpToPreviousSearchResult,
-    showingFirstSearchResult: WebInspector.SourceView.prototype.showingFirstSearchResult,
-    showingLastSearchResult: WebInspector.SourceView.prototype.showingLastSearchResult,
-    _jumpToSearchResult: WebInspector.SourceView.prototype._jumpToSearchResult,
-    _sourceFrameSetupFinished: WebInspector.SourceView.prototype._sourceFrameSetupFinished,
-    _syntaxHighlightingComplete: WebInspector.SourceView.prototype._syntaxHighlightingComplete
-}
-
-WebInspector.ScriptView.prototype.__proto__ = WebInspector.View.prototype;
-
-/* ProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ProfileDataGridNode = function(profileView, profileNode, owningTree, hasChildren)
-{
-    this.profileView = profileView;
-    this.profileNode = profileNode;
-
-    WebInspector.DataGridNode.call(this, null, hasChildren);
-
-    this.addEventListener("populate", this._populate, this);
-
-    this.tree = owningTree;
-
-    this.childrenByCallUID = {};
-    this.lastComparator = null;
-
-    this.callUID = profileNode.callUID;
-    this.selfTime = profileNode.selfTime;
-    this.totalTime = profileNode.totalTime;
-    this.functionName = profileNode.functionName;
-    this.numberOfCalls = profileNode.numberOfCalls;
-    this.url = profileNode.url;
-}
-
-WebInspector.ProfileDataGridNode.prototype = {
-    get data()
-    {
-        function formatMilliseconds(time)
-        {
-            return Number.secondsToString(time / 1000, WebInspector.UIString.bind(WebInspector), !Preferences.samplingCPUProfiler);
-        }
-
-        var data = {};
-
-        data["function"] = this.functionName;
-        data["calls"] = this.numberOfCalls;
-
-        if (this.profileView.showSelfTimeAsPercent)
-            data["self"] = WebInspector.UIString("%.2f%%", this.selfPercent);
-        else
-            data["self"] = formatMilliseconds(this.selfTime);
-
-        if (this.profileView.showTotalTimeAsPercent)
-            data["total"] = WebInspector.UIString("%.2f%%", this.totalPercent);
-        else
-            data["total"] = formatMilliseconds(this.totalTime);
-
-        if (this.profileView.showAverageTimeAsPercent)
-            data["average"] = WebInspector.UIString("%.2f%%", this.averagePercent);
-        else
-            data["average"] = formatMilliseconds(this.averageTime);
-
-        return data;
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
-
-        if (columnIdentifier === "self" && this._searchMatchedSelfColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "total" && this._searchMatchedTotalColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "average" && this._searchMatchedAverageColumn)
-            cell.addStyleClass("highlight");
-        else if (columnIdentifier === "calls" && this._searchMatchedCallsColumn)
-            cell.addStyleClass("highlight");
-
-        if (columnIdentifier !== "function")
-            return cell;
-
-        if (this.profileNode._searchMatchedFunctionColumn)
-            cell.addStyleClass("highlight");
-
-        if (this.profileNode.url) {
-            var fileName = WebInspector.displayNameForURL(this.profileNode.url);
-
-            var urlElement = document.createElement("a");
-            urlElement.className = "profile-node-file webkit-html-resource-link";
-            urlElement.href = this.profileNode.url;
-            urlElement.lineNumber = this.profileNode.lineNumber;
-            urlElement.preferredPanel = "scripts";
-
-            if (this.profileNode.lineNumber > 0)
-                urlElement.textContent = fileName + ":" + this.profileNode.lineNumber;
-            else
-                urlElement.textContent = fileName;
-
-            cell.insertBefore(urlElement, cell.firstChild);
-        }
-
-        return cell;
-    },
-
-    select: function(supressSelectedEvent)
-    {
-        WebInspector.DataGridNode.prototype.select.call(this, supressSelectedEvent);
-        this.profileView._dataGridNodeSelected(this);
-    },
-
-    deselect: function(supressDeselectedEvent)
-    {
-        WebInspector.DataGridNode.prototype.deselect.call(this, supressDeselectedEvent);
-        this.profileView._dataGridNodeDeselected(this);
-    },
-
-    sort: function(/*Function*/ comparator, /*Boolean*/ force)
-    {
-        var gridNodeGroups = [[this]];
-
-        for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) {
-            var gridNodes = gridNodeGroups[gridNodeGroupIndex];
-            var count = gridNodes.length;
-
-            for (var index = 0; index < count; ++index) {
-                var gridNode = gridNodes[index];
-
-                // If the grid node is collapsed, then don't sort children (save operation for later).
-                // If the grid node has the same sorting as previously, then there is no point in sorting it again.
-                if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) {
-                    if (gridNode.children.length)
-                        gridNode.shouldRefreshChildren = true;
-                    continue;
-                }
-
-                gridNode.lastComparator = comparator;
-
-                var children = gridNode.children;
-                var childCount = children.length;
-
-                if (childCount) {
-                    children.sort(comparator);
-
-                    for (var childIndex = 0; childIndex < childCount; ++childIndex)
-                        children[childIndex]._recalculateSiblings(childIndex);
-
-                    gridNodeGroups.push(children);
-                }
-            }
-        }
-    },
-
-    insertChild: function(/*ProfileDataGridNode*/ profileDataGridNode, index)
-    {
-        WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index);
-
-        this.childrenByCallUID[profileDataGridNode.callUID] = profileDataGridNode;
-    },
-
-    removeChild: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode);
-
-        delete this.childrenByCallUID[profileDataGridNode.callUID];
-    },
-
-    removeChildren: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        WebInspector.DataGridNode.prototype.removeChildren.call(this);
-
-        this.childrenByCallUID = {};
-    },
-
-    findChild: function(/*Node*/ node)
-    {
-        if (!node)
-            return null;
-        return this.childrenByCallUID[node.callUID];
-    },
-
-    get averageTime()
-    {
-        return this.selfTime / Math.max(1, this.numberOfCalls);
-    },
-
-    get averagePercent()
-    {
-        return this.averageTime / this.tree.totalTime * 100.0;
-    },
-
-    get selfPercent()
-    {
-        return this.selfTime / this.tree.totalTime * 100.0;
-    },
-
-    get totalPercent()
-    {
-        return this.totalTime / this.tree.totalTime * 100.0;
-    },
-
-    get _parent()
-    {
-        return this.parent !== this.dataGrid ? this.parent : this.tree;
-    },
-
-    _populate: function(event)
-    {
-        this._sharedPopulate();
-
-        if (this._parent) {
-            var currentComparator = this._parent.lastComparator;
-
-            if (currentComparator)
-                this.sort(currentComparator, true);
-        }
-
-        if (this.removeEventListener)
-            this.removeEventListener("populate", this._populate, this);
-    },
-
-    // When focusing and collapsing we modify lots of nodes in the tree.
-    // This allows us to restore them all to their original state when we revert.
-    _save: function()
-    {
-        if (this._savedChildren)
-            return;
-
-        this._savedSelfTime = this.selfTime;
-        this._savedTotalTime = this.totalTime;
-        this._savedNumberOfCalls = this.numberOfCalls;
-
-        this._savedChildren = this.children.slice();
-    },
-
-    // When focusing and collapsing we modify lots of nodes in the tree.
-    // This allows us to restore them all to their original state when we revert.
-    _restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.selfTime = this._savedSelfTime;
-        this.totalTime = this._savedTotalTime;
-        this.numberOfCalls = this._savedNumberOfCalls;
-
-        this.removeChildren();
-
-        var children = this._savedChildren;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            children[index]._restore();
-            this.appendChild(children[index]);
-        }
-    },
-
-    _merge: function(child, shouldAbsorb)
-    {
-        this.selfTime += child.selfTime;
-
-        if (!shouldAbsorb) {
-            this.totalTime += child.totalTime;
-            this.numberOfCalls += child.numberOfCalls;
-        }
-
-        var children = this.children.slice();
-
-        this.removeChildren();
-
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            if (!shouldAbsorb || children[index] !== child)
-                this.appendChild(children[index]);
-        }
-
-        children = child.children.slice();
-        count = children.length;
-
-        for (var index = 0; index < count; ++index) {
-            var orphanedChild = children[index],
-                existingChild = this.childrenByCallUID[orphanedChild.callUID];
-
-            if (existingChild)
-                existingChild._merge(orphanedChild, false);
-            else
-                this.appendChild(orphanedChild);
-        }
-    }
-}
-
-WebInspector.ProfileDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-WebInspector.ProfileDataGridTree = function(profileView, profileNode)
-{
-    this.tree = this;
-    this.children = [];
-
-    this.profileView = profileView;
-
-    this.totalTime = profileNode.totalTime;
-    this.lastComparator = null;
-
-    this.childrenByCallUID = {};
-}
-
-WebInspector.ProfileDataGridTree.prototype = {
-    get expanded()
-    {
-        return true;
-    },
-
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        this.children.splice(index, 0, child);
-        this.childrenByCallUID[child.callUID] = child;
-    },
-
-    removeChildren: function()
-    {
-        this.children = [];
-        this.childrenByCallUID = {};
-    },
-
-    findChild: WebInspector.ProfileDataGridNode.prototype.findChild,
-    sort: WebInspector.ProfileDataGridNode.prototype.sort,
-
-    _save: function()
-    {
-        if (this._savedChildren)
-            return;
-
-        this._savedTotalTime = this.totalTime;
-        this._savedChildren = this.children.slice();
-    },
-
-    restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.children = this._savedChildren;
-        this.totalTime = this._savedTotalTime;
-
-        var children = this.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            children[index]._restore();
-
-        this._savedChildren = null;
-    }
-}
-
-WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}];
-
-WebInspector.ProfileDataGridTree.propertyComparator = function(/*String*/ property, /*Boolean*/ isAscending)
-{
-    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];
-
-    if (!comparator) {
-        if (isAscending) {
-            comparator = function(lhs, rhs)
-            {
-                if (lhs[property] < rhs[property])
-                    return -1;
-
-                if (lhs[property] > rhs[property])
-                    return 1;
-
-                return 0;
-            }
-        } else {
-            comparator = function(lhs, rhs)
-            {
-                if (lhs[property] > rhs[property])
-                    return -1;
-
-                if (lhs[property] < rhs[property])
-                    return 1;
-
-                return 0;
-            }
-        }
-
-        this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;
-    }
-
-    return comparator;
-}
-
-/* BottomUpProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// Bottom Up Profiling shows the entire callstack backwards:
-// The root node is a representation of each individual function called, and each child of that node represents
-// a reverse-callstack showing how many of those calls came from it. So, unlike top-down, the statistics in
-// each child still represent the root node. We have to be particularly careful of recursion with this mode
-// because a root node can represent itself AND an ancestor.
-
-WebInspector.BottomUpProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*BottomUpProfileDataGridTree*/ owningTree)
-{
-    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, this._willHaveChildren(profileNode));
-
-    this._remainingNodeInfos = [];
-}
-
-WebInspector.BottomUpProfileDataGridNode.prototype = {
-    _takePropertiesFromProfileDataGridNode: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        this._save();
-
-        this.selfTime = profileDataGridNode.selfTime;
-        this.totalTime = profileDataGridNode.totalTime;
-        this.numberOfCalls = profileDataGridNode.numberOfCalls;
-    },
-
-    // When focusing, we keep just the members of the callstack.
-    _keepOnlyChild: function(/*ProfileDataGridNode*/ child)
-    {
-        this._save();
-
-        this.removeChildren();
-        this.appendChild(child);
-    },
-
-    _exclude: function(aCallUID)
-    {
-        if (this._remainingNodeInfos)
-            this._populate();
-
-        this._save();
-
-        var children = this.children;
-        var index = this.children.length;
-
-        while (index--)
-            children[index]._exclude(aCallUID);
-
-        var child = this.childrenByCallUID[aCallUID];
-
-        if (child)
-            this._merge(child, true);
-    },
-
-    _restore: function()
-    {
-        WebInspector.ProfileDataGridNode.prototype._restore();
-
-        if (!this.children.length)
-            this.hasChildren = this._willHaveChildren();
-    },
-
-    _merge: function(/*ProfileDataGridNode*/ child, /*Boolean*/ shouldAbsorb)
-    {
-        this.selfTime -= child.selfTime;
-
-        WebInspector.ProfileDataGridNode.prototype._merge.call(this, child, shouldAbsorb);
-    },
-
-    _sharedPopulate: function()
-    {
-        var remainingNodeInfos = this._remainingNodeInfos;
-        var count = remainingNodeInfos.length;
-
-        for (var index = 0; index < count; ++index) {
-            var nodeInfo = remainingNodeInfos[index];
-            var ancestor = nodeInfo.ancestor;
-            var focusNode = nodeInfo.focusNode;
-            var child = this.findChild(ancestor);
-
-            // If we already have this child, then merge the data together.
-            if (child) {
-                var totalTimeAccountedFor = nodeInfo.totalTimeAccountedFor;
-
-                child.selfTime += focusNode.selfTime;
-                child.numberOfCalls += focusNode.numberOfCalls;
-
-                if (!totalTimeAccountedFor)
-                    child.totalTime += focusNode.totalTime;
-            } else {
-                // If not, add it as a true ancestor.
-                // In heavy mode, we take our visual identity from ancestor node...
-                var child = new WebInspector.BottomUpProfileDataGridNode(this.profileView, ancestor, this.tree);
-
-                if (ancestor !== focusNode) {
-                    // but the actual statistics from the "root" node (bottom of the callstack).
-                    child.selfTime = focusNode.selfTime;
-                    child.totalTime = focusNode.totalTime;
-                    child.numberOfCalls = focusNode.numberOfCalls;
-                }
-
-                this.appendChild(child);
-            }
-
-            var parent = ancestor.parent;
-            if (parent && parent.parent) {
-                nodeInfo.ancestor = parent;
-                child._remainingNodeInfos.push(nodeInfo);
-            }
-        }
-
-        delete this._remainingNodeInfos;
-    },
-
-    _willHaveChildren: function(profileNode)
-    {
-        profileNode = profileNode || this.profileNode;
-        // In bottom up mode, our parents are our children since we display an inverted tree.
-        // However, we don't want to show the very top parent since it is redundant.
-        return !!(profileNode.parent && profileNode.parent.parent);
-    }
-}
-
-WebInspector.BottomUpProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
-
-WebInspector.BottomUpProfileDataGridTree = function(/*ProfileView*/ aProfileView, /*ProfileNode*/ aProfileNode)
-{
-    WebInspector.ProfileDataGridTree.call(this, aProfileView, aProfileNode);
-
-    // Iterate each node in pre-order.
-    var profileNodeUIDs = 0;
-    var profileNodeGroups = [[], [aProfileNode]];
-    var visitedProfileNodesForCallUID = {};
-
-    this._remainingNodeInfos = [];
-
-    for (var profileNodeGroupIndex = 0; profileNodeGroupIndex < profileNodeGroups.length; ++profileNodeGroupIndex) {
-        var parentProfileNodes = profileNodeGroups[profileNodeGroupIndex];
-        var profileNodes = profileNodeGroups[++profileNodeGroupIndex];
-        var count = profileNodes.length;
-
-        for (var index = 0; index < count; ++index) {
-            var profileNode = profileNodes[index];
-
-            if (!profileNode.UID)
-                profileNode.UID = ++profileNodeUIDs;
-
-            if (profileNode.head && profileNode !== profileNode.head) {
-                // The total time of this ancestor is accounted for if we're in any form of recursive cycle.
-                var visitedNodes = visitedProfileNodesForCallUID[profileNode.callUID];
-                var totalTimeAccountedFor = false;
-
-                if (!visitedNodes) {
-                    visitedNodes = {}
-                    visitedProfileNodesForCallUID[profileNode.callUID] = visitedNodes;
-                } else {
-                    // The total time for this node has already been accounted for iff one of it's parents has already been visited.
-                    // We can do this check in this style because we are traversing the tree in pre-order.
-                    var parentCount = parentProfileNodes.length;
-                    for (var parentIndex = 0; parentIndex < parentCount; ++parentIndex) {
-                        if (visitedNodes[parentProfileNodes[parentIndex].UID]) {
-                            totalTimeAccountedFor = true;
-                            break;
-                        }
-                    }
-                }
-
-                visitedNodes[profileNode.UID] = true;
-
-                this._remainingNodeInfos.push({ ancestor:profileNode, focusNode:profileNode, totalTimeAccountedFor:totalTimeAccountedFor });
-            }
-
-            var children = profileNode.children;
-            if (children.length) {
-                profileNodeGroups.push(parentProfileNodes.concat([profileNode]))
-                profileNodeGroups.push(children);
-            }
-        }
-    }
-
-    // Populate the top level nodes.
-    WebInspector.BottomUpProfileDataGridNode.prototype._populate.call(this);
-
-    return this;
-}
-
-WebInspector.BottomUpProfileDataGridTree.prototype = {
-    // When focusing, we keep the entire callstack up to this ancestor.
-    focus: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        if (!profileDataGridNode)
-            return;
-
-        this._save();
-
-        var currentNode = profileDataGridNode;
-        var focusNode = profileDataGridNode;
-
-        while (currentNode.parent && (currentNode instanceof WebInspector.ProfileDataGridNode)) {
-            currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);
-
-            focusNode = currentNode;
-            currentNode = currentNode.parent;
-
-            if (currentNode instanceof WebInspector.ProfileDataGridNode)
-                currentNode._keepOnlyChild(focusNode);
-        }
-
-        this.children = [focusNode];
-        this.totalTime = profileDataGridNode.totalTime;
-    },
-
-    exclude: function(/*ProfileDataGridNode*/ profileDataGridNode)
-    {
-        if (!profileDataGridNode)
-            return;
-
-        this._save();
-
-        var excludedCallUID = profileDataGridNode.callUID;
-        var excludedTopLevelChild = this.childrenByCallUID[excludedCallUID];
-
-        // If we have a top level node that is excluded, get rid of it completely (not keeping children),
-        // since bottom up data relies entirely on the root node.
-        if (excludedTopLevelChild)
-            this.children.remove(excludedTopLevelChild);
-
-        var children = this.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            children[index]._exclude(excludedCallUID);
-
-        if (this.lastComparator)
-            this.sort(this.lastComparator, true);
-    },
-
-    _sharedPopulate: WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate
-}
-
-WebInspector.BottomUpProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
-
-
-/* TopDownProfileDataGridTree.js */
-
-/*
- * Copyright (C) 2009 280 North Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TopDownProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*TopDownProfileDataGridTree*/ owningTree)
-{
-    var hasChildren = (profileNode.children && profileNode.children.length);
-
-    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, hasChildren);
-
-    this._remainingChildren = profileNode.children;
-}
-
-WebInspector.TopDownProfileDataGridNode.prototype = {
-    _sharedPopulate: function()
-    {
-        var children = this._remainingChildren;
-        var childrenLength = children.length;
-
-        for (var i = 0; i < childrenLength; ++i)
-            this.appendChild(new WebInspector.TopDownProfileDataGridNode(this.profileView, children[i], this.tree));
-
-        this._remainingChildren = null;
-    },
-
-    _exclude: function(aCallUID)
-    {
-        if (this._remainingChildren)
-            this._populate();
-
-        this._save();
-
-        var children = this.children;
-        var index = this.children.length;
-
-        while (index--)
-            children[index]._exclude(aCallUID);
-
-        var child = this.childrenByCallUID[aCallUID];
-
-        if (child)
-            this._merge(child, true);
-    }
-}
-
-WebInspector.TopDownProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
-
-WebInspector.TopDownProfileDataGridTree = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode)
-{
-    WebInspector.ProfileDataGridTree.call(this, profileView, profileNode);
-
-    this._remainingChildren = profileNode.children;
-
-    WebInspector.TopDownProfileDataGridNode.prototype._populate.call(this);
-}
-
-WebInspector.TopDownProfileDataGridTree.prototype = {
-    focus: function(/*ProfileDataGridNode*/ profileDataGrideNode)
-    {
-        if (!profileDataGrideNode)
-            return;
-
-        this._save();
-        profileDataGrideNode.savePosition();
-
-        this.children = [profileDataGrideNode];
-        this.totalTime = profileDataGrideNode.totalTime;
-    },
-
-    exclude: function(/*ProfileDataGridNode*/ profileDataGrideNode)
-    {
-        if (!profileDataGrideNode)
-            return;
-
-        this._save();
-
-        var excludedCallUID = profileDataGrideNode.callUID;
-
-        WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(this, excludedCallUID);
-
-        if (this.lastComparator)
-            this.sort(this.lastComparator, true);
-    },
-
-    restore: function()
-    {
-        if (!this._savedChildren)
-            return;
-
-        this.children[0].restorePosition();
-
-        WebInspector.ProfileDataGridTree.prototype.restore.call(this);
-    },
-
-    _merge: WebInspector.TopDownProfileDataGridNode.prototype._merge,
-
-    _sharedPopulate: WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate
-}
-
-WebInspector.TopDownProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
-
-/* ProfileView.js */
-
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// FIXME: Rename the file.
-
-WebInspector.CPUProfileView = function(profile)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("profile-view");
-
-    this.showSelfTimeAsPercent = true;
-    this.showTotalTimeAsPercent = true;
-    this.showAverageTimeAsPercent = true;
-
-    var columns = { "self": { title: WebInspector.UIString("Self"), width: "72px", sort: "descending", sortable: true },
-                    "total": { title: WebInspector.UIString("Total"), width: "72px", sortable: true },
-                    "average": { title: WebInspector.UIString("Average"), width: "72px", sortable: true },
-                    "calls": { title: WebInspector.UIString("Calls"), width: "54px", sortable: true },
-                    "function": { title: WebInspector.UIString("Function"), disclosure: true, sortable: true } };
-
-    if (Preferences.samplingCPUProfiler) {
-        delete columns.average;
-        delete columns.calls;
-    }
-
-    this.dataGrid = new WebInspector.DataGrid(columns);
-    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
-    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
-    this.element.appendChild(this.dataGrid.element);
-
-    this.viewSelectElement = document.createElement("select");
-    this.viewSelectElement.className = "status-bar-item";
-    this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false);
-    this.view = "Heavy";
-
-    var heavyViewOption = document.createElement("option");
-    heavyViewOption.label = WebInspector.UIString("Heavy (Bottom Up)");
-    var treeViewOption = document.createElement("option");
-    treeViewOption.label = WebInspector.UIString("Tree (Top Down)");
-    this.viewSelectElement.appendChild(heavyViewOption);
-    this.viewSelectElement.appendChild(treeViewOption);
-
-    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item");
-    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
-
-    this.focusButton = new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."), "focus-profile-node-status-bar-item");
-    this.focusButton.disabled = true;
-    this.focusButton.addEventListener("click", this._focusClicked.bind(this), false);
-
-    this.excludeButton = new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."), "exclude-profile-node-status-bar-item");
-    this.excludeButton.disabled = true;
-    this.excludeButton.addEventListener("click", this._excludeClicked.bind(this), false);
-
-    this.resetButton = new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."), "reset-profile-status-bar-item");
-    this.resetButton.visible = false;
-    this.resetButton.addEventListener("click", this._resetClicked.bind(this), false);
-
-    this.profile = profile;
-
-    var self = this;
-    function profileCallback(profile)
-    {
-        self.profile = profile;
-        self._assignParentsInProfile();
-      
-        self.profileDataGridTree = self.bottomUpProfileDataGridTree;
-        self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
-     
-        self.refresh();
-     
-        self._updatePercentButton();
-    }
-
-    var callId = WebInspector.Callback.wrap(profileCallback);
-    InspectorBackend.getProfile(callId, this.profile.uid);
-}
-
-WebInspector.CPUProfileView.prototype = {
-    get statusBarItems()
-    {
-        return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];
-    },
-
-    get profile()
-    {
-        return this._profile;
-    },
-
-    set profile(profile)
-    {
-        this._profile = profile;
-    },
-
-    get bottomUpProfileDataGridTree()
-    {
-        if (!this._bottomUpProfileDataGridTree)
-            this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this, this.profile.head);
-        return this._bottomUpProfileDataGridTree;
-    },
-
-    get topDownProfileDataGridTree()
-    {
-        if (!this._topDownProfileDataGridTree)
-            this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this, this.profile.head);
-        return this._topDownProfileDataGridTree;
-    },
-
-    get currentTree()
-    {
-        return this._currentTree;
-    },
-
-    set currentTree(tree)
-    {
-        this._currentTree = tree;
-        this.refresh();
-    },
-
-    get topDownTree()
-    {
-        if (!this._topDownTree) {
-            this._topDownTree = WebInspector.TopDownTreeFactory.create(this.profile.head);
-            this._sortProfile(this._topDownTree);
-        }
-
-        return this._topDownTree;
-    },
-
-    get bottomUpTree()
-    {
-        if (!this._bottomUpTree) {
-            this._bottomUpTree = WebInspector.BottomUpTreeFactory.create(this.profile.head);
-            this._sortProfile(this._bottomUpTree);
-        }
-
-        return this._bottomUpTree;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.dataGrid.updateWidths();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.dataGrid)
-            this.dataGrid.updateWidths();
-    },
-
-    refresh: function()
-    {
-        var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
-
-        this.dataGrid.removeChildren();
-
-        var children = this.profileDataGridTree.children;
-        var count = children.length;
-
-        for (var index = 0; index < count; ++index)
-            this.dataGrid.appendChild(children[index]);
-
-        if (selectedProfileNode)
-            selectedProfileNode.selected = true;
-    },
-
-    refreshVisibleData: function()
-    {
-        var child = this.dataGrid.children[0];
-        while (child) {
-            child.refresh();
-            child = child.traverseNextNode(false, null, true);
-        }
-    },
-
-    refreshShowAsPercents: function()
-    {
-        this._updatePercentButton();
-        this.refreshVisibleData();
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var profileNode = this._searchResults[i].profileNode;
-
-                delete profileNode._searchMatchedSelfColumn;
-                delete profileNode._searchMatchedTotalColumn;
-                delete profileNode._searchMatchedCallsColumn;
-                delete profileNode._searchMatchedFunctionColumn;
-
-                profileNode.refresh();
-            }
-        }
-
-        delete this._searchFinishedCallback;
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        query = query.trimWhitespace();
-
-        if (!query.length)
-            return;
-
-        this._searchFinishedCallback = finishedCallback;
-
-        var greaterThan = (query.indexOf(">") === 0);
-        var lessThan = (query.indexOf("<") === 0);
-        var equalTo = (query.indexOf("=") === 0 || ((greaterThan || lessThan) && query.indexOf("=") === 1));
-        var percentUnits = (query.lastIndexOf("%") === (query.length - 1));
-        var millisecondsUnits = (query.length > 2 && query.lastIndexOf("ms") === (query.length - 2));
-        var secondsUnits = (!millisecondsUnits && query.lastIndexOf("s") === (query.length - 1));
-
-        var queryNumber = parseFloat(query);
-        if (greaterThan || lessThan || equalTo) {
-            if (equalTo && (greaterThan || lessThan))
-                queryNumber = parseFloat(query.substring(2));
-            else
-                queryNumber = parseFloat(query.substring(1));
-        }
-
-        var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber);
-
-        // Make equalTo implicitly true if it wasn't specified there is no other operator.
-        if (!isNaN(queryNumber) && !(greaterThan || lessThan))
-            equalTo = true;
-
-        function matchesQuery(/*ProfileDataGridNode*/ profileDataGridNode)
-        {
-            delete profileDataGridNode._searchMatchedSelfColumn;
-            delete profileDataGridNode._searchMatchedTotalColumn;
-            delete profileDataGridNode._searchMatchedAverageColumn;
-            delete profileDataGridNode._searchMatchedCallsColumn;
-            delete profileDataGridNode._searchMatchedFunctionColumn;
-
-            if (percentUnits) {
-                if (lessThan) {
-                    if (profileDataGridNode.selfPercent < queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent < queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                } else if (greaterThan) {
-                    if (profileDataGridNode.selfPercent > queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent > queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-
-                if (equalTo) {
-                    if (profileDataGridNode.selfPercent == queryNumber)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalPercent == queryNumber)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-            } else if (millisecondsUnits || secondsUnits) {
-                if (lessThan) {
-                    if (profileDataGridNode.selfTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime < queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                } else if (greaterThan) {
-                    if (profileDataGridNode.selfTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime > queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-
-                if (equalTo) {
-                    if (profileDataGridNode.selfTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedSelfColumn = true;
-                    if (profileDataGridNode.totalTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedTotalColumn = true;
-                    if (profileDataGridNode.averageTime == queryNumberMilliseconds)
-                        profileDataGridNode._searchMatchedAverageColumn = true;
-                }
-            } else {
-                if (equalTo && profileDataGridNode.numberOfCalls == queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-                if (greaterThan && profileDataGridNode.numberOfCalls > queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-                if (lessThan && profileDataGridNode.numberOfCalls < queryNumber)
-                    profileDataGridNode._searchMatchedCallsColumn = true;
-            }
-
-            if (profileDataGridNode.functionName.hasSubstring(query, true) || profileDataGridNode.url.hasSubstring(query, true))
-                profileDataGridNode._searchMatchedFunctionColumn = true;
-
-            if (profileDataGridNode._searchMatchedSelfColumn ||
-                profileDataGridNode._searchMatchedTotalColumn ||
-                profileDataGridNode._searchMatchedAverageColumn ||
-                profileDataGridNode._searchMatchedCallsColumn ||
-                profileDataGridNode._searchMatchedFunctionColumn)
-            {
-                profileDataGridNode.refresh();
-                return true;
-            }
-
-            return false;
-        }
-
-        var current = this.profileDataGridTree.children[0];
-
-        while (current) {
-            if (matchesQuery(current)) {
-                this._searchResults.push({ profileNode: current });
-            }
-
-            current = current.traverseNextNode(false, null, false);
-        }
-
-        finishedCallback(this, this._searchResults.length);
-    },
-
-    jumpToFirstSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToLastSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToNextSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (++this._currentSearchResultIndex >= this._searchResults.length)
-            this._currentSearchResultIndex = 0;
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    jumpToPreviousSearchResult: function()
-    {
-        if (!this._searchResults || !this._searchResults.length)
-            return;
-        if (--this._currentSearchResultIndex < 0)
-            this._currentSearchResultIndex = (this._searchResults.length - 1);
-        this._jumpToSearchResult(this._currentSearchResultIndex);
-    },
-
-    showingFirstSearchResult: function()
-    {
-        return (this._currentSearchResultIndex === 0);
-    },
-
-    showingLastSearchResult: function()
-    {
-        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
-    },
-
-    _jumpToSearchResult: function(index)
-    {
-        var searchResult = this._searchResults[index];
-        if (!searchResult)
-            return;
-
-        var profileNode = searchResult.profileNode;
-        profileNode.reveal();
-        profileNode.select();
-    },
-
-    _changeView: function(event)
-    {
-        if (!event || !this.profile)
-            return;
-
-        if (event.target.selectedIndex == 1 && this.view == "Heavy") {
-            this.profileDataGridTree = this.topDownProfileDataGridTree;
-            this._sortProfile();
-            this.view = "Tree";
-        } else if (event.target.selectedIndex == 0 && this.view == "Tree") {
-            this.profileDataGridTree = this.bottomUpProfileDataGridTree;
-            this._sortProfile();
-            this.view = "Heavy";
-        }
-
-        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
-            return;
-
-        // The current search needs to be performed again. First negate out previous match
-        // count by calling the search finished callback with a negative number of matches.
-        // Then perform the search again the with same query and callback.
-        this._searchFinishedCallback(this, -this._searchResults.length);
-        this.performSearch(this.currentQuery, this._searchFinishedCallback);
-    },
-
-    _percentClicked: function(event)
-    {
-        var currentState = this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent;
-        this.showSelfTimeAsPercent = !currentState;
-        this.showTotalTimeAsPercent = !currentState;
-        this.showAverageTimeAsPercent = !currentState;
-        this.refreshShowAsPercents();
-    },
-
-    _updatePercentButton: function()
-    {
-        if (this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent) {
-            this.percentButton.title = WebInspector.UIString("Show absolute total and self times.");
-            this.percentButton.toggled = true;
-        } else {
-            this.percentButton.title = WebInspector.UIString("Show total and self times as percentages.");
-            this.percentButton.toggled = false;
-        }
-    },
-
-    _focusClicked: function(event)
-    {
-        if (!this.dataGrid.selectedNode)
-            return;
-
-        this.resetButton.visible = true;
-        this.profileDataGridTree.focus(this.dataGrid.selectedNode);
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _excludeClicked: function(event)
-    {
-        var selectedNode = this.dataGrid.selectedNode
-
-        if (!selectedNode)
-            return;
-
-        selectedNode.deselect();
-
-        this.resetButton.visible = true;
-        this.profileDataGridTree.exclude(selectedNode);
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _resetClicked: function(event)
-    {
-        this.resetButton.visible = false;
-        this.profileDataGridTree.restore();
-        this.refresh();
-        this.refreshVisibleData();
-    },
-
-    _dataGridNodeSelected: function(node)
-    {
-        this.focusButton.disabled = false;
-        this.excludeButton.disabled = false;
-    },
-
-    _dataGridNodeDeselected: function(node)
-    {
-        this.focusButton.disabled = true;
-        this.excludeButton.disabled = true;
-    },
-
-    _sortData: function(event)
-    {
-        this._sortProfile(this.profile);
-    },
-
-    _sortProfile: function()
-    {
-        var sortAscending = this.dataGrid.sortOrder === "ascending";
-        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
-        var sortProperty = {
-                "average": "averageTime",
-                "self": "selfTime",
-                "total": "totalTime",
-                "calls": "numberOfCalls",
-                "function": "functionName"
-            }[sortColumnIdentifier];
-
-        this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
-
-        this.refresh();
-    },
-
-    _mouseDownInDataGrid: function(event)
-    {
-        if (event.detail < 2)
-            return;
-
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell || (!cell.hasStyleClass("total-column") && !cell.hasStyleClass("self-column") && !cell.hasStyleClass("average-column")))
-            return;
-
-        if (cell.hasStyleClass("total-column"))
-            this.showTotalTimeAsPercent = !this.showTotalTimeAsPercent;
-        else if (cell.hasStyleClass("self-column"))
-            this.showSelfTimeAsPercent = !this.showSelfTimeAsPercent;
-        else if (cell.hasStyleClass("average-column"))
-            this.showAverageTimeAsPercent = !this.showAverageTimeAsPercent;
-
-        this.refreshShowAsPercents();
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    _assignParentsInProfile: function()
-    {
-        var head = this.profile.head;
-        head.parent = null;
-        head.head = null;
-        var nodesToTraverse = [ { parent: head, children: head.children } ];
-        while (nodesToTraverse.length > 0) {
-            var pair = nodesToTraverse.shift();
-            var parent = pair.parent;
-            var children = pair.children;
-            var length = children.length;
-            for (var i = 0; i < length; ++i) {
-                children[i].head = head;
-                children[i].parent = parent;
-                if (children[i].children.length > 0)
-                    nodesToTraverse.push({ parent: children[i], children: children[i].children });
-            }
-        }
-    }
-}
-
-WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.CPUProfileType = function()
-{
-    WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));
-    this._recording = false;
-}
-
-WebInspector.CPUProfileType.TypeId = "CPU";
-
-WebInspector.CPUProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");
-    },
-
-    get buttonStyle()
-    {
-        return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";
-    },
-
-    buttonClicked: function()
-    {
-        this._recording = !this._recording;
-
-        if (this._recording)
-            InspectorBackend.startProfiling();
-        else
-            InspectorBackend.stopProfiling();
-    },
-
-    setRecordingProfile: function(isProfiling)
-    {
-        this._recording = isProfiling;
-    },
-
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        return new WebInspector.ProfileSidebarTreeElement(profile);
-    },
-
-    createView: function(profile)
-    {
-        return new WebInspector.CPUProfileView(profile);
-    }
-}
-
-WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
-
-/* DOMAgent.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.DOMNode = function(doc, payload) {
-    this.ownerDocument = doc;
-
-    this.id = payload.id;
-    this.nodeType = payload.nodeType;
-    this.nodeName = payload.nodeName;
-    this.localName = payload.localName;
-    this._nodeValue = payload.nodeValue;
-    this.textContent = this.nodeValue;
-
-    this.attributes = [];
-    this._attributesMap = {};
-    if (payload.attributes)
-        this._setAttributesPayload(payload.attributes);
-
-    this._childNodeCount = payload.childNodeCount;
-    this.children = null;
-
-    this.nextSibling = null;
-    this.prevSibling = null;
-    this.firstChild = null;
-    this.lastChild = null;
-    this.parentNode = null;
-
-    if (payload.children)
-        this._setChildrenPayload(payload.children);
-
-    this._computedStyle = null;
-    this.style = null;
-    this._matchedCSSRules = [];
-
-    if (this.nodeType === Node.ELEMENT_NODE) {
-        // HTML and BODY from internal iframes should not overwrite top-level ones.
-        if (!this.ownerDocument.documentElement && this.nodeName === "HTML")
-            this.ownerDocument.documentElement = this;
-        if (!this.ownerDocument.body && this.nodeName === "BODY")
-            this.ownerDocument.body = this;
-    } else if (this.nodeType === Node.DOCUMENT_TYPE_NODE) {
-        this.publicId = payload.publicId;
-        this.systemId = payload.systemId;
-        this.internalSubset = payload.internalSubset;
-    }
-}
-
-WebInspector.DOMNode.prototype = {
-    hasAttributes: function()
-    {
-        return this.attributes.length > 0;
-    },
-
-    hasChildNodes: function()  {
-        return this._childNodeCount > 0;
-    },
-
-    get nodeValue() {
-        return this._nodeValue;
-    },
-
-    set nodeValue(value) {
-        if (this.nodeType != Node.TEXT_NODE)
-            return;
-        var self = this;
-        var callback = function()
-        {
-            self._nodeValue = value;
-            self.textContent = value;
-        };
-        this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, callback);
-    },
-
-    getAttribute: function(name)
-    {
-        var attr = this._attributesMap[name];
-        return attr ? attr.value : undefined;
-    },
-
-    setAttribute: function(name, value)
-    {
-        var self = this;
-        var callback = function()
-        {
-            var attr = self._attributesMap[name];
-            if (attr)
-                attr.value = value;
-            else
-                attr = self._addAttribute(name, value);
-        };
-        this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback);
-    },
-
-    removeAttribute: function(name)
-    {
-        var self = this;
-        var callback = function()
-        {
-            delete self._attributesMap[name];
-            for (var i = 0;  i < self.attributes.length; ++i) {
-                if (self.attributes[i].name == name) {
-                    self.attributes.splice(i, 1);
-                    break;
-                }
-            }
-        };
-        this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback);
-    },
-
-    _setAttributesPayload: function(attrs)
-    {
-        for (var i = 0; i < attrs.length; i += 2)
-            this._addAttribute(attrs[i], attrs[i + 1]);
-    },
-
-    _insertChild: function(prev, payload)
-    {
-        var node = new WebInspector.DOMNode(this.ownerDocument, payload);
-        if (!prev)
-            // First node
-            this.children = [ node ];
-        else
-            this.children.splice(this.children.indexOf(prev) + 1, 0, node);
-        this._renumber();
-        return node;
-    },
-
-    removeChild_: function(node)
-    {
-        this.children.splice(this.children.indexOf(node), 1);
-        node.parentNode = null;
-        this._renumber();
-    },
-
-    _setChildrenPayload: function(payloads)
-    {
-        this.children = [];
-        for (var i = 0; i < payloads.length; ++i) {
-            var payload = payloads[i];
-            var node = new WebInspector.DOMNode(this.ownerDocument, payload);
-            this.children.push(node);
-        }
-        this._renumber();
-    },
-
-    _renumber: function()
-    {
-        this._childNodeCount = this.children.length;
-        if (this._childNodeCount == 0) {
-            this.firstChild = null;
-            this.lastChild = null;
-            return;
-        }
-        this.firstChild = this.children[0];
-        this.lastChild = this.children[this._childNodeCount - 1];
-        for (var i = 0; i < this._childNodeCount; ++i) {
-            var child = this.children[i];
-            child.index = i;
-            child.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null;
-            child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null;
-            child.parentNode = this;
-        }
-    },
-
-    _addAttribute: function(name, value)
-    {
-        var attr = {
-            "name": name,
-            "value": value,
-            "_node": this
-        };
-        this._attributesMap[name] = attr;
-        this.attributes.push(attr);
-    },
-
-    _setStyles: function(computedStyle, inlineStyle, styleAttributes, matchedCSSRules)
-    {
-        this._computedStyle = new WebInspector.CSSStyleDeclaration(computedStyle);
-        this.style = new WebInspector.CSSStyleDeclaration(inlineStyle);
-
-        for (var name in styleAttributes) {
-            if (this._attributesMap[name])
-                this._attributesMap[name].style = new WebInspector.CSSStyleDeclaration(styleAttributes[name]);
-        }
-
-        this._matchedCSSRules = [];
-        for (var i = 0; i < matchedCSSRules.length; i++)
-            this._matchedCSSRules.push(WebInspector.CSSStyleDeclaration.parseRule(matchedCSSRules[i]));
-    },
-
-    _clearStyles: function()
-    {
-        this.computedStyle = null;
-        this.style = null;
-        for (var name in this._attributesMap)
-            this._attributesMap[name].style = null;
-        this._matchedCSSRules = null;
-    }
-}
-
-WebInspector.DOMDocument = function(domAgent, defaultView, payload)
-{
-    WebInspector.DOMNode.call(this, this, payload);
-    this._listeners = {};
-    this._domAgent = domAgent;
-    this.defaultView = defaultView;
-}
-
-WebInspector.DOMDocument.prototype = {
-
-    addEventListener: function(name, callback)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners) {
-            listeners = [];
-            this._listeners[name] = listeners;
-        }
-        listeners.push(callback);
-    },
-
-    removeEventListener: function(name, callback)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners)
-            return;
-
-        var index = listeners.indexOf(callback);
-        if (index != -1)
-            listeners.splice(index, 1);
-    },
-
-    _fireDomEvent: function(name, event)
-    {
-        var listeners = this._listeners[name];
-        if (!listeners)
-            return;
-
-        for (var i = 0; i < listeners.length; ++i) {
-            var listener = listeners[i];
-            listener.call(this, event);
-        }
-    }
-}
-
-WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype;
-
-
-WebInspector.DOMWindow = function(domAgent)
-{
-    this._domAgent = domAgent;
-}
-
-WebInspector.DOMWindow.prototype = {
-    get document()
-    {
-        return this._domAgent.document;
-    },
-
-    get Node()
-    {
-        return WebInspector.DOMNode;
-    },
-
-    get Element()
-    {
-        return WebInspector.DOMNode;
-    },
-
-    Object: function()
-    {
-    },
-
-    getComputedStyle: function(node)
-    {
-        return node._computedStyle;
-    },
-
-    getMatchedCSSRules: function(node, pseudoElement, authorOnly)
-    {
-        return node._matchedCSSRules;
-    }
-}
-
-WebInspector.DOMAgent = function() {
-    this._window = new WebInspector.DOMWindow(this);
-    this._idToDOMNode = null;
-    this.document = null;
-}
-
-WebInspector.DOMAgent.prototype = {
-    get domWindow()
-    {
-        return this._window;
-    },
-
-    getChildNodesAsync: function(parent, callback)
-    {
-        var children = parent.children;
-        if (children) {
-            callback(children);
-            return;
-        }
-        function mycallback() {
-            callback(parent.children);
-        }
-        var callId = WebInspector.Callback.wrap(mycallback);
-        InspectorBackend.getChildNodes(callId, parent.id);
-    },
-
-    setAttributeAsync: function(node, name, value, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.setAttribute(WebInspector.Callback.wrap(mycallback), node.id, name, value);
-    },
-
-    removeAttributeAsync: function(node, name, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.removeAttribute(WebInspector.Callback.wrap(mycallback), node.id, name);
-    },
-
-    setTextNodeValueAsync: function(node, text, callback)
-    {
-        var mycallback = this._didApplyDomChange.bind(this, node, callback);
-        InspectorBackend.setTextNodeValue(WebInspector.Callback.wrap(mycallback), node.id, text);
-    },
-
-    _didApplyDomChange: function(node, callback, success)
-    {
-        if (!success)
-            return;
-        callback();
-        // TODO(pfeldman): Fix this hack.
-        var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node);
-        if (elem) {
-            elem._updateTitle();
-        }
-    },
-
-    _attributesUpdated: function(nodeId, attrsArray)
-    {
-        var node = this._idToDOMNode[nodeId];
-        node._setAttributesPayload(attrsArray);
-    },
-
-    nodeForId: function(nodeId) {
-        return this._idToDOMNode[nodeId];
-    },
-
-    _setDocument: function(payload)
-    {
-        this._idToDOMNode = {};
-        if (payload && "id" in payload) {
-            this.document = new WebInspector.DOMDocument(this, this._window, payload);
-            this._idToDOMNode[payload.id] = this.document;
-            this._bindNodes(this.document.children);
-        } else
-            this.document = null;
-        WebInspector.panels.elements.setDocument(this.document);
-    },
-
-    _setDetachedRoot: function(payload)
-    {
-        var root = new WebInspector.DOMNode(this.document, payload);
-        this._idToDOMNode[payload.id] = root;
-    },
-
-    _setChildNodes: function(parentId, payloads)
-    {
-        var parent = this._idToDOMNode[parentId];
-        parent._setChildrenPayload(payloads);
-        this._bindNodes(parent.children);
-    },
-
-    _bindNodes: function(children)
-    {
-        for (var i = 0; i < children.length; ++i) {
-            var child = children[i];
-            this._idToDOMNode[child.id] = child;
-            if (child.children)
-                this._bindNodes(child.children);
-        }
-    },
-
-    _childNodeCountUpdated: function(nodeId, newValue)
-    {
-        var node = this._idToDOMNode[nodeId];
-        node._childNodeCount = newValue;
-        var outline = WebInspector.panels.elements.treeOutline;
-        var treeElement = outline.findTreeElement(node);
-        if (treeElement)
-            treeElement.hasChildren = newValue;
-    },
-
-    _childNodeInserted: function(parentId, prevId, payload)
-    {
-        var parent = this._idToDOMNode[parentId];
-        var prev = this._idToDOMNode[prevId];
-        var node = parent._insertChild(prev, payload);
-        this._idToDOMNode[node.id] = node;
-        var event = { target : node, relatedNode : parent };
-        this.document._fireDomEvent("DOMNodeInserted", event);
-    },
-
-    _childNodeRemoved: function(parentId, nodeId)
-    {
-        var parent = this._idToDOMNode[parentId];
-        var node = this._idToDOMNode[nodeId];
-        parent.removeChild_(node);
-        var event = { target : node, relatedNode : parent };
-        this.document._fireDomEvent("DOMNodeRemoved", event);
-        delete this._idToDOMNode[nodeId];
-    }
-}
-
-WebInspector.Cookies = {}
-
-WebInspector.Cookies.getCookiesAsync = function(callback)
-{
-    function mycallback(cookies, cookiesString) {
-        if (cookiesString)
-            callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false);
-        else
-            callback(cookies, true);
-    }
-    var callId = WebInspector.Callback.wrap(mycallback);
-    InspectorBackend.getCookies(callId);
-}
-
-WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
-{
-    var rawCookies = rawCookieString.split(/;\s*/);
-    var cookies = [];
-
-    if (!(/^\s*$/.test(rawCookieString))) {
-        for (var i = 0; i < rawCookies.length; ++i) {
-            var cookie = rawCookies[i];
-            var delimIndex = cookie.indexOf("=");
-            var name = cookie.substring(0, delimIndex);
-            var value = cookie.substring(delimIndex + 1);
-            var size = name.length + value.length;
-            cookies.push({ name: name, value: value, size: size });
-        }
-    }
-
-    return cookies;
-}
-
-WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL)
-{
-    var match = resourceURL.match(WebInspector.URLRegExp);
-    if (!match)
-        return false;
-    // See WebInspector.URLRegExp for definitions of the group index constants.
-    if (!this.cookieDomainMatchesResourceDomain(cookie.domain, match[2]))
-        return false;
-    var resourcePort = match[3] ? match[3] : undefined;
-    var resourcePath = match[4] ? match[4] : '/';
-    return (resourcePath.indexOf(cookie.path) === 0
-        && (!cookie.port || resourcePort == cookie.port)
-        && (!cookie.secure || match[1].toLowerCase() === 'https'));
-}
-
-WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain)
-{
-    if (cookieDomain.charAt(0) !== '.')
-        return resourceDomain === cookieDomain;
-    return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)?" + cookieDomain.substring(1).escapeForRegExp() + "$"), "i");
-}
-
-WebInspector.EventListeners = {}
-
-WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback)
-{
-    if (!node)
-        return;
-
-    var callId = WebInspector.Callback.wrap(callback);
-    InspectorBackend.getEventListenersForNode(callId, node.id);
-}
-
-WebInspector.CSSStyleDeclaration = function(payload)
-{
-    this.id = payload.id;
-    this.width = payload.width;
-    this.height = payload.height;
-    this.__disabledProperties = payload.__disabledProperties;
-    this.__disabledPropertyValues = payload.__disabledPropertyValues;
-    this.__disabledPropertyPriorities = payload.__disabledPropertyPriorities;
-    this.uniqueStyleProperties = payload.uniqueStyleProperties;
-    this._shorthandValues = payload.shorthandValues;
-    this._propertyMap = {};
-    this._longhandProperties = {};
-    this.length = payload.properties.length;
-
-    for (var i = 0; i < this.length; ++i) {
-        var property = payload.properties[i];
-        var name = property.name;
-        this[i] = name;
-        this._propertyMap[name] = property;
-    }
-
-    // Index longhand properties.
-    for (var i = 0; i < this.uniqueStyleProperties.length; ++i) {
-        var name = this.uniqueStyleProperties[i];
-        var property = this._propertyMap[name];
-        if (property.shorthand) {
-            var longhands = this._longhandProperties[property.shorthand];
-            if (!longhands) {
-                longhands = [];
-                this._longhandProperties[property.shorthand] = longhands;
-            }
-            longhands.push(name);
-        }
-    }
-}
-
-WebInspector.CSSStyleDeclaration.parseStyle = function(payload)
-{
-    return new WebInspector.CSSStyleDeclaration(payload);
-}
-
-WebInspector.CSSStyleDeclaration.parseRule = function(payload)
-{
-    var rule = {};
-    rule.id = payload.id;
-    rule.selectorText = payload.selectorText;
-    rule.style = new WebInspector.CSSStyleDeclaration(payload.style);
-    rule.style.parentRule = rule;
-    rule.isUserAgent = payload.isUserAgent;
-    rule.isUser = payload.isUser;
-    rule.isViaInspector = payload.isViaInspector;
-    if (payload.parentStyleSheet)
-        rule.parentStyleSheet = { href: payload.parentStyleSheet.href };
-
-    return rule;
-}
-
-WebInspector.CSSStyleDeclaration.prototype = {
-    getPropertyValue: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.value : "";
-    },
-
-    getPropertyPriority: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.priority : "";
-    },
-
-    getPropertyShorthand: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.shorthand : "";
-    },
-
-    isPropertyImplicit: function(name)
-    {
-        var property = this._propertyMap[name];
-        return property ? property.implicit : "";
-    },
-
-    styleTextWithShorthands: function()
-    {
-        var cssText = "";
-        var foundProperties = {};
-        for (var i = 0; i < this.length; ++i) {
-            var individualProperty = this[i];
-            var shorthandProperty = this.getPropertyShorthand(individualProperty);
-            var propertyName = (shorthandProperty || individualProperty);
-
-            if (propertyName in foundProperties)
-                continue;
-
-            if (shorthandProperty) {
-                var value = this.getPropertyValue(shorthandProperty);
-                var priority = this.getShorthandPriority(shorthandProperty);
-            } else {
-                var value = this.getPropertyValue(individualProperty);
-                var priority = this.getPropertyPriority(individualProperty);
-            }
-
-            foundProperties[propertyName] = true;
-
-            cssText += propertyName + ": " + value;
-            if (priority)
-                cssText += " !" + priority;
-            cssText += "; ";
-        }
-
-        return cssText;
-    },
-
-    getLonghandProperties: function(name)
-    {
-        return this._longhandProperties[name] || [];
-    },
-
-    getShorthandValue: function(shorthandProperty)
-    {
-        return this._shorthandValues[shorthandProperty];
-    },
-
-    getShorthandPriority: function(shorthandProperty)
-    {
-        var priority = this.getPropertyPriority(shorthandProperty);
-        if (priority)
-            return priority;
-
-        var longhands = this._longhandProperties[shorthandProperty];
-        return longhands ? this.getPropertyPriority(longhands[0]) : null;
-    }
-}
-
-WebInspector.attributesUpdated = function()
-{
-    this.domAgent._attributesUpdated.apply(this.domAgent, arguments);
-}
-
-WebInspector.setDocument = function()
-{
-    this.domAgent._setDocument.apply(this.domAgent, arguments);
-}
-
-WebInspector.setDetachedRoot = function()
-{
-    this.domAgent._setDetachedRoot.apply(this.domAgent, arguments);
-}
-
-WebInspector.setChildNodes = function()
-{
-    this.domAgent._setChildNodes.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeCountUpdated = function()
-{
-    this.domAgent._childNodeCountUpdated.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeInserted = function()
-{
-    this.domAgent._childNodeInserted.apply(this.domAgent, arguments);
-}
-
-WebInspector.childNodeRemoved = function()
-{
-    this.domAgent._childNodeRemoved.apply(this.domAgent, arguments);
-}
-
-WebInspector.didGetCookies = WebInspector.Callback.processCallback;
-WebInspector.didGetChildNodes = WebInspector.Callback.processCallback;
-WebInspector.didPerformSearch = WebInspector.Callback.processCallback;
-WebInspector.didApplyDomChange = WebInspector.Callback.processCallback;
-WebInspector.didRemoveAttribute = WebInspector.Callback.processCallback;
-WebInspector.didSetTextNodeValue = WebInspector.Callback.processCallback;
-WebInspector.didGetEventListenersForNode = WebInspector.Callback.processCallback;
-
-/* InjectedScript.js */
-
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var InjectedScript = {};
-
-// Called from within InspectorController on the 'inspected page' side.
-InjectedScript.reset = function()
-{
-    InjectedScript._styles = {};
-    InjectedScript._styleRules = {};
-    InjectedScript._lastStyleId = 0;
-    InjectedScript._lastStyleRuleId = 0;
-    InjectedScript._searchResults = [];
-    InjectedScript._includedInSearchResultsPropertyName = "__includedInInspectorSearchResults";
-}
-
-InjectedScript.reset();
-
-InjectedScript.dispatch = function(methodName, args, callId)
-{
-    var argsArray = JSON.parse(args);
-    if (callId)
-        argsArray.splice(0, 0, callId);  // Methods that run asynchronously have a call back id parameter.
-    var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
-    if (typeof result === "undefined") {
-        InjectedScript._window().console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
-        result = null;
-    }
-    return JSON.stringify(result);
-}
-
-InjectedScript.getStyles = function(nodeId, authorOnly)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    var defaultView = node.ownerDocument.defaultView;
-    var matchedRules = defaultView.getMatchedCSSRules(node, "", authorOnly);
-    var matchedCSSRules = [];
-    for (var i = 0; matchedRules && i < matchedRules.length; ++i)
-        matchedCSSRules.push(InjectedScript._serializeRule(matchedRules[i]));
-
-    var styleAttributes = {};
-    var attributes = node.attributes;
-    for (var i = 0; attributes && i < attributes.length; ++i) {
-        if (attributes[i].style)
-            styleAttributes[attributes[i].name] = InjectedScript._serializeStyle(attributes[i].style, true);
-    }
-    var result = {};
-    result.inlineStyle = InjectedScript._serializeStyle(node.style, true);
-    result.computedStyle = InjectedScript._serializeStyle(defaultView.getComputedStyle(node));
-    result.matchedCSSRules = matchedCSSRules;
-    result.styleAttributes = styleAttributes;
-    return result;
-}
-
-InjectedScript.getComputedStyle = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    return InjectedScript._serializeStyle(node.ownerDocument.defaultView.getComputedStyle(node));
-}
-
-InjectedScript.getInlineStyle = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    return InjectedScript._serializeStyle(node.style, true);
-}
-
-InjectedScript.applyStyleText = function(styleId, styleText, propertyName)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    var styleTextLength = styleText.length;
-
-    // Create a new element to parse the user input CSS.
-    var parseElement = document.createElement("span");
-    parseElement.setAttribute("style", styleText);
-
-    var tempStyle = parseElement.style;
-    if (tempStyle.length || !styleTextLength) {
-        // The input was parsable or the user deleted everything, so remove the
-        // original property from the real style declaration. If this represents
-        // a shorthand remove all the longhand properties.
-        if (style.getPropertyShorthand(propertyName)) {
-            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
-            for (var i = 0; i < longhandProperties.length; ++i)
-                style.removeProperty(longhandProperties[i]);
-        } else
-            style.removeProperty(propertyName);
-    }
-
-    // Notify caller that the property was successfully deleted.
-    if (!styleTextLength)
-        return [null, [propertyName]];
-
-    if (!tempStyle.length)
-        return false;
-
-    // Iterate of the properties on the test element's style declaration and
-    // add them to the real style declaration. We take care to move shorthands.
-    var foundShorthands = {};
-    var changedProperties = [];
-    var uniqueProperties = InjectedScript._getUniqueStyleProperties(tempStyle);
-    for (var i = 0; i < uniqueProperties.length; ++i) {
-        var name = uniqueProperties[i];
-        var shorthand = tempStyle.getPropertyShorthand(name);
-
-        if (shorthand && shorthand in foundShorthands)
-            continue;
-
-        if (shorthand) {
-            var value = InjectedScript._getShorthandValue(tempStyle, shorthand);
-            var priority = InjectedScript._getShorthandPriority(tempStyle, shorthand);
-            foundShorthands[shorthand] = true;
-        } else {
-            var value = tempStyle.getPropertyValue(name);
-            var priority = tempStyle.getPropertyPriority(name);
-        }
-
-        // Set the property on the real style declaration.
-        style.setProperty((shorthand || name), value, priority);
-        changedProperties.push(shorthand || name);
-    }
-    return [InjectedScript._serializeStyle(style, true), changedProperties];
-}
-
-InjectedScript.setStyleText = function(style, cssText)
-{
-    style.cssText = cssText;
-    return true;
-}
-
-InjectedScript.toggleStyleEnabled = function(styleId, propertyName, disabled)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    if (disabled) {
-        if (!style.__disabledPropertyValues || !style.__disabledPropertyPriorities) {
-            var inspectedWindow = InjectedScript._window();
-            style.__disabledProperties = new inspectedWindow.Object;
-            style.__disabledPropertyValues = new inspectedWindow.Object;
-            style.__disabledPropertyPriorities = new inspectedWindow.Object;
-        }
-
-        style.__disabledPropertyValues[propertyName] = style.getPropertyValue(propertyName);
-        style.__disabledPropertyPriorities[propertyName] = style.getPropertyPriority(propertyName);
-
-        if (style.getPropertyShorthand(propertyName)) {
-            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
-            for (var i = 0; i < longhandProperties.length; ++i) {
-                style.__disabledProperties[longhandProperties[i]] = true;
-                style.removeProperty(longhandProperties[i]);
-            }
-        } else {
-            style.__disabledProperties[propertyName] = true;
-            style.removeProperty(propertyName);
-        }
-    } else if (style.__disabledProperties && style.__disabledProperties[propertyName]) {
-        var value = style.__disabledPropertyValues[propertyName];
-        var priority = style.__disabledPropertyPriorities[propertyName];
-
-        style.setProperty(propertyName, value, priority);
-        delete style.__disabledProperties[propertyName];
-        delete style.__disabledPropertyValues[propertyName];
-        delete style.__disabledPropertyPriorities[propertyName];
-    }
-    return InjectedScript._serializeStyle(style, true);
-}
-
-InjectedScript.applyStyleRuleText = function(ruleId, newContent, selectedNodeId)
-{
-    var rule = InjectedScript._styleRules[ruleId];
-    if (!rule)
-        return false;
-
-    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
-
-    try {
-        var stylesheet = rule.parentStyleSheet;
-        stylesheet.addRule(newContent);
-        var newRule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
-        newRule.style.cssText = rule.style.cssText;
-
-        var parentRules = stylesheet.cssRules;
-        for (var i = 0; i < parentRules.length; ++i) {
-            if (parentRules[i] === rule) {
-                rule.parentStyleSheet.removeRule(i);
-                break;
-            }
-        }
-
-        return [InjectedScript._serializeRule(newRule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode)];
-    } catch(e) {
-        // Report invalid syntax.
-        return false;
-    }
-}
-
-InjectedScript.addStyleSelector = function(newContent, selectedNodeId)
-{
-    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
-    if (!selectedNode)
-        return false;
-    var ownerDocument = selectedNode.ownerDocument;
-
-    var stylesheet = ownerDocument.__stylesheet;
-    if (!stylesheet) {
-        var head = ownerDocument.head;
-        var styleElement = ownerDocument.createElement("style");
-        styleElement.type = "text/css";
-        head.appendChild(styleElement);
-        stylesheet = ownerDocument.styleSheets[ownerDocument.styleSheets.length - 1];
-        ownerDocument.__stylesheet = stylesheet;
-    }
-
-    try {
-        stylesheet.addRule(newContent);
-    } catch (e) {
-        // Invalid Syntax for a Selector
-        return false;
-    }
-
-    var rule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
-    rule.__isViaInspector = true;
-
-    return [ InjectedScript._serializeRule(rule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode) ];
-}
-
-InjectedScript._doesSelectorAffectNode = function(selectorText, node)
-{
-    if (!node)
-        return false;
-    var nodes = node.ownerDocument.querySelectorAll(selectorText);
-    for (var i = 0; i < nodes.length; ++i) {
-        if (nodes[i] === node) {
-            return true;
-        }
-    }
-    return false;
-}
-
-InjectedScript.setStyleProperty = function(styleId, name, value)
-{
-    var style = InjectedScript._styles[styleId];
-    if (!style)
-        return false;
-
-    style.setProperty(name, value, "");
-    return true;
-}
-
-InjectedScript._serializeRule = function(rule)
-{
-    var parentStyleSheet = rule.parentStyleSheet;
-
-    var ruleValue = {};
-    ruleValue.selectorText = rule.selectorText;
-    if (parentStyleSheet) {
-        ruleValue.parentStyleSheet = {};
-        ruleValue.parentStyleSheet.href = parentStyleSheet.href;
-    }
-    ruleValue.isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode && !parentStyleSheet.href;
-    ruleValue.isUser = parentStyleSheet && parentStyleSheet.ownerNode && parentStyleSheet.ownerNode.nodeName == "#document";
-    ruleValue.isViaInspector = !!rule.__isViaInspector;
-
-    // Bind editable scripts only.
-    var doBind = !ruleValue.isUserAgent && !ruleValue.isUser;
-    ruleValue.style = InjectedScript._serializeStyle(rule.style, doBind);
-
-    if (doBind) {
-        if (!rule.id) {
-            rule.id = InjectedScript._lastStyleRuleId++;
-            InjectedScript._styleRules[rule.id] = rule;
-        }
-        ruleValue.id = rule.id;
-    }
-    return ruleValue;
-}
-
-InjectedScript._serializeStyle = function(style, doBind)
-{
-    var result = {};
-    result.width = style.width;
-    result.height = style.height;
-    result.__disabledProperties = style.__disabledProperties;
-    result.__disabledPropertyValues = style.__disabledPropertyValues;
-    result.__disabledPropertyPriorities = style.__disabledPropertyPriorities;
-    result.properties = [];
-    result.shorthandValues = {};
-    var foundShorthands = {};
-    for (var i = 0; i < style.length; ++i) {
-        var property = {};
-        var name = style[i];
-        property.name = name;
-        property.priority = style.getPropertyPriority(name);
-        property.implicit = style.isPropertyImplicit(name);
-        var shorthand =  style.getPropertyShorthand(name);
-        property.shorthand = shorthand;
-        if (shorthand && !(shorthand in foundShorthands)) {
-            foundShorthands[shorthand] = true;
-            result.shorthandValues[shorthand] = InjectedScript._getShorthandValue(style, shorthand);
-        }
-        property.value = style.getPropertyValue(name);
-        result.properties.push(property);
-    }
-    result.uniqueStyleProperties = InjectedScript._getUniqueStyleProperties(style);
-
-    if (doBind) {
-        if (!style.id) {
-            style.id = InjectedScript._lastStyleId++;
-            InjectedScript._styles[style.id] = style;
-        }
-        result.id = style.id;
-    }
-    return result;
-}
-
-InjectedScript._getUniqueStyleProperties = function(style)
-{
-    var properties = [];
-    var foundProperties = {};
-
-    for (var i = 0; i < style.length; ++i) {
-        var property = style[i];
-        if (property in foundProperties)
-            continue;
-        foundProperties[property] = true;
-        properties.push(property);
-    }
-
-    return properties;
-}
-
-
-InjectedScript._getLonghandProperties = function(style, shorthandProperty)
-{
-    var properties = [];
-    var foundProperties = {};
-
-    for (var i = 0; i < style.length; ++i) {
-        var individualProperty = style[i];
-        if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-            continue;
-        foundProperties[individualProperty] = true;
-        properties.push(individualProperty);
-    }
-
-    return properties;
-}
-
-InjectedScript._getShorthandValue = function(style, shorthandProperty)
-{
-    var value = style.getPropertyValue(shorthandProperty);
-    if (!value) {
-        // Some shorthands (like border) return a null value, so compute a shorthand value.
-        // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823 is fixed.
-
-        var foundProperties = {};
-        for (var i = 0; i < style.length; ++i) {
-            var individualProperty = style[i];
-            if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-                continue;
-
-            var individualValue = style.getPropertyValue(individualProperty);
-            if (style.isPropertyImplicit(individualProperty) || individualValue === "initial")
-                continue;
-
-            foundProperties[individualProperty] = true;
-
-            if (!value)
-                value = "";
-            else if (value.length)
-                value += " ";
-            value += individualValue;
-        }
-    }
-    return value;
-}
-
-InjectedScript._getShorthandPriority = function(style, shorthandProperty)
-{
-    var priority = style.getPropertyPriority(shorthandProperty);
-    if (!priority) {
-        for (var i = 0; i < style.length; ++i) {
-            var individualProperty = style[i];
-            if (style.getPropertyShorthand(individualProperty) !== shorthandProperty)
-                continue;
-            priority = style.getPropertyPriority(individualProperty);
-            break;
-        }
-    }
-    return priority;
-}
-
-InjectedScript.getPrototypes = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    var result = [];
-    for (var prototype = node; prototype; prototype = prototype.__proto__) {
-        var title = Object.describe(prototype, true);
-        if (title.match(/Prototype$/)) {
-            title = title.replace(/Prototype$/, "");
-        }
-        result.push(title);
-    }
-    return result;
-}
-
-InjectedScript.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object)
-        return false;
-
-    var properties = [];
-
-    // Go over properties, prepare results.
-    for (var propertyName in object) {
-        if (!ignoreHasOwnProperty && "hasOwnProperty" in object && !object.hasOwnProperty(propertyName))
-            continue;
-
-        var property = {};
-        property.name = propertyName;
-        property.parentObjectProxy = objectProxy;
-        var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
-        if (!property.isGetter) {
-            var childObject = object[propertyName];
-            var childObjectProxy = new InjectedScript.createProxyObject(childObject, objectProxy.objectId, abbreviate);
-            childObjectProxy.path = objectProxy.path ? objectProxy.path.slice() : [];
-            childObjectProxy.path.push(propertyName);
-            childObjectProxy.protoDepth = objectProxy.protoDepth || 0;
-            property.value = childObjectProxy;
-        } else {
-            // FIXME: this should show something like "getter" (bug 16734).
-            property.value = { description: "\u2014" }; // em dash
-            property.isGetter = true;
-        }
-        properties.push(property);
-    }
-    return properties;
-}
-
-InjectedScript.setPropertyValue = function(objectProxy, propertyName, expression)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object)
-        return false;
-
-    var expressionLength = expression.length;
-    if (!expressionLength) {
-        delete object[propertyName];
-        return !(propertyName in object);
-    }
-
-    try {
-        // Surround the expression in parenthesis so the result of the eval is the result
-        // of the whole expression not the last potential sub-expression.
-
-        // There is a regression introduced here: eval is now happening against global object,
-        // not call frame while on a breakpoint.
-        // TODO: bring evaluation against call frame back.
-        var result = InjectedScript._window().eval("(" + expression + ")");
-        // Store the result in the property.
-        object[propertyName] = result;
-        return true;
-    } catch(e) {
-        try {
-            var result = InjectedScript._window().eval("\"" + expression.escapeCharacters("\"") + "\"");
-            object[propertyName] = result;
-            return true;
-        } catch(e) {
-            return false;
-        }
-    }
-}
-
-InjectedScript.getNodePropertyValue = function(nodeId, propertyName)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-    var result = node[propertyName];
-    return result !== undefined ? result : false;
-}
-
-InjectedScript.setOuterHTML = function(nodeId, value, expanded)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    var parent = node.parentNode;
-    var prevSibling = node.previousSibling;
-    node.outerHTML = value;
-    var newNode = prevSibling ? prevSibling.nextSibling : parent.firstChild;
-
-    return InjectedScriptHost.pushNodePathToFrontend(newNode, expanded, false);
-}
-
-InjectedScript.getCompletions = function(expression, includeInspectorCommandLineAPI, callFrameId)
-{
-    var props = {};
-    try {
-        var expressionResult;
-        // Evaluate on call frame if call frame id is available.
-        if (typeof callFrameId === "number") {
-            var callFrame = InjectedScript._callFrameForId(callFrameId);
-            if (!callFrame)
-                return props;
-            if (expression)
-                expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
-            else {
-                // Evaluate into properties in scope of the selected call frame.
-                var scopeChain = callFrame.scopeChain;
-                for (var i = 0; i < scopeChain.length; ++i) {
-                    var scopeObject = scopeChain[i];
-                    try {
-                        for (var propertyName in scopeObject)
-                            props[propertyName] = true;
-                    } catch (e) {
-                    }
-                }
-            }
-        } else {
-            if (!expression)
-                expression = "this";
-            expressionResult = InjectedScript._evaluateOn(InjectedScript._window().eval, InjectedScript._window(), expression);
-        }
-        if (expressionResult)
-            for (var prop in expressionResult)
-                props[prop] = true;
-        if (includeInspectorCommandLineAPI)
-            for (var prop in InjectedScript._window().console._inspectorCommandLineAPI)
-                if (prop.charAt(0) !== '_')
-                    props[prop] = true;
-    } catch(e) {
-    }
-    return props;
-}
-
-InjectedScript.evaluate = function(expression, objectGroup)
-{
-    return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression, objectGroup);
-}
-
-InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup)
-{
-    var result = {};
-    try {
-        result.value = InjectedScriptHost.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression), objectGroup);
-        // Handle error that might have happened while describing result.
-        if (result.value.errorText) {
-            result.value = result.value.errorText;
-            result.isException = true;
-        }
-    } catch (e) {
-        result.value = e.toString();
-        result.isException = true;
-    }
-    return result;
-}
-
-InjectedScript._evaluateOn = function(evalFunction, object, expression)
-{
-    InjectedScript._ensureCommandLineAPIInstalled(evalFunction, object);
-    // Surround the expression in with statements to inject our command line API so that
-    // the window object properties still take more precedent than our API functions.
-    expression = "with (window.console._inspectorCommandLineAPI) { with (window) {\n" + expression + "\n} }";
-    var value = evalFunction.call(object, expression);
-
-    // When evaluating on call frame error is not thrown, but returned as a value.
-    if (Object.type(value) === "error")
-        throw value.toString();
-
-    return value;
-}
-
-InjectedScript.addInspectedNode = function(nodeId)
-{
-    var node = InjectedScript._nodeForId(nodeId);
-    if (!node)
-        return false;
-
-    InjectedScript._ensureCommandLineAPIInstalled(InjectedScript._window().eval, InjectedScript._window());
-    var inspectedNodes = InjectedScript._window().console._inspectorCommandLineAPI._inspectedNodes;
-    inspectedNodes.unshift(node);
-    if (inspectedNodes.length >= 5)
-        inspectedNodes.pop();
-    return true;
-}
-
-InjectedScript.performSearch = function(whitespaceTrimmedQuery)
-{
-    var tagNameQuery = whitespaceTrimmedQuery;
-    var attributeNameQuery = whitespaceTrimmedQuery;
-    var startTagFound = (tagNameQuery.indexOf("<") === 0);
-    var endTagFound = (tagNameQuery.lastIndexOf(">") === (tagNameQuery.length - 1));
-
-    if (startTagFound || endTagFound) {
-        var tagNameQueryLength = tagNameQuery.length;
-        tagNameQuery = tagNameQuery.substring((startTagFound ? 1 : 0), (endTagFound ? (tagNameQueryLength - 1) : tagNameQueryLength));
-    }
-
-    // Check the tagNameQuery is it is a possibly valid tag name.
-    if (!/^[a-zA-Z0-9\-_:]+$/.test(tagNameQuery))
-        tagNameQuery = null;
-
-    // Check the attributeNameQuery is it is a possibly valid tag name.
-    if (!/^[a-zA-Z0-9\-_:]+$/.test(attributeNameQuery))
-        attributeNameQuery = null;
-
-    const escapedQuery = whitespaceTrimmedQuery.escapeCharacters("'");
-    const escapedTagNameQuery = (tagNameQuery ? tagNameQuery.escapeCharacters("'") : null);
-    const escapedWhitespaceTrimmedQuery = whitespaceTrimmedQuery.escapeCharacters("'");
-    const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
-
-    function addNodesToResults(nodes, length, getItem)
-    {
-        if (!length)
-            return;
-
-        var nodeIds = [];
-        for (var i = 0; i < length; ++i) {
-            var node = getItem.call(nodes, i);
-            // Skip this node if it already has the property.
-            if (searchResultsProperty in node)
-                continue;
-
-            if (!InjectedScript._searchResults.length) {
-                InjectedScript._currentSearchResultIndex = 0;
-            }
-
-            node[searchResultsProperty] = true;
-            InjectedScript._searchResults.push(node);
-            var nodeId = InjectedScriptHost.pushNodePathToFrontend(node, false, false);
-            nodeIds.push(nodeId);
-        }
-        InjectedScriptHost.addNodesToSearchResult(nodeIds.join(","));
-    }
-
-    function matchExactItems(doc)
-    {
-        matchExactId.call(this, doc);
-        matchExactClassNames.call(this, doc);
-        matchExactTagNames.call(this, doc);
-        matchExactAttributeNames.call(this, doc);
-    }
-
-    function matchExactId(doc)
-    {
-        const result = doc.__proto__.getElementById.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, (result ? 1 : 0), function() { return this });
-    }
-
-    function matchExactClassNames(doc)
-    {
-        const result = doc.__proto__.getElementsByClassName.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchExactTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.getElementsByTagName.call(doc, tagNameQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchExactAttributeNames(doc)
-    {
-        if (!attributeNameQuery)
-            return;
-        const result = doc.__proto__.querySelectorAll.call(doc, "[" + attributeNameQuery + "]");
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchPartialTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchStartOfTagNames(doc)
-    {
-        if (!tagNameQuery)
-            return;
-        const result = doc.__proto__.evaluate.call(doc, "//*[starts-with(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchPartialTagNamesAndAttributeValues(doc)
-    {
-        if (!tagNameQuery) {
-            matchPartialAttributeValues.call(this, doc);
-            return;
-        }
-
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "') or contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchPartialAttributeValues(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, "//*[contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchStyleSelector(doc)
-    {
-        const result = doc.__proto__.querySelectorAll.call(doc, whitespaceTrimmedQuery);
-        addNodesToResults.call(this, result, result.length, result.item);
-    }
-
-    function matchPlainText(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, "//text()[contains(., '" + escapedQuery + "')] | //comment()[contains(., '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function matchXPathQuery(doc)
-    {
-        const result = doc.__proto__.evaluate.call(doc, whitespaceTrimmedQuery, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
-    }
-
-    function finishedSearching()
-    {
-        // Remove the searchResultsProperty now that the search is finished.
-        for (var i = 0; i < InjectedScript._searchResults.length; ++i)
-            delete InjectedScript._searchResults[i][searchResultsProperty];
-    }
-
-    const mainFrameDocument = InjectedScript._window().document;
-    const searchDocuments = [mainFrameDocument];
-    var searchFunctions;
-    if (tagNameQuery && startTagFound && endTagFound)
-        searchFunctions = [matchExactTagNames, matchPlainText];
-    else if (tagNameQuery && startTagFound)
-        searchFunctions = [matchStartOfTagNames, matchPlainText];
-    else if (tagNameQuery && endTagFound) {
-        // FIXME: we should have a matchEndOfTagNames search function if endTagFound is true but not startTagFound.
-        // This requires ends-with() support in XPath, WebKit only supports starts-with() and contains().
-        searchFunctions = [matchPartialTagNames, matchPlainText];
-    } else if (whitespaceTrimmedQuery === "//*" || whitespaceTrimmedQuery === "*") {
-        // These queries will match every node. Matching everything isn't useful and can be slow for large pages,
-        // so limit the search functions list to plain text and attribute matching.
-        searchFunctions = [matchPartialAttributeValues, matchPlainText];
-    } else
-        searchFunctions = [matchExactItems, matchStyleSelector, matchPartialTagNamesAndAttributeValues, matchPlainText, matchXPathQuery];
-
-    // Find all frames, iframes and object elements to search their documents.
-    const querySelectorAllFunction = InjectedScript._window().Document.prototype.querySelectorAll;
-    const subdocumentResult = querySelectorAllFunction.call(mainFrameDocument, "iframe, frame, object");
-
-    for (var i = 0; i < subdocumentResult.length; ++i) {
-        var element = subdocumentResult.item(i);
-        if (element.contentDocument)
-            searchDocuments.push(element.contentDocument);
-    }
-
-    const panel = InjectedScript;
-    var documentIndex = 0;
-    var searchFunctionIndex = 0;
-    var chunkIntervalIdentifier = null;
-
-    // Split up the work into chunks so we don't block the UI thread while processing.
-
-    function processChunk()
-    {
-        var searchDocument = searchDocuments[documentIndex];
-        var searchFunction = searchFunctions[searchFunctionIndex];
-
-        if (++searchFunctionIndex > searchFunctions.length) {
-            searchFunction = searchFunctions[0];
-            searchFunctionIndex = 0;
-
-            if (++documentIndex > searchDocuments.length) {
-                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
-                    delete panel._currentSearchChunkIntervalIdentifier;
-                clearInterval(chunkIntervalIdentifier);
-                finishedSearching.call(panel);
-                return;
-            }
-
-            searchDocument = searchDocuments[documentIndex];
-        }
-
-        if (!searchDocument || !searchFunction)
-            return;
-
-        try {
-            searchFunction.call(panel, searchDocument);
-        } catch(err) {
-            // ignore any exceptions. the query might be malformed, but we allow that.
-        }
-    }
-
-    processChunk();
-
-    chunkIntervalIdentifier = setInterval(processChunk, 25);
-    InjectedScript._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
-    return true;
-}
-
-InjectedScript.searchCanceled = function()
-{
-    if (InjectedScript._searchResults) {
-        const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
-        for (var i = 0; i < this._searchResults.length; ++i) {
-            var node = this._searchResults[i];
-
-            // Remove the searchResultsProperty since there might be an unfinished search.
-            delete node[searchResultsProperty];
-        }
-    }
-
-    if (InjectedScript._currentSearchChunkIntervalIdentifier) {
-        clearInterval(InjectedScript._currentSearchChunkIntervalIdentifier);
-        delete InjectedScript._currentSearchChunkIntervalIdentifier;
-    }
-    InjectedScript._searchResults = [];
-    return true;
-}
-
-InjectedScript.openInInspectedWindow = function(url)
-{
-    // Don't call window.open on wrapper - popup blocker mutes it.
-    // URIs should have no double quotes.
-    InjectedScript._window().eval("window.open(\"" + url + "\")");
-    return true;
-}
-
-InjectedScript.getCallFrames = function()
-{
-    var callFrame = InjectedScriptHost.currentCallFrame();
-    if (!callFrame)
-        return false;
-
-    var result = [];
-    var depth = 0;
-    do {
-        result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
-        callFrame = callFrame.caller;
-    } while (callFrame);
-    return result;
-}
-
-InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
-{
-    var callFrame = InjectedScript._callFrameForId(callFrameId);
-    if (!callFrame)
-        return false;
-    return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
-}
-
-InjectedScript._callFrameForId = function(id)
-{
-    var callFrame = InjectedScriptHost.currentCallFrame();
-    while (--id >= 0 && callFrame)
-        callFrame = callFrame.caller;
-    return callFrame;
-}
-
-InjectedScript.clearConsoleMessages = function()
-{
-    InjectedScriptHost.clearConsoleMessages();
-    return true;
-}
-
-InjectedScript._inspectObject = function(o)
-{
-    if (arguments.length === 0)
-        return;
-
-    var inspectedWindow = InjectedScript._window();
-    inspectedWindow.console.log(o);
-    if (Object.type(o) === "node") {
-        InjectedScriptHost.pushNodePathToFrontend(o, false, true);
-    } else {
-        switch (Object.describe(o)) {
-            case "Database":
-                InjectedScriptHost.selectDatabase(o);
-                break;
-            case "Storage":
-                InjectedScriptHost.selectDOMStorage(o);
-                break;
-        }
-    }
-}
-
-InjectedScript._copy = function(o)
-{
-    if (Object.type(o) === "node") {
-        var nodeId = InjectedScriptHost.pushNodePathToFrontend(o, false, false);
-        InjectedScriptHost.copyNode(nodeId);
-    } else {
-        InjectedScriptHost.copyText(o);
-    }
-}
-
-InjectedScript._ensureCommandLineAPIInstalled = function(evalFunction, evalObject)
-{
-    if (evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI"))
-        return;
-    var inspectorCommandLineAPI = evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI = { \n\
-        $: function() { return document.getElementById.apply(document, arguments) }, \n\
-        $$: function() { return document.querySelectorAll.apply(document, arguments) }, \n\
-        $x: function(xpath, context) \n\
-        { \n\
-            var nodes = []; \n\
-            try { \n\
-                var doc = context || document; \n\
-                var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); \n\
-                var node; \n\
-                while (node = results.iterateNext()) nodes.push(node); \n\
-            } catch (e) {} \n\
-            return nodes; \n\
-        }, \n\
-        dir: function() { return console.dir.apply(console, arguments) }, \n\
-        dirxml: function() { return console.dirxml.apply(console, arguments) }, \n\
-        keys: function(o) { var a = []; for (var k in o) a.push(k); return a; }, \n\
-        values: function(o) { var a = []; for (var k in o) a.push(o[k]); return a; }, \n\
-        profile: function() { return console.profile.apply(console, arguments) }, \n\
-        profileEnd: function() { return console.profileEnd.apply(console, arguments) }, \n\
-        _logEvent: function _inspectorCommandLineAPI_logEvent(e) { console.log(e.type, e); }, \n\
-        _allEventTypes: [\"mouse\", \"key\", \"load\", \"unload\", \"abort\", \"error\", \n\
-            \"select\", \"change\", \"submit\", \"reset\", \"focus\", \"blur\", \n\
-            \"resize\", \"scroll\"], \n\
-        _normalizeEventTypes: function(t) \n\
-        { \n\
-            if (typeof t === \"undefined\") \n\
-                t = console._inspectorCommandLineAPI._allEventTypes; \n\
-            else if (typeof t === \"string\") \n\
-                t = [t]; \n\
-            var i, te = []; \n\
-            for (i = 0; i < t.length; i++) { \n\
-                if (t[i] === \"mouse\") \n\
-                    te.splice(0, 0, \"mousedown\", \"mouseup\", \"click\", \"dblclick\", \n\
-                        \"mousemove\", \"mouseover\", \"mouseout\"); \n\
-                else if (t[i] === \"key\") \n\
-                    te.splice(0, 0, \"keydown\", \"keyup\", \"keypress\"); \n\
-                else \n\
-                    te.push(t[i]); \n\
-            } \n\
-            return te; \n\
-        }, \n\
-        monitorEvents: function(o, t) \n\
-        { \n\
-            if (!o || !o.addEventListener || !o.removeEventListener) \n\
-                return; \n\
-            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
-            for (i = 0; i < t.length; i++) { \n\
-                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-                o.addEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-            } \n\
-        }, \n\
-        unmonitorEvents: function(o, t) \n\
-        { \n\
-            if (!o || !o.removeEventListener) \n\
-                return; \n\
-            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
-            for (i = 0; i < t.length; i++) { \n\
-                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
-            } \n\
-        }, \n\
-        _inspectedNodes: [], \n\
-        get $0() { return console._inspectorCommandLineAPI._inspectedNodes[0] }, \n\
-        get $1() { return console._inspectorCommandLineAPI._inspectedNodes[1] }, \n\
-        get $2() { return console._inspectorCommandLineAPI._inspectedNodes[2] }, \n\
-        get $3() { return console._inspectorCommandLineAPI._inspectedNodes[3] }, \n\
-        get $4() { return console._inspectorCommandLineAPI._inspectedNodes[4] }, \n\
-    };");
-
-    inspectorCommandLineAPI.clear = InjectedScriptHost.wrapCallback(InjectedScript.clearConsoleMessages);
-    inspectorCommandLineAPI.inspect = InjectedScriptHost.wrapCallback(InjectedScript._inspectObject);
-    inspectorCommandLineAPI.copy = InjectedScriptHost.wrapCallback(InjectedScript._copy);
-}
-
-InjectedScript._resolveObject = function(objectProxy)
-{
-    var object = InjectedScript._objectForId(objectProxy.objectId);
-    var path = objectProxy.path;
-    var protoDepth = objectProxy.protoDepth;
-
-    // Follow the property path.
-    for (var i = 0; object && path && i < path.length; ++i)
-        object = object[path[i]];
-
-    // Get to the necessary proto layer.
-    for (var i = 0; object && protoDepth && i < protoDepth; ++i)
-        object = object.__proto__;
-
-    return object;
-}
-
-InjectedScript._window = function()
-{
-    // TODO: replace with 'return window;' once this script is injected into
-    // the page's context.
-    return InjectedScriptHost.inspectedWindow();
-}
-
-InjectedScript._nodeForId = function(nodeId)
-{
-    if (!nodeId)
-        return null;
-    return InjectedScriptHost.nodeForId(nodeId);
-}
-
-InjectedScript._objectForId = function(objectId)
-{
-    // There are three types of object ids used:
-    // - numbers point to DOM Node via the InspectorDOMAgent mapping
-    // - strings point to console objects cached in InspectorController for lazy evaluation upon them
-    // - objects contain complex ids and are currently used for scoped objects
-    if (typeof objectId === "number") {
-        return InjectedScript._nodeForId(objectId);
-    } else if (typeof objectId === "string") {
-        return InjectedScriptHost.unwrapObject(objectId);
-    } else if (typeof objectId === "object") {
-        var callFrame = InjectedScript._callFrameForId(objectId.callFrame);
-        if (objectId.thisObject)
-            return callFrame.thisObject;
-        else
-            return callFrame.scopeChain[objectId.chainIndex];
-    }
-    return objectId;
-}
-
-InjectedScript.pushNodeToFrontend = function(objectProxy)
-{
-    var object = InjectedScript._resolveObject(objectProxy);
-    if (!object || Object.type(object) !== "node")
-        return false;
-    return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
-}
-
-InjectedScript.nodeByPath = function(path)
-{
-    // We make this call through the injected script only to get a nice
-    // callback for it.
-    return InjectedScriptHost.pushNodeByPathToFrontend(path.join(","));
-}
-
-// Called from within InspectorController on the 'inspected page' side.
-InjectedScript.createProxyObject = function(object, objectId, abbreviate)
-{
-    var result = {};
-    result.objectId = objectId;
-    result.type = Object.type(object);
-
-    var type = typeof object;
-    if ((type === "object" && object !== null) || type === "function") {
-        for (var subPropertyName in object) {
-            result.hasChildren = true;
-            break;
-        }
-    }
-    try {
-        result.description = Object.describe(object, abbreviate);
-    } catch (e) {
-        result.errorText = e.toString();
-    }
-    return result;
-}
-
-InjectedScript.evaluateOnSelf = function(funcBody)
-{
-    return window.eval("(" + funcBody + ")();");
-}
-
-InjectedScript.CallFrameProxy = function(id, callFrame)
-{
-    this.id = id;
-    this.type = callFrame.type;
-    this.functionName = (this.type === "function" ? callFrame.functionName : "");
-    this.sourceID = callFrame.sourceID;
-    this.line = callFrame.line;
-    this.scopeChain = this._wrapScopeChain(callFrame);
-}
-
-InjectedScript.CallFrameProxy.prototype = {
-    _wrapScopeChain: function(callFrame)
-    {
-        var foundLocalScope = false;
-        var scopeChain = callFrame.scopeChain;
-        var scopeChainProxy = [];
-        for (var i = 0; i < scopeChain.length; ++i) {
-            var scopeObject = scopeChain[i];
-            var scopeObjectProxy = InjectedScript.createProxyObject(scopeObject, { callFrame: this.id, chainIndex: i }, true);
-
-            if (Object.prototype.toString.call(scopeObject) === "[object JSActivation]") {
-                if (!foundLocalScope)
-                    scopeObjectProxy.thisObject = InjectedScript.createProxyObject(callFrame.thisObject, { callFrame: this.id, thisObject: true }, true);
-                else
-                    scopeObjectProxy.isClosure = true;
-                foundLocalScope = true;
-                scopeObjectProxy.isLocal = true;
-            } else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Element)
-                scopeObjectProxy.isElement = true;
-            else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Document)
-                scopeObjectProxy.isDocument = true;
-            else if (!foundLocalScope)
-                scopeObjectProxy.isWithBlock = true;
-            scopeChainProxy.push(scopeObjectProxy);
-        }
-        return scopeChainProxy;
-    }
-}
-
-InjectedScript.executeSql = function(callId, databaseId, query)
-{
-    function successCallback(tx, result)
-    {
-        var rows = result.rows;
-        var result = [];
-        var length = rows.length;
-        for (var i = 0; i < length; ++i) {
-            var data = {};
-            result.push(data);
-            var row = rows.item(i);
-            for (var columnIdentifier in row) {
-                // FIXME: (Bug 19439) We should specially format SQL NULL here
-                // (which is represented by JavaScript null here, and turned
-                // into the string "null" by the String() function).
-                var text = row[columnIdentifier];
-                data[columnIdentifier] = String(text);
-            }
-        }
-        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, JSON.stringify(result), false);
-    }
-
-    function errorCallback(tx, error)
-    {
-        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, JSON.stringify(error), false);
-    }
-
-    function queryTransaction(tx)
-    {
-        tx.executeSql(query, null, InjectedScriptHost.wrapCallback(successCallback), InjectedScriptHost.wrapCallback(errorCallback));
-    }
-
-    var database = InjectedScriptHost.databaseForId(databaseId);
-    if (!database)
-        errorCallback(null, { code : 2 });  // Return as unexpected version.
-    database.transaction(InjectedScriptHost.wrapCallback(queryTransaction), InjectedScriptHost.wrapCallback(errorCallback));
-    return true;
-}
-
-Object.type = function(obj)
-{
-    if (obj === null)
-        return "null";
-
-    var type = typeof obj;
-    if (type !== "object" && type !== "function")
-        return type;
-
-    var win = InjectedScript._window();
-
-    if (obj instanceof win.Node)
-        return (obj.nodeType === undefined ? type : "node");
-    if (obj instanceof win.String)
-        return "string";
-    if (obj instanceof win.Array)
-        return "array";
-    if (obj instanceof win.Boolean)
-        return "boolean";
-    if (obj instanceof win.Number)
-        return "number";
-    if (obj instanceof win.Date)
-        return "date";
-    if (obj instanceof win.RegExp)
-        return "regexp";
-    if (obj instanceof win.NodeList)
-        return "array";
-    if (obj instanceof win.HTMLCollection || obj instanceof win.HTMLAllCollection)
-        return "array";
-    if (obj instanceof win.Error)
-        return "error";
-    return type;
-}
-
-Object.hasProperties = function(obj)
-{
-    if (typeof obj === "undefined" || typeof obj === "null")
-        return false;
-    for (var name in obj)
-        return true;
-    return false;
-}
-
-Object.describe = function(obj, abbreviated)
-{
-    var type1 = Object.type(obj);
-    var type2 = Object.className(obj);
-
-    switch (type1) {
-    case "object":
-    case "node":
-    case "array":
-        return type2;
-    case "string":
-        if (!abbreviated)
-            return obj;
-        if (obj.length > 100)
-            return "\"" + obj.substring(0, 100) + "\u2026\"";
-        return "\"" + obj + "\"";
-    case "function":
-        var objectText = String(obj);
-        if (!/^function /.test(objectText))
-            objectText = (type2 == "object") ? type1 : type2;
-        else if (abbreviated)
-            objectText = /.*/.exec(obj)[0].replace(/ +$/g, "");
-        return objectText;
-    default:
-        return String(obj);
-    }
-}
-
-Object.className = function(obj)
-{
-    return Object.prototype.toString.call(obj).replace(/^\[object (.*)\]$/i, "$1")
-}
-
-// Although Function.prototype.bind and String.prototype.escapeCharacters are defined in utilities.js they will soon become
-// unavailable in the InjectedScript context. So we define them here for the local use.
-// TODO: remove this comment once InjectedScript runs in a separate context.
-Function.prototype.bind = function(thisObject)
-{
-    var func = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
-}
-
-String.prototype.escapeCharacters = function(chars)
-{
-    var foundChar = false;
-    for (var i = 0; i < chars.length; ++i) {
-        if (this.indexOf(chars.charAt(i)) !== -1) {
-            foundChar = true;
-            break;
-        }
-    }
-
-    if (!foundChar)
-        return this;
-
-    var result = "";
-    for (var i = 0; i < this.length; ++i) {
-        if (chars.indexOf(this.charAt(i)) !== -1)
-            result += "\\";
-        result += this.charAt(i);
-    }
-
-    return result;
-}
-
-/* InjectedScriptAccess.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var InjectedScriptAccess = {};
-
-InjectedScriptAccess._installHandler = function(methodName, async)
-{
-    InjectedScriptAccess[methodName] = function()
-    {
-        var allArgs = Array.prototype.slice.call(arguments);
-        var callback = allArgs[allArgs.length - 1];
-        var argsString = JSON.stringify(Array.prototype.slice.call(allArgs, 0, allArgs.length - 1));
-        
-        function myCallback(result, isException)
-        {
-            if (!isException)
-                callback(JSON.parse(result));
-            else
-                WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage("Error dispatching: " + methodName));
-        }
-        var callId = WebInspector.Callback.wrap(myCallback);
-        InspectorBackend.dispatchOnInjectedScript(callId, methodName, argsString, !!async);
-    };
-}
-
-// InjectedScriptAccess message forwarding puts some constraints on the way methods are implemented and called:
-// - Make sure corresponding methods in InjectedScript return non-null and non-undefined values,
-// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
-// We keep these sorted.
-InjectedScriptAccess._installHandler("addInspectedNode");
-InjectedScriptAccess._installHandler("addStyleSelector");
-InjectedScriptAccess._installHandler("applyStyleRuleText");
-InjectedScriptAccess._installHandler("applyStyleText");
-InjectedScriptAccess._installHandler("clearConsoleMessages");
-InjectedScriptAccess._installHandler("evaluate");
-InjectedScriptAccess._installHandler("evaluateInCallFrame");
-InjectedScriptAccess._installHandler("getCompletions");
-InjectedScriptAccess._installHandler("getComputedStyle");
-InjectedScriptAccess._installHandler("getInlineStyle");
-InjectedScriptAccess._installHandler("getNodePropertyValue");
-InjectedScriptAccess._installHandler("getProperties");
-InjectedScriptAccess._installHandler("getPrototypes");
-InjectedScriptAccess._installHandler("getStyles");
-InjectedScriptAccess._installHandler("openInInspectedWindow");
-InjectedScriptAccess._installHandler("performSearch");
-InjectedScriptAccess._installHandler("pushNodeToFrontend");
-InjectedScriptAccess._installHandler("nodeByPath");
-InjectedScriptAccess._installHandler("searchCanceled");
-InjectedScriptAccess._installHandler("setOuterHTML");
-InjectedScriptAccess._installHandler("setPropertyValue");
-InjectedScriptAccess._installHandler("setStyleProperty");
-InjectedScriptAccess._installHandler("setStyleText");
-InjectedScriptAccess._installHandler("toggleStyleEnabled");
-InjectedScriptAccess._installHandler("evaluateOnSelf");
-
-// Some methods can't run synchronously even on the injected script side (such as DB transactions).
-// Mark them as asynchronous here.
-InjectedScriptAccess._installHandler("executeSql", true);
-
-WebInspector.didDispatchOnInjectedScript = WebInspector.Callback.processCallback;
-
-/* TimelineAgent.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineAgent = function() {
-    // Not implemented.
-}
-
-// Must be kept in sync with TimelineItem.h
-WebInspector.TimelineAgent.RecordType = {
-    EventDispatch : 0,
-    Layout : 1,
-    RecalculateStyles : 2,
-    Paint : 3,
-    ParseHTML : 4,
-    TimerInstall : 5,
-    TimerRemove : 6,
-    TimerFire : 7,
-    XHRReadyStateChange : 8,
-    XHRLoad : 9,
-    EvaluateScript : 10,
-    MarkTimeline : 11,
-    ResourceSendRequest : 12,
-    ResourceReceiveResponse : 13,
-    ResourceFinish : 14
-};
-
-WebInspector.addRecordToTimeline = function(record) {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.addRecordToTimeline(record);
-}
-
-WebInspector.timelineProfilerWasStarted = function() {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.timelineWasStarted();
-}
-
-WebInspector.timelineProfilerWasStopped = function() {
-    if (WebInspector.panels.timeline)
-        WebInspector.panels.timeline.timelineWasStopped();
-}
-
-/* TimelinePanel.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelinePanel = function()
-{
-    WebInspector.Panel.call(this);
-    this.element.addStyleClass("timeline");
-
-    this._overviewPane = new WebInspector.TimelineOverviewPane(this.categories);
-    this._overviewPane.addEventListener("window changed", this._scheduleRefresh, this);
-    this._overviewPane.addEventListener("filter changed", this._refresh, this);
-    this.element.appendChild(this._overviewPane.element);
-
-    this._sidebarBackgroundElement = document.createElement("div");
-    this._sidebarBackgroundElement.className = "sidebar timeline-sidebar-background";
-    this.element.appendChild(this._sidebarBackgroundElement);
-
-    this._containerElement = document.createElement("div");
-    this._containerElement.id = "timeline-container";
-    this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);
-    this.element.appendChild(this._containerElement);
-
-    this.createSidebar(this._containerElement, this._containerElement);
-    var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);
-    itemsTreeElement.expanded = true;
-    this.sidebarTree.appendChild(itemsTreeElement);
-
-    this._sidebarListElement = document.createElement("div");
-    this.sidebarElement.appendChild(this._sidebarListElement);
-
-    this._containerContentElement = document.createElement("div");
-    this._containerContentElement.id = "resources-container-content";
-    this._containerElement.appendChild(this._containerContentElement);
-
-    this._timelineGrid = new WebInspector.TimelineGrid();
-    this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
-    this._itemsGraphsElement.id = "timeline-graphs";
-    this._containerContentElement.appendChild(this._timelineGrid.element);
-
-    this._topGapElement = document.createElement("div");
-    this._topGapElement.className = "timeline-gap";
-    this._itemsGraphsElement.appendChild(this._topGapElement);
-
-    this._graphRowsElement = document.createElement("div");
-    this._itemsGraphsElement.appendChild(this._graphRowsElement);
-
-    this._bottomGapElement = document.createElement("div");
-    this._bottomGapElement.className = "timeline-gap";
-    this._itemsGraphsElement.appendChild(this._bottomGapElement);
-
-    this._createStatusbarButtons();
-
-    this._records = [];
-    this._sendRequestRecords = {};
-    this._calculator = new WebInspector.TimelineCalculator();
-}
-
-WebInspector.TimelinePanel.prototype = {
-    toolbarItemClass: "timeline",
-
-    get toolbarItemLabel()
-    {
-        return WebInspector.UIString("Timeline");
-    },
-
-    get statusBarItems()
-    {
-        return [this.toggleTimelineButton.element, this.clearButton.element];
-    },
-
-    get categories()
-    {
-        if (!this._categories) {
-            this._categories = {
-                loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), "rgb(47,102,236)"),
-                scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), "rgb(157,231,119)"),
-                rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), "rgb(164,60,255)")
-            };
-        }
-        return this._categories;
-    },
-
-    _createStatusbarButtons: function()
-    {
-        this.toggleTimelineButton = new WebInspector.StatusBarButton("", "record-profile-status-bar-item");
-        this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked.bind(this), false);
-
-        this.clearButton = new WebInspector.StatusBarButton("", "timeline-clear-status-bar-item");
-        this.clearButton.addEventListener("click", this.reset.bind(this), false);
-    },
-
-    _toggleTimelineButtonClicked: function()
-    {
-        if (this.toggleTimelineButton.toggled)
-            InspectorBackend.stopTimelineProfiler();
-        else
-            InspectorBackend.startTimelineProfiler();
-    },
-
-    timelineWasStarted: function()
-    {
-        this.toggleTimelineButton.toggled = true;
-    },
-
-    timelineWasStopped: function()
-    {
-        this.toggleTimelineButton.toggled = false;
-    },
-
-    addRecordToTimeline: function(record)
-    {
-        this._innerAddRecordToTimeline(record, this._records);
-        this._scheduleRefresh();
-    },
-
-    _innerAddRecordToTimeline: function(record, collection)
-    {
-        var formattedRecord = this._formatRecord(record);
-
-        // Glue subsequent records with same category and title together if they are closer than 100ms to each other.
-        if (this._lastRecord && (!record.children || !record.children.length) &&
-                this._lastRecord.category == formattedRecord.category &&
-                this._lastRecord.title == formattedRecord.title &&
-                this._lastRecord.details == formattedRecord.details &&
-                formattedRecord.startTime - this._lastRecord.endTime < 0.1) {
-            this._lastRecord.endTime = formattedRecord.endTime;
-            this._lastRecord.count++;
-        } else {
-            collection.push(formattedRecord);
-            for (var i = 0; record.children && i < record.children.length; ++i) {
-                if (!formattedRecord.children)
-                    formattedRecord.children = [];
-                var formattedChild = this._innerAddRecordToTimeline(record.children[i], formattedRecord.children);
-                formattedChild.parent = formattedRecord;
-            }
-            this._lastRecord = record.children && record.children.length ? null : formattedRecord;
-        }
-        return formattedRecord;
-    },
-
-    _formatRecord: function(record)
-    {
-        var recordTypes = WebInspector.TimelineAgent.RecordType;
-        if (!this._recordStyles) {
-            this._recordStyles = {};
-            this._recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: this.categories.rendering };
-            this._recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse"), category: this.categories.loading };
-            this._recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.MarkTimeline] = { title: WebInspector.UIString("Mark"), category: this.categories.scripting };
-            this._recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: this.categories.loading };
-            this._recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: this.categories.loading };
-            this._recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: this.categories.loading };
-        }
-
-        var style = this._recordStyles[record.type];
-        if (!style)
-            style = this._recordStyles[recordTypes.EventDispatch];
-
-        var formattedRecord = {};
-        formattedRecord.category = style.category;
-        formattedRecord.title = style.title;
-        formattedRecord.startTime = record.startTime / 1000;
-        formattedRecord.data = record.data;
-        formattedRecord.count = 1;
-        formattedRecord.type = record.type;
-        formattedRecord.endTime = (typeof record.endTime !== "undefined") ? record.endTime / 1000 : formattedRecord.startTime;
-        formattedRecord.record = record;
-
-        // Make resource receive record last since request was sent; make finish record last since response received.
-        if (record.type === WebInspector.TimelineAgent.RecordType.ResourceSendRequest) {
-            this._sendRequestRecords[record.data.identifier] = formattedRecord;
-        } else if (record.type === WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse) {
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            if (sendRequestRecord) { // False if we started instrumentation in the middle of request.
-                sendRequestRecord._responseReceivedFormattedTime = formattedRecord.startTime;
-                formattedRecord.startTime = sendRequestRecord.startTime;
-                sendRequestRecord.details = this._getRecordDetails(record);
-            }
-        } else if (record.type === WebInspector.TimelineAgent.RecordType.ResourceFinish) {
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            if (sendRequestRecord) // False for main resource.
-                formattedRecord.startTime = sendRequestRecord._responseReceivedFormattedTime;
-        }
-        formattedRecord.details = this._getRecordDetails(record);
-
-        return formattedRecord;
-    },
-
-    _getRecordDetails: function(record)
-    {
-        switch (record.type) {
-        case WebInspector.TimelineAgent.RecordType.EventDispatch:
-            return record.data ? record.data.type : "";
-        case WebInspector.TimelineAgent.RecordType.Paint:
-            return record.data.width + "\u2009\u00d7\u2009" + record.data.height;
-        case WebInspector.TimelineAgent.RecordType.TimerInstall:
-        case WebInspector.TimelineAgent.RecordType.TimerRemove:
-        case WebInspector.TimelineAgent.RecordType.TimerFire:
-            return record.data.timerId;
-        case WebInspector.TimelineAgent.RecordType.XHRReadyStateChange:
-        case WebInspector.TimelineAgent.RecordType.XHRLoad:
-        case WebInspector.TimelineAgent.RecordType.EvaluateScript:
-        case WebInspector.TimelineAgent.RecordType.ResourceSendRequest:
-            return WebInspector.displayNameForURL(record.data.url);
-        case WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse:
-        case WebInspector.TimelineAgent.RecordType.ResourceFinish:
-            var sendRequestRecord = this._sendRequestRecords[record.data.identifier];
-            return sendRequestRecord ? WebInspector.displayNameForURL(sendRequestRecord.data.url) : "";
-        case WebInspector.TimelineAgent.RecordType.MarkTimeline:
-            return record.data.message;
-        default:
-            return "";
-        }
-    },
-
-    setSidebarWidth: function(width)
-    {
-        WebInspector.Panel.prototype.setSidebarWidth.call(this, width);
-        this._sidebarBackgroundElement.style.width = width + "px";
-        this._overviewPane.setSidebarWidth(width);
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._containerContentElement.style.left = width + "px";
-        this._scheduleRefresh();
-        this._overviewPane.updateMainViewWidth(width);
-    },
-
-    resize: function() {
-        this._scheduleRefresh();
-    },
-
-    reset: function()
-    {
-        this._lastRecord = null;
-        this._sendRequestRecords = {};
-        this._overviewPane.reset();
-        this._records = [];
-        this._refresh();
-    },
-
-    show: function()
-    {
-        WebInspector.Panel.prototype.show.call(this);
-
-        if (this._needsRefresh)
-            this._refresh();
-    },
-
-    _onScroll: function(event)
-    {
-        var scrollTop = this._containerElement.scrollTop;
-        var dividersTop = Math.max(0, scrollTop);
-        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
-        this._scheduleRefresh(true);
-    },
-
-    _scheduleRefresh: function(immediate)
-    {
-        if (this._needsRefresh)
-            return;
-        this._needsRefresh = true;
-
-        if (this.visible && !("_refreshTimeout" in this))
-            this._refreshTimeout = setTimeout(this._refresh.bind(this), immediate ? 0 : 100);
-    },
-
-    _refresh: function()
-    {
-        this._needsRefresh = false;
-        if ("_refreshTimeout" in this) {
-            clearTimeout(this._refreshTimeout);
-            delete this._refreshTimeout;
-        }
-        this._overviewPane.update(this._records);
-        this._refreshRecords();
-    },
-
-    _refreshRecords: function()
-    {
-        this._calculator.windowLeft = this._overviewPane.windowLeft;
-        this._calculator.windowRight = this._overviewPane.windowRight;
-        this._calculator.reset();
-
-        for (var i = 0; i < this._records.length; ++i)
-            this._calculator.updateBoundaries(this._records[i]);
-
-        var recordsInWindow = [];
-        for (var i = 0; i < this._records.length; ++i) {
-            var record = this._records[i];
-            var percentages = this._calculator.computeBarGraphPercentages(record);
-            if (percentages.start < 100 && percentages.end >= 0 && !record.category.hidden)
-                this._addToRecordsWindow(record, recordsInWindow);
-        }
-
-        // Calculate the visible area.
-        var visibleTop = this._containerElement.scrollTop;
-        var visibleBottom = visibleTop + this._containerElement.clientHeight;
-
-        // Define row height, should be in sync with styles for timeline graphs.
-        const rowHeight = 18;
-        const expandOffset = 15;
-
-        // Convert visible area to visible indexes. Always include top-level record for a visible nested record.
-        var startIndex = Math.max(0, Math.floor(visibleTop / rowHeight) - 1);
-        while (startIndex > 0 && recordsInWindow[startIndex].parent)
-            startIndex--;
-        var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
-        while (endIndex < recordsInWindow.length - 1 && recordsInWindow[startIndex].parent)
-            endIndex++;
-
-        // Resize gaps first.
-        const top = (startIndex * rowHeight) + "px";
-        this._topGapElement.style.height = top;
-        this.sidebarElement.style.top = top;
-        this.sidebarResizeElement.style.top = top;
-        this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";
-
-        // Update visible rows.
-        var listRowElement = this._sidebarListElement.firstChild;
-        var graphRowElement = this._graphRowsElement.firstChild;
-        var width = this._graphRowsElement.offsetWidth;
-        var scheduleRefreshCallback = this._scheduleRefresh.bind(this, true);
-        for (var i = startIndex; i < endIndex; ++i) {
-            var record = recordsInWindow[i];
-            var isEven = !(i % 2);
-
-            if (!listRowElement) {
-                listRowElement = new WebInspector.TimelineRecordListRow().element;
-                this._sidebarListElement.appendChild(listRowElement);
-            }
-            if (!graphRowElement) {
-                graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback, rowHeight).element;
-                this._graphRowsElement.appendChild(graphRowElement);
-            }
-
-            listRowElement.listRow.update(record, isEven);
-            graphRowElement.graphRow.update(record, isEven, this._calculator, width, expandOffset);
-
-            listRowElement = listRowElement.nextSibling;
-            graphRowElement = graphRowElement.nextSibling;
-        }
-
-        // Remove extra rows.
-        while (listRowElement) {
-            var nextElement = listRowElement.nextSibling;
-            listRowElement.listRow.dispose();
-            listRowElement = nextElement;
-        }
-        while (graphRowElement) {
-            var nextElement = graphRowElement.nextSibling;
-            graphRowElement.graphRow.dispose();
-            graphRowElement = nextElement;
-        }
-
-        // Reserve some room for expand / collapse controls to the left for records that start at 0ms.
-        var timelinePaddingLeft = this._calculator.windowLeft === 0 ? expandOffset : 0;
-        this._timelineGrid.updateDividers(true, this._calculator, timelinePaddingLeft);
-        this._adjustScrollPosition((recordsInWindow.length + 1) * rowHeight);
-    },
-
-    _addToRecordsWindow: function(record, recordsWindow)
-    {
-        recordsWindow.push(record);
-        if (!record.collapsed) {
-            var index = recordsWindow.length;
-            for (var i = 0; record.children && i < record.children.length; ++i)
-                this._addToRecordsWindow(record.children[i], recordsWindow);
-            record.visibleChildrenCount = recordsWindow.length - index;
-        }
-    },
-
-    _adjustScrollPosition: function(totalHeight)
-    {
-        // Prevent the container from being scrolled off the end.
-        if ((this._containerElement.scrollTop + this._containerElement.offsetHeight) > totalHeight + 1)
-            this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);
-    }
-}
-
-WebInspector.TimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
-
-
-WebInspector.TimelineCategory = function(name, title, color)
-{
-    this.name = name;
-    this.title = title;
-    this.color = color;
-}
-
-
-WebInspector.TimelineCalculator = function()
-{
-    this.windowLeft = 0.0;
-    this.windowRight = 1.0;
-    this._uiString = WebInspector.UIString.bind(WebInspector);
-}
-
-WebInspector.TimelineCalculator.prototype = {
-    computeBarGraphPercentages: function(record)
-    {
-        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
-        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
-        return {start: start, end: end};
-    },
-
-    get minimumBoundary()
-    {
-        if (typeof this._minimumBoundary === "number")
-            return this._minimumBoundary;
-
-        if (typeof this.windowLeft === "number")
-            this._minimumBoundary = this._absoluteMinimumBoundary + this.windowLeft * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
-        else
-            this._minimumBoundary = this._absoluteMinimumBoundary;
-        return this._minimumBoundary;
-    },
-
-    get maximumBoundary()
-    {
-        if (typeof this._maximumBoundary === "number")
-            return this._maximumBoundary;
-
-        if (typeof this.windowLeft === "number")
-            this._maximumBoundary = this._absoluteMinimumBoundary + this.windowRight * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
-        else
-            this._maximumBoundary = this._absoluteMaximumBoundary;
-        return this._maximumBoundary;
-    },
-
-    reset: function()
-    {
-        delete this._absoluteMinimumBoundary;
-        delete this._absoluteMaximumBoundary;
-        delete this._minimumBoundary;
-        delete this._maximumBoundary;
-    },
-
-    updateBoundaries: function(record)
-    {
-        var didChange = false;
-
-        var lowerBound = record.startTime;
-
-        if (typeof this._absoluteMinimumBoundary === "undefined" || lowerBound < this._absoluteMinimumBoundary) {
-            this._absoluteMinimumBoundary = lowerBound;
-            delete this._minimumBoundary;
-            didChange = true;
-        }
-
-        var upperBound = record.endTime;
-        if (typeof this._absoluteMaximumBoundary === "undefined" || upperBound > this._absoluteMaximumBoundary) {
-            this._absoluteMaximumBoundary = upperBound;
-            delete this._maximumBoundary;
-            didChange = true;
-        }
-
-        return didChange;
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value + this.minimumBoundary - this._absoluteMinimumBoundary, this._uiString);
-    }
-}
-
-
-WebInspector.TimelineRecordListRow = function()
-{
-    this.element = document.createElement("div");
-    this.element.listRow = this;
-    var iconElement = document.createElement("span");
-    iconElement.className = "timeline-tree-icon";
-    this.element.appendChild(iconElement);
-
-    this._typeElement = document.createElement("span");
-    this._typeElement.className = "type";
-    this.element.appendChild(this._typeElement);
-
-    var separatorElement = document.createElement("span");
-    separatorElement.className = "separator";
-    separatorElement.textContent = " ";
-
-    this._dataElement = document.createElement("span");
-    this._dataElement.className = "data dimmed";
-
-    this._repeatCountElement = document.createElement("span");
-    this._repeatCountElement.className = "count";
-
-    this.element.appendChild(separatorElement);
-    this.element.appendChild(this._dataElement);
-    this.element.appendChild(this._repeatCountElement);
-}
-
-WebInspector.TimelineRecordListRow.prototype = {
-    update: function(record, isEven)
-    {
-        this.element.className = "timeline-tree-item timeline-category-" + record.category.name + (isEven ? " even" : "");
-        this._typeElement.textContent = record.title;
-
-        if (record.details) {
-            this._dataElement.textContent = "(" + record.details + ")";
-            this._dataElement.title = record.details;
-        } else {
-            this._dataElement.textContent = "";
-            this._dataElement.title = "";
-        }
-
-        if (record.count > 1)
-            this._repeatCountElement.textContent = "\u2009\u00d7\u2009" + record.count;
-        else
-            this._repeatCountElement.textContent = "";
-    },
-
-    dispose: function()
-    {
-        this.element.parentElement.removeChild(this.element);
-    }
-}
-
-
-WebInspector.TimelineRecordGraphRow = function(graphContainer, refreshCallback, rowHeight)
-{
-    this.element = document.createElement("div");
-    this.element.graphRow = this;
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "timeline-graph-bar-area";
-    this.element.appendChild(this._barAreaElement);
-
-    this._barElement = document.createElement("div");
-    this._barElement.className = "timeline-graph-bar";
-    this._barAreaElement.appendChild(this._barElement);
-
-    this._expandElement = document.createElement("div");
-    this._expandElement.className = "timeline-expandable";
-    graphContainer.appendChild(this._expandElement);
-
-    var leftBorder = document.createElement("div");
-    leftBorder.className = "timeline-expandable-left";
-    this._expandElement.appendChild(leftBorder);
-
-    this._expandElement.addEventListener("click", this._onClick.bind(this));
-    this._refreshCallback = refreshCallback;
-    this._rowHeight = rowHeight;
-}
-
-WebInspector.TimelineRecordGraphRow.prototype = {
-    update: function(record, isEven, calculator, clientWidth, expandOffset)
-    {
-        this._record = record;
-        this.element.className = "timeline-graph-side timeline-category-" + record.category.name + (isEven ? " even" : "");
-        var percentages = calculator.computeBarGraphPercentages(record);
-        var left = percentages.start / 100 * clientWidth;
-        var width = (percentages.end - percentages.start) / 100 * clientWidth;
-        this._barElement.style.left = (left + expandOffset) + "px";
-        this._barElement.style.width = width + "px";
-
-        if (record.visibleChildrenCount) {
-            this._expandElement.style.top = this.element.offsetTop + "px";
-            this._expandElement.style.left = left + "px";
-            this._expandElement.style.width = Math.max(12, width + 25) + "px";
-            if (!record.collapsed) {
-                this._expandElement.style.height = (record.visibleChildrenCount + 1) * this._rowHeight + "px";
-                this._expandElement.addStyleClass("timeline-expandable-expanded");
-                this._expandElement.removeStyleClass("timeline-expandable-collapsed");
-            } else {
-                this._expandElement.style.height = this._rowHeight + "px";
-                this._expandElement.addStyleClass("timeline-expandable-collapsed");
-                this._expandElement.removeStyleClass("timeline-expandable-expanded");
-            }
-            this._expandElement.removeStyleClass("hidden");
-        } else {
-            this._expandElement.addStyleClass("hidden");
-        }
-    },
-
-    _onClick: function(event)
-    {
-        this._record.collapsed = !this._record.collapsed;
-        this._refreshCallback();
-    },
-
-    dispose: function()
-    {
-        this.element.parentElement.removeChild(this.element);
-        this._expandElement.parentElement.removeChild(this._expandElement);
-    }
-}
-
-/* TimelineOverviewPane.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TimelineOverviewPane = function(categories)
-{
-    this.element = document.createElement("div");
-    this.element.id = "timeline-overview-panel";
-
-    this._categories = categories;
-    this._overviewSidebarElement = document.createElement("div");
-    this._overviewSidebarElement.id = "timeline-overview-sidebar";
-    this.element.appendChild(this._overviewSidebarElement);
-
-    var overviewTreeElement = document.createElement("ol");
-    overviewTreeElement.className = "sidebar-tree";
-    this._overviewSidebarElement.appendChild(overviewTreeElement);
-    var sidebarTree = new TreeOutline(overviewTreeElement);
-
-    var categoriesTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("TIMELINES"), {}, true);
-    categoriesTreeElement.expanded = true;
-    sidebarTree.appendChild(categoriesTreeElement);
-    for (var categoryName in this._categories) {
-        var category = this._categories[categoryName];
-        categoriesTreeElement.appendChild(new WebInspector.TimelineCategoryTreeElement(category, this._onCheckboxClicked.bind(this, category)));
-    }
-
-    this._overviewGrid = new WebInspector.TimelineGrid();
-    this._overviewGrid.element.id = "timeline-overview-grid";
-    this._overviewGrid.itemsGraphsElement.id = "timeline-overview-graphs";
-    this.element.appendChild(this._overviewGrid.element);
-
-    this._categoryGraphs = {};
-    var i = 0;
-    for (var category in this._categories) {
-        var categoryGraph = new WebInspector.TimelineCategoryGraph(this._categories[category], i++ % 2);
-        this._categoryGraphs[category] = categoryGraph;
-        this._overviewGrid.itemsGraphsElement.appendChild(categoryGraph.graphElement);
-    }
-    this._overviewGrid.setScrollAndDividerTop(0, 0);
-
-    this._overviewWindowElement = document.createElement("div");
-    this._overviewWindowElement.id = "timeline-overview-window";
-    this._overviewWindowElement.addEventListener("mousedown", this._dragWindow.bind(this), false);
-    this._overviewGrid.element.appendChild(this._overviewWindowElement);
-
-    this._leftResizeElement = document.createElement("div");
-    this._leftResizeElement.className = "timeline-window-resizer";
-    this._leftResizeElement.style.left = 0;
-    this._overviewGrid.element.appendChild(this._leftResizeElement);
-    this._leftResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._leftResizeElement), false);
-
-    this._rightResizeElement = document.createElement("div");
-    this._rightResizeElement.className = "timeline-window-resizer timeline-window-resizer-right";
-    this._rightResizeElement.style.right = 0;
-    this._overviewGrid.element.appendChild(this._rightResizeElement);
-    this._rightResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._rightResizeElement), false);
-
-    this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();
-
-    var separatorElement = document.createElement("div");
-    separatorElement.id = "timeline-overview-separator";
-    this.element.appendChild(separatorElement);
-
-    this.windowLeft = 0.0;
-    this.windowRight = 1.0;
-}
-
-
-WebInspector.TimelineOverviewPane.prototype = {
-    _onCheckboxClicked: function (category, event) {
-        if (event.target.checked)
-            category.hidden = false;
-        else
-            category.hidden = true;
-        this._categoryGraphs[category.name].dimmed = !event.target.checked;
-        this.dispatchEventToListeners("filter changed");
-    },
-
-    update: function(records)
-    {
-        // Clear summary bars.
-        var timelines = {};
-        for (var category in this._categories) {
-            timelines[category] = [];
-            this._categoryGraphs[category].clearChunks();
-        }
-
-        function forAllRecords(recordsArray, callback)
-        {
-            if (!recordsArray)
-                return;
-            for (var i = 0; i < recordsArray.length; ++i) {
-                callback(recordsArray[i]);
-                forAllRecords(recordsArray[i].children, callback);
-            }
-        }
-
-        // Create sparse arrays with 101 cells each to fill with chunks for a given category.
-        this._overviewCalculator.reset();
-        forAllRecords(records, this._overviewCalculator.updateBoundaries.bind(this._overviewCalculator));
-
-        function markTimeline(record)
-        {
-            var percentages = this._overviewCalculator.computeBarGraphPercentages(record);
-
-            var end = Math.round(percentages.end);
-            var categoryName = record.category.name;
-            for (var j = Math.round(percentages.start); j <= end; ++j)
-                timelines[categoryName][j] = true;
-        }
-        forAllRecords(records, markTimeline.bind(this));
-
-        // Convert sparse arrays to continuous segments, render graphs for each.
-        for (var category in this._categories) {
-            var timeline = timelines[category];
-            window.timelineSaved = timeline;
-            var chunkStart = -1;
-            for (var j = 0; j < 101; ++j) {
-                if (timeline[j]) {
-                    if (chunkStart === -1)
-                        chunkStart = j;
-                } else {
-                    if (chunkStart !== -1) {
-                        this._categoryGraphs[category].addChunk(chunkStart, j);
-                        chunkStart = -1;
-                    }
-                }
-            }
-            if (chunkStart !== -1) {
-                this._categoryGraphs[category].addChunk(chunkStart, 100);
-                chunkStart = -1;
-            }
-        }
-        this._overviewGrid.updateDividers(true, this._overviewCalculator);
-    },
-
-    setSidebarWidth: function(width)
-    {
-        this._overviewSidebarElement.style.width = width + "px";
-    },
-
-    updateMainViewWidth: function(width)
-    {
-        this._overviewGrid.element.style.left = width + "px";
-    },
-
-    reset: function()
-    {
-        this._overviewCalculator.reset();
-        this._overviewGrid.updateDividers(true, this._overviewCalculator);
-        this.windowLeft = 0.0;
-        this.windowRight = 1.0;
-    },
-
-    _resizeWindow: function(resizeElement, event)
-    {
-        WebInspector.elementDragStart(resizeElement, this._windowResizeDragging.bind(this, resizeElement), this._endWindowDragging.bind(this), event, "col-resize");
-    },
-
-    _windowResizeDragging: function(resizeElement, event)
-    {
-        if (resizeElement === this._leftResizeElement)
-            this._resizeWindowLeft(event.pageX - this._overviewGrid.element.offsetLeft);
-        else
-            this._resizeWindowRight(event.pageX - this._overviewGrid.element.offsetLeft);
-        event.preventDefault();
-    },
-
-    _dragWindow: function(event)
-    {
-        WebInspector.elementDragStart(this._overviewWindowElement, this._windowDragging.bind(this, event.pageX,
-            this._leftResizeElement.offsetLeft, this._rightResizeElement.offsetLeft), this._endWindowDragging.bind(this), event, "ew-resize");
-    },
-
-    _windowDragging: function(startX, windowLeft, windowRight, event)
-    {
-        var delta = event.pageX - startX;
-        var start = windowLeft + delta;
-        var end = windowRight + delta;
-        var windowSize = windowRight - windowLeft;
-
-        if (start < 0) {
-            start = 0;
-            end = windowSize;
-        }
-
-        if (end > this._overviewGrid.element.clientWidth) {
-            end = this._overviewGrid.element.clientWidth;
-            start = end - windowSize;
-        }
-        this._setWindowPosition(start, end);
-
-        event.preventDefault();
-    },
-
-    _resizeWindowLeft: function(start)
-    {
-        // Glue to edge.
-        if (start < 10)
-            start = 0;
-        this._setWindowPosition(start, null);
-    },
-
-    _resizeWindowRight: function(end)
-    {
-        // Glue to edge.
-        if (end > this._overviewGrid.element.clientWidth - 10)
-            end = this._overviewGrid.element.clientWidth;
-        this._setWindowPosition(null, end);
-    },
-
-    _setWindowPosition: function(start, end)
-    {
-        if (typeof start === "number") {
-            if (start > this._rightResizeElement.offsetLeft - 4)
-                start = this._rightResizeElement.offsetLeft - 4;
-
-            this.windowLeft = start / this._overviewGrid.element.clientWidth;
-            this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
-            this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";
-        }
-        if (typeof end === "number") {
-            if (end < this._leftResizeElement.offsetLeft + 12)
-                end = this._leftResizeElement.offsetLeft + 12;
-
-            this.windowRight = end / this._overviewGrid.element.clientWidth;
-            this._rightResizeElement.style.left = this.windowRight * 100 + "%";
-        }
-        this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";
-        this.dispatchEventToListeners("window changed");
-    },
-
-    _endWindowDragging: function(event)
-    {
-        WebInspector.elementDragEnd(event);
-    }
-}
-
-WebInspector.TimelineOverviewPane.prototype.__proto__ = WebInspector.Object.prototype;
-
-
-WebInspector.TimelineOverviewCalculator = function()
-{
-    this._uiString = WebInspector.UIString.bind(WebInspector);
-}
-
-WebInspector.TimelineOverviewCalculator.prototype = {
-    computeBarGraphPercentages: function(record)
-    {
-        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
-        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
-        return {start: start, end: end};
-    },
-
-    reset: function()
-    {
-        delete this.minimumBoundary;
-        delete this.maximumBoundary;
-    },
-
-    updateBoundaries: function(record)
-    {
-        if (typeof this.minimumBoundary === "undefined" || record.startTime < this.minimumBoundary) {
-            this.minimumBoundary = record.startTime;
-            return true;
-        }
-        if (typeof this.maximumBoundary === "undefined" || record.endTime > this.maximumBoundary) {
-            this.maximumBoundary = record.endTime;
-            return true;
-        }
-        return false;
-    },
-
-    get boundarySpan()
-    {
-        return this.maximumBoundary - this.minimumBoundary;
-    },
-
-    formatValue: function(value)
-    {
-        return Number.secondsToString(value, this._uiString);
-    }
-}
-
-
-WebInspector.TimelineCategoryTreeElement = function(category, onCheckboxClicked)
-{
-    this._category = category;
-    this._onCheckboxClicked = onCheckboxClicked;
-    // Pass an empty title, the title gets made later in onattach.
-    TreeElement.call(this, "", null, false);
-}
-
-WebInspector.TimelineCategoryTreeElement.prototype = {
-    onattach: function()
-    {
-        this.listItemElement.removeChildren();
-        this.listItemElement.addStyleClass("timeline-category-tree-item");
-        this.listItemElement.addStyleClass("timeline-category-" + this._category.name);
-
-        var label = document.createElement("label");
-
-        var checkElement = document.createElement("input");
-        checkElement.type = "checkbox";
-        checkElement.className = "timeline-category-checkbox";
-        checkElement.checked = true;
-        checkElement.addEventListener("click", this._onCheckboxClicked);
-        label.appendChild(checkElement);
-
-        var typeElement = document.createElement("span");
-        typeElement.className = "type";
-        typeElement.textContent = this._category.title;
-        label.appendChild(typeElement);
-
-        this.listItemElement.appendChild(label);
-    }
-}
-
-WebInspector.TimelineCategoryTreeElement.prototype.__proto__ = TreeElement.prototype;
-
-WebInspector.TimelineCategoryGraph = function(category, isEven)
-{
-    this._category = category;
-
-    this._graphElement = document.createElement("div");
-    this._graphElement.className = "timeline-graph-side timeline-overview-graph-side" + (isEven ? " even" : "");
-
-    this._barAreaElement = document.createElement("div");
-    this._barAreaElement.className = "timeline-graph-bar-area timeline-category-" + category.name;
-    this._graphElement.appendChild(this._barAreaElement);
-}
-
-WebInspector.TimelineCategoryGraph.prototype = {
-    get graphElement()
-    {
-        return this._graphElement;
-    },
-
-    addChunk: function(start, end)
-    {
-        var chunk = document.createElement("div");
-        chunk.className = "timeline-graph-bar";
-        this._barAreaElement.appendChild(chunk);
-        chunk.style.setProperty("left", start + "%");
-        chunk.style.setProperty("width", (end - start) + "%");
-    },
-
-    clearChunks: function()
-    {
-        this._barAreaElement.removeChildren();
-    },
-
-    set dimmed(dimmed)
-    {
-        if (dimmed)
-            this._barAreaElement.removeStyleClass("timeline-category-" + this._category.name);
-        else
-            this._barAreaElement.addStyleClass("timeline-category-" + this._category.name);
-    }
-}
-
-/* TestController.js */
-
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.TestController = function(callId)
-{
-    this._callId = callId;
-    this._waitUntilDone = false;
-}
-
-WebInspector.TestController.prototype = {
-    waitUntilDone: function()
-    {
-        this._waitUntilDone = true;
-    },
-
-    notifyDone: function(result)
-    {
-        var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);
-        InspectorBackend.didEvaluateForTestInFrontend(this._callId, message);
-    },
-
-    runAfterPendingDispatches: function(callback)
-    {
-        if (WebInspector.pendingDispatches === 0) {
-            callback();
-            return;
-        }
-        setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);
-    }
-}
-
-WebInspector.evaluateForTestInFrontend = function(callId, script)
-{
-    var controller = new WebInspector.TestController(callId);
-    function invokeMethod()
-    {
-        try {
-            var result;
-            if (window[script] && typeof window[script] === "function")
-                result = window[script].call(WebInspector, controller);
-            else
-                result = window.eval(script);
-
-            if (!controller._waitUntilDone)
-                controller.notifyDone(result);
-        } catch (e) {
-            controller.notifyDone(e.toString());
-        }
-    }
-    controller.runAfterPendingDispatches(invokeMethod);
-}
-
-/* base.js */
-
-// Copyright 2006 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//  * Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//  * Redistributions in binary form must reproduce the above copyright
-//    notice, this list of conditions and the following disclaimer in
-//    the documentation and/or other materials provided with the
-//    distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-// NOTE: This file has been changed from the one on doctype. The following
-// changes were made:
-// - Removed goog.globalEval because it calls eval() which is not allowed from
-//   inside v8 extensions. If we ever need to use globalEval, we will need to
-//   find a way to work around this problem.
-// - Remove Function.prototype.apply() emulation for the same reason. This one
-//   is useless anyway because V8 supports apply() natively.
-
-/**
- * @fileoverview Bootstrap for the Google JS Library
- */
-
-/**
- * @define {boolean} Overridden to true by the compiler when
- *     --mark_as_compiled is specified.
- */
-var COMPILED = true;
-
-
-/**
- * Base namespace for the Google JS library.  Checks to see goog is
- * already defined in the current scope before assigning to prevent
- * clobbering if base.js is loaded more than once.
- */
-var goog = {}; // Check to see if already defined in current scope
-
-
-/**
- * Reference to the global context.  In most cases this will be 'window'.
- */
-goog.global = this;
-
-
-/**
- * Indicates whether or not we can call 'eval' directly to eval code in the
- * global scope. Set to a Boolean by the first call to goog.globalEval (which
- * empirically tests whether eval works for globals). @see goog.globalEval
- * @type {boolean?}
- * @private
- */
-goog.evalWorksForGlobals_ = null;
-
-
-/**
- * Creates object stubs for a namespace. When present in a file, goog.provide
- * also indicates that the file defines the indicated object.
- * @param {string} name name of the object that this file defines.
- */
-goog.provide = function(name) {
-  if (!COMPILED) {
-    // Ensure that the same namespace isn't provided twice. This is intended
-    // to teach new developers that 'goog.provide' is effectively a variable
-    // declaration. And when JSCompiler transforms goog.provide into a real
-    // variable declaration, the compiled JS should work the same as the raw
-    // JS--even when the raw JS uses goog.provide incorrectly.
-    if (goog.getObjectByName(name) && !goog.implicitNamespaces_[name]) {
-      throw 'Namespace "' + name + '" already declared.';
-    }
-
-    var namespace = name;
-    while ((namespace = namespace.substr(0, namespace.lastIndexOf('.')))) {
-      goog.implicitNamespaces_[namespace] = true;
-    }
-  }
-
-  goog.exportPath_(name);
-};
-
-
-if (!COMPILED) {
-  /**
-   * Namespaces implicitly defined by goog.provide. For example,
-   * goog.provide('goog.events.Event') implicitly declares
-   * that 'goog' and 'goog.events' must be namespaces.
-   *
-   * @type {Object}
-   * @private
-   */
-  goog.implicitNamespaces_ = {};
-}
-
-
-/**
- * Builds an object structure for the provided namespace path,
- * ensuring that names that already exist are not overwritten. For
- * example:
- * "a.b.c" -> a = {};a.b={};a.b.c={};
- * Used by goog.provide and goog.exportSymbol.
- * @param {string} name name of the object that this file defines.
- * @param {Object} opt_object the object to expose at the end of the path.
- * @private
- */
-goog.exportPath_ = function(name, opt_object) {
-  var parts = name.split('.');
-  var cur = goog.global;
-  var part;
-
-  // Internet Explorer exhibits strange behavior when throwing errors from
-  // methods externed in this manner.  See the testExportSymbolExceptions in
-  // base_test.html for an example.
-  if (!(parts[0] in cur) && cur.execScript) {
-    cur.execScript('var ' + parts[0]);
-  }
-
-  // Parentheses added to eliminate strict JS warning in Firefox.
-  while ((part = parts.shift())) {
-    if (!parts.length && goog.isDef(opt_object)) {
-      // last part and we have an object; use it
-      cur[part] = opt_object;
-    } else if (cur[part]) {
-      cur = cur[part];
-    } else {
-      cur = cur[part] = {};
-    }
-  }
-};
-
-
-/**
- * Returns an object based on its fully qualified name
- * @param {string} name The fully qualified name.
- * @return {Object?} The object or, if not found, null.
- */
-goog.getObjectByName = function(name) {
-  var parts = name.split('.');
-  var cur = goog.global;
-  for (var part; part = parts.shift(); ) {
-    if (cur[part]) {
-      cur = cur[part];
-    } else {
-      return null;
-    }
-  }
-  return cur;
-};
-
-
-/**
- * Globalizes a whole namespace, such as goog or goog.lang.
- *
- * @param {Object} obj The namespace to globalize.
- * @param {Object} opt_global The object to add the properties to.
- * @deprecated Properties may be explicitly exported to the global scope, but
- *     this should no longer be done in bulk.
- */
-goog.globalize = function(obj, opt_global) {
-  var global = opt_global || goog.global;
-  for (var x in obj) {
-    global[x] = obj[x];
-  }
-};
-
-
-/**
- * Adds a dependency from a file to the files it requires.
- * @param {string} relPath The path to the js file.
- * @param {Array} provides An array of strings with the names of the objects
- *                         this file provides.
- * @param {Array} requires An array of strings with the names of the objects
- *                         this file requires.
- */
-goog.addDependency = function(relPath, provides, requires) {
-  if (!COMPILED) {
-    var provide, require;
-    var path = relPath.replace(/\\/g, '/');
-    var deps = goog.dependencies_;
-    for (var i = 0; provide = provides[i]; i++) {
-      deps.nameToPath[provide] = path;
-      if (!(path in deps.pathToNames)) {
-        deps.pathToNames[path] = {};
-      }
-      deps.pathToNames[path][provide] = true;
-    }
-    for (var j = 0; require = requires[j]; j++) {
-      if (!(path in deps.requires)) {
-        deps.requires[path] = {};
-      }
-      deps.requires[path][require] = true;
-    }
-  }
-};
-
-
-/**
- * Implements a system for the dynamic resolution of dependencies
- * that works in parallel with the BUILD system.
- * @param {string} rule Rule to include, in the form goog.package.part.
- */
-goog.require = function(rule) {
-
-  // if the object already exists we do not need do do anything
-  if (!COMPILED) {
-    if (goog.getObjectByName(rule)) {
-      return;
-    }
-    var path = goog.getPathFromDeps_(rule);
-    if (path) {
-      goog.included_[path] = true;
-      goog.writeScripts_();
-    } else {
-      // NOTE(nicksantos): We could throw an error, but this would break
-      // legacy users that depended on this failing silently. Instead, the
-      // compiler should warn us when there are invalid goog.require calls.
-    }
-  }
-};
-
-
-/**
- * Path for included scripts
- * @type {string}
- */
-goog.basePath = '';
-
-
-/**
- * Null function used for default values of callbacks, etc.
- * @type {Function}
- */
-goog.nullFunction = function() {};
-
-
-/**
- * When defining a class Foo with an abstract method bar(), you can do:
- *
- * Foo.prototype.bar = goog.abstractMethod
- *
- * Now if a subclass of Foo fails to override bar(), an error
- * will be thrown when bar() is invoked.
- *
- * Note: This does not take the name of the function to override as
- * an argument because that would make it more difficult to obfuscate
- * our JavaScript code.
- *
- * @throws {Error} when invoked to indicate the method should be
- *   overridden.
- */
-goog.abstractMethod = function() {
-  throw Error('unimplemented abstract method');
-};
-
-
-if (!COMPILED) {
-  /**
-   * Object used to keep track of urls that have already been added. This
-   * record allows the prevention of circular dependencies.
-   * @type {Object}
-   * @private
-   */
-  goog.included_ = {};
-
-
-  /**
-   * This object is used to keep track of dependencies and other data that is
-   * used for loading scripts
-   * @private
-   * @type {Object}
-   */
-  goog.dependencies_ = {
-    pathToNames: {}, // 1 to many
-    nameToPath: {}, // 1 to 1
-    requires: {}, // 1 to many
-    visited: {}, // used when resolving dependencies to prevent us from
-                 // visiting the file twice
-    written: {} // used to keep track of script files we have written
-  };
-
-
-  /**
-   * Tries to detect the base path of the base.js script that bootstraps
-   * Google JS Library
-   * @private
-   */
-  goog.findBasePath_ = function() {
-    var doc = goog.global.document;
-    if (typeof doc == 'undefined') {
-      return;
-    }
-    if (goog.global.GOOG_BASE_PATH) {
-      goog.basePath = goog.global.GOOG_BASE_PATH;
-      return;
-    } else {
-      goog.global.GOOG_BASE_PATH = null;
-    }
-    var scripts = doc.getElementsByTagName('script');
-    for (var script, i = 0; script = scripts[i]; i++) {
-      var src = script.src;
-      var l = src.length;
-      if (src.substr(l - 7) == 'base.js') {
-        goog.basePath = src.substr(0, l - 7);
-        return;
-      }
-    }
-  };
-
-
-  /**
-   * Writes a script tag if, and only if, that script hasn't already been added
-   * to the document.  (Must be called at execution time)
-   * @param {string} src Script source.
-   * @private
-   */
-  goog.writeScriptTag_ = function(src) {
-    var doc = goog.global.document;
-    if (typeof doc != 'undefined' &&
-        !goog.dependencies_.written[src]) {
-      goog.dependencies_.written[src] = true;
-      doc.write('<script type="text/javascript" src="' +
-                src + '"></' + 'script>');
-    }
-  };
-
-
-  /**
-   * Resolves dependencies based on the dependencies added using addDependency
-   * and calls writeScriptTag_ in the correct order.
-   * @private
-   */
-  goog.writeScripts_ = function() {
-    // the scripts we need to write this time
-    var scripts = [];
-    var seenScript = {};
-    var deps = goog.dependencies_;
-
-    function visitNode(path) {
-      if (path in deps.written) {
-        return;
-      }
-
-      // we have already visited this one. We can get here if we have cyclic
-      // dependencies
-      if (path in deps.visited) {
-        if (!(path in seenScript)) {
-          seenScript[path] = true;
-          scripts.push(path);
-        }
-        return;
-      }
-
-      deps.visited[path] = true;
-
-      if (path in deps.requires) {
-        for (var requireName in deps.requires[path]) {
-          visitNode(deps.nameToPath[requireName]);
-        }
-      }
-
-      if (!(path in seenScript)) {
-        seenScript[path] = true;
-        scripts.push(path);
-      }
-    }
-
-    for (var path in goog.included_) {
-      if (!deps.written[path]) {
-        visitNode(path);
-      }
-    }
-
-    for (var i = 0; i < scripts.length; i++) {
-      if (scripts[i]) {
-        goog.writeScriptTag_(goog.basePath + scripts[i]);
-      } else {
-        throw Error('Undefined script input');
-      }
-    }
-  };
-
-
-  /**
-   * Looks at the dependency rules and tries to determine the script file that
-   * fulfills a particular rule.
-   * @param {string} rule In the form goog.namespace.Class or project.script.
-   * @return {string?} Url corresponding to the rule, or null.
-   * @private
-   */
-  goog.getPathFromDeps_ = function(rule) {
-    if (rule in goog.dependencies_.nameToPath) {
-      return goog.dependencies_.nameToPath[rule];
-    } else {
-      return null;
-    }
-  };
-
-  goog.findBasePath_();
-  goog.writeScriptTag_(goog.basePath + 'deps.js');
-}
-
-
-
-//==============================================================================
-// Language Enhancements
-//==============================================================================
-
-
-/**
- * This is a "fixed" version of the typeof operator.  It differs from the typeof
- * operator in such a way that null returns 'null' and arrays return 'array'.
- * @param {*} value The value to get the type of.
- * @return {string} The name of the type.
- */
-goog.typeOf = function(value) {
-  var s = typeof value;
-  if (s == 'object') {
-    if (value) {
-      // We cannot use constructor == Array or instanceof Array because
-      // different frames have different Array objects. In IE6, if the iframe
-      // where the array was created is destroyed, the array loses its
-      // prototype. Then dereferencing val.splice here throws an exception, so
-      // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
-      // so that will work. In this case, this function will return false and
-      // most array functions will still work because the array is still
-      // array-like (supports length and []) even though it has lost its
-      // prototype. Custom object cannot have non enumerable length and
-      // NodeLists don't have a slice method.
-      if (typeof value.length == 'number' &&
-          typeof value.splice != 'undefined' &&
-          !goog.propertyIsEnumerable_(value, 'length')) {
-        return 'array';
-      }
-
-      // IE in cross-window calls does not correctly marshal the function type
-      // (it appears just as an object) so we cannot use just typeof val ==
-      // 'function'. However, if the object has a call property, it is a
-      // function.
-      if (typeof value.call != 'undefined') {
-        return 'function';
-      }
-    } else {
-      return 'null';
-    }
-
-  // In Safari typeof nodeList returns function.  We would like to return
-  // object for those and we can detect an invalid function by making sure that
-  // the function object has a call method
-  } else if (s == 'function' && typeof value.call == 'undefined') {
-    return 'object';
-  }
-  return s;
-};
-
-if (Object.prototype.propertyIsEnumerable) {
-  /**
-   * Safe way to test whether a property is enumarable.  It allows testing
-   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
-   * does not exist (like DOM nodes in IE).
-   * @param {Object} object The object to test if the property is enumerable.
-   * @param {string} propName The property name to check for.
-   * @return {boolean} True if the property is enumarable.
-   * @private
-   */
-  goog.propertyIsEnumerable_ = function(object, propName) {
-    return Object.prototype.propertyIsEnumerable.call(object, propName);
-  };
-} else {
-  /**
-   * Safe way to test whether a property is enumarable.  It allows testing
-   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
-   * does not exist (like DOM nodes in IE).
-   * @param {Object} object The object to test if the property is enumerable.
-   * @param {string} propName The property name to check for.
-   * @return {boolean} True if the property is enumarable.
-   * @private
-   */
-  goog.propertyIsEnumerable_ = function(object, propName) {
-    // KJS in Safari 2 is not ECMAScript compatible and lacks crucial methods
-    // such as propertyIsEnumerable.  We therefore use a workaround.
-    // Does anyone know a more efficient work around?
-    if (propName in object) {
-      for (var key in object) {
-        if (key == propName) {
-          return true;
-        }
-      }
-    }
-    return false;
-  };
-}
-
-/**
- * Returns true if the specified value is not |undefined|.
- * WARNING: Do not use this to test if an object has a property. Use the in
- * operator instead.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is defined.
- */
-goog.isDef = function(val) {
-  return typeof val != 'undefined';
-};
-
-
-/**
- * Returns true if the specified value is |null|
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is null.
- */
-goog.isNull = function(val) {
-  return val === null;
-};
-
-
-/**
- * Returns true if the specified value is defined and not null
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is defined and not null.
- */
-goog.isDefAndNotNull = function(val) {
-  return goog.isDef(val) && !goog.isNull(val);
-};
-
-
-/**
- * Returns true if the specified value is an array
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an array.
- */
-goog.isArray = function(val) {
-  return goog.typeOf(val) == 'array';
-};
-
-
-/**
- * Returns true if the object looks like an array. To qualify as array like
- * the value needs to be either a NodeList or an object with a Number length
- * property.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an array.
- */
-goog.isArrayLike = function(val) {
-  var type = goog.typeOf(val);
-  return type == 'array' || type == 'object' && typeof val.length == 'number';
-};
-
-
-/**
- * Returns true if the object looks like a Date. To qualify as Date-like
- * the value needs to be an object and have a getFullYear() function.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a like a Date.
- */
-goog.isDateLike = function(val) {
-  return goog.isObject(val) && typeof val.getFullYear == 'function';
-};
-
-
-/**
- * Returns true if the specified value is a string
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a string.
- */
-goog.isString = function(val) {
-  return typeof val == 'string';
-};
-
-
-/**
- * Returns true if the specified value is a boolean
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is boolean.
- */
-goog.isBoolean = function(val) {
-  return typeof val == 'boolean';
-};
-
-
-/**
- * Returns true if the specified value is a number
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a number.
- */
-goog.isNumber = function(val) {
-  return typeof val == 'number';
-};
-
-
-/**
- * Returns true if the specified value is a function
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is a function.
- */
-goog.isFunction = function(val) {
-  return goog.typeOf(val) == 'function';
-};
-
-
-/**
- * Returns true if the specified value is an object.  This includes arrays
- * and functions.
- * @param {*} val Variable to test.
- * @return {boolean} Whether variable is an object.
- */
-goog.isObject = function(val) {
-  var type = goog.typeOf(val);
-  return type == 'object' || type == 'array' || type == 'function';
-};
-
-
-/**
- * Adds a hash code field to an object. The hash code is unique for the
- * given object.
- * @param {Object} obj The object to get the hash code for.
- * @return {number} The hash code for the object.
- */
-goog.getHashCode = function(obj) {
-  // In IE, DOM nodes do not extend Object so they do not have this method.
-  // we need to check hasOwnProperty because the proto might have this set.
-
-  if (obj.hasOwnProperty && obj.hasOwnProperty(goog.HASH_CODE_PROPERTY_)) {
-    return obj[goog.HASH_CODE_PROPERTY_];
-  }
-  if (!obj[goog.HASH_CODE_PROPERTY_]) {
-    obj[goog.HASH_CODE_PROPERTY_] = ++goog.hashCodeCounter_;
-  }
-  return obj[goog.HASH_CODE_PROPERTY_];
-};
-
-
-/**
- * Removes the hash code field from an object.
- * @param {Object} obj The object to remove the field from.
- */
-goog.removeHashCode = function(obj) {
-  // DOM nodes in IE are not instance of Object and throws exception
-  // for delete. Instead we try to use removeAttribute
-  if ('removeAttribute' in obj) {
-    obj.removeAttribute(goog.HASH_CODE_PROPERTY_);
-  }
-  /** @preserveTry */
-  try {
-    delete obj[goog.HASH_CODE_PROPERTY_];
-  } catch (ex) {
-  }
-};
-
-
-/**
- * {String} Name for hash code property
- * @private
- */
-goog.HASH_CODE_PROPERTY_ = 'goog_hashCode_';
-
-
-/**
- * @type {number} Counter for hash codes.
- * @private
- */
-goog.hashCodeCounter_ = 0;
-
-
-/**
- * Clone an object/array (recursively)
- * @param {Object} proto Object to clone.
- * @return {Object} Clone of x;.
- */
-goog.cloneObject = function(proto) {
-  var type = goog.typeOf(proto);
-  if (type == 'object' || type == 'array') {
-    if (proto.clone) {
-      return proto.clone();
-    }
-    var clone = type == 'array' ? [] : {};
-    for (var key in proto) {
-      clone[key] = goog.cloneObject(proto[key]);
-    }
-    return clone;
-  }
-
-  return proto;
-};
-
-
-/**
- * Partially applies this function to a particular 'this object' and zero or
- * more arguments. The result is a new function with some arguments of the first
- * function pre-filled and the value of |this| 'pre-specified'.<br><br>
- *
- * Remaining arguments specified at call-time are appended to the pre-
- * specified ones.<br><br>
- *
- * Also see: {@link #partial}.<br><br>
- *
- * Note that bind and partial are optimized such that repeated calls to it do
- * not create more than one function object, so there is no additional cost for
- * something like:<br>
- *
- * <pre>var g = bind(f, obj);
- * var h = partial(g, 1, 2, 3);
- * var k = partial(h, a, b, c);</pre>
- *
- * Usage:
- * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
- * barMethBound('arg3', 'arg4');</pre>
- *
- * @param {Function} fn A function to partially apply.
- * @param {Object} self Specifies the object which |this| should point to
- *     when the function is run. If the value is null or undefined, it will
- *     default to the global object.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to the function.
- *
- * @return {Function} A partially-applied form of the function bind() was
- *     invoked as a method of.
- */
-goog.bind = function(fn, self, var_args) {
-  var boundArgs = fn.boundArgs_;
-
-  if (arguments.length > 2) {
-    var args = Array.prototype.slice.call(arguments, 2);
-    if (boundArgs) {
-      args.unshift.apply(args, boundArgs);
-    }
-    boundArgs = args;
-  }
-
-  self = fn.boundSelf_ || self;
-  fn = fn.boundFn_ || fn;
-
-  var newfn;
-  var context = self || goog.global;
-
-  if (boundArgs) {
-    newfn = function() {
-      // Combine the static args and the new args into one big array
-      var args = Array.prototype.slice.call(arguments);
-      args.unshift.apply(args, boundArgs);
-      return fn.apply(context, args);
-    }
-  } else {
-    newfn = function() {
-      return fn.apply(context, arguments);
-    }
-  }
-
-  newfn.boundArgs_ = boundArgs;
-  newfn.boundSelf_ = self;
-  newfn.boundFn_ = fn;
-
-  return newfn;
-};
-
-
-/**
- * Like bind(), except that a 'this object' is not required. Useful when the
- * target function is already bound.
- *
- * Usage:
- * var g = partial(f, arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Function} fn A function to partially apply.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the function bind() was
- *     invoked as a method of.
- */
-goog.partial = function(fn, var_args) {
-  var args = Array.prototype.slice.call(arguments, 1);
-  args.unshift(fn, null);
-  return goog.bind.apply(null, args);
-};
-
-
-/**
- * Copies all the members of a source object to a target object.
- * This is deprecated. Use goog.object.extend instead.
- * @param {Object} target Target.
- * @param {Object} source Source.
- * @deprecated
- */
-goog.mixin = function(target, source) {
-  for (var x in source) {
-    target[x] = source[x];
-  }
-
-  // For IE the for-in-loop does not contain any properties that are not
-  // enumerable on the prototype object (for example, isPrototypeOf from
-  // Object.prototype) but also it will not include 'replace' on objects that
-  // extend String and change 'replace' (not that it is common for anyone to
-  // extend anything except Object).
-};
-
-
-/**
- * A simple wrapper for new Date().getTime().
- *
- * @return {number} An integer value representing the number of milliseconds
- *     between midnight, January 1, 1970 and the current time.
- */
-goog.now = Date.now || (function() {
-  return new Date().getTime();
-});
-
-
-/**
- * Abstract implementation of goog.getMsg for use with localized messages
- * @param {string} str Translatable string, places holders in the form.{$foo}
- * @param {Object} opt_values Map of place holder name to value.
- */
-goog.getMsg = function(str, opt_values) {
-  var values = opt_values || {};
-  for (var key in values) {
-    str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), values[key]);
-  }
-  return str;
-};
-
-
-/**
- * Exposes an unobfuscated global namespace path for the given object.
- * Note that fields of the exported object *will* be obfuscated,
- * unless they are exported in turn via this function or
- * goog.exportProperty
- *
- * <p>Also handy for making public items that are defined in anonymous
- * closures.
- *
- * ex. goog.exportSymbol('Foo', Foo);
- *
- * ex. goog.exportSymbol('public.path.Foo.staticFunction',
- *                       Foo.staticFunction);
- *     public.path.Foo.staticFunction();
- *
- * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
- *                       Foo.prototype.myMethod);
- *     new public.path.Foo().myMethod();
- *
- * @param {string} publicPath Unobfuscated name to export.
- * @param {Object} object Object the name should point to.
- */
-goog.exportSymbol = function(publicPath, object) {
-  goog.exportPath_(publicPath, object);
-};
-
-
-/**
- * Exports a property unobfuscated into the object's namespace.
- * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
- * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
- * @param {Object} object Object whose static property is being exported.
- * @param {string} publicName Unobfuscated name to export.
- * @param {Object} symbol Object the name should point to.
- */
-goog.exportProperty = function(object, publicName, symbol) {
-  object[publicName] = symbol;
-};
-
-
-
-//==============================================================================
-// Extending Function
-//==============================================================================
-
-
-/**
- * An alias to the {@link goog.bind()} global function.
- *
- * Usage:
- * var g = f.bind(obj, arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Object} self Specifies the object to which |this| should point
- *     when the function is run. If the value is null or undefined, it will
- *     default to the global object.
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the Function on which bind()
- *     was invoked as a method.
- * @deprecated
- */
-Function.prototype.bind = function(self, var_args) {
-  if (arguments.length > 1) {
-    var args = Array.prototype.slice.call(arguments, 1);
-    args.unshift(this, self);
-    return goog.bind.apply(null, args);
-  } else {
-    return goog.bind(this, self);
-  }
-};
-
-
-/**
- * An alias to the {@link goog.partial()} global function.
- *
- * Usage:
- * var g = f.partial(arg1, arg2);
- * g(arg3, arg4);
- *
- * @param {Object} var_args Additional arguments that are partially
- *     applied to fn.
- * @return {Function} A partially-applied form of the function partial() was
- *     invoked as a method of.
- * @deprecated
- */
-Function.prototype.partial = function(var_args) {
-  var args = Array.prototype.slice.call(arguments);
-  args.unshift(this, null);
-  return goog.bind.apply(null, args);
-};
-
-
-/**
- * Inherit the prototype methods from one constructor into another.
- *
- * Usage:
- * <pre>
- * function ParentClass(a, b) { }
- * ParentClass.prototype.foo = function(a) { }
- *
- * function ChildClass(a, b, c) {
- *   ParentClass.call(this, a, b);
- * }
- *
- * ChildClass.inherits(ParentClass);
- *
- * var child = new ChildClass('a', 'b', 'see');
- * child.foo(); // works
- * </pre>
- *
- * In addition, a superclass' implementation of a method can be invoked
- * as follows:
- *
- * <pre>
- * ChildClass.prototype.foo = function(a) {
- *   ChildClass.superClass_.foo.call(this, a);
- *   // other code
- * };
- * </pre>
- *
- * @param {Function} parentCtor Parent class.
- */
-Function.prototype.inherits = function(parentCtor) {
-  goog.inherits(this, parentCtor);
-};
-
-
-/**
- * Static variant of Function.prototype.inherits.
- * @param {Function} childCtor Child class.
- * @param {Function} parentCtor Parent class.
- */
-goog.inherits = function(childCtor, parentCtor) {
-  /** @constructor */
-  function tempCtor() {};
-  tempCtor.prototype = parentCtor.prototype;
-  childCtor.superClass_ = parentCtor.prototype;
-  childCtor.prototype = new tempCtor();
-  childCtor.prototype.constructor = childCtor;
-};
-
-
-/**
- * Mixes in an object's properties and methods into the callee's prototype.
- * Basically mixin based inheritance, thus providing an alternative method for
- * adding properties and methods to a class' prototype.
- *
- * <pre>
- * function X() {}
- * X.mixin({
- *   one: 1,
- *   two: 2,
- *   three: 3,
- *   doit: function() { return this.one + this.two + this.three; }
- * });
- *
- * function Y() { }
- * Y.mixin(X.prototype);
- * Y.prototype.four = 15;
- * Y.prototype.doit2 = function() { return this.doit() + this.four; }
- * });
- *
- * // or
- *
- * function Y() { }
- * Y.inherits(X);
- * Y.mixin({
- *   one: 10,
- *   four: 15,
- *   doit2: function() { return this.doit() + this.four; }
- * });
- * </pre>
- *
- * @param {Object} source from which to copy properties.
- * @see goog.mixin
- * @deprecated
- */
-Function.prototype.mixin = function(source) {
-  goog.mixin(this.prototype, source);
-};
-
-/* inspector_controller_impl.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview DevTools' implementation of the InspectorController API.
- */
-
-goog.provide('devtools.InspectorBackendImpl');
-goog.provide('devtools.InspectorFrontendHostImpl');
-
-devtools.InspectorBackendImpl = function() {
-  WebInspector.InspectorBackendStub.call(this);
-  this.installInspectorControllerDelegate_('clearMessages');
-  this.installInspectorControllerDelegate_('copyNode');
-  this.installInspectorControllerDelegate_('deleteCookie');
-  this.installInspectorControllerDelegate_('didEvaluateForTestInFrontend');
-  this.installInspectorControllerDelegate_('disableResourceTracking');
-  this.installInspectorControllerDelegate_('disableTimeline');
-  this.installInspectorControllerDelegate_('enableResourceTracking');
-  this.installInspectorControllerDelegate_('enableTimeline');
-  this.installInspectorControllerDelegate_('getChildNodes');
-  this.installInspectorControllerDelegate_('getCookies');
-  this.installInspectorControllerDelegate_('getDatabaseTableNames');
-  this.installInspectorControllerDelegate_('getDOMStorageEntries');
-  this.installInspectorControllerDelegate_('getEventListenersForNode');
-  this.installInspectorControllerDelegate_('highlightDOMNode');
-  this.installInspectorControllerDelegate_('hideDOMNodeHighlight');
-  this.installInspectorControllerDelegate_('releaseWrapperObjectGroup');
-  this.installInspectorControllerDelegate_('removeAttribute');
-  this.installInspectorControllerDelegate_('removeDOMStorageItem');
-  this.installInspectorControllerDelegate_('removeNode');
-  this.installInspectorControllerDelegate_('saveFrontendSettings');
-  this.installInspectorControllerDelegate_('setAttribute');
-  this.installInspectorControllerDelegate_('setDOMStorageItem');
-  this.installInspectorControllerDelegate_('setTextNodeValue');
-  this.installInspectorControllerDelegate_('startTimelineProfiler');
-  this.installInspectorControllerDelegate_('stopTimelineProfiler');
-  this.installInspectorControllerDelegate_('storeLastActivePanel');
-};
-goog.inherits(devtools.InspectorBackendImpl,
-    WebInspector.InspectorBackendStub);
-
-
-/**
- * {@inheritDoc}.
- */
-devtools.InspectorBackendImpl.prototype.toggleNodeSearch = function() {
-  WebInspector.InspectorBackendStub.prototype.toggleNodeSearch.call(this);
-  this.callInspectorController_.call(this, 'toggleNodeSearch');
-  if (!this.searchingForNode()) {
-    // This is called from ElementsPanel treeOutline's focusNodeChanged().
-    DevToolsHost.activateWindow();
-  }
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.debuggerEnabled = function() {
-  return true;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.profilerEnabled = function() {
-  return true;
-};
-
-
-devtools.InspectorBackendImpl.prototype.addBreakpoint = function(
-    sourceID, line, condition) {
-  devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
-};
-
-
-devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(
-    sourceID, line) {
-  devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
-};
-
-devtools.InspectorBackendImpl.prototype.updateBreakpoint = function(
-    sourceID, line, condition) {
-  devtools.tools.getDebuggerAgent().updateBreakpoint(
-      sourceID, line, condition);
-};
-
-devtools.InspectorBackendImpl.prototype.pauseInDebugger = function() {
-  devtools.tools.getDebuggerAgent().pauseExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.resumeDebugger = function() {
-  devtools.tools.getDebuggerAgent().resumeExecution();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepIntoStatement();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepOutOfFunction();
-};
-
-
-devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger =
-    function() {
-  devtools.tools.getDebuggerAgent().stepOverStatement();
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function() {
-  return devtools.tools.getDebuggerAgent().pauseOnExceptions();
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(
-    value) {
-  return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.startProfiling = function() {
-  devtools.tools.getProfilerAgent().startProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.stopProfiling = function() {
-  devtools.tools.getProfilerAgent().stopProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId) {
-  WebInspector.didGetProfileHeaders(callId, []);
-};
-
-
-/**
- * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
- * and is able to retrieve them by uid using 'getProfile'.
- */
-devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile) {
-  WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
-  WebInspector.__fullProfiles[profile.uid] = profile;
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid) {
-  if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles)) {
-    WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
-  }
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function() {
-  devtools.tools.getProfilerAgent().startProfiling(
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
-      | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
-      | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
-};
-
-
-/**
- * @override
- */
-devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript =
-    RemoteToolsAgent.DispatchOnInjectedScript.bind(RemoteToolsAgent);
-
-
-/**
- * Installs delegating handler into the inspector controller.
- * @param {string} methodName Method to install delegating handler for.
- */
-devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_
-    = function(methodName) {
-  this[methodName] = goog.bind(this.callInspectorController_, this,
-      methodName);
-};
-
-
-/**
- * Bound function with the installInjectedScriptDelegate_ actual
- * implementation.
- */
-devtools.InspectorBackendImpl.prototype.callInspectorController_ =
-    function(methodName, var_arg) {
-  var args = Array.prototype.slice.call(arguments, 1);
-  RemoteToolsAgent.DispatchOnInspectorController(
-      WebInspector.Callback.wrap(function(){}),
-      methodName,
-      JSON.stringify(args));
-};
-
-
-InspectorBackend = new devtools.InspectorBackendImpl();
-
-/* debugger_agent.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Provides communication interface to remote v8 debugger. See
- * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol
- */
-goog.provide('devtools.DebuggerAgent');
-
-
-/**
- * @constructor
- */
-devtools.DebuggerAgent = function() {
-  RemoteDebuggerAgent.DebuggerOutput =
-      goog.bind(this.handleDebuggerOutput_, this);
-  RemoteDebuggerAgent.SetContextId =
-      goog.bind(this.setContextId_, this);
-
-  /**
-   * Id of the inspected page global context. It is used for filtering scripts.
-   * @type {number}
-   */
-  this.contextId_ = null;
-
-  /**
-   * Mapping from script id to script info.
-   * @type {Object}
-   */
-  this.parsedScripts_ = null;
-
-  /**
-   * Mapping from the request id to the devtools.BreakpointInfo for the
-   * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for
-   * 'setbreakpoint' responses to learn their ids in the v8 debugger.
-   * @see #handleSetBreakpointResponse_
-   * @type {Object}
-   */
-  this.requestNumberToBreakpointInfo_ = null;
-
-  /**
-   * Information on current stack frames.
-   * @type {Array.<devtools.CallFrame>}
-   */
-  this.callFrames_ = [];
-
-  /**
-   * Whether to stop in the debugger on the exceptions.
-   * @type {boolean}
-   */
-  this.pauseOnExceptions_ = false;
-
-  /**
-   * Mapping: request sequence number->callback.
-   * @type {Object}
-   */
-  this.requestSeqToCallback_ = null;
-
-  /**
-   * Whether the scripts panel has been shown and initialilzed.
-   * @type {boolean}
-   */
-  this.scriptsPanelInitialized_ = false;
-
-  /**
-   * Whether the scripts list should be requested next time when context id is
-   * set.
-   * @type {boolean}
-   */
-  this.requestScriptsWhenContextIdSet_ = false;
-
-  /**
-   * Whether the agent is waiting for initial scripts response.
-   * @type {boolean}
-   */
-  this.waitingForInitialScriptsResponse_ = false;
-
-  /**
-   * If backtrace response is received when initial scripts response
-   * is not yet processed the backtrace handling will be postponed until
-   * after the scripts response processing. The handler bound to its arguments
-   * and this agent will be stored in this field then.
-   * @type {?function()}
-   */
-  this.pendingBacktraceResponseHandler_ = null;
-
-  /**
-   * Container of all breakpoints set using resource URL. These breakpoints
-   * survive page reload. Breakpoints set by script id(for scripts that don't
-   * have URLs) are stored in ScriptInfo objects.
-   * @type {Object}
-   */
-  this.urlToBreakpoints_ = {};
-
-
-  /**
-   * Exception message that is shown to user while on exception break.
-   * @type {WebInspector.ConsoleMessage}
-   */
-  this.currentExceptionMessage_ = null;
-};
-
-
-/**
- * A copy of the scope types from v8/src/mirror-delay.js
- * @enum {number}
- */
-devtools.DebuggerAgent.ScopeType = {
-  Global: 0,
-  Local: 1,
-  With: 2,
-  Closure: 3,
-  Catch: 4
-};
-
-
-/**
- * Resets debugger agent to its initial state.
- */
-devtools.DebuggerAgent.prototype.reset = function() {
-  this.contextId_ = null;
-  // No need to request scripts since they all will be pushed in AfterCompile
-  // events.
-  this.requestScriptsWhenContextIdSet_ = false;
-  this.waitingForInitialScriptsResponse_ = false;
-
-  this.parsedScripts_ = {};
-  this.requestNumberToBreakpointInfo_ = {};
-  this.callFrames_ = [];
-  this.requestSeqToCallback_ = {};
-};
-
-
-/**
- * Initializes scripts UI. This method is called every time Scripts panel
- * is shown. It will send request for context id if it's not set yet.
- */
-devtools.DebuggerAgent.prototype.initUI = function() {
-  // Initialize scripts cache when Scripts panel is shown first time.
-  if (this.scriptsPanelInitialized_) {
-    return;
-  }
-  this.scriptsPanelInitialized_ = true;
-  if (this.contextId_) {
-    // We already have context id. This means that we are here from the
-    // very beginning of the page load cycle and hence will get all scripts
-    // via after-compile events. No need to request scripts for this session.
-    //
-    // There can be a number of scripts from after-compile events that are
-    // pending addition into the UI.
-    for (var scriptId in this.parsedScripts_) {
-      var script = this.parsedScripts_[scriptId];
-      WebInspector.parsedScriptSource(scriptId, script.getUrl(),
-          undefined /* script source */, script.getLineOffset());
-    }
-    return;
-  }
-  this.waitingForInitialScriptsResponse_ = true;
-  // Script list should be requested only when current context id is known.
-  RemoteDebuggerAgent.GetContextId();
-  this.requestScriptsWhenContextIdSet_ = true;
-};
-
-
-/**
- * Asynchronously requests the debugger for the script source.
- * @param {number} scriptId Id of the script whose source should be resolved.
- * @param {function(source:?string):void} callback Function that will be called
- *     when the source resolution is completed. 'source' parameter will be null
- *     if the resolution fails.
- */
-devtools.DebuggerAgent.prototype.resolveScriptSource = function(
-    scriptId, callback) {
-  var script = this.parsedScripts_[scriptId];
-  if (!script || script.isUnresolved()) {
-    callback(null);
-    return;
-  }
-
-  var cmd = new devtools.DebugCommand('scripts', {
-    'ids': [scriptId],
-    'includeSource': true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  // Force v8 execution so that it gets to processing the requested command.
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-    if (msg.isSuccess()) {
-      var scriptJson = msg.getBody()[0];
-      callback(scriptJson.source);
-    } else {
-      callback(null);
-    }
-  };
-};
-
-
-/**
- * Tells the v8 debugger to stop on as soon as possible.
- */
-devtools.DebuggerAgent.prototype.pauseExecution = function() {
-  RemoteDebuggerCommandExecutor.DebuggerPauseScript();
-};
-
-
-/**
- * @param {number} sourceId Id of the script fot the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition The breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.addBreakpoint = function(
-    sourceId, line, condition) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var commandArguments;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    if (breakpoints && breakpoints[line]) {
-      return;
-    }
-    if (!breakpoints) {
-      breakpoints = {};
-      this.urlToBreakpoints_[script.getUrl()] = breakpoints;
-    }
-
-    var breakpointInfo = new devtools.BreakpointInfo(line);
-    breakpoints[line] = breakpointInfo;
-
-    commandArguments = {
-      'groupId': this.contextId_,
-      'type': 'script',
-      'target': script.getUrl(),
-      'line': line,
-      'condition': condition
-    };
-  } else {
-    var breakpointInfo = script.getBreakpointInfo(line);
-    if (breakpointInfo) {
-      return;
-    }
-
-    breakpointInfo = new devtools.BreakpointInfo(line);
-    script.addBreakpointInfo(breakpointInfo);
-
-    commandArguments = {
-      'groupId': this.contextId_,
-      'type': 'scriptId',
-      'target': sourceId,
-      'line': line,
-      'condition': condition
-    };
-  }
-
-  var cmd = new devtools.DebugCommand('setbreakpoint', commandArguments);
-
-  this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo;
-
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  // Force v8 execution so that it gets to processing the requested command.
-  // It is necessary for being able to change a breakpoint just after it
-  // has been created (since we need an existing breakpoint id for that).
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var breakpointInfo;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    breakpointInfo = breakpoints[line];
-    delete breakpoints[line];
-  } else {
-    breakpointInfo = script.getBreakpointInfo(line);
-    if (breakpointInfo) {
-      script.removeBreakpointInfo(breakpointInfo);
-    }
-  }
-
-  if (!breakpointInfo) {
-    return;
-  }
-
-  breakpointInfo.markAsRemoved();
-
-  var id = breakpointInfo.getV8Id();
-
-  // If we don't know id of this breakpoint in the v8 debugger we cannot send
-  // 'clearbreakpoint' request. In that case it will be removed in
-  // 'setbreakpoint' response handler when we learn the id.
-  if (id != -1) {
-    this.requestClearBreakpoint_(id);
-  }
-};
-
-
-/**
- * @param {number} sourceId Id of the script for the breakpoint.
- * @param {number} line Number of the line for the breakpoint.
- * @param {?string} condition New breakpoint condition.
- */
-devtools.DebuggerAgent.prototype.updateBreakpoint = function(
-    sourceId, line, condition) {
-  var script = this.parsedScripts_[sourceId];
-  if (!script) {
-    return;
-  }
-
-  line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
-
-  var breakpointInfo;
-  if (script.getUrl()) {
-    var breakpoints = this.urlToBreakpoints_[script.getUrl()];
-    breakpointInfo = breakpoints[line];
-  } else {
-    breakpointInfo = script.getBreakpointInfo(line);
-  }
-
-  var id = breakpointInfo.getV8Id();
-
-  // If we don't know id of this breakpoint in the v8 debugger we cannot send
-  // the 'changebreakpoint' request.
-  if (id != -1) {
-    // TODO(apavlov): make use of the real values for 'enabled' and
-    // 'ignoreCount' when appropriate.
-    this.requestChangeBreakpoint_(id, true, condition, null);
-  }
-};
-
-
-/**
- * Tells the v8 debugger to step into the next statement.
- */
-devtools.DebuggerAgent.prototype.stepIntoStatement = function() {
-  this.stepCommand_('in');
-};
-
-
-/**
- * Tells the v8 debugger to step out of current function.
- */
-devtools.DebuggerAgent.prototype.stepOutOfFunction = function() {
-  this.stepCommand_('out');
-};
-
-
-/**
- * Tells the v8 debugger to step over the next statement.
- */
-devtools.DebuggerAgent.prototype.stepOverStatement = function() {
-  this.stepCommand_('next');
-};
-
-
-/**
- * Tells the v8 debugger to continue execution after it has been stopped on a
- * breakpoint or an exception.
- */
-devtools.DebuggerAgent.prototype.resumeExecution = function() {
-  this.clearExceptionMessage_();
-  var cmd = new devtools.DebugCommand('continue');
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Creates exception message and schedules it for addition to the resource upon
- * backtrace availability.
- * @param {string} url Resource url.
- * @param {number} line Resource line number.
- * @param {string} message Exception text.
- */
-devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(
-    url, line, message) {
-  this.currentExceptionMessage_ = new WebInspector.ConsoleMessage(
-      WebInspector.ConsoleMessage.MessageSource.JS,
-      WebInspector.ConsoleMessage.MessageType.Log,
-      WebInspector.ConsoleMessage.MessageLevel.Error,
-      line,
-      url,
-      0 /* group level */,
-      1 /* repeat count */,
-      '[Exception] ' + message);
-};
-
-
-/**
- * Shows pending exception message that is created with createExceptionMessage_
- * earlier.
- */
-devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function() {
-  if (!this.currentExceptionMessage_) {
-    return;
-  }
-  var msg = this.currentExceptionMessage_;
-  var resource = WebInspector.resourceURLMap[msg.url];
-  if (resource) {
-    msg.resource = resource;
-    WebInspector.panels.resources.addMessageToResource(resource, msg);
-  } else {
-    this.currentExceptionMessage_ = null;
-  }
-};
-
-
-/**
- * Clears exception message from the resource.
- */
-devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function() {
-  if (this.currentExceptionMessage_) {
-    var messageElement =
-        this.currentExceptionMessage_._resourceMessageLineElement;
-    var bubble = messageElement.parentElement;
-    bubble.removeChild(messageElement);
-    if (!bubble.firstChild) {
-      // Last message in bubble removed.
-      bubble.parentElement.removeChild(bubble);
-    }
-    this.currentExceptionMessage_ = null;
-  }
-};
-
-
-/**
- * @return {boolean} True iff the debugger will pause execution on the
- * exceptions.
- */
-devtools.DebuggerAgent.prototype.pauseOnExceptions = function() {
-  return this.pauseOnExceptions_;
-};
-
-
-/**
- * Tells whether to pause in the debugger on the exceptions or not.
- * @param {boolean} value True iff execution should be stopped in the debugger
- * on the exceptions.
- */
-devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value) {
-  this.pauseOnExceptions_ = value;
-};
-
-
-/**
- * Sends 'evaluate' request to the debugger.
- * @param {Object} arguments Request arguments map.
- * @param {function(devtools.DebuggerMessage)} callback Callback to be called
- *     when response is received.
- */
-devtools.DebuggerAgent.prototype.requestEvaluate = function(
-    arguments, callback) {
-  var cmd = new devtools.DebugCommand('evaluate', arguments);
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sends 'lookup' request for each unresolved property of the object. When
- * response is received the properties will be changed with their resolved
- * values.
- * @param {Object} object Object whose properties should be resolved.
- * @param {function(devtools.DebuggerMessage)} Callback to be called when all
- *     children are resolved.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be included.
- */
-devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback,
-                                                            noIntrinsic) {
-  if ('handle' in object) {
-    var result = [];
-    devtools.DebuggerAgent.formatObjectProperties_(object, result,
-                                                   noIntrinsic);
-    callback(result);
-  } else {
-    this.requestLookup_([object.ref], function(msg) {
-      var result = [];
-      if (msg.isSuccess()) {
-        var handleToObject = msg.getBody();
-        var resolved = handleToObject[object.ref];
-        devtools.DebuggerAgent.formatObjectProperties_(resolved, result,
-                                                       noIntrinsic);
-        callback(result);
-      } else {
-        callback([]);
-      }
-    });
-  }
-};
-
-
-/**
- * Sends 'scope' request for the scope object to resolve its variables.
- * @param {Object} scope Scope to be resolved.
- * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback
- *     Callback to be called when all scope variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback) {
-  var cmd = new devtools.DebugCommand('scope', {
-    'frameNumber': scope.frameNumber,
-    'number': scope.index,
-    'compactFormat': true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-      var result = [];
-    if (msg.isSuccess()) {
-      var scopeObjectJson = msg.getBody().object;
-      devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result,
-                                                     true /* no intrinsic */);
-    }
-    callback(result);
-  };
-};
-
-
-/**
- * Sends 'scopes' request for the frame object to resolve all variables
- * available in the frame.
- * @param {number} callFrameId Id of call frame whose variables need to
- *     be resolved.
- * @param {function(Object)} callback Callback to be called when all frame
- *     variables are resolved.
- */
-devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(
-    callFrameId, callback) {
-  var result = {};
-
-  var frame = this.callFrames_[callFrameId];
-  if (!frame) {
-    callback(result);
-    return;
-  }
-
-  var waitingResponses = 0;
-  function scopeResponseHandler(msg) {
-    waitingResponses--;
-
-    if (msg.isSuccess()) {
-      var properties = msg.getBody().object.properties;
-      for (var j = 0; j < properties.length; j++) {
-        result[properties[j].name] = true;
-      }
-    }
-
-    // When all scopes are resolved invoke the callback.
-    if (waitingResponses == 0) {
-      callback(result);
-    }
-  };
-
-  for (var i = 0; i < frame.scopeChain.length; i++) {
-    var scope = frame.scopeChain[i].objectId;
-    if (scope.type == devtools.DebuggerAgent.ScopeType.Global) {
-      // Do not resolve global scope since it takes for too long.
-      // TODO(yurys): allow to send only property names in the response.
-      continue;
-    }
-    var cmd = new devtools.DebugCommand('scope', {
-      'frameNumber': scope.frameNumber,
-      'number': scope.index,
-      'compactFormat': true
-    });
-    devtools.DebuggerAgent.sendCommand_(cmd);
-    this.requestSeqToCallback_[cmd.getSequenceNumber()] =
-        scopeResponseHandler;
-    waitingResponses++;
-  }
-};
-
-/**
- * Evaluates the expressionString to an object in the call frame and reports
- * all its properties.
- * @param{string} expressionString Expression whose properties should be
- *     collected.
- * @param{number} callFrameId The frame id.
- * @param{function(Object result,bool isException)} reportCompletions Callback
- *     function.
- */
-devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(
-      expressionString, callFrameId, reportCompletions) {
-    if (expressionString) {
-      expressionString = 'var obj = ' + expressionString +
-          '; var names = {}; for (var n in obj) { names[n] = true; };' +
-          'names;';
-      this.evaluateInCallFrame(
-          callFrameId,
-          expressionString,
-          function(result) {
-            var names = {};
-            if (!result.isException) {
-              var props = result.value.objectId.properties;
-              // Put all object properties into the map.
-              for (var i = 0; i < props.length; i++) {
-                names[props[i].name] = true;
-              }
-            }
-            reportCompletions(names, result.isException);
-          });
-    } else {
-      this.resolveFrameVariables_(callFrameId,
-          function(result) {
-            reportCompletions(result, false /* isException */);
-          });
-    }
-};
-
-
-/**
- * @param{number} scriptId
- * @return {string} Type of the context of the script with specified id.
- */
-devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId) {
-  return this.parsedScripts_[scriptId].getContextType();
-};
-
-
-/**
- * Removes specified breakpoint from the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- */
-devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(
-    breakpointId) {
-  var cmd = new devtools.DebugCommand('clearbreakpoint', {
-    'breakpoint': breakpointId
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Changes breakpoint parameters in the v8 debugger.
- * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
- * @param {boolean} enabled Whether to enable the breakpoint.
- * @param {?string} condition New breakpoint condition.
- * @param {number} ignoreCount New ignore count for the breakpoint.
- */
-devtools.DebuggerAgent.prototype.requestChangeBreakpoint_ = function(
-    breakpointId, enabled, condition, ignoreCount) {
-  var cmd = new devtools.DebugCommand('changebreakpoint', {
-    'breakpoint': breakpointId,
-    'enabled': enabled,
-    'condition': condition,
-    'ignoreCount': ignoreCount
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends 'backtrace' request to v8.
- */
-devtools.DebuggerAgent.prototype.requestBacktrace_ = function() {
-  var cmd = new devtools.DebugCommand('backtrace', {
-    'compactFormat':true
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends command to v8 debugger.
- * @param {devtools.DebugCommand} cmd Command to execute.
- */
-devtools.DebuggerAgent.sendCommand_ = function(cmd) {
-  RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol());
-};
-
-
-/**
- * Tells the v8 debugger to make the next execution step.
- * @param {string} action 'in', 'out' or 'next' action.
- */
-devtools.DebuggerAgent.prototype.stepCommand_ = function(action) {
-  this.clearExceptionMessage_();
-  var cmd = new devtools.DebugCommand('continue', {
-    'stepaction': action,
-    'stepcount': 1
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-};
-
-
-/**
- * Sends 'lookup' request to v8.
- * @param {number} handle Handle to the object to lookup.
- */
-devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback) {
-  var cmd = new devtools.DebugCommand('lookup', {
-    'compactFormat':true,
-    'handles': handles
-  });
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
-};
-
-
-/**
- * Sets debugger context id for scripts filtering.
- * @param {number} contextId Id of the inspected page global context.
- */
-devtools.DebuggerAgent.prototype.setContextId_ = function(contextId) {
-  this.contextId_ = contextId;
-
-  // If it's the first time context id is set request scripts list.
-  if (this.requestScriptsWhenContextIdSet_) {
-    this.requestScriptsWhenContextIdSet_ = false;
-    var cmd = new devtools.DebugCommand('scripts', {
-      'includeSource': false
-    });
-    devtools.DebuggerAgent.sendCommand_(cmd);
-    // Force v8 execution so that it gets to processing the requested command.
-    RemoteToolsAgent.ExecuteVoidJavaScript();
-
-    var debuggerAgent = this;
-    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
-      // Handle the response iff the context id hasn't changed since the request
-      // was issued. Otherwise if the context id did change all up-to-date
-      // scripts will be pushed in after compile events and there is no need to
-      // handle the response.
-      if (contextId == debuggerAgent.contextId_) {
-        debuggerAgent.handleScriptsResponse_(msg);
-      }
-
-      // We received initial scripts response so flush the flag and
-      // see if there is an unhandled backtrace response.
-      debuggerAgent.waitingForInitialScriptsResponse_ = false;
-      if (debuggerAgent.pendingBacktraceResponseHandler_) {
-        debuggerAgent.pendingBacktraceResponseHandler_();
-        debuggerAgent.pendingBacktraceResponseHandler_ = null;
-      }
-    };
-  }
-};
-
-
-/**
- * Handles output sent by v8 debugger. The output is either asynchronous event
- * or response to a previously sent request.  See protocol definitioun for more
- * details on the output format.
- * @param {string} output
- */
-devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output) {
-  var msg;
-  try {
-    msg = new devtools.DebuggerMessage(output);
-  } catch(e) {
-    debugPrint('Failed to handle debugger reponse:\n' + e);
-    throw e;
-  }
-
-  if (msg.getType() == 'event') {
-    if (msg.getEvent() == 'break') {
-      this.handleBreakEvent_(msg);
-    } else if (msg.getEvent() == 'exception') {
-      this.handleExceptionEvent_(msg);
-    } else if (msg.getEvent() == 'afterCompile') {
-      this.handleAfterCompileEvent_(msg);
-    }
-  } else if (msg.getType() == 'response') {
-    if (msg.getCommand() == 'scripts') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'setbreakpoint') {
-      this.handleSetBreakpointResponse_(msg);
-    } else if (msg.getCommand() == 'clearbreakpoint') {
-      this.handleClearBreakpointResponse_(msg);
-    } else if (msg.getCommand() == 'backtrace') {
-      this.handleBacktraceResponse_(msg);
-    } else if (msg.getCommand() == 'lookup') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'evaluate') {
-      this.invokeCallbackForResponse_(msg);
-    } else if (msg.getCommand() == 'scope') {
-      this.invokeCallbackForResponse_(msg);
-    }
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg) {
-  // Force scrips panel to be shown first.
-  WebInspector.currentPanel = WebInspector.panels.scripts;
-
-  var body = msg.getBody();
-
-  var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
-  this.requestBacktrace_();
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg) {
-  // Force scrips panel to be shown first.
-  WebInspector.currentPanel = WebInspector.panels.scripts;
-
-  var body = msg.getBody();
-  // No script field in the body means that v8 failed to parse the script. We
-  // resume execution on parser errors automatically.
-  if (this.pauseOnExceptions_ && body.script) {
-    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
-    this.createExceptionMessage_(body.script.name, line, body.exception.text);
-    this.requestBacktrace_();
-  } else {
-    this.resumeExecution();
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg) {
-  var scripts = msg.getBody();
-  for (var i = 0; i < scripts.length; i++) {
-    var script = scripts[i];
-
-    // Skip scripts from other tabs.
-    if (!this.isScriptFromInspectedContext_(script, msg)) {
-      continue;
-    }
-
-    // We may already have received the info in an afterCompile event.
-    if (script.id in this.parsedScripts_) {
-      continue;
-    }
-    this.addScriptInfo_(script, msg);
-  }
-};
-
-
-/**
- * @param {Object} script Json object representing script.
- * @param {devtools.DebuggerMessage} msg Debugger response.
- */
-devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(
-    script, msg) {
-  if (!script.context) {
-    // Always ignore scripts from the utility context.
-    return false;
-  }
-  var context = msg.lookup(script.context.ref);
-  var scriptContextId = context.data;
-  if (!goog.isDef(scriptContextId)) {
-    return false; // Always ignore scripts from the utility context.
-  }
-  if (this.contextId_ === null) {
-    return true;
-  }
-  if (goog.isString(context.data)) {
-    // Find the id from context data. The context data has the format "type,id".
-    var comma = context.data.indexOf(',');
-    if (comma < 0) {
-      return false;
-    }
-    return (parseInt(context.data.substring(comma + 1)) == this.contextId_);
-  } else {
-    // TODO(sgjesse) remove this when patch for
-    // https://bugs.webkit.org/show_bug.cgi?id=31873 has landed in Chromium.
-    return (scriptContextId.value == this.contextId_);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg) {
-  var requestSeq = msg.getRequestSeq();
-  var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq];
-  if (!breakpointInfo) {
-    // TODO(yurys): handle this case
-    return;
-  }
-  delete this.requestNumberToBreakpointInfo_[requestSeq];
-  if (!msg.isSuccess()) {
-    // TODO(yurys): handle this case
-    return;
-  }
-  var idInV8 = msg.getBody().breakpoint;
-  breakpointInfo.setV8Id(idInV8);
-
-  if (breakpointInfo.isRemoved()) {
-    this.requestClearBreakpoint_(idInV8);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg) {
-  if (!this.contextId_) {
-    // Ignore scripts delta if main request has not been issued yet.
-    return;
-  }
-  var script = msg.getBody().script;
-
-  // Ignore scripts from other tabs.
-  if (!this.isScriptFromInspectedContext_(script, msg)) {
-    return;
-  }
-  this.addScriptInfo_(script, msg);
-};
-
-
-/**
- * Adds the script info to the local cache. This method assumes that the script
- * is not in the cache yet.
- * @param {Object} script Script json object from the debugger message.
- * @param {devtools.DebuggerMessage} msg Debugger message containing the script
- *     data.
- */
-devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg) {
-  var context = msg.lookup(script.context.ref);
-  var contextType;
-  if (goog.isString(context.data)) {
-    // Find the type from context data. The context data has the format
-    // "type,id".
-    var comma = context.data.indexOf(',');
-    if (comma < 0) {
-      return
-    }
-    contextType = context.data.substring(0, comma);
-  } else {
-    // TODO(sgjesse) remove this when patch for
-    // https://bugs.webkit.org/show_bug.cgi?id=31873 has landed in Chromium.
-    contextType = context.data.type;
-  }
-  this.parsedScripts_[script.id] = new devtools.ScriptInfo(
-      script.id, script.name, script.lineOffset, contextType);
-  if (this.scriptsPanelInitialized_) {
-    // Only report script as parsed after scripts panel has been shown.
-    WebInspector.parsedScriptSource(
-        script.id, script.name, script.source, script.lineOffset);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(
-    msg) {
-  // Do nothing.
-};
-
-
-/**
- * Handles response to 'backtrace' command.
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg) {
-  if (this.waitingForInitialScriptsResponse_) {
-    this.pendingBacktraceResponseHandler_ =
-        this.doHandleBacktraceResponse_.bind(this, msg);
-  } else {
-    this.doHandleBacktraceResponse_(msg);
-  }
-};
-
-
-/**
- * @param {devtools.DebuggerMessage} msg
- */
-devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg) {
-  var frames = msg.getBody().frames;
-  this.callFrames_ = [];
-  for (var i = 0; i <  frames.length; ++i) {
-    this.callFrames_.push(this.formatCallFrame_(frames[i]));
-  }
-  WebInspector.pausedScript(this.callFrames_);
-  this.showPendingExceptionMessage_();
-  InspectorFrontendHost.activateWindow();
-};
-
-
-/**
- * Evaluates code on given callframe.
- */
-devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(
-    callFrameId, code, callback) {
-  var callFrame = this.callFrames_[callFrameId];
-  callFrame.evaluate_(code, callback);
-};
-
-
-/**
- * Handles response to a command by invoking its callback (if any).
- * @param {devtools.DebuggerMessage} msg
- * @return {boolean} Whether a callback for the given message was found and
- *     excuted.
- */
-devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg) {
-  var callback = this.requestSeqToCallback_[msg.getRequestSeq()];
-  if (!callback) {
-    // It may happend if reset was called.
-    return false;
-  }
-  delete this.requestSeqToCallback_[msg.getRequestSeq()];
-  callback(msg);
-  return true;
-};
-
-
-/**
- * @param {Object} stackFrame Frame json object from 'backtrace' response.
- * @return {!devtools.CallFrame} Object containing information related to the
- *     call frame in the format expected by ScriptsPanel and its panes.
- */
-devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame) {
-  var func = stackFrame.func;
-  var sourceId = func.scriptId;
-
-  // Add service script if it does not exist.
-  var existingScript = this.parsedScripts_[sourceId];
-  if (!existingScript) {
-    this.parsedScripts_[sourceId] = new devtools.ScriptInfo(
-        sourceId, null /* name */, 0 /* line */, 'unknown' /* type */,
-        true /* unresolved */);
-    WebInspector.parsedScriptSource(sourceId, null, null, 0);
-  }
-
-  var funcName = func.name || func.inferredName || '(anonymous function)';
-  var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line);
-
-  // Add basic scope chain info with scope variables.
-  var scopeChain = [];
-  var ScopeType = devtools.DebuggerAgent.ScopeType;
-  for (var i = 0; i < stackFrame.scopes.length; i++) {
-    var scope = stackFrame.scopes[i];
-    scope.frameNumber = stackFrame.index;
-    var scopeObjectProxy = new WebInspector.ObjectProxy(scope, [], 0, '', true);
-    scopeObjectProxy.isScope = true;
-    switch(scope.type) {
-      case ScopeType.Global:
-        scopeObjectProxy.isDocument = true;
-        break;
-      case ScopeType.Local:
-        scopeObjectProxy.isLocal = true;
-        scopeObjectProxy.thisObject =
-            devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver);
-        break;
-      case ScopeType.With:
-      // Catch scope is treated as a regular with scope by WebKit so we
-      // also treat it this way.
-      case ScopeType.Catch:
-        scopeObjectProxy.isWithBlock = true;
-        break;
-      case ScopeType.Closure:
-        scopeObjectProxy.isClosure = true;
-        break;
-    }
-    scopeChain.push(scopeObjectProxy);
-  }
-  return new devtools.CallFrame(stackFrame.index, 'function', funcName,
-      sourceId, line, scopeChain);
-};
-
-
-/**
- * Collects properties for an object from the debugger response.
- * @param {Object} object An object from the debugger protocol response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the
- *     properties into.
- * @param {boolean} noIntrinsic Whether intrinsic properties should be
- *     included.
- */
-devtools.DebuggerAgent.formatObjectProperties_ = function(object, result,
-                                                          noIntrinsic) {
-  devtools.DebuggerAgent.propertiesToProxies_(object.properties, result);
-  if (noIntrinsic) {
-    return;
-  }
-
-  result.push(new WebInspector.ObjectPropertyProxy('__proto__',
-      devtools.DebuggerAgent.formatObjectProxy_(object.protoObject)));
-  result.push(new WebInspector.ObjectPropertyProxy('constructor',
-      devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction)));
-  // Don't add 'prototype' property since it is one of the regualar properties.
-};
-
-
-/**
- * For each property in 'properties' creates its proxy representative.
- * @param {Array.<Object>} properties Receiver properties or locals array from
- *     'backtrace' response.
- * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder.
- */
-devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result) {
-  var map = {};
-  for (var i = 0; i < properties.length; ++i) {
-    var property = properties[i];
-    var name = String(property.name);
-    if (name in map) {
-      continue;
-    }
-    map[name] = true;
-    var value = devtools.DebuggerAgent.formatObjectProxy_(property.value);
-    var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value);
-    result.push(propertyProxy);
-  }
-};
-
-
-/**
- * @param {Object} v An object reference from the debugger response.
- * @return {*} The value representation expected by ScriptsPanel.
- */
-devtools.DebuggerAgent.formatObjectProxy_ = function(v) {
-  var description;
-  var hasChildren = false;
-  if (v.type == 'object') {
-    description = v.className;
-    hasChildren = true;
-  } else if (v.type == 'function') {
-    if (v.source) {
-      description = v.source;
-    } else {
-      description = 'function ' + v.name + '()';
-    }
-    hasChildren = true;
-  } else if (v.type == 'undefined') {
-    description = 'undefined';
-  } else if (v.type == 'null') {
-    description = 'null';
-  } else if (goog.isDef(v.value)) {
-    // Check for undefined and null types before checking the value, otherwise
-    // null/undefined may have blank value.
-    description = v.value;
-  } else {
-    description = '<unresolved ref: ' + v.ref + ', type: ' + v.type + '>';
-  }
-  var proxy = new WebInspector.ObjectProxy(v, [], 0, description, hasChildren);
-  proxy.type = v.type;
-  proxy.isV8Ref = true;
-  return proxy;
-};
-
-
-/**
- * Converts line number from Web Inspector UI(1-based) to v8(0-based).
- * @param {number} line Resource line number in Web Inspector UI.
- * @return {number} The line number in v8.
- */
-devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line) {
-  return line - 1;
-};
-
-
-/**
- * Converts line number from v8(0-based) to Web Inspector UI(1-based).
- * @param {number} line Resource line number in v8.
- * @return {number} The line number in Web Inspector.
- */
-devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line) {
-  return line + 1;
-};
-
-
-/**
- * @param {number} scriptId Id of the script.
- * @param {?string} url Script resource URL if any.
- * @param {number} lineOffset First line 0-based offset in the containing
- *     document.
- * @param {string} contextType Type of the script's context:
- *     "page" - regular script from html page
- *     "injected" - extension content script
- * @param {bool} opt_isUnresolved If true, script will not be resolved.
- * @constructor
- */
-devtools.ScriptInfo = function(
-    scriptId, url, lineOffset, contextType, opt_isUnresolved) {
-  this.scriptId_ = scriptId;
-  this.lineOffset_ = lineOffset;
-  this.contextType_ = contextType;
-  this.url_ = url;
-  this.isUnresolved_ = opt_isUnresolved;
-
-  this.lineToBreakpointInfo_ = {};
-};
-
-
-/**
- * @return {number}
- */
-devtools.ScriptInfo.prototype.getLineOffset = function() {
-  return this.lineOffset_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.ScriptInfo.prototype.getContextType = function() {
-  return this.contextType_;
-};
-
-
-/**
- * @return {?string}
- */
-devtools.ScriptInfo.prototype.getUrl = function() {
-  return this.url_;
-};
-
-
-/**
- * @return {?bool}
- */
-devtools.ScriptInfo.prototype.isUnresolved = function() {
-  return this.isUnresolved_;
-};
-
-
-/**
- * @param {number} line 0-based line number in the script.
- * @return {?devtools.BreakpointInfo} Information on a breakpoint at the
- *     specified line in the script or undefined if there is no breakpoint at
- *     that line.
- */
-devtools.ScriptInfo.prototype.getBreakpointInfo = function(line) {
-  return this.lineToBreakpointInfo_[line];
-};
-
-
-/**
- * Adds breakpoint info to the script.
- * @param {devtools.BreakpointInfo} breakpoint
- */
-devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint) {
-  this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint;
-};
-
-
-/**
- * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed.
- */
-devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint) {
-  var line = breakpoint.getLine();
-  delete this.lineToBreakpointInfo_[line];
-};
-
-
-
-/**
- * @param {number} line Breakpoint 0-based line number in the containing script.
- * @constructor
- */
-devtools.BreakpointInfo = function(line) {
-  this.line_ = line;
-  this.v8id_ = -1;
-  this.removed_ = false;
-};
-
-
-/**
- * @return {number}
- */
-devtools.BreakpointInfo.prototype.getLine = function(n) {
-  return this.line_;
-};
-
-
-/**
- * @return {number} Unique identifier of this breakpoint in the v8 debugger.
- */
-devtools.BreakpointInfo.prototype.getV8Id = function(n) {
-  return this.v8id_;
-};
-
-
-/**
- * Sets id of this breakpoint in the v8 debugger.
- * @param {number} id
- */
-devtools.BreakpointInfo.prototype.setV8Id = function(id) {
-  this.v8id_ = id;
-};
-
-
-/**
- * Marks this breakpoint as removed from the  front-end.
- */
-devtools.BreakpointInfo.prototype.markAsRemoved = function() {
-  this.removed_ = true;
-};
-
-
-/**
- * @return {boolean} Whether this breakpoint has been removed from the
- *     front-end.
- */
-devtools.BreakpointInfo.prototype.isRemoved = function() {
-  return this.removed_;
-};
-
-
-/**
- * Call stack frame data.
- * @param {string} id CallFrame id.
- * @param {string} type CallFrame type.
- * @param {string} functionName CallFrame type.
- * @param {string} sourceID Source id.
- * @param {number} line Source line.
- * @param {Array.<Object>} scopeChain Array of scoped objects.
- * @construnctor
- */
-devtools.CallFrame = function(id, type, functionName, sourceID, line,
-    scopeChain) {
-  this.id = id;
-  this.type = type;
-  this.functionName = functionName;
-  this.sourceID = sourceID;
-  this.line = line;
-  this.scopeChain = scopeChain;
-};
-
-
-/**
- * This method issues asynchronous evaluate request, reports result to the
- * callback.
- * @param {string} expression An expression to be evaluated in the context of
- *     this call frame.
- * @param {function(Object):undefined} callback Callback to report result to.
- */
-devtools.CallFrame.prototype.evaluate_ = function(expression, callback) {
-  devtools.tools.getDebuggerAgent().requestEvaluate({
-      'expression': expression,
-      'frame': this.id,
-      'global': false,
-      'disable_break': false,
-      'compactFormat': true
-    },
-    function(response) {
-      var result = {};
-      if (response.isSuccess()) {
-        result.value = devtools.DebuggerAgent.formatObjectProxy_(
-            response.getBody());
-      } else {
-        result.value = response.getMessage();
-        result.isException = true;
-      }
-      callback(result);
-    });
-};
-
-
-/**
- * JSON based commands sent to v8 debugger.
- * @param {string} command Name of the command to execute.
- * @param {Object} opt_arguments Command-specific arguments map.
- * @constructor
- */
-devtools.DebugCommand = function(command, opt_arguments) {
-  this.command_ = command;
-  this.type_ = 'request';
-  this.seq_ = ++devtools.DebugCommand.nextSeq_;
-  if (opt_arguments) {
-    this.arguments_ = opt_arguments;
-  }
-};
-
-
-/**
- * Next unique number to be used as debugger request sequence number.
- * @type {number}
- */
-devtools.DebugCommand.nextSeq_ = 1;
-
-
-/**
- * @return {number}
- */
-devtools.DebugCommand.prototype.getSequenceNumber = function() {
-  return this.seq_;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebugCommand.prototype.toJSONProtocol = function() {
-  var json = {
-    'seq': this.seq_,
-    'type': this.type_,
-    'command': this.command_
-  }
-  if (this.arguments_) {
-    json.arguments = this.arguments_;
-  }
-  return JSON.stringify(json);
-};
-
-
-/**
- * JSON messages sent from v8 debugger. See protocol definition for more
- * details: http://code.google.com/p/v8/wiki/DebuggerProtocol
- * @param {string} msg Raw protocol packet as JSON string.
- * @constructor
- */
-devtools.DebuggerMessage = function(msg) {
-  this.packet_ = JSON.parse(msg);
-  this.refs_ = [];
-  if (this.packet_.refs) {
-    for (var i = 0; i < this.packet_.refs.length; i++) {
-      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
-    }
-  }
-};
-
-
-/**
- * @return {string} The packet type.
- */
-devtools.DebuggerMessage.prototype.getType = function() {
-  return this.packet_.type;
-};
-
-
-/**
- * @return {?string} The packet event if the message is an event.
- */
-devtools.DebuggerMessage.prototype.getEvent = function() {
-  return this.packet_.event;
-};
-
-
-/**
- * @return {?string} The packet command if the message is a response to a
- *     command.
- */
-devtools.DebuggerMessage.prototype.getCommand = function() {
-  return this.packet_.command;
-};
-
-
-/**
- * @return {number} The packet request sequence.
- */
-devtools.DebuggerMessage.prototype.getRequestSeq = function() {
-  return this.packet_.request_seq;
-};
-
-
-/**
- * @return {number} Whether the v8 is running after processing the request.
- */
-devtools.DebuggerMessage.prototype.isRunning = function() {
-  return this.packet_.running ? true : false;
-};
-
-
-/**
- * @return {boolean} Whether the request succeeded.
- */
-devtools.DebuggerMessage.prototype.isSuccess = function() {
-  return this.packet_.success ? true : false;
-};
-
-
-/**
- * @return {string}
- */
-devtools.DebuggerMessage.prototype.getMessage = function() {
-  return this.packet_.message;
-};
-
-
-/**
- * @return {Object} Parsed message body json.
- */
-devtools.DebuggerMessage.prototype.getBody = function() {
-  return this.packet_.body;
-};
-
-
-/**
- * @param {number} handle Object handle.
- * @return {?Object} Returns the object with the handle if it was sent in this
- *    message(some objects referenced by handles may be missing in the message).
- */
-devtools.DebuggerMessage.prototype.lookup = function(handle) {
-  return this.refs_[handle];
-};
-
-/* codemap.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Constructs a mapper that maps addresses into code entries.
- *
- * @constructor
- */
-devtools.profiler.CodeMap = function() {
-  /**
-   * Dynamic code entries. Used for JIT compiled code.
-   */
-  this.dynamics_ = new goog.structs.SplayTree();
-
-  /**
-   * Name generator for entries having duplicate names.
-   */
-  this.dynamicsNameGen_ = new devtools.profiler.CodeMap.NameGenerator();
-
-  /**
-   * Static code entries. Used for statically compiled code.
-   */
-  this.statics_ = new goog.structs.SplayTree();
-
-  /**
-   * Libraries entries. Used for the whole static code libraries.
-   */
-  this.libraries_ = new goog.structs.SplayTree();
-
-  /**
-   * Map of memory pages occupied with static code.
-   */
-  this.pages_ = [];
-};
-
-
-/**
- * The number of alignment bits in a page address.
- */
-devtools.profiler.CodeMap.PAGE_ALIGNMENT = 12;
-
-
-/**
- * Page size in bytes.
- */
-devtools.profiler.CodeMap.PAGE_SIZE =
-    1 << devtools.profiler.CodeMap.PAGE_ALIGNMENT;
-
-
-/**
- * Adds a dynamic (i.e. moveable and discardable) code entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addCode = function(start, codeEntry) {
-  this.dynamics_.insert(start, codeEntry);
-};
-
-
-/**
- * Moves a dynamic code entry. Throws an exception if there is no dynamic
- * code entry with the specified starting address.
- *
- * @param {number} from The starting address of the entry being moved.
- * @param {number} to The destination address.
- */
-devtools.profiler.CodeMap.prototype.moveCode = function(from, to) {
-  var removedNode = this.dynamics_.remove(from);
-  this.dynamics_.insert(to, removedNode.value);
-};
-
-
-/**
- * Discards a dynamic code entry. Throws an exception if there is no dynamic
- * code entry with the specified starting address.
- *
- * @param {number} start The starting address of the entry being deleted.
- */
-devtools.profiler.CodeMap.prototype.deleteCode = function(start) {
-  var removedNode = this.dynamics_.remove(start);
-};
-
-
-/**
- * Adds a library entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addLibrary = function(
-    start, codeEntry) {
-  this.markPages_(start, start + codeEntry.size);
-  this.libraries_.insert(start, codeEntry);
-};
-
-
-/**
- * Adds a static code entry.
- *
- * @param {number} start The starting address.
- * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
- */
-devtools.profiler.CodeMap.prototype.addStaticCode = function(
-    start, codeEntry) {
-  this.statics_.insert(start, codeEntry);
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.markPages_ = function(start, end) {
-  for (var addr = start; addr <= end;
-       addr += devtools.profiler.CodeMap.PAGE_SIZE) {
-    this.pages_[addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT] = 1;
-  }
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
-  return addr >= node.key && addr < (node.key + node.value.size);
-};
-
-
-/**
- * @private
- */
-devtools.profiler.CodeMap.prototype.findInTree_ = function(tree, addr) {
-  var node = tree.findGreatestLessThan(addr);
-  return node && this.isAddressBelongsTo_(addr, node) ? node.value : null;
-};
-
-
-/**
- * Finds a code entry that contains the specified address. Both static and
- * dynamic code entries are considered.
- *
- * @param {number} addr Address.
- */
-devtools.profiler.CodeMap.prototype.findEntry = function(addr) {
-  var pageAddr = addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT;
-  if (pageAddr in this.pages_) {
-    // Static code entries can contain "holes" of unnamed code.
-    // In this case, the whole library is assigned to this address.
-    return this.findInTree_(this.statics_, addr) ||
-        this.findInTree_(this.libraries_, addr);
-  }
-  var min = this.dynamics_.findMin();
-  var max = this.dynamics_.findMax();
-  if (max != null && addr < (max.key + max.value.size) && addr >= min.key) {
-    var dynaEntry = this.findInTree_(this.dynamics_, addr);
-    if (dynaEntry == null) return null;
-    // Dedupe entry name.
-    if (!dynaEntry.nameUpdated_) {
-      dynaEntry.name = this.dynamicsNameGen_.getName(dynaEntry.name);
-      dynaEntry.nameUpdated_ = true;
-    }
-    return dynaEntry;
-  }
-  return null;
-};
-
-
-/**
- * Returns an array of all dynamic code entries.
- */
-devtools.profiler.CodeMap.prototype.getAllDynamicEntries = function() {
-  return this.dynamics_.exportValues();
-};
-
-
-/**
- * Returns an array of all static code entries.
- */
-devtools.profiler.CodeMap.prototype.getAllStaticEntries = function() {
-  return this.statics_.exportValues();
-};
-
-
-/**
- * Returns an array of all libraries entries.
- */
-devtools.profiler.CodeMap.prototype.getAllLibrariesEntries = function() {
-  return this.libraries_.exportValues();
-};
-
-
-/**
- * Creates a code entry object.
- *
- * @param {number} size Code entry size in bytes.
- * @param {string} opt_name Code entry name.
- * @constructor
- */
-devtools.profiler.CodeMap.CodeEntry = function(size, opt_name) {
-  this.size = size;
-  this.name = opt_name || '';
-  this.nameUpdated_ = false;
-};
-
-
-devtools.profiler.CodeMap.CodeEntry.prototype.getName = function() {
-  return this.name;
-};
-
-
-devtools.profiler.CodeMap.CodeEntry.prototype.toString = function() {
-  return this.name + ': ' + this.size.toString(16);
-};
-
-
-devtools.profiler.CodeMap.NameGenerator = function() {
-  this.knownNames_ = {};
-};
-
-
-devtools.profiler.CodeMap.NameGenerator.prototype.getName = function(name) {
-  if (!(name in this.knownNames_)) {
-    this.knownNames_[name] = 0;
-    return name;
-  }
-  var count = ++this.knownNames_[name];
-  return name + ' {' + count + '}';
-};
-
-/* consarray.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-/**
- * Constructs a ConsArray object. It is used mainly for tree traversal.
- * In this use case we have lots of arrays that we need to iterate
- * sequentally. The internal Array implementation is horribly slow
- * when concatenating on large (10K items) arrays due to memory copying.
- * That's why we avoid copying memory and insead build a linked list
- * of arrays to iterate through.
- *
- * @constructor
- */
-function ConsArray() {
-  this.tail_ = new ConsArray.Cell(null, null);
-  this.currCell_ = this.tail_;
-  this.currCellPos_ = 0;
-};
-
-
-/**
- * Concatenates another array for iterating. Empty arrays are ignored.
- * This operation can be safely performed during ongoing ConsArray
- * iteration.
- *
- * @param {Array} arr Array to concatenate.
- */
-ConsArray.prototype.concat = function(arr) {
-  if (arr.length > 0) {
-    this.tail_.data = arr;
-    this.tail_ = this.tail_.next = new ConsArray.Cell(null, null);
-  }
-};
-
-
-/**
- * Whether the end of iteration is reached.
- */
-ConsArray.prototype.atEnd = function() {
-  return this.currCell_ === null ||
-      this.currCell_.data === null ||
-      this.currCellPos_ >= this.currCell_.data.length;
-};
-
-
-/**
- * Returns the current item, moves to the next one.
- */
-ConsArray.prototype.next = function() {
-  var result = this.currCell_.data[this.currCellPos_++];
-  if (this.currCellPos_ >= this.currCell_.data.length) {
-    this.currCell_ = this.currCell_.next;
-    this.currCellPos_ = 0;
-  }
-  return result;
-};
-
-
-/**
- * A cell object used for constructing a list in ConsArray.
- *
- * @constructor
- */
-ConsArray.Cell = function(data, next) {
-  this.data = data;
-  this.next = next;
-};
-
-
-/* csvparser.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces.
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a CSV lines parser.
- */
-devtools.profiler.CsvParser = function() {
-};
-
-
-/**
- * A regex for matching a trailing quote.
- * @private
- */
-devtools.profiler.CsvParser.TRAILING_QUOTE_RE_ = /\"$/;
-
-
-/**
- * A regex for matching a double quote.
- * @private
- */
-devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
-
-
-/**
- * Parses a line of CSV-encoded values. Returns an array of fields.
- *
- * @param {string} line Input line.
- */
-devtools.profiler.CsvParser.prototype.parseLine = function(line) {
-  var insideQuotes = false;
-  var fields = [];
-  var prevPos = 0;
-  for (var i = 0, n = line.length; i < n; ++i) {
-    switch (line.charAt(i)) {
-      case ',':
-        if (!insideQuotes) {
-          fields.push(line.substring(prevPos, i));
-          prevPos = i + 1;
-        }
-        break;
-      case '"':
-        if (!insideQuotes) {
-          insideQuotes = true;
-          // Skip the leading quote.
-          prevPos++;
-        } else {
-          if (i + 1 < n && line.charAt(i + 1) != '"') {
-            insideQuotes = false;
-          } else {
-            i++;
-          }
-        }
-        break;
-    }
-  }
-  if (n > 0) {
-    fields.push(line.substring(prevPos));
-  }
-
-  for (i = 0; i < fields.length; ++i) {
-    // Eliminate trailing quotes.
-    fields[i] = fields[i].replace(devtools.profiler.CsvParser.TRAILING_QUOTE_RE_, '');
-    // Convert quoted quotes into single ones.
-    fields[i] = fields[i].replace(devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_, '"');
-  }
-  return fields;
-};
-
-/* logreader.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/**
- * @fileoverview Log Reader is used to process log file produced by V8.
- */
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Base class for processing log files.
- *
- * @param {Array.<Object>} dispatchTable A table used for parsing and processing
- *     log records.
- * @constructor
- */
-devtools.profiler.LogReader = function(dispatchTable) {
-  /**
-   * @type {Array.<Object>}
-   */
-  this.dispatchTable_ = dispatchTable;
-  this.dispatchTable_['alias'] =
-      { parsers: [null, null], processor: this.processAlias_ };
-  this.dispatchTable_['repeat'] =
-      { parsers: [parseInt, 'var-args'], processor: this.processRepeat_,
-        backrefs: true };
-
-  /**
-   * A key-value map for aliases. Translates short name -> full name.
-   * @type {Object}
-   */
-  this.aliases_ = {};
-
-  /**
-   * A key-value map for previous address values.
-   * @type {Object}
-   */
-  this.prevAddresses_ = {};
-
-  /**
-   * A key-value map for events than can be backreference-compressed.
-   * @type {Object}
-   */
-  this.backRefsCommands_ = {};
-  this.initBackRefsCommands_();
-
-  /**
-   * Back references for decompression.
-   * @type {Array.<string>}
-   */
-  this.backRefs_ = [];
-};
-
-
-/**
- * Creates a parser for an address entry.
- *
- * @param {string} addressTag Address tag to perform offset decoding.
- * @return {function(string):number} Address parser.
- */
-devtools.profiler.LogReader.prototype.createAddressParser = function(
-    addressTag) {
-  var self = this;
-  return (function (str) {
-    var value = parseInt(str, 16);
-    var firstChar = str.charAt(0);
-    if (firstChar == '+' || firstChar == '-') {
-      var addr = self.prevAddresses_[addressTag];
-      addr += value;
-      self.prevAddresses_[addressTag] = addr;
-      return addr;
-    } else if (firstChar != '0' || str.charAt(1) != 'x') {
-      self.prevAddresses_[addressTag] = value;
-    }
-    return value;
-  });
-};
-
-
-/**
- * Expands an alias symbol, if applicable.
- *
- * @param {string} symbol Symbol to expand.
- * @return {string} Expanded symbol, or the input symbol itself.
- */
-devtools.profiler.LogReader.prototype.expandAlias = function(symbol) {
-  return symbol in this.aliases_ ? this.aliases_[symbol] : symbol;
-};
-
-
-/**
- * Used for printing error messages.
- *
- * @param {string} str Error message.
- */
-devtools.profiler.LogReader.prototype.printError = function(str) {
-  // Do nothing.
-};
-
-
-/**
- * Processes a portion of V8 profiler event log.
- *
- * @param {string} chunk A portion of log.
- */
-devtools.profiler.LogReader.prototype.processLogChunk = function(chunk) {
-  this.processLog_(chunk.split('\n'));
-};
-
-
-/**
- * Processes stack record.
- *
- * @param {number} pc Program counter.
- * @param {Array.<string>} stack String representation of a stack.
- * @return {Array.<number>} Processed stack.
- */
-devtools.profiler.LogReader.prototype.processStack = function(pc, stack) {
-  var fullStack = [pc];
-  var prevFrame = pc;
-  for (var i = 0, n = stack.length; i < n; ++i) {
-    var frame = stack[i];
-    var firstChar = frame.charAt(0);
-    if (firstChar == '+' || firstChar == '-') {
-      // An offset from the previous frame.
-      prevFrame += parseInt(frame, 16);
-      fullStack.push(prevFrame);
-    // Filter out possible 'overflow' string.
-    } else if (firstChar != 'o') {
-      fullStack.push(parseInt(frame, 16));
-    }
-  }
-  return fullStack;
-};
-
-
-/**
- * Returns whether a particular dispatch must be skipped.
- *
- * @param {!Object} dispatch Dispatch record.
- * @return {boolean} True if dispatch must be skipped.
- */
-devtools.profiler.LogReader.prototype.skipDispatch = function(dispatch) {
-  return false;
-};
-
-
-/**
- * Does a dispatch of a log record.
- *
- * @param {Array.<string>} fields Log record.
- * @private
- */
-devtools.profiler.LogReader.prototype.dispatchLogRow_ = function(fields) {
-  // Obtain the dispatch.
-  var command = fields[0];
-  if (!(command in this.dispatchTable_)) {
-    throw new Error('unknown command: ' + command);
-  }
-  var dispatch = this.dispatchTable_[command];
-
-  if (dispatch === null || this.skipDispatch(dispatch)) {
-    return;
-  }
-
-  // Parse fields.
-  var parsedFields = [];
-  for (var i = 0; i < dispatch.parsers.length; ++i) {
-    var parser = dispatch.parsers[i];
-    if (parser === null) {
-      parsedFields.push(fields[1 + i]);
-    } else if (typeof parser == 'function') {
-      parsedFields.push(parser(fields[1 + i]));
-    } else {
-      // var-args
-      parsedFields.push(fields.slice(1 + i));
-      break;
-    }
-  }
-
-  // Run the processor.
-  dispatch.processor.apply(this, parsedFields);
-};
-
-
-/**
- * Decompresses a line if it was backreference-compressed.
- *
- * @param {string} line Possibly compressed line.
- * @return {string} Decompressed line.
- * @private
- */
-devtools.profiler.LogReader.prototype.expandBackRef_ = function(line) {
-  var backRefPos;
-  // Filter out case when a regexp is created containing '#'.
-  if (line.charAt(line.length - 1) != '"'
-      && (backRefPos = line.lastIndexOf('#')) != -1) {
-    var backRef = line.substr(backRefPos + 1);
-    var backRefIdx = parseInt(backRef, 10) - 1;
-    var colonPos = backRef.indexOf(':');
-    var backRefStart =
-        colonPos != -1 ? parseInt(backRef.substr(colonPos + 1), 10) : 0;
-    line = line.substr(0, backRefPos) +
-        this.backRefs_[backRefIdx].substr(backRefStart);
-  }
-  this.backRefs_.unshift(line);
-  if (this.backRefs_.length > 10) {
-    this.backRefs_.length = 10;
-  }
-  return line;
-};
-
-
-/**
- * Initializes the map of backward reference compressible commands.
- * @private
- */
-devtools.profiler.LogReader.prototype.initBackRefsCommands_ = function() {
-  for (var event in this.dispatchTable_) {
-    var dispatch = this.dispatchTable_[event];
-    if (dispatch && dispatch.backrefs) {
-      this.backRefsCommands_[event] = true;
-    }
-  }
-};
-
-
-/**
- * Processes alias log record. Adds an alias to a corresponding map.
- *
- * @param {string} symbol Short name.
- * @param {string} expansion Long name.
- * @private
- */
-devtools.profiler.LogReader.prototype.processAlias_ = function(
-    symbol, expansion) {
-  if (expansion in this.dispatchTable_) {
-    this.dispatchTable_[symbol] = this.dispatchTable_[expansion];
-    if (expansion in this.backRefsCommands_) {
-      this.backRefsCommands_[symbol] = true;
-    }
-  } else {
-    this.aliases_[symbol] = expansion;
-  }
-};
-
-
-/**
- * Processes log lines.
- *
- * @param {Array.<string>} lines Log lines.
- * @private
- */
-devtools.profiler.LogReader.prototype.processLog_ = function(lines) {
-  var csvParser = new devtools.profiler.CsvParser();
-  try {
-    for (var i = 0, n = lines.length; i < n; ++i) {
-      var line = lines[i];
-      if (!line) {
-        continue;
-      }
-      if (line.charAt(0) == '#' ||
-          line.substr(0, line.indexOf(',')) in this.backRefsCommands_) {
-        line = this.expandBackRef_(line);
-      }
-      var fields = csvParser.parseLine(line);
-      this.dispatchLogRow_(fields);
-    }
-  } catch (e) {
-    // An error on the last line is acceptable since log file can be truncated.
-    if (i < n - 1) {
-      this.printError('line ' + (i + 1) + ': ' + (e.message || e));
-      throw e;
-    }
-  }
-};
-
-
-/**
- * Processes repeat log record. Expands it according to calls count and
- * invokes processing.
- *
- * @param {number} count Count.
- * @param {Array.<string>} cmd Parsed command.
- * @private
- */
-devtools.profiler.LogReader.prototype.processRepeat_ = function(count, cmd) {
-  // Replace the repeat-prefixed command from backrefs list with a non-prefixed.
-  this.backRefs_[0] = cmd.join(',');
-  for (var i = 0; i < count; ++i) {
-    this.dispatchLogRow_(cmd);
-  }
-};
-
-/* profile.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a profile object for processing profiling-related events
- * and calculating function execution times.
- *
- * @constructor
- */
-devtools.profiler.Profile = function() {
-  this.codeMap_ = new devtools.profiler.CodeMap();
-  this.topDownTree_ = new devtools.profiler.CallTree();
-  this.bottomUpTree_ = new devtools.profiler.CallTree();
-};
-
-
-/**
- * Returns whether a function with the specified name must be skipped.
- * Should be overriden by subclasses.
- *
- * @param {string} name Function name.
- */
-devtools.profiler.Profile.prototype.skipThisFunction = function(name) {
-  return false;
-};
-
-
-/**
- * Enum for profiler operations that involve looking up existing
- * code entries.
- *
- * @enum {number}
- */
-devtools.profiler.Profile.Operation = {
-  MOVE: 0,
-  DELETE: 1,
-  TICK: 2
-};
-
-
-/**
- * Called whenever the specified operation has failed finding a function
- * containing the specified address. Should be overriden by subclasses.
- * See the devtools.profiler.Profile.Operation enum for the list of
- * possible operations.
- *
- * @param {number} operation Operation.
- * @param {number} addr Address of the unknown code.
- * @param {number} opt_stackPos If an unknown address is encountered
- *     during stack strace processing, specifies a position of the frame
- *     containing the address.
- */
-devtools.profiler.Profile.prototype.handleUnknownCode = function(
-    operation, addr, opt_stackPos) {
-};
-
-
-/**
- * Registers a library.
- *
- * @param {string} name Code entry name.
- * @param {number} startAddr Starting address.
- * @param {number} endAddr Ending address.
- */
-devtools.profiler.Profile.prototype.addLibrary = function(
-    name, startAddr, endAddr) {
-  var entry = new devtools.profiler.CodeMap.CodeEntry(
-      endAddr - startAddr, name);
-  this.codeMap_.addLibrary(startAddr, entry);
-  return entry;
-};
-
-
-/**
- * Registers statically compiled code entry.
- *
- * @param {string} name Code entry name.
- * @param {number} startAddr Starting address.
- * @param {number} endAddr Ending address.
- */
-devtools.profiler.Profile.prototype.addStaticCode = function(
-    name, startAddr, endAddr) {
-  var entry = new devtools.profiler.CodeMap.CodeEntry(
-      endAddr - startAddr, name);
-  this.codeMap_.addStaticCode(startAddr, entry);
-  return entry;
-};
-
-
-/**
- * Registers dynamic (JIT-compiled) code entry.
- *
- * @param {string} type Code entry type.
- * @param {string} name Code entry name.
- * @param {number} start Starting address.
- * @param {number} size Code entry size.
- */
-devtools.profiler.Profile.prototype.addCode = function(
-    type, name, start, size) {
-  var entry = new devtools.profiler.Profile.DynamicCodeEntry(size, type, name);
-  this.codeMap_.addCode(start, entry);
-  return entry;
-};
-
-
-/**
- * Reports about moving of a dynamic code entry.
- *
- * @param {number} from Current code entry address.
- * @param {number} to New code entry address.
- */
-devtools.profiler.Profile.prototype.moveCode = function(from, to) {
-  try {
-    this.codeMap_.moveCode(from, to);
-  } catch (e) {
-    this.handleUnknownCode(devtools.profiler.Profile.Operation.MOVE, from);
-  }
-};
-
-
-/**
- * Reports about deletion of a dynamic code entry.
- *
- * @param {number} start Starting address.
- */
-devtools.profiler.Profile.prototype.deleteCode = function(start) {
-  try {
-    this.codeMap_.deleteCode(start);
-  } catch (e) {
-    this.handleUnknownCode(devtools.profiler.Profile.Operation.DELETE, start);
-  }
-};
-
-
-/**
- * Records a tick event. Stack must contain a sequence of
- * addresses starting with the program counter value.
- *
- * @param {Array<number>} stack Stack sample.
- */
-devtools.profiler.Profile.prototype.recordTick = function(stack) {
-  var processedStack = this.resolveAndFilterFuncs_(stack);
-  this.bottomUpTree_.addPath(processedStack);
-  processedStack.reverse();
-  this.topDownTree_.addPath(processedStack);
-};
-
-
-/**
- * Translates addresses into function names and filters unneeded
- * functions.
- *
- * @param {Array<number>} stack Stack sample.
- */
-devtools.profiler.Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
-  var result = [];
-  for (var i = 0; i < stack.length; ++i) {
-    var entry = this.codeMap_.findEntry(stack[i]);
-    if (entry) {
-      var name = entry.getName();
-      if (!this.skipThisFunction(name)) {
-        result.push(name);
-      }
-    } else {
-      this.handleUnknownCode(
-          devtools.profiler.Profile.Operation.TICK, stack[i], i);
-    }
-  }
-  return result;
-};
-
-
-/**
- * Performs a BF traversal of the top down call graph.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.Profile.prototype.traverseTopDownTree = function(f) {
-  this.topDownTree_.traverse(f);
-};
-
-
-/**
- * Performs a BF traversal of the bottom up call graph.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.Profile.prototype.traverseBottomUpTree = function(f) {
-  this.bottomUpTree_.traverse(f);
-};
-
-
-/**
- * Calculates a top down profile for a node with the specified label.
- * If no name specified, returns the whole top down calls tree.
- *
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getTopDownProfile = function(opt_label) {
-  return this.getTreeProfile_(this.topDownTree_, opt_label);
-};
-
-
-/**
- * Calculates a bottom up profile for a node with the specified label.
- * If no name specified, returns the whole bottom up calls tree.
- *
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getBottomUpProfile = function(opt_label) {
-  return this.getTreeProfile_(this.bottomUpTree_, opt_label);
-};
-
-
-/**
- * Helper function for calculating a tree profile.
- *
- * @param {devtools.profiler.Profile.CallTree} tree Call tree.
- * @param {string} opt_label Node label.
- */
-devtools.profiler.Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
-  if (!opt_label) {
-    tree.computeTotalWeights();
-    return tree;
-  } else {
-    var subTree = tree.cloneSubtree(opt_label);
-    subTree.computeTotalWeights();
-    return subTree;
-  }
-};
-
-
-/**
- * Calculates a flat profile of callees starting from a node with
- * the specified label. If no name specified, starts from the root.
- *
- * @param {string} opt_label Starting node label.
- */
-devtools.profiler.Profile.prototype.getFlatProfile = function(opt_label) {
-  var counters = new devtools.profiler.CallTree();
-  var rootLabel = opt_label || devtools.profiler.CallTree.ROOT_NODE_LABEL;
-  var precs = {};
-  precs[rootLabel] = 0;
-  var root = counters.findOrAddChild(rootLabel);
-
-  this.topDownTree_.computeTotalWeights();
-  this.topDownTree_.traverseInDepth(
-    function onEnter(node) {
-      if (!(node.label in precs)) {
-        precs[node.label] = 0;
-      }
-      var nodeLabelIsRootLabel = node.label == rootLabel;
-      if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
-        if (precs[rootLabel] == 0) {
-          root.selfWeight += node.selfWeight;
-          root.totalWeight += node.totalWeight;
-        } else {
-          var rec = root.findOrAddChild(node.label);
-          rec.selfWeight += node.selfWeight;
-          if (nodeLabelIsRootLabel || precs[node.label] == 0) {
-            rec.totalWeight += node.totalWeight;
-          }
-        }
-        precs[node.label]++;
-      }
-    },
-    function onExit(node) {
-      if (node.label == rootLabel || precs[rootLabel] > 0) {
-        precs[node.label]--;
-      }
-    },
-    null);
-
-  if (!opt_label) {
-    // If we have created a flat profile for the whole program, we don't
-    // need an explicit root in it. Thus, replace the counters tree
-    // root with the node corresponding to the whole program.
-    counters.root_ = root;
-  } else {
-    // Propagate weights so percents can be calculated correctly.
-    counters.getRoot().selfWeight = root.selfWeight;
-    counters.getRoot().totalWeight = root.totalWeight;
-  }
-  return counters;
-};
-
-
-/**
- * Creates a dynamic code entry.
- *
- * @param {number} size Code size.
- * @param {string} type Code type.
- * @param {string} name Function name.
- * @constructor
- */
-devtools.profiler.Profile.DynamicCodeEntry = function(size, type, name) {
-  devtools.profiler.CodeMap.CodeEntry.call(this, size, name);
-  this.type = type;
-};
-
-
-/**
- * Returns node name.
- */
-devtools.profiler.Profile.DynamicCodeEntry.prototype.getName = function() {
-  var name = this.name;
-  if (name.length == 0) {
-    name = '<anonymous>';
-  } else if (name.charAt(0) == ' ') {
-    // An anonymous function with location: " aaa.js:10".
-    name = '<anonymous>' + name;
-  }
-  return this.type + ': ' + name;
-};
-
-
-/**
- * Constructs a call graph.
- *
- * @constructor
- */
-devtools.profiler.CallTree = function() {
-  this.root_ = new devtools.profiler.CallTree.Node(
-      devtools.profiler.CallTree.ROOT_NODE_LABEL);
-};
-
-
-/**
- * The label of the root node.
- */
-devtools.profiler.CallTree.ROOT_NODE_LABEL = '';
-
-
-/**
- * @private
- */
-devtools.profiler.CallTree.prototype.totalsComputed_ = false;
-
-
-/**
- * Returns the tree root.
- */
-devtools.profiler.CallTree.prototype.getRoot = function() {
-  return this.root_;
-};
-
-
-/**
- * Adds the specified call path, constructing nodes as necessary.
- *
- * @param {Array<string>} path Call path.
- */
-devtools.profiler.CallTree.prototype.addPath = function(path) {
-  if (path.length == 0) {
-    return;
-  }
-  var curr = this.root_;
-  for (var i = 0; i < path.length; ++i) {
-    curr = curr.findOrAddChild(path[i]);
-  }
-  curr.selfWeight++;
-  this.totalsComputed_ = false;
-};
-
-
-/**
- * Finds an immediate child of the specified parent with the specified
- * label, creates a child node if necessary. If a parent node isn't
- * specified, uses tree root.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.prototype.findOrAddChild = function(label) {
-  return this.root_.findOrAddChild(label);
-};
-
-
-/**
- * Creates a subtree by cloning and merging all subtrees rooted at nodes
- * with a given label. E.g. cloning the following call tree on label 'A'
- * will give the following result:
- *
- *           <A>--<B>                                     <B>
- *          /                                            /
- *     <root>             == clone on 'A' ==>  <root>--<A>
- *          \                                            \
- *           <C>--<A>--<D>                                <D>
- *
- * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
- * source call tree.
- *
- * @param {string} label The label of the new root node.
- */
-devtools.profiler.CallTree.prototype.cloneSubtree = function(label) {
-  var subTree = new devtools.profiler.CallTree();
-  this.traverse(function(node, parent) {
-    if (!parent && node.label != label) {
-      return null;
-    }
-    var child = (parent ? parent : subTree).findOrAddChild(node.label);
-    child.selfWeight += node.selfWeight;
-    return child;
-  });
-  return subTree;
-};
-
-
-/**
- * Computes total weights in the call graph.
- */
-devtools.profiler.CallTree.prototype.computeTotalWeights = function() {
-  if (this.totalsComputed_) {
-    return;
-  }
-  this.root_.computeTotalWeight();
-  this.totalsComputed_ = true;
-};
-
-
-/**
- * Traverses the call graph in preorder. This function can be used for
- * building optionally modified tree clones. This is the boilerplate code
- * for this scenario:
- *
- * callTree.traverse(function(node, parentClone) {
- *   var nodeClone = cloneNode(node);
- *   if (parentClone)
- *     parentClone.addChild(nodeClone);
- *   return nodeClone;
- * });
- *
- * @param {function(devtools.profiler.CallTree.Node, *)} f Visitor function.
- *    The second parameter is the result of calling 'f' on the parent node.
- */
-devtools.profiler.CallTree.prototype.traverse = function(f) {
-  var pairsToProcess = new ConsArray();
-  pairsToProcess.concat([{node: this.root_, param: null}]);
-  while (!pairsToProcess.atEnd()) {
-    var pair = pairsToProcess.next();
-    var node = pair.node;
-    var newParam = f(node, pair.param);
-    var morePairsToProcess = [];
-    node.forEachChild(function (child) {
-        morePairsToProcess.push({node: child, param: newParam}); });
-    pairsToProcess.concat(morePairsToProcess);
-  }
-};
-
-
-/**
- * Performs an indepth call graph traversal.
- *
- * @param {function(devtools.profiler.CallTree.Node)} enter A function called
- *     prior to visiting node's children.
- * @param {function(devtools.profiler.CallTree.Node)} exit A function called
- *     after visiting node's children.
- */
-devtools.profiler.CallTree.prototype.traverseInDepth = function(enter, exit) {
-  function traverse(node) {
-    enter(node);
-    node.forEachChild(traverse);
-    exit(node);
-  }
-  traverse(this.root_);
-};
-
-
-/**
- * Constructs a call graph node.
- *
- * @param {string} label Node label.
- * @param {devtools.profiler.CallTree.Node} opt_parent Node parent.
- */
-devtools.profiler.CallTree.Node = function(label, opt_parent) {
-  this.label = label;
-  this.parent = opt_parent;
-  this.children = {};
-};
-
-
-/**
- * Node self weight (how many times this node was the last node in
- * a call path).
- * @type {number}
- */
-devtools.profiler.CallTree.Node.prototype.selfWeight = 0;
-
-
-/**
- * Node total weight (includes weights of all children).
- * @type {number}
- */
-devtools.profiler.CallTree.Node.prototype.totalWeight = 0;
-
-
-/**
- * Adds a child node.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.addChild = function(label) {
-  var child = new devtools.profiler.CallTree.Node(label, this);
-  this.children[label] = child;
-  return child;
-};
-
-
-/**
- * Computes node's total weight.
- */
-devtools.profiler.CallTree.Node.prototype.computeTotalWeight =
-    function() {
-  var totalWeight = this.selfWeight;
-  this.forEachChild(function(child) {
-      totalWeight += child.computeTotalWeight(); });
-  return this.totalWeight = totalWeight;
-};
-
-
-/**
- * Returns all node's children as an array.
- */
-devtools.profiler.CallTree.Node.prototype.exportChildren = function() {
-  var result = [];
-  this.forEachChild(function (node) { result.push(node); });
-  return result;
-};
-
-
-/**
- * Finds an immediate child with the specified label.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.findChild = function(label) {
-  return this.children[label] || null;
-};
-
-
-/**
- * Finds an immediate child with the specified label, creates a child
- * node if necessary.
- *
- * @param {string} label Child node label.
- */
-devtools.profiler.CallTree.Node.prototype.findOrAddChild = function(label) {
-  return this.findChild(label) || this.addChild(label);
-};
-
-
-/**
- * Calls the specified function for every child.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.forEachChild = function(f) {
-  for (var c in this.children) {
-    f(this.children[c]);
-  }
-};
-
-
-/**
- * Walks up from the current node up to the call tree root.
- *
- * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.walkUpToRoot = function(f) {
-  for (var curr = this; curr != null; curr = curr.parent) {
-    f(curr);
-  }
-};
-
-
-/**
- * Tries to find a node with the specified path.
- *
- * @param {Array<string>} labels The path.
- * @param {function(devtools.profiler.CallTree.Node)} opt_f Visitor function.
- */
-devtools.profiler.CallTree.Node.prototype.descendToChild = function(
-    labels, opt_f) {
-  for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
-    var child = curr.findChild(labels[pos]);
-    if (opt_f) {
-      opt_f(child, pos);
-    }
-    curr = child;
-  }
-  return curr;
-};
-
-/* profile_view.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// Initlialize namespaces
-var devtools = devtools || {};
-devtools.profiler = devtools.profiler || {};
-
-
-/**
- * Creates a Profile View builder object.
- *
- * @param {number} samplingRate Number of ms between profiler ticks.
- * @constructor
- */
-devtools.profiler.ViewBuilder = function(samplingRate) {
-  this.samplingRate = samplingRate;
-};
-
-
-/**
- * Builds a profile view for the specified call tree.
- *
- * @param {devtools.profiler.CallTree} callTree A call tree.
- * @param {boolean} opt_bottomUpViewWeights Whether remapping
- *     of self weights for a bottom up view is needed.
- */
-devtools.profiler.ViewBuilder.prototype.buildView = function(
-    callTree, opt_bottomUpViewWeights) {
-  var head;
-  var samplingRate = this.samplingRate;
-  var createViewNode = this.createViewNode;
-  callTree.traverse(function(node, viewParent) {
-    var totalWeight = node.totalWeight * samplingRate;
-    var selfWeight = node.selfWeight * samplingRate;
-    if (opt_bottomUpViewWeights === true) {
-      if (viewParent === head) {
-        selfWeight = totalWeight;
-      } else {
-        selfWeight = 0;
-      }
-    }
-    var viewNode = createViewNode(node.label, totalWeight, selfWeight, head);
-    if (viewParent) {
-      viewParent.addChild(viewNode);
-    } else {
-      head = viewNode;
-    }
-    return viewNode;
-  });
-  var view = this.createView(head);
-  return view;
-};
-
-
-/**
- * Factory method for a profile view.
- *
- * @param {devtools.profiler.ProfileView.Node} head View head node.
- * @return {devtools.profiler.ProfileView} Profile view.
- */
-devtools.profiler.ViewBuilder.prototype.createView = function(head) {
-  return new devtools.profiler.ProfileView(head);
-};
-
-
-/**
- * Factory method for a profile view node.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @return {devtools.profiler.ProfileView.Node} Profile view node.
- */
-devtools.profiler.ViewBuilder.prototype.createViewNode = function(
-    funcName, totalTime, selfTime, head) {
-  return new devtools.profiler.ProfileView.Node(
-      funcName, totalTime, selfTime, head);
-};
-
-
-/**
- * Creates a Profile View object. It allows to perform sorting
- * and filtering actions on the profile.
- *
- * @param {devtools.profiler.ProfileView.Node} head Head (root) node.
- * @constructor
- */
-devtools.profiler.ProfileView = function(head) {
-  this.head = head;
-};
-
-
-/**
- * Sorts the profile view using the specified sort function.
- *
- * @param {function(devtools.profiler.ProfileView.Node,
- *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
- *     functions. Must comply with Array.sort sorting function requirements.
- */
-devtools.profiler.ProfileView.prototype.sort = function(sortFunc) {
-  this.traverse(function (node) {
-    node.sortChildren(sortFunc);
-  });
-};
-
-
-/**
- * Traverses profile view nodes in preorder.
- *
- * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function.
- */
-devtools.profiler.ProfileView.prototype.traverse = function(f) {
-  var nodesToTraverse = new ConsArray();
-  nodesToTraverse.concat([this.head]);
-  while (!nodesToTraverse.atEnd()) {
-    var node = nodesToTraverse.next();
-    f(node);
-    nodesToTraverse.concat(node.children);
-  }
-};
-
-
-/**
- * Constructs a Profile View node object. Each node object corresponds to
- * a function call.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @constructor
- */
-devtools.profiler.ProfileView.Node = function(
-    internalFuncName, totalTime, selfTime, head) {
-  this.internalFuncName = internalFuncName;
-  this.totalTime = totalTime;
-  this.selfTime = selfTime;
-  this.head = head;
-  this.parent = null;
-  this.children = [];
-};
-
-
-/**
- * Returns a share of the function's total time in application's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'totalPercent',
-    function() { return this.totalTime /
-      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Returns a share of the function's self time in application's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'selfPercent',
-    function() { return this.selfTime /
-      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Returns a share of the function's total time in its parent's total time.
- */
-devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
-    'parentTotalPercent',
-    function() { return this.totalTime /
-      (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
-
-
-/**
- * Adds a child to the node.
- *
- * @param {devtools.profiler.ProfileView.Node} node Child node.
- */
-devtools.profiler.ProfileView.Node.prototype.addChild = function(node) {
-  node.parent = this;
-  this.children.push(node);
-};
-
-
-/**
- * Sorts all the node's children recursively.
- *
- * @param {function(devtools.profiler.ProfileView.Node,
- *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
- *     functions. Must comply with Array.sort sorting function requirements.
- */
-devtools.profiler.ProfileView.Node.prototype.sortChildren = function(
-    sortFunc) {
-  this.children.sort(sortFunc);
-};
-
-/* splaytree.js */
-
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// A namespace stub. It will become more clear how to declare it properly
-// during integration of this script into Dev Tools.
-var goog = goog || {};
-goog.structs = goog.structs || {};
-
-
-/**
- * Constructs a Splay tree.  A splay tree is a self-balancing binary
- * search tree with the additional property that recently accessed
- * elements are quick to access again. It performs basic operations
- * such as insertion, look-up and removal in O(log(n)) amortized time.
- *
- * @constructor
- */
-goog.structs.SplayTree = function() {
-};
-
-
-/**
- * Pointer to the root node of the tree.
- *
- * @type {goog.structs.SplayTree.Node}
- * @private
- */
-goog.structs.SplayTree.prototype.root_ = null;
-
-
-/**
- * @return {boolean} Whether the tree is empty.
- */
-goog.structs.SplayTree.prototype.isEmpty = function() {
-  return !this.root_;
-};
-
-
-
-/**
- * Inserts a node into the tree with the specified key and value if
- * the tree does not already contain a node with the specified key. If
- * the value is inserted, it becomes the root of the tree.
- *
- * @param {number} key Key to insert into the tree.
- * @param {*} value Value to insert into the tree.
- */
-goog.structs.SplayTree.prototype.insert = function(key, value) {
-  if (this.isEmpty()) {
-    this.root_ = new goog.structs.SplayTree.Node(key, value);
-    return;
-  }
-  // Splay on the key to move the last node on the search path for
-  // the key to the root of the tree.
-  this.splay_(key);
-  if (this.root_.key == key) {
-    return;
-  }
-  var node = new goog.structs.SplayTree.Node(key, value);
-  if (key > this.root_.key) {
-    node.left = this.root_;
-    node.right = this.root_.right;
-    this.root_.right = null;
-  } else {
-    node.right = this.root_;
-    node.left = this.root_.left;
-    this.root_.left = null;
-  }
-  this.root_ = node;
-};
-
-
-/**
- * Removes a node with the specified key from the tree if the tree
- * contains a node with this key. The removed node is returned. If the
- * key is not found, an exception is thrown.
- *
- * @param {number} key Key to find and remove from the tree.
- * @return {goog.structs.SplayTree.Node} The removed node.
- */
-goog.structs.SplayTree.prototype.remove = function(key) {
-  if (this.isEmpty()) {
-    throw Error('Key not found: ' + key);
-  }
-  this.splay_(key);
-  if (this.root_.key != key) {
-    throw Error('Key not found: ' + key);
-  }
-  var removed = this.root_;
-  if (!this.root_.left) {
-    this.root_ = this.root_.right;
-  } else {
-    var right = this.root_.right;
-    this.root_ = this.root_.left;
-    // Splay to make sure that the new root has an empty right child.
-    this.splay_(key);
-    // Insert the original right child as the right child of the new
-    // root.
-    this.root_.right = right;
-  }
-  return removed;
-};
-
-
-/**
- * Returns the node having the specified key or null if the tree doesn't contain
- * a node with the specified key.
- *
- * @param {number} key Key to find in the tree.
- * @return {goog.structs.SplayTree.Node} Node having the specified key.
- */
-goog.structs.SplayTree.prototype.find = function(key) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  this.splay_(key);
-  return this.root_.key == key ? this.root_ : null;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the minimum key value.
- */
-goog.structs.SplayTree.prototype.findMin = function() {
-  if (this.isEmpty()) {
-    return null;
-  }
-  var current = this.root_;
-  while (current.left) {
-    current = current.left;
-  }
-  return current;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the maximum key value.
- */
-goog.structs.SplayTree.prototype.findMax = function(opt_startNode) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  var current = opt_startNode || this.root_;
-  while (current.right) {
-    current = current.right;
-  }
-  return current;
-};
-
-
-/**
- * @return {goog.structs.SplayTree.Node} Node having the maximum key value that
- *     is less or equal to the specified key value.
- */
-goog.structs.SplayTree.prototype.findGreatestLessThan = function(key) {
-  if (this.isEmpty()) {
-    return null;
-  }
-  // Splay on the key to move the node with the given key or the last
-  // node on the search path to the top of the tree.
-  this.splay_(key);
-  // Now the result is either the root node or the greatest node in
-  // the left subtree.
-  if (this.root_.key <= key) {
-    return this.root_;
-  } else if (this.root_.left) {
-    return this.findMax(this.root_.left);
-  } else {
-    return null;
-  }
-};
-
-
-/**
- * @return {Array<*>} An array containing all the values of tree's nodes.
- */
-goog.structs.SplayTree.prototype.exportValues = function() {
-  var result = [];
-  this.traverse_(function(node) { result.push(node.value); });
-  return result;
-};
-
-
-/**
- * Perform the splay operation for the given key. Moves the node with
- * the given key to the top of the tree.  If no node has the given
- * key, the last node on the search path is moved to the top of the
- * tree. This is the simplified top-down splaying algorithm from:
- * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
- *
- * @param {number} key Key to splay the tree on.
- * @private
- */
-goog.structs.SplayTree.prototype.splay_ = function(key) {
-  if (this.isEmpty()) {
-    return;
-  }
-  // Create a dummy node.  The use of the dummy node is a bit
-  // counter-intuitive: The right child of the dummy node will hold
-  // the L tree of the algorithm.  The left child of the dummy node
-  // will hold the R tree of the algorithm.  Using a dummy node, left
-  // and right will always be nodes and we avoid special cases.
-  var dummy, left, right;
-  dummy = left = right = new goog.structs.SplayTree.Node(null, null);
-  var current = this.root_;
-  while (true) {
-    if (key < current.key) {
-      if (!current.left) {
-        break;
-      }
-      if (key < current.left.key) {
-        // Rotate right.
-        var tmp = current.left;
-        current.left = tmp.right;
-        tmp.right = current;
-        current = tmp;
-        if (!current.left) {
-          break;
-        }
-      }
-      // Link right.
-      right.left = current;
-      right = current;
-      current = current.left;
-    } else if (key > current.key) {
-      if (!current.right) {
-        break;
-      }
-      if (key > current.right.key) {
-        // Rotate left.
-        var tmp = current.right;
-        current.right = tmp.left;
-        tmp.left = current;
-        current = tmp;
-        if (!current.right) {
-          break;
-        }
-      }
-      // Link left.
-      left.right = current;
-      left = current;
-      current = current.right;
-    } else {
-      break;
-    }
-  }
-  // Assemble.
-  left.right = current.left;
-  right.left = current.right;
-  current.left = dummy.right;
-  current.right = dummy.left;
-  this.root_ = current;
-};
-
-
-/**
- * Performs a preorder traversal of the tree.
- *
- * @param {function(goog.structs.SplayTree.Node)} f Visitor function.
- * @private
- */
-goog.structs.SplayTree.prototype.traverse_ = function(f) {
-  var nodesToVisit = [this.root_];
-  while (nodesToVisit.length > 0) {
-    var node = nodesToVisit.shift();
-    if (node == null) {
-      continue;
-    }
-    f(node);
-    nodesToVisit.push(node.left);
-    nodesToVisit.push(node.right);
-  }
-};
-
-
-/**
- * Constructs a Splay tree node.
- *
- * @param {number} key Key.
- * @param {*} value Value.
- */
-goog.structs.SplayTree.Node = function(key, value) {
-  this.key = key;
-  this.value = value;
-};
-
-
-/**
- * @type {goog.structs.SplayTree.Node}
- */
-goog.structs.SplayTree.Node.prototype.left = null;
-
-
-/**
- * @type {goog.structs.SplayTree.Node}
- */
-goog.structs.SplayTree.Node.prototype.right = null;
-
-/* profiler_agent.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Provides communication interface to remote v8 profiler.
- */
-goog.provide('devtools.ProfilerAgent');
-
-/**
- * @constructor
- */
-devtools.ProfilerAgent = function() {
-  RemoteProfilerAgent.DidGetActiveProfilerModules =
-      goog.bind(this.didGetActiveProfilerModules_, this);
-  RemoteProfilerAgent.DidGetLogLines =
-      goog.bind(this.didGetLogLines_, this);
-
-  /**
-   * Active profiler modules flags.
-   * @type {number}
-   */
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-
-  /**
-   * Interval for polling profiler state.
-   * @type {number}
-   */
-  this.getActiveProfilerModulesInterval_ = null;
-
-  /**
-   * Profiler log position.
-   * @type {number}
-   */
-  this.logPosition_ = 0;
-
-  /**
-   * Whether log contents retrieval must be forced next time.
-   * @type {boolean}
-   */
-  this.forceGetLogLines_ = false;
-
-  /**
-   * Profiler processor instance.
-   * @type {devtools.profiler.Processor}
-   */
-  this.profilerProcessor_ = new devtools.profiler.Processor();
-};
-
-
-/**
- * A copy of enum from include/v8.h
- * @enum {number}
- */
-devtools.ProfilerAgent.ProfilerModules = {
-  PROFILER_MODULE_NONE: 0,
-  PROFILER_MODULE_CPU: 1,
-  PROFILER_MODULE_HEAP_STATS: 1 << 1,
-  PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2,
-  PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16
-};
-
-
-/**
- * Resets profiler agent to its initial state.
- */
-devtools.ProfilerAgent.prototype.reset = function() {
-  this.logPosition_ = 0;
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-};
-
-
-/**
- * Sets up callbacks that deal with profiles processing.
- */
-devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function() {
-  // A temporary icon indicating that the profile is being processed.
-  var processingIcon = new WebInspector.SidebarTreeElement(
-      'profile-sidebar-tree-item',
-      WebInspector.UIString('Processing...'),
-      '', null, false);
-  var profilesSidebar = WebInspector.panels.profiles.getProfileType(
-      WebInspector.CPUProfileType.TypeId).treeElement;
-
-  this.profilerProcessor_.setCallbacks(
-      function onProfileProcessingStarted() {
-        // Set visually empty string. Subtitle hiding is done via styles
-        // manipulation which doesn't play well with dynamic append / removal.
-        processingIcon.subtitle = ' ';
-        profilesSidebar.appendChild(processingIcon);
-      },
-      function onProfileProcessingStatus(ticksCount) {
-        processingIcon.subtitle =
-            WebInspector.UIString('%d ticks processed', ticksCount);
-      },
-      function onProfileProcessingFinished(profile) {
-        profilesSidebar.removeChild(processingIcon);
-        profile.typeId = WebInspector.CPUProfileType.TypeId;
-        InspectorBackend.addFullProfile(profile);
-        WebInspector.addProfileHeader(profile);
-        // If no profile is currently shown, show the new one.
-        var profilesPanel = WebInspector.panels.profiles;
-        if (!profilesPanel.visibleView) {
-          profilesPanel.showProfile(profile);
-        }
-      }
-  );
-};
-
-
-/**
- * Initializes profiling state.
- */
-devtools.ProfilerAgent.prototype.initializeProfiling = function() {
-  this.setupProfilerProcessorCallbacks();
-  this.forceGetLogLines_ = true;
-  this.getActiveProfilerModulesInterval_ = setInterval(
-        function() { RemoteProfilerAgent.GetActiveProfilerModules(); }, 1000);
-};
-
-
-/**
- * Starts profiling.
- * @param {number} modules List of modules to enable.
- */
-devtools.ProfilerAgent.prototype.startProfiling = function(modules) {
-  var cmd = new devtools.DebugCommand('profile', {
-      'modules': modules,
-      'command': 'resume'});
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-  if (modules &
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
-    var pos = this.logPosition_;
-    // Active modules will not change, instead, a snapshot will be logged.
-    setTimeout(function() { RemoteProfilerAgent.GetLogLines(pos); }, 500);
-  }
-};
-
-
-/**
- * Stops profiling.
- */
-devtools.ProfilerAgent.prototype.stopProfiling = function(modules) {
-  var cmd = new devtools.DebugCommand('profile', {
-      'modules': modules,
-      'command': 'pause'});
-  devtools.DebuggerAgent.sendCommand_(cmd);
-  RemoteToolsAgent.ExecuteVoidJavaScript();
-};
-
-
-/**
- * Handles current profiler status.
- * @param {number} modules List of active (started) modules.
- */
-devtools.ProfilerAgent.prototype.didGetActiveProfilerModules_ = function(
-    modules) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  var profModuleNone = profModules.PROFILER_MODULE_NONE;
-  if (this.forceGetLogLines_ ||
-      (modules != profModuleNone &&
-      this.activeProfilerModules_ == profModuleNone)) {
-    this.forceGetLogLines_ = false;
-    // Start to query log data.
-    RemoteProfilerAgent.GetLogLines(this.logPosition_);
-  }
-  this.activeProfilerModules_ = modules;
-  // Update buttons.
-  WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU);
-};
-
-
-/**
- * Handles a portion of a profiler log retrieved by GetLogLines call.
- * @param {number} pos Current position in log.
- * @param {string} log A portion of profiler log.
- */
-devtools.ProfilerAgent.prototype.didGetLogLines_ = function(pos, log) {
-  this.logPosition_ = pos;
-  if (log.length > 0) {
-    this.profilerProcessor_.processLogChunk(log);
-  } else if (this.activeProfilerModules_ ==
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE) {
-    // No new data and profiling is stopped---suspend log reading.
-    return;
-  }
-  setTimeout(function() { RemoteProfilerAgent.GetLogLines(pos); }, 500);
-};
-
-/* profiler_processor.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Profiler processor is used to process log file produced
- * by V8 and produce an internal profile representation which is used
- * for building profile views in 'Profiles' tab.
- */
-goog.provide('devtools.profiler.Processor');
-
-
-/**
- * Creates a Profile View builder object compatible with WebKit Profiler UI.
- *
- * @param {number} samplingRate Number of ms between profiler ticks.
- * @constructor
- */
-devtools.profiler.WebKitViewBuilder = function(samplingRate) {
-  devtools.profiler.ViewBuilder.call(this, samplingRate);
-};
-goog.inherits(devtools.profiler.WebKitViewBuilder,
-    devtools.profiler.ViewBuilder);
-
-
-/**
- * @override
- */
-devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(
-    funcName, totalTime, selfTime, head) {
-  return new devtools.profiler.WebKitViewNode(
-      funcName, totalTime, selfTime, head);
-};
-
-
-/**
- * Constructs a Profile View node object for displaying in WebKit Profiler UI.
- *
- * @param {string} internalFuncName A fully qualified function name.
- * @param {number} totalTime Amount of time that application spent in the
- *     corresponding function and its descendants (not that depending on
- *     profile they can be either callees or callers.)
- * @param {number} selfTime Amount of time that application spent in the
- *     corresponding function only.
- * @param {devtools.profiler.ProfileView.Node} head Profile view head.
- * @constructor
- */
-devtools.profiler.WebKitViewNode = function(
-    internalFuncName, totalTime, selfTime, head) {
-  devtools.profiler.ProfileView.Node.call(this,
-      internalFuncName, totalTime, selfTime, head);
-  this.initFuncInfo_();
-  this.callUID = internalFuncName;
-};
-goog.inherits(devtools.profiler.WebKitViewNode,
-    devtools.profiler.ProfileView.Node);
-
-
-/**
- * RegEx for stripping V8's prefixes of compiled functions.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE =
-    /^(?:LazyCompile|Function|Callback): (.*)$/;
-
-
-/**
- * RegEx for extracting script source URL and line number.
- */
-devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE =
-    /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/;
-
-
-/**
- * Inits 'functionName', 'url', and 'lineNumber' fields using 'internalFuncName'
- * field.
- * @private
- */
-devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function() {
-  var nodeAlias = devtools.profiler.WebKitViewNode;
-  this.functionName = this.internalFuncName;
-
-  var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName);
-  if (strippedName) {
-    this.functionName = strippedName[1];
-  }
-
-  var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName);
-  if (parsedName) {
-    this.functionName = parsedName[1];
-    if (parsedName[4]) {
-      this.functionName += parsedName[4];
-    }
-    this.url = parsedName[2];
-    this.lineNumber = parsedName[3];
-  } else {
-    this.url = '';
-    this.lineNumber = 0;
-  }
-};
-
-
-/**
- * Ancestor of a profile object that leaves out only JS-related functions.
- * @constructor
- */
-devtools.profiler.JsProfile = function() {
-  devtools.profiler.Profile.call(this);
-};
-goog.inherits(devtools.profiler.JsProfile, devtools.profiler.Profile);
-
-
-/**
- * RegExp that leaves only JS functions.
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_FUNC_RE = /^(LazyCompile|Function|Script|Callback):/;
-
-/**
- * RegExp that filters out native code (ending with "native src.js:xxx").
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_NATIVE_FUNC_RE = /\ native\ \w+\.js:\d+$/;
-
-/**
- * RegExp that filters out native scripts.
- * @type {RegExp}
- */
-devtools.profiler.JsProfile.JS_NATIVE_SCRIPT_RE = /^Script:\ native/;
-
-
-/**
- * @override
- */
-devtools.profiler.JsProfile.prototype.skipThisFunction = function(name) {
-  return !devtools.profiler.JsProfile.JS_FUNC_RE.test(name) ||
-      // To profile V8's natives comment out two lines below and '||' above.
-      devtools.profiler.JsProfile.JS_NATIVE_FUNC_RE.test(name) ||
-      devtools.profiler.JsProfile.JS_NATIVE_SCRIPT_RE.test(name);
-};
-
-
-/**
- * Profiler processor. Consumes profiler log and builds profile views.
- *
- * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
- *     that receives a new processed profile.
- * @constructor
- */
-devtools.profiler.Processor = function() {
-  devtools.profiler.LogReader.call(this, {
-      'code-creation': {
-          parsers: [null, this.createAddressParser('code'), parseInt, null],
-          processor: this.processCodeCreation_, backrefs: true,
-          needsProfile: true },
-      'code-move': { parsers: [this.createAddressParser('code'),
-          this.createAddressParser('code-move-to')],
-          processor: this.processCodeMove_, backrefs: true,
-          needsProfile: true },
-      'code-delete': { parsers: [this.createAddressParser('code')],
-          processor: this.processCodeDelete_, backrefs: true,
-          needsProfile: true },
-      'tick': { parsers: [this.createAddressParser('code'),
-          this.createAddressParser('stack'), parseInt, 'var-args'],
-          processor: this.processTick_, backrefs: true, needProfile: true },
-      'profiler': { parsers: [null, 'var-args'],
-          processor: this.processProfiler_, needsProfile: false },
-      'heap-sample-begin': { parsers: [null, null, parseInt],
-          processor: this.processHeapSampleBegin_ },
-      'heap-sample-stats': { parsers: [null, null, parseInt, parseInt],
-          processor: this.processHeapSampleStats_ },
-      'heap-sample-item': { parsers: [null, parseInt, parseInt],
-          processor: this.processHeapSampleItem_ },
-      'heap-js-cons-item': { parsers: [null, parseInt, parseInt],
-          processor: this.processHeapJsConsItem_ },
-      'heap-js-ret-item': { parsers: [null, 'var-args'],
-          processor: this.processHeapJsRetItem_ },
-      'heap-sample-end': { parsers: [null, null],
-          processor: this.processHeapSampleEnd_ },
-      // Not used in DevTools Profiler.
-      'shared-library': null,
-      // Obsolete row types.
-      'code-allocate': null,
-      'begin-code-region': null,
-      'end-code-region': null});
-
-
-  /**
-   * Callback that is called when a new profile is encountered in the log.
-   * @type {function()}
-   */
-  this.startedProfileProcessing_ = null;
-
-  /**
-   * Callback that is called periodically to display processing status.
-   * @type {function()}
-   */
-  this.profileProcessingStatus_ = null;
-
-  /**
-   * Callback that is called when a profile has been processed and is ready
-   * to be shown.
-   * @type {function(devtools.profiler.ProfileView)}
-   */
-  this.finishedProfileProcessing_ = null;
-
-  /**
-   * The current profile.
-   * @type {devtools.profiler.JsProfile}
-   */
-  this.currentProfile_ = null;
-
-  /**
-   * Builder of profile views. Created during "profiler,begin" event processing.
-   * @type {devtools.profiler.WebKitViewBuilder}
-   */
-  this.viewBuilder_ = null;
-
-  /**
-   * Next profile id.
-   * @type {number}
-   */
-  this.profileId_ = 1;
-
-  /**
-   * Counter for processed ticks.
-   * @type {number}
-   */
-  this.ticksCount_ = 0;
-
-  /**
-   * Interval id for updating processing status.
-   * @type {number}
-   */
-  this.processingInterval_ = null;
-
-  /**
-   * The current heap snapshot.
-   * @type {string}
-   */
-  this.currentHeapSnapshot_ = null;
-
-  /**
-   * Next heap snapshot id.
-   * @type {number}
-   */
-  this.heapSnapshotId_ = 1;
-};
-goog.inherits(devtools.profiler.Processor, devtools.profiler.LogReader);
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.printError = function(str) {
-  debugPrint(str);
-};
-
-
-/**
- * @override
- */
-devtools.profiler.Processor.prototype.skipDispatch = function(dispatch) {
-  return dispatch.needsProfile && this.currentProfile_ == null;
-};
-
-
-/**
- * Sets profile processing callbacks.
- *
- * @param {function()} started Started processing callback.
- * @param {function(devtools.profiler.ProfileView)} finished Finished
- *     processing callback.
- */
-devtools.profiler.Processor.prototype.setCallbacks = function(
-    started, processing, finished) {
-  this.startedProfileProcessing_ = started;
-  this.profileProcessingStatus_ = processing;
-  this.finishedProfileProcessing_ = finished;
-};
-
-
-/**
- * An address for the fake "(program)" entry. WebKit's visualisation
- * has assumptions on how the top of the call tree should look like,
- * and we need to add a fake entry as the topmost function. This
- * address is chosen because it's the end address of the first memory
- * page, which is never used for code or data, but only as a guard
- * page for catching AV errors.
- *
- * @type {number}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff;
-/**
- * @type {string}
- */
-devtools.profiler.Processor.PROGRAM_ENTRY_STR = '0xffff';
-
-
-/**
- * Sets new profile callback.
- * @param {function(devtools.profiler.ProfileView)} callback Callback function.
- */
-devtools.profiler.Processor.prototype.setNewProfileCallback = function(
-    callback) {
-  this.newProfileCallback_ = callback;
-};
-
-
-devtools.profiler.Processor.prototype.processProfiler_ = function(
-    state, params) {
-  switch (state) {
-    case 'resume':
-      if (this.currentProfile_ == null) {
-        this.currentProfile_ = new devtools.profiler.JsProfile();
-        // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
-        this.currentProfile_.addCode(
-          'Function', '(program)',
-          devtools.profiler.Processor.PROGRAM_ENTRY, 1);
-        if (this.startedProfileProcessing_) {
-          this.startedProfileProcessing_();
-        }
-        this.ticksCount_ = 0;
-        var self = this;
-        if (this.profileProcessingStatus_) {
-          this.processingInterval_ = window.setInterval(
-              function() { self.profileProcessingStatus_(self.ticksCount_); },
-              1000);
-        }
-      }
-      break;
-    case 'pause':
-      if (this.currentProfile_ != null) {
-        window.clearInterval(this.processingInterval_);
-        this.processingInterval_ = null;
-        if (this.finishedProfileProcessing_) {
-          this.finishedProfileProcessing_(this.createProfileForView());
-        }
-        this.currentProfile_ = null;
-      }
-      break;
-    case 'begin':
-      var samplingRate = NaN;
-      if (params.length > 0) {
-        samplingRate = parseInt(params[0]);
-      }
-      if (isNaN(samplingRate)) {
-        samplingRate = 1;
-      }
-      this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate);
-      break;
-    // These events are valid but aren't used.
-    case 'compression':
-    case 'end': break;
-    default:
-      throw new Error('unknown profiler state: ' + state);
-  }
-};
-
-
-devtools.profiler.Processor.prototype.processCodeCreation_ = function(
-    type, start, size, name) {
-  this.currentProfile_.addCode(this.expandAlias(type), name, start, size);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to) {
-  this.currentProfile_.moveCode(from, to);
-};
-
-
-devtools.profiler.Processor.prototype.processCodeDelete_ = function(start) {
-  this.currentProfile_.deleteCode(start);
-};
-
-
-devtools.profiler.Processor.prototype.processTick_ = function(
-    pc, sp, vmState, stack) {
-  // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
-  stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
-  this.currentProfile_.recordTick(this.processStack(pc, stack));
-  this.ticksCount_++;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(
-    space, state, ticks) {
-  if (space != 'Heap') return;
-  this.currentHeapSnapshot_ = {
-      number: this.heapSnapshotId_++,
-      entries: {},
-      clusters: {},
-      lowlevels: {},
-      ticks: ticks
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(
-    space, state, capacity, used) {
-  if (space != 'Heap') return;
-  this.currentHeapSnapshot_.capacity = capacity;
-  this.currentHeapSnapshot_.used = used;
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(
-    item, number, size) {
-  if (!this.currentHeapSnapshot_) return;
-  this.currentHeapSnapshot_.lowlevels[item] = {
-    type: item, count: number, size: size
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(
-    item, number, size) {
-  if (!this.currentHeapSnapshot_) return;
-  this.currentHeapSnapshot_.entries[item] = {
-    cons: item, count: number, size: size, retainers: {}
-  };
-};
-
-
-devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(
-    item, retainersArray) {
-  if (!this.currentHeapSnapshot_) return;
-  var rawRetainers = {};
-  for (var i = 0, n = retainersArray.length; i < n; ++i) {
-    var entry = retainersArray[i].split(';');
-    rawRetainers[entry[0]] = parseInt(entry[1], 10);
-  }
-
-  function mergeRetainers(entry) {
-    for (var rawRetainer in rawRetainers) {
-      var consName = rawRetainer.indexOf(':') != -1 ?
-          rawRetainer.split(':')[0] : rawRetainer;
-      if (!(consName in entry.retainers))
-        entry.retainers[consName] = { cons: consName, count: 0, clusters: {} };
-      var retainer = entry.retainers[consName];
-      retainer.count += rawRetainers[rawRetainer];
-      if (consName != rawRetainer)
-        retainer.clusters[rawRetainer] = true;
-    }
-  }
-
-  if (item.indexOf(':') != -1) {
-    // Array, Function, or Object instances cluster case.
-    if (!(item in this.currentHeapSnapshot_.clusters)) {
-      this.currentHeapSnapshot_.clusters[item] = {
-        cons: item, retainers: {}
-      };
-    }
-    mergeRetainers(this.currentHeapSnapshot_.clusters[item]);
-    item = item.split(':')[0];
-  }
-  mergeRetainers(this.currentHeapSnapshot_.entries[item]);
-};
-
-
-devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(
-    space, state) {
-  if (space != 'Heap') return;
-  var snapshot = this.currentHeapSnapshot_;
-  this.currentHeapSnapshot_ = null;
-  // For some reason, 'used' from 'heap-sample-stats' sometimes differ from
-  // the sum of objects sizes. To avoid discrepancy, we re-calculate 'used'.
-  snapshot.used = 0;
-  for (var item in snapshot.lowlevels) {
-      snapshot.used += snapshot.lowlevels[item].size;
-  }
-  WebInspector.panels.profiles.addSnapshot(snapshot);
-};
-
-
-/**
- * Creates a profile for further displaying in ProfileView.
- */
-devtools.profiler.Processor.prototype.createProfileForView = function() {
-  var profile = this.viewBuilder_.buildView(
-      this.currentProfile_.getTopDownProfile());
-  profile.uid = this.profileId_++;
-  profile.title = UserInitiatedProfileName + '.' + profile.uid;
-  return profile;
-};
-
-/* heap_profiler_panel.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Heap profiler panel implementation.
- */
-
-WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
-    snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
-    snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId;
-
-    var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
-    snapshots.push(snapshot);
-
-    snapshot.listIndex = snapshots.length - 1;
-
-    if (WebInspector.CPUProfile)
-        this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
-    else
-        this.addProfileHeader(snapshot);
-
-    this.dispatchEventToListeners("snapshot added");
-}
-
-
-WebInspector.HeapSnapshotView = function(parent, profile)
-{
-    WebInspector.View.call(this);
-
-    this.element.addStyleClass("heap-snapshot-view");
-
-    this.parent = parent;
-    this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
-
-    this.showCountAsPercent = false;
-    this.showSizeAsPercent = false;
-    this.showCountDeltaAsPercent = false;
-    this.showSizeDeltaAsPercent = false;
-
-    this.categories = {
-        code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),
-        data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects and Data"), "rgb(47,102,236)"),
-        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
-    };
-
-    this.summaryBar = new WebInspector.SummaryBar(this.categories);
-    this.summaryBar.element.id = "heap-snapshot-summary";
-    this.summaryBar.calculator = new WebInspector.HeapSummaryCalculator(profile.used);
-    this.element.appendChild(this.summaryBar.element);
-
-    var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
-                    "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
-                    "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
-                    "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
-                    "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
-
-    this.dataGrid = new WebInspector.DataGrid(columns);
-    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
-    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
-    this.element.appendChild(this.dataGrid.element);
-
-    this.profile = profile;
-
-    this.baseSelectElement = document.createElement("select");
-    this.baseSelectElement.className = "status-bar-item";
-    this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
-    this._updateBaseOptions();
-    if (this.profile.listIndex > 0)
-        this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
-    else
-        this.baseSelectElement.selectedIndex = this.profile.listIndex;
-    this._resetDataGridList();
-
-    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
-    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
-
-    this.refresh();
-
-    this._updatePercentButton();
-};
-
-WebInspector.HeapSnapshotView.prototype = {
-
-    get statusBarItems()
-    {
-        return [this.baseSelectElement, this.percentButton.element];
-    },
-
-    get profile()
-    {
-        return this._profile;
-    },
-
-    set profile(profile)
-    {
-        this._profile = profile;
-    },
-
-    show: function(parentElement)
-    {
-        WebInspector.View.prototype.show.call(this, parentElement);
-        this.dataGrid.updateWidths();
-    },
-
-    hide: function()
-    {
-        WebInspector.View.prototype.hide.call(this);
-        this._currentSearchResultIndex = -1;
-    },
-
-    resize: function()
-    {
-        if (this.dataGrid)
-            this.dataGrid.updateWidths();
-    },
-
-    refresh: function()
-    {
-        this.dataGrid.removeChildren();
-
-        var children = this.snapshotDataGridList.children;
-        var count = children.length;
-        for (var index = 0; index < count; ++index)
-            this.dataGrid.appendChild(children[index]);
-
-        this._updateSummaryGraph();
-    },
-
-    refreshShowAsPercents: function()
-    {
-        this._updatePercentButton();
-        this.refreshVisibleData();
-    },
-
-    _deleteSearchMatchedFlags: function(node)
-    {
-        delete node._searchMatchedConsColumn;
-        delete node._searchMatchedCountColumn;
-        delete node._searchMatchedSizeColumn;
-        delete node._searchMatchedCountDeltaColumn;
-        delete node._searchMatchedSizeDeltaColumn;
-    },
-
-    searchCanceled: function()
-    {
-        if (this._searchResults) {
-            for (var i = 0; i < this._searchResults.length; ++i) {
-                var profileNode = this._searchResults[i].profileNode;
-                this._deleteSearchMatchedFlags(profileNode);
-                profileNode.refresh();
-            }
-        }
-
-        delete this._searchFinishedCallback;
-        this._currentSearchResultIndex = -1;
-        this._searchResults = [];
-    },
-
-    performSearch: function(query, finishedCallback)
-    {
-        // Call searchCanceled since it will reset everything we need before doing a new search.
-        this.searchCanceled();
-
-        query = query.trimWhitespace();
-
-        if (!query.length)
-            return;
-
-        this._searchFinishedCallback = finishedCallback;
-
-        var helper = WebInspector.HeapSnapshotView.SearchHelper;
-
-        var operationAndNumber = helper.parseOperationAndNumber(query);
-        var operation = operationAndNumber[0];
-        var queryNumber = operationAndNumber[1];
-
-        var percentUnits = helper.percents.test(query);
-        var megaBytesUnits = helper.megaBytes.test(query);
-        var kiloBytesUnits = helper.kiloBytes.test(query);
-        var bytesUnits = helper.bytes.test(query);
-
-        var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));
-
-        function matchesQuery(heapSnapshotDataGridNode)
-        {
-            WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);
-
-            if (percentUnits) {
-                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);
-            } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {
-                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);
-            } else {
-                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);
-            }
-
-            if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))
-                heapSnapshotDataGridNode._searchMatchedConsColumn = true;
-
-            if (heapSnapshotDataGridNode._searchMatchedConsColumn ||
-                heapSnapshotDataGridNode._searchMatchedCountColumn ||
-                heapSnapshotDataGridNode._searchMatchedSizeColumn ||
-                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||
-                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {
-                heapSnapshotDataGridNode.refresh();
-                return true;
-            }
-
-            return false;
-        }
-
-        var current = this.snapshotDataGridList.children[0];
-        var depth = 0;
-        var info = {};
-
-        // The second and subsequent levels of heap snapshot nodes represent retainers,
-        // so recursive expansion will be infinite, since a graph is being traversed.
-        // So default to a recursion cap of 2 levels.
-        var maxDepth = 2;
-
-        while (current) {
-            if (matchesQuery(current))
-                this._searchResults.push({ profileNode: current });
-            current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
-            depth += info.depthChange;
-        }
-
-        finishedCallback(this, this._searchResults.length);
-    },
-
-    jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,
-    jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,
-    jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,
-    jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,
-    showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,
-    showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,
-    _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,
-
-    refreshVisibleData: function()
-    {
-        var child = this.dataGrid.children[0];
-        while (child) {
-            child.refresh();
-            child = child.traverseNextNode(false, null, true);
-        }
-        this._updateSummaryGraph();
-    },
-
-    _changeBase: function() {
-        if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
-            return;
-
-        this._resetDataGridList();
-        this.refresh();
-
-        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
-            return;
-
-        // The current search needs to be performed again. First negate out previous match
-        // count by calling the search finished callback with a negative number of matches.
-        // Then perform the search again with the same query and callback.
-        this._searchFinishedCallback(this, -this._searchResults.length);
-        this.performSearch(this.currentQuery, this._searchFinishedCallback);
-    },
-
-    _createSnapshotDataGridList: function()
-    {
-        if (this._snapshotDataGridList)
-          delete this._snapshotDataGridList;
-
-        this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
-        return this._snapshotDataGridList;
-    },
-
-    _mouseDownInDataGrid: function(event)
-    {
-        if (event.detail < 2)
-            return;
-
-        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
-        if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
-            return;
-
-        if (cell.hasStyleClass("count-column"))
-            this.showCountAsPercent = !this.showCountAsPercent;
-        else if (cell.hasStyleClass("size-column"))
-            this.showSizeAsPercent = !this.showSizeAsPercent;
-        else if (cell.hasStyleClass("countDelta-column"))
-            this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
-        else if (cell.hasStyleClass("sizeDelta-column"))
-            this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
-
-        this.refreshShowAsPercents();
-
-        event.preventDefault();
-        event.stopPropagation();
-    },
-
-    get _isShowingAsPercent()
-    {
-        return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
-    },
-
-    _percentClicked: function(event)
-    {
-        var currentState = this._isShowingAsPercent;
-        this.showCountAsPercent = !currentState;
-        this.showSizeAsPercent = !currentState;
-        this.showCountDeltaAsPercent = !currentState;
-        this.showSizeDeltaAsPercent = !currentState;
-        this.refreshShowAsPercents();
-    },
-
-    _resetDataGridList: function()
-    {
-        this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
-        var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
-        if (this.snapshotDataGridList)
-            lastComparator = this.snapshotDataGridList.lastComparator;
-        this.snapshotDataGridList = this._createSnapshotDataGridList();
-        this.snapshotDataGridList.sort(lastComparator, true);
-    },
-
-    _sortData: function()
-    {
-        var sortAscending = this.dataGrid.sortOrder === "ascending";
-        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
-        var sortProperty = {
-                "cons": ["constructorName", null],
-                "count": ["count", null],
-                "size": ["size", "count"],
-                "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],
-                "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]
-        }[sortColumnIdentifier];
-
-        this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));
-
-        this.refresh();
-    },
-
-    _updateBaseOptions: function()
-    {
-        var list = WebInspector.HeapSnapshotProfileType.snapshots;
-        // We're assuming that snapshots can only be added.
-        if (this.baseSelectElement.length == list.length)
-            return;
-
-        for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
-            var baseOption = document.createElement("option");
-            baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
-            this.baseSelectElement.appendChild(baseOption);
-        }
-    },
-
-    _updatePercentButton: function()
-    {
-        if (this._isShowingAsPercent) {
-            this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
-            this.percentButton.toggled = true;
-        } else {
-            this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
-            this.percentButton.toggled = false;
-        }
-    },
-
-    _updateSummaryGraph: function()
-    {
-        this.summaryBar.calculator.showAsPercent = this._isShowingAsPercent;
-        this.summaryBar.update(this.profile.lowlevels);
-    }
-};
-
-WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
-
-WebInspector.HeapSnapshotView.SearchHelper = {
-    // In comparators, we assume that a value from a node is passed as the first parameter.
-    operations: { LESS: function (a, b) { return a !== null && a < b; },
-                  LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },
-                  EQUAL: function (a, b) { return a !== null && a == b; },
-                  GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },
-                  GREATER: function (a, b) { return a !== null && a > b; } },
-
-    operationParsers: { LESS: /^<(\d+)/,
-                        LESS_OR_EQUAL: /^<=(\d+)/,
-                        GREATER_OR_EQUAL: /^>=(\d+)/,
-                        GREATER: /^>(\d+)/ },
-
-    parseOperationAndNumber: function(query)
-    {
-        var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;
-        var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;
-        for (var operation in parsers) {
-            var match = query.match(parsers[operation]);
-            if (match != null)
-                return [operations[operation], parseFloat(match[1])];
-        }
-        return [operations.EQUAL, parseFloat(query)];
-    },
-
-    percents: /%$/,
-
-    megaBytes: /MB$/i,
-
-    kiloBytes: /KB$/i,
-
-    bytes: /B$/i
-}
-
-WebInspector.HeapSummaryCalculator = function(total)
-{
-    this.total = total;
-}
-
-WebInspector.HeapSummaryCalculator.prototype = {
-    computeSummaryValues: function(lowLevels)
-    {
-        function highFromLow(type) {
-            if (type == "CODE_TYPE" || type == "SHARED_FUNCTION_INFO_TYPE" || type == "SCRIPT_TYPE") return "code";
-            if (type == "STRING_TYPE" || type == "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
-            return "other";
-        }
-        var highLevels = {data: 0, code: 0, other: 0};
-        for (var item in lowLevels) {
-            var highItem = highFromLow(item);
-            highLevels[highItem] += lowLevels[item].size;
-        }
-        return {categoryValues: highLevels};
-    },
-
-    formatValue: function(value)
-    {
-        if (this.showAsPercent)
-            return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
-        else
-            return Number.bytesToString(value);
-    },
-
-    get showAsPercent()
-    {
-        return this._showAsPercent;
-    },
-
-    set showAsPercent(x)
-    {
-        this._showAsPercent = x;
-    }
-}
-
-WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
-{
-    this.profile = snapshot;
-
-    WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
-
-    this.refreshTitles();
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
-    get mainTitle()
-    {
-        if (this._mainTitle)
-            return this._mainTitle;
-        return this.profile.title;
-    },
-
-    set mainTitle(x)
-    {
-        this._mainTitle = x;
-        this.refreshTitles();
-    },
-
-    get subtitle()
-    {
-        if (this._subTitle)
-            return this._subTitle;
-        return WebInspector.UIString("Used %s of %s (%.0f%%)", Number.bytesToString(this.profile.used, null, false), Number.bytesToString(this.profile.capacity, null, false), this.profile.used / this.profile.capacity * 100.0);
-    },
-
-    set subtitle(x)
-    {
-        this._subTitle = x;
-        this.refreshTitles();
-    }
-};
-
-WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
-{
-    this.tree = owningTree;
-
-    WebInspector.DataGridNode.call(this, null, this._hasRetainers);
-
-    this.addEventListener("populate", this._populate, this);
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
-    isEmptySet: function(set)
-    {
-        for (var x in set)
-            return false;
-        return true;
-    },
-
-    get _hasRetainers()
-    {
-        return !this.isEmptySet(this.retainers);
-    },
-
-    get _parent()
-    {
-        // For top-level nodes, return owning tree as a parent, not data grid.
-        return this.parent !== this.dataGrid ? this.parent : this.tree;
-    },
-
-    _populate: function(event)
-    {
-        var self = this;
-        this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
-            self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
-        });
-
-        if (this._parent) {
-            var currentComparator = this._parent.lastComparator;
-            if (currentComparator)
-                this.sort(currentComparator, true);
-        }
-
-        this.removeEventListener("populate", this._populate, this);
-    },
-
-    produceDiff: function(baseEntries, currentEntries, callback)
-    {
-        for (var item in currentEntries)
-            callback(baseEntries[item], currentEntries[item]);
-
-        for (item in baseEntries) {
-            if (!(item in currentEntries))
-                callback(baseEntries[item], null);
-        }
-    },
-
-    sort: function(comparator, force) {
-        if (!force && this.lastComparator === comparator)
-            return;
-
-        this.children.sort(comparator);
-        var childCount = this.children.length;
-        for (var childIndex = 0; childIndex < childCount; ++childIndex)
-            this.children[childIndex]._recalculateSiblings(childIndex);
-        for (var i = 0; i < this.children.length; ++i) {
-            var child = this.children[i];
-            if (!force && (!child.expanded || child.lastComparator === comparator))
-                continue;
-            child.sort(comparator, force);
-        }
-        this.lastComparator = comparator;
-    },
-
-    signForDelta: function(delta) {
-        if (delta == 0)
-            return "";
-        if (delta > 0)
-            return "+";
-        else
-            // Math minus sign, same width as plus.
-            return "\u2212";
-    },
-
-    showDeltaAsPercent: function(value) {
-        if (value === Number.POSITIVE_INFINITY)
-            return WebInspector.UIString("new");
-        else if (value === Number.NEGATIVE_INFINITY)
-            return WebInspector.UIString("deleted");
-        if (value > 1000.0)
-            return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
-        return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
-    },
-
-    getTotalCount: function() {
-        if (!this._count) {
-            this._count = 0;
-            for (var i = 0, n = this.children.length; i < n; ++i)
-                this._count += this.children[i].count;
-        }
-        return this._count;
-    },
-
-    getTotalSize: function() {
-        if (!this._size) {
-            this._size = 0;
-            for (var i = 0, n = this.children.length; i < n; ++i)
-                this._size += this.children[i].size;
-        }
-        return this._size;
-    },
-
-    get countPercent()
-    {
-        return this.count / this._parent.getTotalCount() * 100.0;
-    },
-
-    get sizePercent()
-    {
-        return this.size / this._parent.getTotalSize() * 100.0;
-    },
-
-    get countDeltaPercent()
-    {
-        if (this.baseCount > 0) {
-            if (this.count > 0)
-                return this.countDelta / this.baseCount * 100.0;
-            else
-                return Number.NEGATIVE_INFINITY;
-        } else
-            return Number.POSITIVE_INFINITY;
-    },
-
-    get sizeDeltaPercent()
-    {
-        if (this.baseSize > 0) {
-            if (this.size > 0)
-                return this.sizeDelta / this.baseSize * 100.0;
-            else
-                return Number.NEGATIVE_INFINITY;
-        } else
-            return Number.POSITIVE_INFINITY;
-    },
-
-    get data()
-    {
-        var data = {};
-
-        data["cons"] = this.constructorName;
-
-        if (this.snapshotView.showCountAsPercent)
-            data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
-        else
-            data["count"] = this.count;
-
-        if (this.size !== null) {
-            if (this.snapshotView.showSizeAsPercent)
-                data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
-            else
-                data["size"] = Number.bytesToString(this.size);
-        } else
-            data["size"] = "";
-
-        if (this.snapshotView.showCountDeltaAsPercent)
-            data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
-        else
-            data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
-
-        if (this.sizeDelta != null) {
-            if (this.snapshotView.showSizeDeltaAsPercent)
-                data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
-            else
-                data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
-        } else
-            data["sizeDelta"] = "";
-
-        return data;
-    },
-
-    createCell: function(columnIdentifier)
-    {
-        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
-
-        if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||
-            (columnIdentifier === "count" && this._searchMatchedCountColumn) ||
-            (columnIdentifier === "size" && this._searchMatchedSizeColumn) ||
-            (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||
-            (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))
-            cell.addStyleClass("highlight");
-
-        return cell;
-    }
-};
-
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
-
-WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
-    this.snapshotView = snapshotView;
-
-    if (!snapshotEntry)
-        snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
-    this.constructorName = snapshotEntry.cons;
-    this.count = snapshotEntry.count;
-    this.size = snapshotEntry.size;
-    this.retainers = snapshotEntry.retainers;
-
-    if (!baseEntry)
-        baseEntry = { count: 0, size: 0, retainers: {} };
-    this.baseCount = baseEntry.count;
-    this.countDelta = this.count - this.baseCount;
-    this.baseSize = baseEntry.size;
-    this.sizeDelta = this.size - this.baseSize;
-    this.baseRetainers = baseEntry.retainers;
-
-    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-};
-
-WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
-{
-    this.tree = this;
-    this.snapshotView = snapshotView;
-    this.children = [];
-    this.lastComparator = null;
-    this.populateChildren(baseEntries, snapshotEntries);
-};
-
-WebInspector.HeapSnapshotDataGridList.prototype = {
-    appendChild: function(child)
-    {
-        this.insertChild(child, this.children.length);
-    },
-
-    insertChild: function(child, index)
-    {
-        this.children.splice(index, 0, child);
-    },
-
-    removeChildren: function()
-    {
-        this.children = [];
-    },
-
-    populateChildren: function(baseEntries, snapshotEntries)
-    {
-        var self = this;
-        this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
-            self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
-        });
-    },
-
-    produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
-    sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
-    getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
-    getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
-};
-
-WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
-
-WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)
-{
-    var propertyHash = property + '#' + property2;
-    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];
-    if (!comparator) {
-        comparator = function(lhs, rhs) {
-            var l = lhs[property], r = rhs[property];
-            if ((l === null || r === null) && property2 !== null)
-                l = lhs[property2], r = rhs[property2];
-            var result = l < r ? -1 : (l > r ? 1 : 0);
-            return isAscending ? result : -result;
-        };
-        this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;
-    }
-    return comparator;
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
-{
-    this.snapshotView = snapshotView;
-
-    if (!snapshotEntry)
-        snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
-    this.constructorName = snapshotEntry.cons;
-    this.count = snapshotEntry.count;
-    this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
-
-    if (!baseEntry)
-        baseEntry = { count: 0, clusters: {} };
-    this.baseCount = baseEntry.count;
-    this.countDelta = this.count - this.baseCount;
-    this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
-
-    this.size = null;
-    this.sizeDelta = null;
-
-    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
-}
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
-    get sizePercent()
-    {
-        return null;
-    },
-
-    get sizeDeltaPercent()
-    {
-        return null;
-    },
-
-    _calculateRetainers: function(snapshot, clusters) {
-        var retainers = {};
-        if (this.isEmptySet(clusters)) {
-            if (this.constructorName in snapshot.entries)
-                return snapshot.entries[this.constructorName].retainers;
-        } else {
-            // In case when an entry is retained by clusters, we need to gather up the list
-            // of retainers by merging retainers of every cluster.
-            // E.g. having such a tree:
-            //   A
-            //     Object:1  10
-            //       X       3
-            //       Y       4
-            //     Object:2  5
-            //       X       6
-            //
-            // will result in a following retainers list: X 9, Y 4.
-            for (var clusterName in clusters) {
-                if (clusterName in snapshot.clusters) {
-                    var clusterRetainers = snapshot.clusters[clusterName].retainers;
-                    for (var clusterRetainer in clusterRetainers) {
-                        var clusterRetainerEntry = clusterRetainers[clusterRetainer];
-                        if (!(clusterRetainer in retainers))
-                            retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
-                        retainers[clusterRetainer].count += clusterRetainerEntry.count;
-                        for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
-                            retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
-                    }
-                }
-            }
-        }
-        return retainers;
-    }
-};
-
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
-
-
-WebInspector.HeapSnapshotProfileType = function()
-{
-    WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
-}
-
-WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
-
-WebInspector.HeapSnapshotProfileType.snapshots = [];
-
-WebInspector.HeapSnapshotProfileType.prototype = {
-    get buttonTooltip()
-    {
-        return WebInspector.UIString("Take heap snapshot.");
-    },
-
-    get buttonStyle()
-    {
-        return "heap-snapshot-status-bar-item status-bar-item";
-    },
-
-    buttonClicked: function()
-    {
-        InspectorBackend.takeHeapSnapshot();
-    },
-
-    createSidebarTreeElementForProfile: function(profile)
-    {
-        var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
-        element.small = false;
-        return element;
-    },
-
-    createView: function(profile)
-    {
-        return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
-    }
-}
-
-WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
-
-
-(function() {
-    var originalCreatePanels = WebInspector._createPanels;
-    WebInspector._createPanels = function() {
-        originalCreatePanels.apply(this, arguments);
-        if (WebInspector.panels.profiles)
-            WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
-    }
-})();
-
-/* devtools.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Tools is a main class that wires all components of the
- * DevTools frontend together. It is also responsible for overriding existing
- * WebInspector functionality while it is getting upstreamed into WebCore.
- */
-goog.provide('devtools.Tools');
-
-goog.require('devtools.DebuggerAgent');
-
-
-/**
- * Dispatches raw message from the host.
- * @param {string} remoteName
- * @prama {string} methodName
- * @param {string} param1, param2, param3 Arguments to dispatch.
- */
-devtools$$dispatch = function(remoteName, methodName, param1, param2, param3) {
-  remoteName = 'Remote' + remoteName.substring(0, remoteName.length - 8);
-  var agent = window[remoteName];
-  if (!agent) {
-    debugPrint('No remote agent "' + remoteName + '" found.');
-    return;
-  }
-  var method = agent[methodName];
-  if (!method) {
-    debugPrint('No method "' + remoteName + '.' + methodName + '" found.');
-    return;
-  }
-  method.call(this, param1, param2, param3);
-};
-
-
-devtools.ToolsAgent = function() {
-  RemoteToolsAgent.DidDispatchOn =
-      WebInspector.Callback.processCallback;
-  RemoteToolsAgent.FrameNavigate =
-      goog.bind(this.frameNavigate_, this);
-  RemoteToolsAgent.DispatchOnClient =
-      goog.bind(this.dispatchOnClient_, this);
-  this.debuggerAgent_ = new devtools.DebuggerAgent();
-  this.profilerAgent_ = new devtools.ProfilerAgent();
-};
-
-
-/**
- * Resets tools agent to its initial state.
- */
-devtools.ToolsAgent.prototype.reset = function() {
-  InspectorFrontendHost.reset();
-  this.debuggerAgent_.reset();
-  this.profilerAgent_.reset();
-};
-
-
-/**
- * @param {string} script Script exression to be evaluated in the context of the
- *     inspected page.
- * @param {function(Object|string, boolean):undefined} opt_callback Function to
- *     call with the result.
- */
-devtools.ToolsAgent.prototype.evaluateJavaScript = function(script,
-    opt_callback) {
-  InspectorBackend.evaluate(script, opt_callback || function() {});
-};
-
-
-/**
- * @return {devtools.DebuggerAgent} Debugger agent instance.
- */
-devtools.ToolsAgent.prototype.getDebuggerAgent = function() {
-  return this.debuggerAgent_;
-};
-
-
-/**
- * @return {devtools.ProfilerAgent} Profiler agent instance.
- */
-devtools.ToolsAgent.prototype.getProfilerAgent = function() {
-  return this.profilerAgent_;
-};
-
-
-/**
- * @param {string} url Url frame navigated to.
- * @see tools_agent.h
- * @private
- */
-devtools.ToolsAgent.prototype.frameNavigate_ = function(url) {
-  this.reset();
-  // Do not reset Profiles panel.
-  var profiles = null;
-  if ('profiles' in WebInspector.panels) {
-    profiles = WebInspector.panels['profiles'];
-    delete WebInspector.panels['profiles'];
-  }
-  WebInspector.reset();
-  if (profiles != null) {
-    WebInspector.panels['profiles'] = profiles;
-  }
-};
-
-
-/**
- * @param {string} message Serialized call to be dispatched on WebInspector.
- * @private
- */
-devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message) {
-  var args = JSON.parse(message);
-  var methodName = args[0];
-  var parameters = args.slice(1);
-  WebInspector[methodName].apply(WebInspector, parameters);
-};
-
-
-/**
- * Evaluates js expression.
- * @param {string} expr
- */
-devtools.ToolsAgent.prototype.evaluate = function(expr) {
-  RemoteToolsAgent.evaluate(expr);
-};
-
-
-/**
- * Enables / disables resources panel in the ui.
- * @param {boolean} enabled New panel status.
- */
-WebInspector.setResourcesPanelEnabled = function(enabled) {
-  InspectorBackend._resourceTrackingEnabled = enabled;
-  WebInspector.panels.resources.reset();
-};
-
-
-/**
- * Prints string  to the inspector console or shows alert if the console doesn't
- * exist.
- * @param {string} text
- */
-function debugPrint(text) {
-  var console = WebInspector.console;
-  if (console) {
-    console.addMessage(new WebInspector.ConsoleMessage(
-        WebInspector.ConsoleMessage.MessageSource.JS,
-        WebInspector.ConsoleMessage.MessageType.Log,
-        WebInspector.ConsoleMessage.MessageLevel.Log,
-        1, 'chrome://devtools/<internal>', undefined, -1, text));
-  } else {
-    alert(text);
-  }
-}
-
-
-/**
- * Global instance of the tools agent.
- * @type {devtools.ToolsAgent}
- */
-devtools.tools = null;
-
-
-var context = {};  // Used by WebCore's inspector routines.
-
-///////////////////////////////////////////////////////////////////////////////
-// Here and below are overrides to existing WebInspector methods only.
-// TODO(pfeldman): Patch WebCore and upstream changes.
-var oldLoaded = WebInspector.loaded;
-WebInspector.loaded = function() {
-  devtools.tools = new devtools.ToolsAgent();
-  devtools.tools.reset();
-
-  Preferences.ignoreWhitespace = false;
-  Preferences.samplingCPUProfiler = true;
-  Preferences.heapProfilerPresent = true;
-  oldLoaded.call(this);
-
-  // Hide dock button on Mac OS.
-  // TODO(pfeldman): remove once Mac OS docking is implemented.
-  if (InspectorFrontendHost.platform().indexOf('mac') == 0) {
-    document.getElementById('dock-status-bar-item').addStyleClass('hidden');
-  }
-
-  InspectorFrontendHost.loaded();
-};
-
-
-(function() {
-
-  /**
-   * Handles an F3 keydown event to focus the Inspector search box.
-   * @param {KeyboardEvent} event Event to optionally handle
-   * @return {boolean} whether the event has been handled
-   */
-  function handleF3Keydown(event) {
-    if (event.keyIdentifier == 'F3' && !event.altKey && !event.ctrlKey &&
-        !event.shiftKey && !event.metaKey) {
-      var searchField = document.getElementById("search");
-      searchField.focus();
-      searchField.select();
-      event.preventDefault();
-      return true;
-    }
-    return false;
-  }
-
-
-  var oldKeyDown = WebInspector.documentKeyDown;
-  /**
-   * This override allows to intercept keydown events we want to handle in a
-   * custom way. Some nested documents (iframes) delegate keydown handling to
-   * WebInspector.documentKeyDown (e.g. SourceFrame).
-   * @param {KeyboardEvent} event
-   * @override
-   */
-  WebInspector.documentKeyDown = function(event) {
-    var isHandled = handleF3Keydown(event);
-    if (!isHandled) {
-      // Mute refresh action.
-      if (event.keyIdentifier == 'F5') {
-        event.preventDefault();
-      } else if (event.keyIdentifier == 'U+0052' /* 'R' */ &&
-          (event.ctrlKey || event.metaKey)) {
-        event.preventDefault();
-      } else {
-        oldKeyDown.call(this, event);
-      }
-    }
-  };
-})();
-
-
-/**
- * This override is necessary for adding script source asynchronously.
- * @override
- */
-WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function() {
-  if (!this._frameNeedsSetup) {
-    return;
-  }
-
-  this.attach();
-
-  if (this.script.source) {
-    this.didResolveScriptSource_();
-  } else {
-    var self = this;
-    devtools.tools.getDebuggerAgent().resolveScriptSource(
-        this.script.sourceID,
-        function(source) {
-          self.script.source = source ||
-              WebInspector.UIString('<source is not available>');
-          self.didResolveScriptSource_();
-        });
-  }
-};
-
-
-/**
- * Performs source frame setup when script source is aready resolved.
- */
-WebInspector.ScriptView.prototype.didResolveScriptSource_ = function() {
-  if (!InspectorFrontendHost.addSourceToFrame(
-      "text/javascript", this.script.source, this.sourceFrame.element)) {
-    return;
-  }
-
-  delete this._frameNeedsSetup;
-
-  this.sourceFrame.addEventListener(
-      "syntax highlighting complete", this._syntaxHighlightingComplete, this);
-  this.sourceFrame.syntaxHighlightJavascript();
-};
-
-
-/**
- * @param {string} type Type of the the property value('object' or 'function').
- * @param {string} className Class name of the property value.
- * @constructor
- */
-WebInspector.UnresolvedPropertyValue = function(type, className) {
-  this.type = type;
-  this.className = className;
-};
-
-
-/**
- * This function overrides standard searchableViews getters to perform search
- * only in the current view (other views are loaded asynchronously, no way to
- * search them yet).
- */
-WebInspector.searchableViews_ = function() {
-  var views = [];
-  const visibleView = this.visibleView;
-  if (visibleView && visibleView.performSearch) {
-    views.push(visibleView);
-  }
-  return views;
-};
-
-
-/**
- * @override
- */
-WebInspector.ResourcesPanel.prototype.__defineGetter__(
-    'searchableViews',
-    WebInspector.searchableViews_);
-
-
-/**
- * @override
- */
-WebInspector.ScriptsPanel.prototype.__defineGetter__(
-    'searchableViews',
-    WebInspector.searchableViews_);
-
-
-(function() {
-  var oldShow = WebInspector.ScriptsPanel.prototype.show;
-  WebInspector.ScriptsPanel.prototype.show =  function() {
-    devtools.tools.getDebuggerAgent().initUI();
-    this.enableToggleButton.visible = false;
-    oldShow.call(this);
-  };
-})();
-
-
-(function InterceptProfilesPanelEvents() {
-  var oldShow = WebInspector.ProfilesPanel.prototype.show;
-  WebInspector.ProfilesPanel.prototype.show = function() {
-    devtools.tools.getProfilerAgent().initializeProfiling();
-    this.enableToggleButton.visible = false;
-    oldShow.call(this);
-    // Show is called on every show event of a panel, so
-    // we only need to intercept it once.
-    WebInspector.ProfilesPanel.prototype.show = oldShow;
-  };
-})();
-
-
-/*
- * @override
- * TODO(mnaganov): Restore l10n when it will be agreed that it is needed.
- */
-WebInspector.UIString = function(string) {
-  return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
-};
-
-
-// There is no clear way of setting frame title yet. So sniffing main resource
-// load.
-(function OverrideUpdateResource() {
-  var originalUpdateResource = WebInspector.updateResource;
-  WebInspector.updateResource = function(identifier, payload) {
-    originalUpdateResource.call(this, identifier, payload);
-    var resource = this.resources[identifier];
-    if (resource && resource.mainResource && resource.finished) {
-      document.title =
-          WebInspector.UIString('Developer Tools - %s', resource.url);
-    }
-  };
-})();
-
-
-// Highlight extension content scripts in the scripts list.
-(function () {
-  var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu;
-  WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script) {
-    var result = original.apply(this, arguments);
-    var debuggerAgent = devtools.tools.getDebuggerAgent();
-    var type = debuggerAgent.getScriptContextType(script.sourceID);
-    var option = script.filesSelectOption;
-    if (type == 'injected' && option) {
-      option.addStyleClass('injected');
-    }
-    return result;
-  };
-})();
-
-
-/** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */
-(function() {
-  var originalDragStart = WebInspector.elementDragStart;
-  WebInspector.elementDragStart = function(element) {
-    if (element) {
-      var glassPane = document.createElement("div");
-      glassPane.style.cssText =
-          'position:absolute;width:100%;height:100%;opacity:0;z-index:1';
-      glassPane.id = 'glass-pane-for-drag';
-      element.parentElement.appendChild(glassPane);
-    }
-
-    originalDragStart.apply(this, arguments);
-  };
-
-  var originalDragEnd = WebInspector.elementDragEnd;
-  WebInspector.elementDragEnd = function() {
-    originalDragEnd.apply(this, arguments);
-
-    var glassPane = document.getElementById('glass-pane-for-drag');
-    if (glassPane) {
-      glassPane.parentElement.removeChild(glassPane);
-    }
-  };
-})();
-
-
-(function () {
-var orig = InjectedScriptAccess.getProperties;
-InjectedScriptAccess.getProperties = function(
-    objectProxy, ignoreHasOwnProperty, abbreviate, callback) {
-  if (objectProxy.isScope) {
-    devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId,
-        callback);
-  } else if (objectProxy.isV8Ref) {
-    devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId,
-        callback, false);
-  } else {
-    orig.apply(this, arguments);
-  }
-};
-})();
-
-
-InjectedScriptAccess.evaluateInCallFrame = function(callFrameId, code,
-                                                    objectGroup, callback)
-{
-  //TODO(pfeldman): remove once 49084 is rolled.
-  if (!callback) {
-    callback = objectGroup;
-  }
-  devtools.tools.getDebuggerAgent().evaluateInCallFrame(
-      callFrameId, code, callback);
-};
-
-
-WebInspector.resourceTrackingWasEnabled = function()
-{
-    InspectorBackend._resourceTrackingEnabled = true;
-    this.panels.resources.resourceTrackingWasEnabled();
-};
-
-WebInspector.resourceTrackingWasDisabled = function()
-{
-    InspectorBackend._resourceTrackingEnabled = false;
-    this.panels.resources.resourceTrackingWasDisabled();
-};
-
-(function() {
-var orig = WebInspector.ConsoleMessage.prototype.setMessageBody;
-WebInspector.ConsoleMessage.prototype.setMessageBody = function(args) {
-  for (var i = 0; i < args.length; ++i) {
-    if (typeof args[i] == "string") {
-      args[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(args[i]);
-    }
-  }
-  orig.call(this, args);
-};
-})();
-
-
-(function() {
-var orig = InjectedScriptAccess.getCompletions;
-InjectedScriptAccess.getCompletions = function(expressionString,
-    includeInspectorCommandLineAPI, callFrameId, reportCompletions) {
-  if (goog.isDef(callFrameId)) {
-    devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(
-        expressionString, callFrameId, reportCompletions);
-  } else {
-    return orig.apply(this, arguments);
-  }
-};
-})();
-
-
-(function() {
-WebInspector.ElementsPanel.prototype._nodeSearchButtonClicked = function(
-    event) {
-  InspectorBackend.toggleNodeSearch();
-  this.nodeSearchButton.toggled = !this.nodeSearchButton.toggled;
-};
-})();
-
-
-// We need to have a place for postponed tasks
-// which should be executed when all the messages between agent and frontend
-// are processed.
-
-WebInspector.runAfterPendingDispatchesQueue = [];
-
-WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback) {
-  WebInspector.runAfterPendingDispatchesQueue.push(callback);
-};
-
-WebInspector.queuesAreEmpty = function() {
-  var copy = this.runAfterPendingDispatchesQueue.slice();
-  this.runAfterPendingDispatchesQueue = [];
-  for (var i = 0; i < copy.length; ++i)
-    copy[i].call(this);
-};
-
-(function() {
-var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame;
-InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element) {
-  var resource = WebInspector.resources[identifier];
-  if (!resource) {
-    return;
-  }
-  originalAddToFrame.call(this, identifier, resource.mimeType, element);
-};
-})();
-
-/* devtools_host_stub.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview These stubs emulate backend functionality and allows
- * DevTools frontend to function as a standalone web app.
- */
-
-if (!window['RemoteDebuggerAgent']) {
-
-/**
- * @constructor
- */
-RemoteDebuggerAgentStub = function() {
-};
-
-
-RemoteDebuggerAgentStub.prototype.GetContextId = function() {
-  RemoteDebuggerAgent.SetContextId(3);
-};
-
-
-/**
- * @constructor
- */
-RemoteProfilerAgentStub = function() {
-};
-
-
-RemoteProfilerAgentStub.prototype.GetActiveProfilerModules = function() {
-  ProfilerStubHelper.GetInstance().GetActiveProfilerModules();
-};
-
-
-RemoteProfilerAgentStub.prototype.GetLogLines = function(pos) {
-  ProfilerStubHelper.GetInstance().GetLogLines(pos);
-};
-
-
-/**
- * @constructor
- */
-RemoteToolsAgentStub = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.DispatchOnInjectedScript = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.DispatchOnInspectorController = function() {
-};
-
-
-RemoteToolsAgentStub.prototype.ExecuteVoidJavaScript = function() {
-};
-
-
-/**
- * @constructor
- */
-ProfilerStubHelper = function() {
-  this.activeProfilerModules_ =
-      devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
-  this.heapProfSample_ = 0;
-  this.log_ = '';
-};
-
-
-ProfilerStubHelper.GetInstance = function() {
-  if (!ProfilerStubHelper.instance_) {
-    ProfilerStubHelper.instance_ = new ProfilerStubHelper();
-  }
-  return ProfilerStubHelper.instance_;
-};
-
-
-ProfilerStubHelper.prototype.StopProfiling = function(modules) {
-  this.activeProfilerModules_ &= ~modules;
-};
-
-
-ProfilerStubHelper.prototype.StartProfiling = function(modules) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
-    if (modules & profModules.PROFILER_MODULE_HEAP_STATS) {
-      this.log_ +=
-          'heap-sample-begin,"Heap","allocated",' +
-              (new Date()).getTime() + '\n' +
-          'heap-sample-stats,"Heap","allocated",10000,1000\n';
-      this.log_ +=
-          'heap-sample-item,STRING_TYPE,100,1000\n' +
-          'heap-sample-item,CODE_TYPE,10,200\n' +
-          'heap-sample-item,MAP_TYPE,20,350\n';
-      this.log_ +=
-          ProfilerStubHelper.HeapSamples[this.heapProfSample_++];
-      this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length;
-      this.log_ +=
-          'heap-sample-end,"Heap","allocated"\n';
-    }
-  } else {
-    if (modules & profModules.PROFILER_MODULE_CPU) {
-      this.log_ += ProfilerStubHelper.ProfilerLogBuffer;
-    }
-    this.activeProfilerModules_ |= modules;
-  }
-};
-
-
-ProfilerStubHelper.prototype.GetActiveProfilerModules = function() {
-  var self = this;
-  setTimeout(function() {
-      RemoteProfilerAgent.DidGetActiveProfilerModules(
-          self.activeProfilerModules_);
-  }, 100);
-};
-
-
-ProfilerStubHelper.prototype.GetLogLines = function(pos) {
-  var profModules = devtools.ProfilerAgent.ProfilerModules;
-  var logLines = this.log_.substr(pos);
-  setTimeout(function() {
-    RemoteProfilerAgent.DidGetLogLines(pos + logLines.length, logLines);
-  }, 100);
-};
-
-
-ProfilerStubHelper.ProfilerLogBuffer =
-  'profiler,begin,1\n' +
-  'profiler,resume\n' +
-  'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' +
-  'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' +
-  'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' +
-  'tick,0x1010,0x0,3\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x3010,0x0,3,0x2020, 0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x2030,0x0,3,0x2020, 0x1010\n' +
-  'tick,0x2020,0x0,3,0x1010\n' +
-  'tick,0x1010,0x0,3\n' +
-  'profiler,pause\n';
-
-
-ProfilerStubHelper.HeapSamples = [
-  'heap-js-cons-item,foo,1,100\n' +
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,Object,5,100\n' +
-  'heap-js-ret-item,foo,bar;3\n' +
-  'heap-js-ret-item,bar,foo;5\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
-  'heap-js-cons-item,foo,2000,200000\n' +
-  'heap-js-cons-item,bar,10,1000\n' +
-  'heap-js-cons-item,Object,6,120\n' +
-  'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' +
-  'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1\n',
-
-  'heap-js-cons-item,foo,15,1500\n' +
-  'heap-js-cons-item,bar,15,1500\n' +
-  'heap-js-cons-item,Object,5,100\n' +
-  'heap-js-cons-item,Array,3,1000\n' +
-  'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' +
-  'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' +
-  'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' +
-  'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' +
-  'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n',
-
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,Object,6,120\n' +
-  'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' +
-  'heap-js-ret-item,Object:0x1234,(global property);3\n' +
-  'heap-js-ret-item,Object:0x1235,(global property);5\n',
-
-  'heap-js-cons-item,foo,15,1500\n' +
-  'heap-js-cons-item,bar,15,1500\n' +
-  'heap-js-cons-item,Array,10,1000\n' +
-  'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' +
-  'heap-js-ret-item,bar,foo;5\n' +
-  'heap-js-ret-item,Array:0x5678,(roots);3\n',
-
-  'heap-js-cons-item,bar,20,2000\n' +
-  'heap-js-cons-item,baz,15,1500\n' +
-  'heap-js-ret-item,bar,baz;3\n' +
-  'heap-js-ret-item,baz,bar;3\n'
-];
-
-
-/**
- * @constructor
- */
-RemoteDebuggerCommandExecutorStub = function() {
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd) {
-  if ('{"seq":2,"type":"request","command":"scripts","arguments":{"' +
-      'includeSource":false}}' == cmd) {
-    var response1 =
-        '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' +
-        'success":true,"body":[{"handle":61,"type":"script","name":"' +
-        'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
-        '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' +
-        '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' +
-        '"handle":60,"type":"context","data":"page,3"}],"running":false}';
-    this.sendResponse_(response1);
-  } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{' +
-             '"ids":[59],"includeSource":true}}' == cmd) {
-    this.sendResponse_(
-        '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' +
-        '"success":true,"body":[{"handle":1,"type":"script","name":' +
-        '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
-        '"lineCount":1,"source":"function fib(n) {return n+1;}",' +
-        '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' +
-        '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' +
-        '"running":false}');
-  } else if (cmd.indexOf('"command":"profile"') != -1) {
-    var cmdObj = JSON.parse(cmd);
-    if (cmdObj.arguments.command == 'resume') {
-      ProfilerStubHelper.GetInstance().StartProfiling(
-          parseInt(cmdObj.arguments.modules));
-    } else if (cmdObj.arguments.command == 'pause') {
-      ProfilerStubHelper.GetInstance().StopProfiling(
-          parseInt(cmdObj.arguments.modules));
-    } else {
-      debugPrint('Unexpected profile command: ' + cmdObj.arguments.command);
-    }
-  } else {
-    debugPrint('Unexpected command: ' + cmd);
-  }
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function() {
-};
-
-
-RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response) {
-  setTimeout(function() {
-    RemoteDebuggerAgent.DebuggerOutput(response);
-  }, 0);
-};
-
-
-DevToolsHostStub = function() {
-  this.isStub = true;
-};
-goog.inherits(DevToolsHostStub,
-    WebInspector.InspectorFrontendHostStub);
-
-
-DevToolsHostStub.prototype.reset = function() {
-};
-
-
-DevToolsHostStub.prototype.setting = function() {
-};
-
-
-DevToolsHostStub.prototype.setSetting = function() {
-};
-
-
-window['RemoteDebuggerAgent'] = new RemoteDebuggerAgentStub();
-window['RemoteDebuggerCommandExecutor'] =
-    new RemoteDebuggerCommandExecutorStub();
-window['RemoteProfilerAgent'] = new RemoteProfilerAgentStub();
-window['RemoteToolsAgent'] = new RemoteToolsAgentStub();
-InspectorFrontendHost = new DevToolsHostStub();
-
-}
-
-/* tests.js */
-
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-/**
- * @fileoverview This file contains small testing framework along with the
- * test suite for the frontend. These tests are a part of the continues build
- * and are executed by the devtools_sanity_unittest.cc as a part of the
- * Interactive UI Test suite.
- */
-
-if (window.domAutomationController) {
-
-var ___interactiveUiTestsMode = true;
-
-/**
- * Test suite for interactive UI tests.
- * @constructor
- */
-TestSuite = function() {
-  this.controlTaken_ = false;
-  this.timerId_ = -1;
-};
-
-
-/**
- * Reports test failure.
- * @param {string} message Failure description.
- */
-TestSuite.prototype.fail = function(message) {
-  if (this.controlTaken_) {
-    this.reportFailure_(message);
-  } else {
-    throw message;
-  }
-};
-
-
-/**
- * Equals assertion tests that expected == actual.
- * @param {Object} expected Expected object.
- * @param {Object} actual Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
-TestSuite.prototype.assertEquals = function(expected, actual, opt_message) {
-  if (expected != actual) {
-    var message = 'Expected: "' + expected + '", but was "' + actual + '"';
-    if (opt_message) {
-      message = opt_message + '(' + message + ')';
-    }
-    this.fail(message);
-  }
-};
-
-
-/**
- * True assertion tests that value == true.
- * @param {Object} value Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
-TestSuite.prototype.assertTrue = function(value, opt_message) {
-  this.assertEquals(true, !!value, opt_message);
-};
-
-
-/**
- * Contains assertion tests that string contains substring.
- * @param {string} string Outer.
- * @param {string} substring Inner.
- */
-TestSuite.prototype.assertContains = function(string, substring) {
-  if (string.indexOf(substring) == -1) {
-    this.fail('Expected to: "' + string + '" to contain "' + substring + '"');
-  }
-};
-
-
-/**
- * Takes control over execution.
- */
-TestSuite.prototype.takeControl = function() {
-  this.controlTaken_ = true;
-  // Set up guard timer.
-  var self = this;
-  this.timerId_ = setTimeout(function() {
-    self.reportFailure_('Timeout exceeded: 20 sec');
-  }, 20000);
-};
-
-
-/**
- * Releases control over execution.
- */
-TestSuite.prototype.releaseControl = function() {
-  if (this.timerId_ != -1) {
-    clearTimeout(this.timerId_);
-    this.timerId_ = -1;
-  }
-  this.reportOk_();
-};
-
-
-/**
- * Async tests use this one to report that they are completed.
- */
-TestSuite.prototype.reportOk_ = function() {
-  window.domAutomationController.send('[OK]');
-};
-
-
-/**
- * Async tests use this one to report failures.
- */
-TestSuite.prototype.reportFailure_ = function(error) {
-  if (this.timerId_ != -1) {
-    clearTimeout(this.timerId_);
-    this.timerId_ = -1;
-  }
-  window.domAutomationController.send('[FAILED] ' + error);
-};
-
-
-/**
- * Runs all global functions starting with 'test' as unit tests.
- */
-TestSuite.prototype.runTest = function(testName) {
-  try {
-    this[testName]();
-    if (!this.controlTaken_) {
-      this.reportOk_();
-    }
-  } catch (e) {
-    this.reportFailure_(e);
-  }
-};
-
-
-/**
- * @param {string} panelName Name of the panel to show.
- */
-TestSuite.prototype.showPanel = function(panelName) {
-  // Open Scripts panel.
-  var toolbar = document.getElementById('toolbar');
-  var button = toolbar.getElementsByClassName(panelName)[0];
-  button.click();
-  this.assertEquals(WebInspector.panels[panelName],
-      WebInspector.currentPanel);
-};
-
-
-/**
- * Overrides the method with specified name until it's called first time.
- * @param {Object} receiver An object whose method to override.
- * @param {string} methodName Name of the method to override.
- * @param {Function} override A function that should be called right after the
- *     overriden method returns.
- * @param {boolean} opt_sticky Whether restore original method after first run
- *     or not.
- */
-TestSuite.prototype.addSniffer = function(receiver, methodName, override,
-                                          opt_sticky) {
-  var orig = receiver[methodName];
-  if (typeof orig != 'function') {
-    this.fail('Cannot find method to override: ' + methodName);
-  }
-  var test = this;
-  receiver[methodName] = function(var_args) {
-    try {
-      var result = orig.apply(this, arguments);
-    } finally {
-      if (!opt_sticky) {
-        receiver[methodName] = orig;
-      }
-    }
-    // In case of exception the override won't be called.
-    try {
-      override.apply(this, arguments);
-    } catch (e) {
-      test.fail('Exception in overriden method "' + methodName + '": ' + e);
-    }
-    return result;
-  };
-};
-
-
-// UI Tests
-
-
-/**
- * Tests that the real injected host is present in the context.
- */
-TestSuite.prototype.testHostIsPresent = function() {
-  this.assertTrue(typeof InspectorFrontendHost == 'object' &&
-      !InspectorFrontendHost.isStub);
-};
-
-
-/**
- * Tests elements tree has an 'HTML' root.
- */
-TestSuite.prototype.testElementsTreeRoot = function() {
-  var doc = WebInspector.domAgent.document;
-  this.assertEquals('HTML', doc.documentElement.nodeName);
-  this.assertTrue(doc.documentElement.hasChildNodes());
-};
-
-
-/**
- * Tests that main resource is present in the system and that it is
- * the only resource.
- */
-TestSuite.prototype.testMainResource = function() {
-  var tokens = [];
-  var resources = WebInspector.resources;
-  for (var id in resources) {
-    tokens.push(resources[id].lastPathComponent);
-  }
-  this.assertEquals('simple_page.html', tokens.join(','));
-};
-
-
-/**
- * Tests that resources tab is enabled when corresponding item is selected.
- */
-TestSuite.prototype.testEnableResourcesTab = function() {
-  this.showPanel('resources');
-
-  var test = this;
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        test.assertEquals('simple_page.html', payload.lastPathComponent);
-        WebInspector.panels.resources.refresh();
-        WebInspector.panels.resources.revealAndSelectItem(
-            WebInspector.resources[identifier]);
-
-        test.releaseControl();
-      });
-
-  // Following call should lead to reload that we capture in the
-  // addResource override.
-  WebInspector.panels.resources._enableResourceTracking();
-
-  // We now have some time to report results to controller.
-  this.takeControl();
-};
-
-
-/**
- * Tests that correct content length is reported for resources.
- */
-TestSuite.prototype.testResourceContentLength = function() {
-  this.showPanel('resources');
-  var test = this;
-
-  var png = false;
-  var html = false;
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        if (!payload.didLengthChange)
-          return;
-        var resource = WebInspector.resources[identifier];
-        if (!resource || !resource.url)
-          return;
-        if (resource.url.search('image.html$') != -1) {
-          var expectedLength = 87;
-          test.assertTrue(
-              resource.contentLength <= expectedLength,
-              'image.html content length is greater thatn expected.');
-          if (expectedLength == resource.contentLength) {
-            html = true;
-          }
-        } else if (resource.url.search('image.png') != -1) {
-          var expectedLength = 257796;
-          test.assertTrue(
-              resource.contentLength <= expectedLength,
-              'image.png content length is greater than expected.');
-          if (expectedLength == resource.contentLength) {
-            png = true;
-          }
-        }
-        if (html && png) {
-          // Wait 1 second before releasing control to check that the content
-          // lengths are not updated anymore.
-          setTimeout(function() {
-            test.releaseControl();
-          }, 1000);
-        }
-      }, true);
-
-  // Make sure resource tracking is on.
-  WebInspector.panels.resources._enableResourceTracking();
-  // Reload inspected page to update all resources.
-  test.evaluateInConsole_(
-      'window.location.reload(true);',
-       function(resultText) {
-           test.assertEquals('undefined', resultText,
-                             'Unexpected result of reload().');
-       });
-
-  // We now have some time to report results to controller.
-  this.takeControl();
-};
-
-
-/**
- * Tests resource headers.
- */
-TestSuite.prototype.testResourceHeaders = function() {
-  this.showPanel('resources');
-
-  var test = this;
-
-  var responseOk = false;
-  var timingOk = false;
-
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        var resource = this.resources[identifier];
-        if (!resource || resource.mainResource) {
-          // We are only interested in secondary resources in this test.
-          return;
-        }
-
-        var requestHeaders = JSON.stringify(resource.requestHeaders);
-        test.assertContains(requestHeaders, 'Accept');
-
-        if (payload.didResponseChange) {
-          var responseHeaders = JSON.stringify(resource.responseHeaders);
-          test.assertContains(responseHeaders, 'Content-type');
-          test.assertContains(responseHeaders, 'Content-Length');
-          test.assertTrue(typeof resource.responseReceivedTime != 'undefined');
-          responseOk = true;
-        }
-
-        if (payload.didTimingChange) {
-          test.assertTrue(typeof resource.startTime != 'undefined');
-          timingOk = true;
-        }
-
-        if (payload.didCompletionChange) {
-          test.assertTrue(responseOk);
-          test.assertTrue(timingOk);
-          test.assertTrue(typeof resource.endTime != 'undefined');
-          test.releaseControl();
-        }
-      }, true);
-
-  WebInspector.panels.resources._enableResourceTracking();
-  this.takeControl();
-};
-
-
-/**
- * Tests the mime type of a cached (HTTP 304) resource.
- */
-TestSuite.prototype.testCachedResourceMimeType = function() {
-  this.showPanel('resources');
-
-  var test = this;
-  var hasReloaded = false;
-
-  this.addSniffer(WebInspector, 'updateResource',
-      function(identifier, payload) {
-        var resource = this.resources[identifier];
-        if (!resource || resource.mainResource) {
-          // We are only interested in secondary resources in this test.
-          return;
-        }
-
-        if (payload.didResponseChange) {
-          // Test server uses a default mime type for JavaScript files.
-          test.assertEquals('text/html', payload.mimeType);
-          if (!hasReloaded) {
-            hasReloaded = true;
-            // Reload inspected page to update all resources.
-            test.evaluateInConsole_(
-                'window.location.reload(true);',
-                 function() {});
-          } else {
-            test.releaseControl();
-          }
-        }
-
-      }, true);
-
-  WebInspector.panels.resources._enableResourceTracking();
-  this.takeControl();
-};
-
-
-/**
- * Tests that profiler works.
- */
-TestSuite.prototype.testProfilerTab = function() {
-  this.showPanel('profiles');
-
-  var test = this;
-  this.addSniffer(WebInspector.panels.profiles, 'addProfileHeader',
-      function(typeOrProfile, profile) {
-        if (!profile) {
-          profile = typeOrProfile;
-        }
-        var panel = WebInspector.panels.profiles;
-        panel.showProfile(profile);
-        var node = panel.visibleView.profileDataGridTree.children[0];
-        // Iterate over displayed functions and search for a function
-        // that is called 'fib' or 'eternal_fib'. If found, it will mean
-        // that we actually have profiled page's code.
-        while (node) {
-          if (node.functionName.indexOf('fib') != -1) {
-            test.releaseControl();
-          }
-          node = node.traverseNextNode(true, null, true);
-        }
-
-        test.fail();
-      });
-  var ticksCount = 0;
-  var tickRecord = '\nt,';
-  this.addSniffer(RemoteProfilerAgent, 'DidGetLogLines',
-      function(posIgnored, log) {
-        var pos = 0;
-        while ((pos = log.indexOf(tickRecord, pos)) != -1) {
-          pos += tickRecord.length;
-          ticksCount++;
-        }
-        if (ticksCount > 100) {
-          InspectorBackend.stopProfiling();
-        }
-      }, true);
-
-  InspectorBackend.startProfiling();
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts tab can be open and populated with inspected scripts.
- */
-TestSuite.prototype.testShowScriptsTab = function() {
-  var parsedDebuggerTestPageHtml = false;
-
-  // Intercept parsedScriptSource calls to check that all expected scripts are
-  // added to the debugger.
-  var test = this;
-  var receivedConsoleApiSource = false;
-  this.addSniffer(WebInspector, 'parsedScriptSource',
-      function(sourceID, sourceURL, source, startingLine) {
-        if (sourceURL == undefined) {
-          if (receivedConsoleApiSource) {
-            test.fail('Unexpected script without URL');
-          } else {
-            receivedConsoleApiSource = true;
-          }
-        } else if (sourceURL.search(/debugger_test_page.html$/) != -1) {
-          if (parsedDebuggerTestPageHtml) {
-            test.fail('Unexpected parse event: ' + sourceURL);
-          }
-          parsedDebuggerTestPageHtml = true;
-          if (!WebInspector.panels.scripts.visibleView) {
-            test.fail('No visible script view: ' + sourceURL);
-          }
-        } else {
-          test.fail('Unexpected script URL: ' + sourceURL);
-        }
-
-        // There should be two scripts: one for the main page and another
-        // one which is source of console API(see
-        // InjectedScript._ensureCommandLineAPIInstalled).
-        if (parsedDebuggerTestPageHtml && receivedConsoleApiSource) {
-           test.releaseControl();
-        }
-      }, true /* sticky */);
-
-  this.showPanel('scripts');
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts tab is populated with inspected scripts even if it
- * hadn't been shown by the moment inspected paged refreshed.
- * @see http://crbug.com/26312
- */
-TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh =
-    function() {
-  var test = this;
-  this.assertEquals(WebInspector.panels.elements,
-      WebInspector.currentPanel, 'Elements panel should be current one.');
-
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'reset',
-      waitUntilScriptIsParsed);
-
-  // Reload inspected page. It will reset the debugger agent.
-  test.evaluateInConsole_(
-      'window.location.reload(true);',
-      function(resultText) {
-        test.assertEquals('undefined', resultText,
-                          'Unexpected result of reload().');
-      });
-
-  function waitUntilScriptIsParsed() {
-    var parsed = devtools.tools.getDebuggerAgent().parsedScripts_;
-    for (var id in parsed) {
-      var url = parsed[id].getUrl();
-      if (url && url.search('debugger_test_page.html$') != -1) {
-        checkScriptsPanel();
-        return;
-      }
-    }
-    test.addSniffer(devtools.DebuggerAgent.prototype, 'addScriptInfo_',
-        waitUntilScriptIsParsed);
-  }
-
-  function checkScriptsPanel() {
-    test.showPanel('scripts');
-    test.assertTrue(test._scriptsAreParsed(['debugger_test_page.html$']),
-                    'Inspected script not found in the scripts list');
-    test.releaseControl();
-  }
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts list contains content scripts.
- */
-TestSuite.prototype.testContentScriptIsPresent = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  test._waitUntilScriptsAreParsed(
-      ['page_with_content_script.html$', 'simple_content_script.js$'],
-      function() {
-        test.releaseControl();
-      });
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that scripts are not duplicaed on Scripts tab switch.
- */
-TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() {
-  var test = this;
-
-  // There should be two scripts: one for the main page and another
-  // one which is source of console API(see
-  // InjectedScript._ensureCommandLineAPIInstalled).
-  var expectedScriptsCount = 2;
-  var parsedScripts = [];
-
-  this.showPanel('scripts');
-
-
-  function switchToElementsTab() {
-    test.showPanel('elements');
-    setTimeout(switchToScriptsTab, 0);
-  }
-
-  function switchToScriptsTab() {
-    test.showPanel('scripts');
-    setTimeout(checkScriptsPanel, 0);
-  }
-
-  function checkScriptsPanel() {
-    test.assertTrue(!!WebInspector.panels.scripts.visibleView,
-                    'No visible script view.');
-    test.assertTrue(test._scriptsAreParsed(['debugger_test_page.html$']),
-                    'Some scripts are missing.');
-    checkNoDuplicates();
-    test.releaseControl();
-  }
-
-  function checkNoDuplicates() {
-    var scriptSelect = document.getElementById('scripts-files');
-    var options = scriptSelect.options;
-    for (var i = 0; i < options.length; i++) {
-      var scriptName = options[i].text;
-      for (var j = i + 1; j < options.length; j++) {
-        test.assertTrue(scriptName != options[j].text,
-            'Found script duplicates: ' + test.optionsToString_(options));
-      }
-    }
-  }
-
-  test._waitUntilScriptsAreParsed(
-      ['debugger_test_page.html$'],
-      function() {
-        checkNoDuplicates();
-        setTimeout(switchToElementsTab, 0);
-      });
-
-
-  // Wait until all scripts are added to the debugger.
-  this.takeControl();
-};
-
-
-/**
- * Tests that a breakpoint can be set.
- */
-TestSuite.prototype.testSetBreakpoint = function() {
-  var test = this;
-  this.showPanel('scripts');
-
-  var breakpointLine = 12;
-
-  this._waitUntilScriptsAreParsed(['debugger_test_page.html'],
-      function() {
-        test.showMainPageScriptSource_(
-            'debugger_test_page.html',
-            function(view, url) {
-              view._addBreakpoint(breakpointLine);
-              // Force v8 execution.
-              RemoteToolsAgent.ExecuteVoidJavaScript();
-              test.waitForSetBreakpointResponse_(url, breakpointLine,
-                  function() {
-                    test.releaseControl();
-                  });
-            });
-      });
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that pause on exception works.
- */
-TestSuite.prototype.testPauseOnException = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  // Make sure pause on exceptions is on.
-  if (!WebInspector.currentPanel.pauseOnExceptionButton.toggled) {
-    WebInspector.currentPanel.pauseOnExceptionButton.element.click();
-  }
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['pause_on_exception.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['throwAnException', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 6,
-        lineText: '  return unknown_var;'
-      },
-      function() {
-        test.releaseControl();
-      });
-
-  this.takeControl();
-};
-
-
-// Tests that debugger works correctly if pause event occurs when DevTools
-// frontend is being loaded.
-TestSuite.prototype.testPauseWhenLoadingDevTools = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  var expectations = {
-        functionsOnStack: ['callDebugger'],
-        lineNumber: 8,
-        lineText: '  debugger;'
-      };
-
-
-  // Script execution can already be paused.
-  if (WebInspector.currentPanel.paused) {
-    var callFrame =
-        WebInspector.currentPanel.sidebarPanes.callstack.selectedCallFrame;
-    this.assertEquals(expectations.functionsOnStack[0],
-                      callFrame.functionName);
-    var callbackInvoked = false;
-    this._checkSourceFrameWhenLoaded(expectations, function() {
-          callbackInvoked = true;
-          if (test.controlTaken_) {
-            test.releaseControl();
-          }
-        });
-    if (!callbackInvoked) {
-      test.takeControl();
-    }
-    return;
-  }
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['callDebugger'],
-        lineNumber: 8,
-        lineText: '  debugger;'
-      },
-      function() {
-        test.releaseControl();
-      });
-  this.takeControl();
-};
-
-
-// Tests that pressing 'Pause' will pause script execution if the script
-// is already running.
-TestSuite.prototype.testPauseWhenScriptIsRunning = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  test.evaluateInConsole_(
-      'setTimeout("handleClick()" , 0)',
-      function(resultText) {
-        test.assertTrue(!isNaN(resultText),
-                        'Failed to get timer id: ' + resultText);
-        testScriptPauseAfterDelay();
-      });
-
-  // Wait for some time to make sure that inspected page is running the
-  // infinite loop.
-  function testScriptPauseAfterDelay() {
-    setTimeout(testScriptPause, 300);
-  }
-
-  function testScriptPause() {
-    // The script should be in infinite loop. Click 'Pause' button to
-    // pause it and wait for the result.
-    WebInspector.panels.scripts.pauseButton.click();
-
-    test._waitForScriptPause(
-        {
-          functionsOnStack: ['handleClick', '(anonymous function)'],
-          lineNumber: 5,
-          lineText: '  while(true) {'
-        },
-        function() {
-          test.releaseControl();
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Serializes options collection to string.
- * @param {HTMLOptionsCollection} options
- * @return {string}
- */
-TestSuite.prototype.optionsToString_ = function(options) {
-  var names = [];
-  for (var i = 0; i < options.length; i++) {
-    names.push('"' + options[i].text + '"');
-  }
-  return names.join(',');
-};
-
-
-/**
- * Ensures that main HTML resource is selected in Scripts panel and that its
- * source frame is setup. Invokes the callback when the condition is satisfied.
- * @param {HTMLOptionsCollection} options
- * @param {function(WebInspector.SourceView,string)} callback
- */
-TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback) {
-  var test = this;
-
-  var scriptSelect = document.getElementById('scripts-files');
-  var options = scriptSelect.options;
-
-  test.assertTrue(options.length, 'Scripts list is empty');
-
-  // Select page's script if it's not current option.
-  var scriptResource;
-  if (options[scriptSelect.selectedIndex].text === scriptName) {
-    scriptResource = options[scriptSelect.selectedIndex].representedObject;
-  } else {
-    var pageScriptIndex = -1;
-    for (var i = 0; i < options.length; i++) {
-      if (options[i].text === scriptName) {
-        pageScriptIndex = i;
-        break;
-      }
-    }
-    test.assertTrue(-1 !== pageScriptIndex,
-                    'Script with url ' + scriptName + ' not found among ' +
-                        test.optionsToString_(options));
-    scriptResource = options[pageScriptIndex].representedObject;
-
-    // Current panel is 'Scripts'.
-    WebInspector.currentPanel._showScriptOrResource(scriptResource);
-    test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex,
-                      'Unexpected selected option index.');
-  }
-
-  test.assertTrue(scriptResource instanceof WebInspector.Resource,
-                  'Unexpected resource class.');
-  test.assertTrue(!!scriptResource.url, 'Resource URL is null.');
-  test.assertTrue(
-      scriptResource.url.search(scriptName + '$') != -1,
-      'Main HTML resource should be selected.');
-
-  var scriptsPanel = WebInspector.panels.scripts;
-
-  var view = scriptsPanel.visibleView;
-  test.assertTrue(view instanceof WebInspector.SourceView);
-
-  if (!view.sourceFrame._isContentLoaded()) {
-    test.addSniffer(view, '_sourceFrameSetupFinished', function(event) {
-      callback(view, scriptResource.url);
-    });
-  } else {
-    callback(view, scriptResource.url);
-  }
-};
-
-
-/*
- * Evaluates the code in the console as if user typed it manually and invokes
- * the callback when the result message is received and added to the console.
- * @param {string} code
- * @param {function(string)} callback
- */
-TestSuite.prototype.evaluateInConsole_ = function(code, callback) {
-  WebInspector.console.visible = true;
-  WebInspector.console.prompt.text = code;
-  WebInspector.console.promptElement.dispatchEvent(
-      TestSuite.createKeyEvent('Enter'));
-
-  this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage',
-      function(commandResult) {
-        callback(commandResult.toMessageElement().textContent);
-      });
-};
-
-
-/*
- * Waits for 'setbreakpoint' response, checks that corresponding breakpoint
- * was successfully set and invokes the callback if it was.
- * @param {string} scriptUrl
- * @param {number} breakpointLine
- * @param {function()} callback
- */
-TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl,
-                                                             breakpointLine,
-                                                             callback) {
-  var test = this;
-  test.addSniffer(
-      devtools.DebuggerAgent.prototype,
-      'handleSetBreakpointResponse_',
-      function(msg) {
-        var bps = this.urlToBreakpoints_[scriptUrl];
-        test.assertTrue(!!bps, 'No breakpoints for line ' + breakpointLine);
-        var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine);
-        test.assertTrue(!!bps[line].getV8Id(),
-                        'Breakpoint id was not assigned.');
-        callback();
-      });
-};
-
-
-/**
- * Tests eval on call frame.
- */
-TestSuite.prototype.testEvalOnCallFrame = function() {
-  this.showPanel('scripts');
-
-  var breakpointLine = 16;
-
-  var test = this;
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'handleScriptsResponse_',
-      function(msg) {
-        test.showMainPageScriptSource_(
-            'debugger_test_page.html',
-            function(view, url) {
-              view._addBreakpoint(breakpointLine);
-              // Force v8 execution.
-              RemoteToolsAgent.ExecuteVoidJavaScript();
-              test.waitForSetBreakpointResponse_(url, breakpointLine,
-                                                 setBreakpointCallback);
-            });
-      });
-
-  function setBreakpointCallback() {
-    // Since breakpoints are ignored in evals' calculate() function is
-    // execute after zero-timeout so that the breakpoint is hit.
-    test.evaluateInConsole_(
-        'setTimeout("calculate(123)" , 0)',
-        function(resultText) {
-          test.assertTrue(!isNaN(resultText),
-                          'Failed to get timer id: ' + resultText);
-          waitForBreakpointHit();
-        });
-  }
-
-  function waitForBreakpointHit() {
-    test.addSniffer(
-        devtools.DebuggerAgent.prototype,
-        'handleBacktraceResponse_',
-        function(msg) {
-          test.assertEquals(2, this.callFrames_.length,
-                            'Unexpected stack depth on the breakpoint. ' +
-                                JSON.stringify(msg));
-          test.assertEquals('calculate', this.callFrames_[0].functionName,
-                            'Unexpected top frame function.');
-          // Evaluate 'e+1' where 'e' is an argument of 'calculate' function.
-          test.evaluateInConsole_(
-              'e+1',
-              function(resultText) {
-                test.assertEquals('124', resultText, 'Unexpected "e+1" value.');
-                test.releaseControl();
-              });
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that console auto completion works when script execution is paused.
- */
-TestSuite.prototype.testCompletionOnPause = function() {
-  this.showPanel('scripts');
-  var test = this;
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['completion_on_pause.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['innerFunction', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 9,
-        lineText: '    debugger;'
-      },
-      showConsole);
-
-  function showConsole() {
-    test.addSniffer(WebInspector.console, 'afterShow', testLocalsCompletion);
-    WebInspector.showConsole();
-  }
-
-  function testLocalsCompletion() {
-    checkCompletions(
-        'th',
-        ['parameter1', 'closureLocal', 'p', 'createClosureLocal'],
-        testThisCompletion);
-  }
-
-  function testThisCompletion() {
-    checkCompletions(
-        'this.',
-        ['field1', 'field2', 'm'],
-        testFieldCompletion);
-  }
-
-  function testFieldCompletion() {
-    checkCompletions(
-        'this.field1.',
-        ['id', 'name'],
-        function() {
-          test.releaseControl();
-        });
-  }
-
-  function checkCompletions(expression, expectedProperties, callback) {
-      test.addSniffer(WebInspector.console, '_reportCompletions',
-        function(bestMatchOnly, completionsReadyCallback, dotNotation,
-            bracketNotation, prefix, result, isException) {
-          test.assertTrue(!isException,
-                          'Exception while collecting completions');
-          for (var i = 0; i < expectedProperties.length; i++) {
-            var name = expectedProperties[i];
-            test.assertTrue(result[name], 'Name ' + name +
-                ' not found among the completions: ' +
-                JSON.stringify(result));
-          }
-          setTimeout(callback, 0);
-        });
-    WebInspector.console.prompt.text = expression;
-    WebInspector.console.prompt.autoCompleteSoon();
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Tests that inspected page doesn't hang on reload if it contains a syntax
- * error and DevTools window is open.
- */
-TestSuite.prototype.testAutoContinueOnSyntaxError = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  function checkScriptsList() {
-    var scriptSelect = document.getElementById('scripts-files');
-    var options = scriptSelect.options;
-    // There should be only console API source (see
-    // InjectedScript._ensureCommandLineAPIInstalled) since the page script
-    // contains a syntax error.
-    for (var i = 0 ; i < options.length; i++) {
-      if (options[i].text.search('script_syntax_error.html$') != -1) {
-        test.fail('Script with syntax error should not be in the list of ' +
-                  'parsed scripts.');
-      }
-    }
-  }
-
-  this.addSniffer(devtools.DebuggerAgent.prototype, 'handleScriptsResponse_',
-      function(msg) {
-        checkScriptsList();
-
-        // Reload inspected page.
-        test.evaluateInConsole_(
-            'window.location.reload(true);',
-            function(resultText) {
-              test.assertEquals('undefined', resultText,
-                                'Unexpected result of reload().');
-              waitForExceptionEvent();
-            });
-      });
-
-  function waitForExceptionEvent() {
-    var exceptionCount = 0;
-    test.addSniffer(
-        devtools.DebuggerAgent.prototype,
-        'handleExceptionEvent_',
-        function(msg) {
-          exceptionCount++;
-          test.assertEquals(1, exceptionCount, 'Too many exceptions.');
-          test.assertEquals(undefined, msg.getBody().script,
-                            'Unexpected exception: ' + JSON.stringify(msg));
-          test.releaseControl();
-        });
-
-    // Check that the script is not paused on parse error.
-    test.addSniffer(
-        WebInspector,
-        'pausedScript',
-        function(callFrames) {
-          test.fail('Script execution should not pause on syntax error.');
-        });
-  }
-
-  this.takeControl();
-};
-
-
-/**
- * Checks current execution line against expectations.
- * @param {WebInspector.SourceFrame} sourceFrame
- * @param {number} lineNumber Expected line number
- * @param {string} lineContent Expected line text
- */
-TestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber,
-                                                   lineContent) {
-  var sourceRow = sourceFrame.sourceRow(lineNumber);
-
-  var line = sourceRow.getElementsByClassName('webkit-line-content')[0];
-  this.assertEquals(lineNumber, sourceFrame.executionLine,
-                    'Unexpected execution line number.');
-  this.assertEquals(lineContent, line.textContent,
-                    'Unexpected execution line text.');
-
-  this.assertTrue(!!sourceRow, 'Execution line not found');
-  this.assertTrue(sourceRow.hasStyleClass('webkit-execution-line'),
-      'Execution line ' + lineNumber + ' is not highlighted. Class: ' +
-          sourceRow.className);
-}
-
-
-/**
- * Checks that all expected scripts are present in the scripts list
- * in the Scripts panel.
- * @param {Array.<string>} expected Regular expressions describing
- *     expected script names.
- * @return {boolean} Whether all the scripts are in 'scripts-files' select
- *     box
- */
-TestSuite.prototype._scriptsAreParsed = function(expected) {
-  var scriptSelect = document.getElementById('scripts-files');
-  var options = scriptSelect.options;
-
-  // Check that at least all the expected scripts are present.
-  var missing = expected.slice(0);
-  for (var i = 0 ; i < options.length; i++) {
-    for (var j = 0; j < missing.length; j++) {
-      if (options[i].text.search(missing[j]) != -1) {
-        missing.splice(j, 1);
-        break;
-      }
-    }
-  }
-  return missing.length == 0;
-};
-
-
-/**
- * Waits for script pause, checks expectations, and invokes the callback.
- * @param {Object} expectations  Dictionary of expectations
- * @param {function():void} callback
- */
-TestSuite.prototype._waitForScriptPause = function(expectations, callback) {
-  var test = this;
-  // Wait until script is paused.
-  test.addSniffer(
-      WebInspector,
-      'pausedScript',
-      function(callFrames) {
-        var functionsOnStack = [];
-        for (var i = 0; i < callFrames.length; i++) {
-          functionsOnStack.push(callFrames[i].functionName);
-        }
-
-        test.assertEquals(
-            expectations.functionsOnStack.join(','),
-            functionsOnStack.join(','), 'Unexpected stack.');
-
-        // Check that execution line where the script is paused is
-        // expected one.
-        test._checkSourceFrameWhenLoaded(expectations, callback);
-      });
-};
-
-
-/**
- * Waits for current source frame to load, checks expectations, and invokes
- * the callback.
- * @param {Object} expectations  Dictionary of expectations
- * @param {function():void} callback
- */
-TestSuite.prototype._checkSourceFrameWhenLoaded = function(
-    expectations, callback) {
-  var test = this;
-
-  var frame = WebInspector.currentPanel.visibleView.sourceFrame;
-  if (frame._isContentLoaded()) {
-    checkExecLine();
-  } else {
-    frame.addEventListener('content loaded', checkExecLine);
-  }
-  function checkExecLine() {
-    test._checkExecutionLine(frame, expectations.lineNumber,
-                             expectations.lineText);
-    // Make sure we don't listen anymore.
-    frame.removeEventListener('content loaded', checkExecLine);
-    callback();
-  }
-};
-
-
-/**
- * Performs sequence of steps.
- * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2,
- *     action2,...,actionN].
- */
-TestSuite.prototype._performSteps = function(actions) {
-  var test = this;
-  var i = 0;
-  function doNextAction() {
-    if (i > 0) {
-      actions[i++]();
-    }
-    if (i < actions.length - 1) {
-      test._waitForScriptPause(actions[i++], doNextAction);
-    }
-  }
-  doNextAction();
-};
-
-
-/**
- * Waits until all the scripts are parsed and asynchronously executes the code
- * in the inspected page.
- */
-TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(
-    code, expectedScripts) {
-  var test = this;
-
-  function executeFunctionInInspectedPage() {
-    // Since breakpoints are ignored in evals' calculate() function is
-    // execute after zero-timeout so that the breakpoint is hit.
-    test.evaluateInConsole_(
-        'setTimeout("' + code + '" , 0)',
-        function(resultText) {
-          test.assertTrue(!isNaN(resultText),
-                          'Failed to get timer id: ' + resultText);
-        });
-  }
-
-  test._waitUntilScriptsAreParsed(
-      expectedScripts, executeFunctionInInspectedPage);
-};
-
-
-/**
- * Waits until all the scripts are parsed and invokes the callback.
- */
-TestSuite.prototype._waitUntilScriptsAreParsed = function(
-    expectedScripts, callback) {
-  var test = this;
-
-  function waitForAllScripts() {
-    if (test._scriptsAreParsed(expectedScripts)) {
-      callback();
-    } else {
-      test.addSniffer(WebInspector, 'parsedScriptSource', waitForAllScripts);
-    }
-  }
-
-  waitForAllScripts();
-};
-
-
-/**
- * Waits until all debugger scripts are parsed and executes 'a()' in the
- * inspected page.
- */
-TestSuite.prototype._executeFunctionForStepTest = function() {
-  this._executeCodeWhenScriptsAreParsed(
-      'a()',
-      ['debugger_step.html$', 'debugger_step.js$']);
-};
-
-
-/**
- * Tests step over in the debugger.
- */
-TestSuite.prototype.testStepOver = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 5,
-        lineText: '  var y = fact(10);'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 6,
-        lineText: '  return y;'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Tests step out in the debugger.
- */
-TestSuite.prototype.testStepOut = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-out').click();
-      },
-      {
-        functionsOnStack: ['a','(anonymous function)'],
-        lineNumber: 8,
-        lineText: '  printResult(result);'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Tests step in in the debugger.
- */
-TestSuite.prototype.testStepIn = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeFunctionForStepTest();
-
-  this._performSteps([
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 3,
-        lineText: '    debugger;'
-      },
-      function() {
-        document.getElementById('scripts-step-over').click();
-      },
-      {
-        functionsOnStack: ['d','a','(anonymous function)'],
-        lineNumber: 5,
-        lineText: '  var y = fact(10);'
-      },
-      function() {
-        document.getElementById('scripts-step-into').click();
-      },
-      {
-        functionsOnStack: ['fact','d','a','(anonymous function)'],
-        lineNumber: 15,
-        lineText: '  return r;'
-      },
-      function() {
-        test.releaseControl();
-      }
-  ]);
-
-  test.takeControl();
-};
-
-
-/**
- * Gets a XPathResult matching given xpath.
- * @param {string} xpath
- * @param {number} resultType
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {XPathResult} Type of returned value is determined by 'resultType' parameter
- */
-
-TestSuite.prototype._evaluateXpath = function(
-    xpath, resultType, opt_ancestor) {
-  if (!opt_ancestor) {
-    opt_ancestor = document.documentElement;
-  }
-  try {
-    return document.evaluate(xpath, opt_ancestor, null, resultType, null);
-  } catch(e) {
-    this.fail('Error in expression: "' + xpath + '".' + e);
-  }
-};
-
-
-/**
- * Gets first Node matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {?Node}
- */
-TestSuite.prototype._findNode = function(xpath, opt_ancestor) {
-  var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE,
-      opt_ancestor).singleNodeValue;
-  this.assertTrue(!!result, 'Cannot find node on path: ' + xpath);
-  return result;
-};
-
-
-/**
- * Gets a text matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified documentElement
- *     will be used
- * @return {?string}
- */
-TestSuite.prototype._findText = function(xpath, opt_ancestor) {
-  var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE,
-      opt_ancestor).stringValue;
-  this.assertTrue(!!result, 'Cannot find text on path: ' + xpath);
-  return result;
-};
-
-
-/**
- * Gets an iterator over nodes matching given xpath.
- * @param {string} xpath
- * @param {Node} opt_ancestor Context node. If not specified, documentElement
- *     will be used
- * @return {XPathResult} Iterator over the nodes
- */
-TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor) {
-  return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-      opt_ancestor);
-};
-
-
-/**
- * Checks the scopeSectionDiv against the expectations.
- * @param {Node} scopeSectionDiv The section div
- * @param {Object} expectations Expectations dictionary
- */
-TestSuite.prototype._checkScopeSectionDiv = function(
-    scopeSectionDiv, expectations) {
-  var scopeTitle = this._findText(
-      './div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv);
-  this.assertEquals(expectations.title, scopeTitle,
-      'Unexpected scope section title.');
-  if (!expectations.properties) {
-    return;
-  }
-  this.assertTrue(scopeSectionDiv.hasStyleClass('expanded'), 'Section "' +
-      scopeTitle + '" is collapsed.');
-
-  var propertyIt = this._nodeIterator('./ol/li',
-                                      scopeSectionDiv);
-  var propertyLi;
-  var foundProps = [];
-  while (propertyLi = propertyIt.iterateNext()) {
-    var name = this._findText('./span[@class="name"]/text()', propertyLi);
-    var value = this._findText('./span[@class="value"]/text()', propertyLi);
-    this.assertTrue(!!name, 'Invalid variable name: "' + name + '"');
-    this.assertTrue(name in expectations.properties,
-                    'Unexpected property: ' + name);
-    this.assertEquals(expectations.properties[name], value,
-                      'Unexpected "' + name + '" property value.');
-    delete expectations.properties[name];
-    foundProps.push(name + ' = ' + value);
-  }
-
-  // Check that all expected properties were found.
-  for (var p in expectations.properties) {
-    this.fail('Property "' + p + '" was not found in scope "' + scopeTitle +
-        '". Found properties: "' + foundProps.join(',') + '"');
-  }
-};
-
-
-/**
- * Expands scope sections matching the filter and invokes the callback on
- * success.
- * @param {function(WebInspector.ObjectPropertiesSection, number):boolean}
- *     filter
- * @param {Function} callback
- */
-TestSuite.prototype._expandScopeSections = function(filter, callback) {
-  var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections;
-
-  var toBeUpdatedCount = 0;
-  function updateListener() {
-    --toBeUpdatedCount;
-    if (toBeUpdatedCount == 0) {
-      // Report when all scopes are expanded and populated.
-      callback();
-    }
-  }
-
-  // Global scope is always the last one.
-  for (var i = 0; i < sections.length - 1; i++) {
-    var section = sections[i];
-    if (!filter(sections, i)) {
-      continue;
-    }
-    ++toBeUpdatedCount;
-    var populated = section.populated;
-
-    this._hookGetPropertiesCallback(updateListener,
-      function() {
-        section.expand();
-        if (populated) {
-          // Make sure 'updateProperties' callback will be called at least once
-          // after it was overridden.
-          section.update();
-        }
-      });
-  }
-};
-
-
-/**
- * Tests that scopes can be expanded and contain expected data.
- */
-TestSuite.prototype.testExpandScope = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['debugger_closure.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['innerFunction', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 8,
-        lineText: '    debugger;'
-      },
-      expandAllSectionsExceptGlobal);
-
-  // Expanding Global scope takes for too long so we skeep it.
-  function expandAllSectionsExceptGlobal() {
-      test._expandScopeSections(function(sections, i) {
-        return i < sections.length - 1;
-      },
-      examineScopes /* When all scopes are expanded and populated check
-          them. */);
-  }
-
-  // Check scope sections contents.
-  function examineScopes() {
-    var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/' +
-        'div[div[@class="title"]/text()="Scope Variables"]');
-    var expectedScopes = [
-      {
-        title: 'Local',
-        properties: {
-          x:2009,
-          innerFunctionLocalVar:2011,
-          'this': 'global',
-        }
-      },
-      {
-        title: 'Closure',
-        properties: {
-          n:'TextParam',
-          makeClosureLocalVar:'local.TextParam',
-        }
-      },
-      {
-        title: 'Global',
-      },
-    ];
-    var it = test._nodeIterator('./div[@class="body"]/div',
-                                scopeVariablesSection);
-    var scopeIndex = 0;
-    var scopeDiv;
-    while (scopeDiv = it.iterateNext()) {
-       test.assertTrue(scopeIndex < expectedScopes.length,
-                       'Too many scopes.');
-       test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]);
-       ++scopeIndex;
-    }
-    test.assertEquals(expectedScopes.length, scopeIndex,
-                      'Unexpected number of scopes.');
-
-    test.releaseControl();
-  }
-
-  test.takeControl();
-};
-
-
-/**
- * Returns child tree element for a property with given name.
- * @param {TreeElement} parent Parent tree element.
- * @param {string} childName
- * @param {string} objectPath Path to the object. Will be printed in the case
- *     of failure.
- * @return {TreeElement}
- */
-TestSuite.prototype._findChildProperty = function(
-    parent, childName, objectPath) {
-  var children = parent.children;
-  for (var i = 0; i < children.length; i++) {
-    var treeElement = children[i];
-    var property = treeElement.property;
-    if (property.name == childName) {
-      return treeElement;
-    }
-  }
-  this.fail('Cannot find property "' + childName + '" in ' + objectPath);
-};
-
-
-/**
- * Executes the 'code' with InjectedScriptAccess.getProperties overriden
- * so that all callbacks passed to InjectedScriptAccess.getProperties are
- * extended with the 'hook'.
- * @param {Function} hook The hook function.
- * @param {Function} code A code snippet to be executed.
- */
-TestSuite.prototype._hookGetPropertiesCallback = function(hook, code) {
-  var orig = InjectedScriptAccess.getProperties;
-  InjectedScriptAccess.getProperties = function(objectProxy,
-      ignoreHasOwnProperty, abbreviate, callback) {
-    orig.call(InjectedScriptAccess, objectProxy, ignoreHasOwnProperty, abbreviate,
-        function() {
-          callback.apply(this, arguments);
-          hook();
-        });
-  };
-  try {
-    code();
-  } finally {
-    InjectedScriptAccess.getProperties = orig;
-  }
-};
-
-
-/**
- * Tests that all elements in prototype chain of an object have expected
- * intrinic proprties(__proto__, constructor, prototype).
- */
-TestSuite.prototype.testDebugIntrinsicProperties = function() {
-  this.showPanel('scripts');
-  var test = this;
-
-  this._executeCodeWhenScriptsAreParsed(
-      'handleClick()',
-      ['debugger_intrinsic_properties.html$']);
-
-  this._waitForScriptPause(
-      {
-        functionsOnStack: ['callDebugger', 'handleClick',
-                           '(anonymous function)'],
-        lineNumber: 29,
-        lineText: '  debugger;'
-      },
-      expandLocalScope);
-
-  var localScopeSection = null;
-  function expandLocalScope() {
-    test._expandScopeSections(function(sections, i) {
-        if (i == 0) {
-          test.assertTrue(sections[i].object.isLocal, 'Scope #0 is not Local.');
-          localScopeSection = sections[i];
-          return true;
-        }
-        return false;
-      },
-      examineLocalScope);
-  }
-
-  function examineLocalScope() {
-    var scopeExpectations = [
-      'a', 'Object', [
-        'constructor', 'function Child()', [
-          'constructor', 'function Function()', null,
-          'name', 'Child', null,
-          'prototype', 'Object', [
-            'childProtoField', '21', null
-          ]
-        ],
-
-        '__proto__', 'Object', [
-          '__proto__', 'Object', [
-            '__proto__', 'Object', [
-              '__proto__', 'null', null,
-              'constructor', 'function Object()', null,
-            ],
-            'constructor', 'function Parent()', [
-              'name', 'Parent', null,
-              'prototype', 'Object', [
-                'parentProtoField', '11', null,
-              ]
-            ],
-            'parentProtoField', '11', null,
-          ],
-          'constructor', 'function Child()', null,
-          'childProtoField', '21', null,
-        ],
-
-        'parentField', '10', null,
-        'childField', '20', null,
-      ]
-    ];
-
-    checkProperty(
-        localScopeSection.propertiesTreeOutline,
-        '<Local Scope>',
-        scopeExpectations);
-  }
-
-  var propQueue = [];
-  var index = 0;
-  var expectedFinalIndex = 8;
-
-  function expandAndCheckNextProperty() {
-    if (index == propQueue.length) {
-      test.assertEquals(expectedFinalIndex, index,
-          'Unexpected number of expanded objects.');
-      test.releaseControl();
-      return;
-    }
-
-    // Read next property data from the queue.
-    var treeElement = propQueue[index].treeElement;
-    var path = propQueue[index].path;
-    var expectations = propQueue[index].expectations;
-    index++;
-
-    // Expand the property.
-    test._hookGetPropertiesCallback(function() {
-          checkProperty(treeElement, path, expectations);
-        },
-        function() {
-          treeElement.expand();
-        });
-  }
-
-  function checkProperty(treeElement, path, expectations) {
-    for (var i = 0; i < expectations.length; i += 3) {
-      var name = expectations[i];
-      var description = expectations[i+1];
-      var value = expectations[i+2];
-
-      var propertyPath = path + '.' + name;
-      var propertyTreeElement = test._findChildProperty(
-          treeElement, name, path);
-      test.assertTrue(propertyTreeElement,
-          'Property "' + propertyPath + '" not found.');
-      test.assertEquals(description,
-          propertyTreeElement.property.value.description,
-          'Unexpected "' + propertyPath + '" description.');
-      if (value) {
-        // Schedule property content check.
-        propQueue.push({
-          treeElement: propertyTreeElement,
-          path: propertyPath,
-          expectations: value,
-        });
-      }
-    }
-    // Check next property in the queue.
-    expandAndCheckNextProperty();
-  }
-
-  test.takeControl();
-};
-
-
-/**
- * Tests 'Pause' button will pause debugger when a snippet is evaluated.
- */
-TestSuite.prototype.testPauseInEval = function() {
-  this.showPanel('scripts');
-
-  var test = this;
-
-  var pauseButton = document.getElementById('scripts-pause');
-  pauseButton.click();
-
-  devtools.tools.evaluateJavaScript('fib(10)');
-
-  this.addSniffer(WebInspector, 'pausedScript',
-      function() {
-        test.releaseControl();
-      });
-
-  test.takeControl();
-};
-
-
-/**
- * Key event with given key identifier.
- */
-TestSuite.createKeyEvent = function(keyIdentifier) {
-  var evt = document.createEvent('KeyboardEvent');
-  evt.initKeyboardEvent('keydown', true /* can bubble */, true /* can cancel */,
-                        null /* view */, keyIdentifier, "");
-  return evt;
-};
-
-
-/**
- * Tests console eval.
- */
-TestSuite.prototype.testConsoleEval = function() {
-  var test = this;
-  this.evaluateInConsole_('123',
-      function(resultText) {
-        test.assertEquals('123', resultText);
-        test.releaseControl();
-      });
-
-  this.takeControl();
-};
-
-
-/**
- * Tests console log.
- */
-TestSuite.prototype.testConsoleLog = function() {
-  WebInspector.console.visible = true;
-  var messages = WebInspector.console.messages;
-  var index = 0;
-
-  var test = this;
-  var assertNext = function(line, message, opt_class, opt_count, opt_substr) {
-    var elem = messages[index++].toMessageElement();
-    var clazz = elem.getAttribute('class');
-    var expectation = (opt_count || '') + 'console_test_page.html:' +
-        line + message;
-    if (opt_substr) {
-      test.assertContains(elem.textContent, expectation);
-    } else {
-      test.assertEquals(expectation, elem.textContent);
-    }
-    if (opt_class) {
-      test.assertContains(clazz, 'console-' + opt_class);
-    }
-  };
-
-  assertNext('5', 'log', 'log-level');
-  assertNext('7', 'debug', 'log-level');
-  assertNext('9', 'info', 'log-level');
-  assertNext('11', 'warn', 'warning-level');
-  assertNext('13', 'error', 'error-level');
-  assertNext('15', 'Message format number 1, 2 and 3.5');
-  assertNext('17', 'Message format for string');
-  assertNext('19', 'Object Object');
-  assertNext('22', 'repeated', 'log-level', 5);
-  assertNext('26', 'count: 1');
-  assertNext('26', 'count: 2');
-  assertNext('29', 'group', 'group-title');
-  index++;
-  assertNext('33', 'timer:', 'log-level', '', true);
-  assertNext('35', '1 2 3', 'log-level');
-  assertNext('37', 'HTMLDocument', 'log-level');
-  assertNext('39', '<html>', 'log-level', '', true);
-};
-
-
-/**
- * Tests eval of global objects.
- */
-TestSuite.prototype.testEvalGlobal = function() {
-  WebInspector.console.visible = true;
-
-  var inputs = ['foo', 'foobar'];
-  var expectations = ['foo', 'fooValue',
-                      'foobar', 'ReferenceError: foobar is not defined'];
-
-  // Do not change code below - simply add inputs and expectations above.
-  var initEval = function(input) {
-    WebInspector.console.prompt.text = input;
-    WebInspector.console.promptElement.dispatchEvent(
-        TestSuite.createKeyEvent('Enter'));
-  };
-  var test = this;
-  var messagesCount = 0;
-  var inputIndex = 0;
-  this.addSniffer(WebInspector.ConsoleView.prototype, 'addMessage',
-      function(commandResult) {
-        messagesCount++;
-        if (messagesCount == expectations.length) {
-          var messages = WebInspector.console.messages;
-          for (var i = 0; i < expectations; ++i) {
-            var elem = messages[i++].toMessageElement();
-            test.assertEquals(elem.textContent, expectations[i]);
-          }
-          test.releaseControl();
-        } else if (messagesCount % 2 == 0) {
-          initEval(inputs[inputIndex++]);
-        }
-      }, true);
-
-  initEval(inputs[inputIndex++]);
-  this.takeControl();
-};
-
-
-/**
- * Tests that Storage panel can be open and that local DOM storage is added
- * to the panel.
- */
-TestSuite.prototype.testShowStoragePanel = function() {
-  var test = this;
-  this.addSniffer(WebInspector.panels.storage, 'addDOMStorage',
-      function(storage) {
-        var orig = storage.getEntries;
-        storage.getEntries = function(callback) {
-          orig.call(this, function(entries) {
-            callback(entries);
-            test.releaseControl();
-          });
-        };
-        try {
-          WebInspector.currentPanel.selectDOMStorage(storage.id);
-          storage.getEntries = orig;
-        } catch (e) {
-          test.fail('Exception in selectDOMStorage: ' + e);
-        }
-      });
-  this.showPanel('storage');
-
-  // Access localStorage so that it's pushed to the frontend.
-  this.evaluateInConsole_(
-      'setTimeout("localStorage.x = 10" , 0)',
-      function(resultText) {
-        test.assertTrue(!isNaN(resultText),
-                        'Failed to get timer id: ' + resultText);
-      });
-
-  // Wait until DOM storage is added to the panel.
-  this.takeControl();
-};
-
-
-/**
- * Test runner for the test suite.
- */
-var uiTests = {};
-
-
-/**
- * Run each test from the test suit on a fresh instance of the suite.
- */
-uiTests.runAllTests = function() {
-  // For debugging purposes.
-  for (var name in TestSuite.prototype) {
-    if (name.substring(0, 4) == 'test' &&
-        typeof TestSuite.prototype[name] == 'function') {
-      uiTests.runTest(name);
-    }
-  }
-};
-
-
-/**
- * Run specified test on a fresh instance of the test suite.
- * @param {string} name Name of a test method from TestSuite class.
- */
-uiTests.runTest = function(name) {
-  new TestSuite().runTest(name);
-};
-
-
-}
-
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.css b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.css
deleted file mode 100644
index b676175..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.css
+++ /dev/null
@@ -1,3760 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Anthony Ricaud <[email protected]>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-body {
-    cursor: default;
-    height: 100%;
-    width: 100%;
-    overflow: hidden;
-    font-family: Lucida Grande, sans-serif;
-    font-size: 10px;
-    margin: 0;
-    -webkit-text-size-adjust: none;
-    -webkit-user-select: none;
-}
-
-* {
-    -webkit-box-sizing: border-box;
-}
-
-:focus {
-    outline: none;
-}
-
-input[type="search"]:focus, input[type="text"]:focus {
-    outline: auto 5px -webkit-focus-ring-color;
-}
-
-iframe, a img {
-    border: none;
-}
-
-img {
-    -webkit-user-drag: none;
-}
-
-.hidden {
-    display: none !important;
-}
-
-#toolbar {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 56px;
-    display: -webkit-box;
-    padding: 0 5px;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(191, 191, 191)), to(rgb(151, 151, 151)));
-    border-bottom: 1px solid rgb(80, 80, 80);
-    -webkit-box-orient: horizontal;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-body.inactive #toolbar {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(207, 207, 207)));
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-}
-
-body.detached.platform-mac-leopard #toolbar {
-    background: transparent !important;
-}
-
-body.attached #toolbar {
-    height: 34px;
-    border-top: 1px solid rgb(100, 100, 100);
-    cursor: row-resize;
-    padding-left: 0;
-}
-
-body.attached.port-qt #toolbar {
-    cursor: auto;
-}
-
-body.attached.inactive #toolbar {
-    border-top: 1px solid rgb(64%, 64%, 64%);
-}
-
-.toolbar-item {
-    display: -webkit-box;
-    padding: 4px 6px;
-    margin: 0;
-    background-color: transparent;
-    border-style: none;
-    border-color: transparent;
-    -webkit-box-orient: vertical;
-    -webkit-box-align: center;
-    -webkit-box-pack: end;
-}
-
-.toolbar-item.toggleable.toggled-on {
-    border-width: 0 2px 0 2px;
-    padding: 4px 4px;
-    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;
-}
-
-.toolbar-item.flexable-space {
-    -webkit-box-flex: 1;
-    visibility: hidden;
-}
-
-.toolbar-item input {
-    margin-bottom: 8px;
-}
-
-.toolbar-icon {
-    display: inline-block;
-    width: 32px;
-    height: 32px;
-    -webkit-background-size: 100% auto;
-}
-
-body.attached .toolbar-icon {
-    width: 24px;
-    height: 24px;
-    vertical-align: middle;
-}
-
-.toolbar-item:active .toolbar-icon {
-    background-position: 0 32px;
-}
-
-body.attached .toolbar-item:active .toolbar-icon {
-    background-position: 0 24px;
-}
-
-.toolbar-label {
-    font-size: 11px;
-    font-family: Lucida Grande, sans-serif;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-}
-
-.toolbar-item.toggleable:active .toolbar-label {
-    text-shadow: none;
-}
-
-body.attached .toolbar-label {
-    display: inline-block;
-    vertical-align: middle;
-    margin-left: 3px;
-}
-
-body.attached #search-toolbar-label {
-    display: none;
-}
-
-#search {
-    width: 205px;
-    font-size: 16px;
-    margin-bottom: 5px;
-}
-
-body.attached #search {
-    font-size: 11px;
-    margin-bottom: 8px;
-}
-
-#search-results-matches {
-    font-size: 11px;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-    margin-bottom: 22px;
-}
-
-body.attached #search-results-matches {
-    margin-bottom: 6px;
-}
-
-.toolbar-item.elements .toolbar-icon {
-    background-image: url(Images/elementsIcon.png);
-}
-
-.toolbar-item.resources .toolbar-icon {
-    background-image: url(Images/resourcesIcon.png);
-}
-
-.toolbar-item.scripts .toolbar-icon {
-    background-image: url(Images/scriptsIcon.png);
-}
-
-.toolbar-item.timeline .toolbar-icon {
-    background-image: url(Images/timelineIcon.png);
-}
-
-.toolbar-item.storage .toolbar-icon {
-    background-image: url(Images/storageIcon.png);
-}
-
-.toolbar-item.profiles .toolbar-icon {
-    background-image: url(Images/profilesIcon.png);
-}
-
-.toolbar-item.console .toolbar-icon {
-    background-image: url(Images/consoleIcon.png);
-}
-
-#close-button-left, #close-button-right {
-    width: 14px;
-    height: 14px;
-    background-image: url(Images/closeButtons.png);
-    background-position: 0 0;
-    background-color: transparent;
-    border: 0 none transparent;
-    margin: 5px 0;
-}
-
-#close-button-left:hover, #close-button-right:hover {
-    background-position: 14px 0;
-}
-
-#close-button-left:active, #close-button-right:active {
-    background-position: 28px 0;
-}
-
-body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {
-    display: none;
-}
-
-body.attached.port-qt .toolbar-item.close-left, body.attached.port-qt .toolbar-item.close-right {
-    display: none;
-}
-
-body.platform-mac-tiger .toolbar-item.close-right, body.platform-mac-leopard .toolbar-item.close-right { 
-    display: none;
-}
-
-body:not(.platform-mac-tiger):not(.platform-mac-leopard) .toolbar-item.close-left { 
-    display: none;
-}
-
-#main {
-    position: absolute;
-    z-index: 1;
-    top: 56px;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    overflow: hidden;
-    background-color: white;
-}
-
-body.attached #main {
-    top: 34px;
-}
-
-#main-panels {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 23px;
-    overflow: hidden;
-}
-
-#main-status-bar {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-}
-
-body.drawer-visible #main-status-bar {
-    height: 24px;
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackground.png);
-    background-repeat: no-repeat, repeat-x;
-    background-position: right center, center;
-    cursor: row-resize;
-}
-
-body.drawer-visible #main-status-bar * {
-    cursor: default;
-}
-
-body.drawer-visible #main-panels {
-    bottom: 24px;
-}
-
-.status-bar {
-    background-color: rgb(235, 235, 235);
-    background-image: url(Images/statusbarBackground.png);
-    background-repeat: repeat-x;
-    white-space: nowrap;
-    height: 23px;
-    overflow: hidden;
-    z-index: 12;
-}
-
-.status-bar > div {
-    display: inline-block;
-    vertical-align: top;
-}
-
-.status-bar-item {
-    display: inline-block;
-    height: 24px;
-    padding: 0;
-    margin-left: -1px;
-    margin-right: 0;
-    vertical-align: top;
-    border: 0 transparent none;
-    background-color: transparent;
-}
-
-.status-bar-item:active {
-    position: relative;
-    z-index: 200;
-}
-
-.glyph {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.75);
-    z-index: 1;
-}
-
-.glyph.shadow {
-    top: 1px;
-    background-color: white !important;
-    z-index: 0;
-}
-
-button.status-bar-item {
-    position: relative;
-    width: 32px;
-    background-image: url(Images/statusbarButtons.png);
-    background-position: 0 0;
-}
-
-button.status-bar-item:active {
-    background-position: 32px 0 !important;
-}
-
-button.status-bar-item .glyph.shadow {
-    background-color: rgba(255, 255, 255, 0.33) !important;
-}
-
-button.status-bar-item.toggled-on .glyph {
-    background-color: rgb(66, 129, 235);
-}
-
-button.status-bar-item:disabled {
-    opacity: 0.5;
-    background-position: 0 0 !important;
-}
-
-select.status-bar-item {
-    min-width: 48px;
-    border-width: 0 17px 0 2px;
-    padding: 0 2px 0 6px;
-    font-weight: bold;
-    color: rgb(48, 48, 48);
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-    -webkit-border-image: url(Images/statusbarMenuButton.png) 0 17 0 2;
-    -webkit-border-radius: 0;
-    -webkit-appearance: none;
-}
-
-select.status-bar-item:active {
-    color: black;
-    -webkit-border-image: url(Images/statusbarMenuButtonSelected.png) 0 17 0 2;
-}
-
-#dock-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/undockButtonGlyph.png);
-}
-
-body.detached #dock-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/dockButtonGlyph.png);
-}
-
-body.port-qt #dock-status-bar-item {
-    display: none
-}
-
-#console-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png);
-}
-
-#clear-console-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#changes-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png); /* TODO: Needs Image for Changes Toggle Button */
-}
-
-#clear-changes-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-#count-items {
-    position: absolute;
-    right: 16px;
-    top: 0;
-    cursor: pointer;
-    padding: 6px 2px;
-    font-size: 10px;
-    height: 19px;
-}
-
-#changes-count, #error-warning-count {
-    display: inline;
-}
-
-#error-warning-count:hover, #changes-count:hover {
-    border-bottom: 1px solid rgb(96, 96, 96);
-}
-
-#style-changes-count::before {
-    content: url(Images/styleIcon.png); /* TODO: Needs Image for Style Changes Icon */
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-
-#error-count::before {
-    content: url(Images/errorIcon.png);
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-    
-#changes-count + #error-warning-count, #error-count + #warning-count {
-    margin-left: 6px;
-}
-
-#warning-count::before {
-    content: url(Images/warningIcon.png);
-    width: 10px;
-    height: 10px;
-    vertical-align: -1px;
-    margin-right: 2px;
-}
-
-#drawer {
-    display: none;
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: 200px;
-    background-color: white;
-    background-image: url(Images/statusbarBottomBackground.png);
-    background-repeat: repeat-x;
-    background-position: bottom;
-}
-
-body.drawer-visible #drawer {
-    display: block;
-}
-
-#drawer-status-bar {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    background: none;
-}
-
-#console-messages {
-    position: absolute;
-    z-index: 0;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 23px;
-    font-size: initial;
-    font-family: monospace;
-    padding: 2px 0;
-    overflow-y: overlay;
-    word-wrap: break-word;
-    -webkit-user-select: text;
-    -webkit-text-size-adjust: auto;
-}
-
-#console-prompt {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-    white-space: pre-wrap;
-    -webkit-user-modify: read-write-plaintext-only;
-}
-
-#console-prompt::before {
-    background-image: url(Images/userInputIcon.png);
-}
-
-.console-user-command-result.console-log-level::before {
-    background-image: url(Images/userInputResultIcon.png);
-}
-
-.console-message, .console-user-command {
-    position: relative;
-    border-bottom: 1px solid rgb(240, 240, 240);
-    padding: 1px 22px 1px 24px;
-    min-height: 16px;
-}
-
-.console-adjacent-user-command-result {
-    border-bottom: none;
-}
-
-.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {
-    background-image: none;
-}
-
-.console-message::before, .console-user-command::before, #console-prompt::before, .console-group-title::before {
-    position: absolute;
-    display: block;
-    content: "";
-    left: 7px;
-    top: 0.8em;
-    width: 10px;
-    height: 10px;
-    margin-top: -5px;
-    -webkit-user-select: none;
-}
-
-.console-message .bubble {
-    display: inline-block;
-    height: 14px;
-    background-color: rgb(128, 151, 189);
-    vertical-align: middle;
-    white-space: nowrap;
-    padding: 1px 4px;
-    margin-top: -2px;
-    margin-right: 4px;
-    text-align: left;
-    font-size: 11px;
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-    text-shadow: none;
-    color: white;
-    -webkit-border-radius: 7px;
-}
-
-.console-message-text {
-    white-space: pre-wrap;
-}
-
-.repeated-message {
-    padding-left: 6px;
-}
-
-.repeated-message.console-error-level::before, .repeated-message.console-warning-level:before, .repeated-message.console-debug-level:before {
-    visibility: hidden;
-}
-
-.console-group .console-group > .console-group-messages {
-    margin-left: 16px;
-}
-
-.console-group-title {
-    font-weight: bold;
-}
-
-.console-group-title::before {
-    background-image: url(Images/disclosureTriangleSmallDown.png);
-    top: 0.6em;
-    width: 11px;
-    height: 12px;
-}
-
-.console-group.collapsed .console-group-title::before {
-    background-image: url(Images/disclosureTriangleSmallRight.png);
-}
-
-.console-group.collapsed > .console-group-messages {
-    display: none;
-}
-
-.console-error-level .console-message-text {
-    color: red;
-}
-
-.console-debug-level .console-message-text {
-    color: blue;
-}
-
-.console-debug-level::before {
-    background-image: url(Images/searchSmallBrightBlue.png);
-}
-
-.console-error-level::before {
-    background-image: url(Images/errorIcon.png);
-}
-
-.console-warning-level::before {
-    background-image: url(Images/warningIcon.png);
-}
-
-.console-user-command .console-message {
-    margin-left: -24px;
-    padding-right: 0;
-    border-bottom: none;
-}
-
-.console-user-command::before {
-    background-image: url(Images/userInputPreviousIcon.png);
-}
-
-.console-user-command > .console-message-text {
-    color: rgb(0, 128, 255);
-}
-
-#console-messages a {
-    color: rgb(33%, 33%, 33%);
-    cursor: pointer;
-}
-
-#console-messages a:hover {
-    color: rgb(15%, 15%, 15%);
-}
-
-.console-message-url {
-    float: right;
-}
-
-.console-group-messages .section {
-    margin: 0 0 0 12px !important;
-}
-
-.console-group-messages .section .header {
-    padding: 0 8px 0 0;
-    background-image: none;
-    border: none;
-    min-height: 0;
-}
-
-.console-group-messages .section .header::before {
-    position: absolute;
-    top: 1px;
-    left: 1px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.console-group-messages .section.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.console-group-messages .section .header .title {
-    color: black;
-    font-weight: normal;
-}
-
-.console-group-messages .section .properties li .info {
-    padding-top: 0;
-    padding-bottom: 0;
-    color: rgb(60%, 60%, 60%);
-}
-
-.console-group-messages .outline-disclosure {
-    padding-left: 0;
-}
-
-.console-group-messages .outline-disclosure > ol {
-    padding: 0 0 0 12px !important;
-}
-
-.console-group-messages .outline-disclosure, .console-group-messages .outline-disclosure ol {
-    font-size: inherit;
-    line-height: 12px;
-}
-
-.console-group-messages .outline-disclosure.single-node li {
-    padding-left: 2px;
-}
-
-.console-group-messages .outline-disclosure li .selection {
-    margin-left: -6px;
-    margin-right: -6px;
-}
-
-.console-group-messages .add-attribute {
-    display: none;
-}
-
-.console-formatted-object, .console-formatted-node {
-    position: relative;
-    display: inline-block;
-    vertical-align: top;
-}
-
-.console-formatted-object .section, .console-formatted-node .section {
-    position: static;
-}
-
-.console-formatted-object .properties, .console-formatted-node .properties {
-    padding-left: 0 !important;
-}
-
-.console-formatted-number {
-    color: rgb(28, 0, 207);
-}
-
-.console-formatted-string, .console-formatted-regexp {
-    color: rgb(196, 26, 22);
-}
-
-.console-formatted-null, .console-formatted-undefined {
-    color: rgb(128, 128, 128);
-}
-
-.error-message {
-    color: red;
-}
-
-.auto-complete-text {
-    color: rgb(128, 128, 128);
-    -webkit-user-select: none;
-    -webkit-user-modify: read-only;
-}
-
-.panel {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.panel.visible {
-    display: block;
-}
-
-.resource-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    overflow: hidden;
-}
-
-.resource-view.visible {
-    display: block;
-}
-
-.resource-view.headers-visible {
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.resource-view-headers {
-    display: none;
-    padding: 6px;
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-    background-color: white;
-    -webkit-user-select: text;
-}
-
-.resource-view-headers .outline-disclosure .parent {
-    -webkit-user-select: none;
-    font-weight: bold;
-}
-
-.resource-view.headers-visible .resource-view-headers {
-    display: block;
-}
-
-.resource-view-headers .outline-disclosure .children li {
-    white-space: nowrap;
-}
-
-.resource-view-headers .outline-disclosure li.expanded .header-count {
-    display: none;
-}
-
-.resource-view-headers .outline-disclosure .header-name {
-    color: rgb(33%, 33%, 33%);
-    display: inline-block;
-    margin-right: 0.5em;
-    font-weight: bold;
-    vertical-align: top;
-    white-space: pre-wrap;
-}
-
-.resource-view-headers .outline-disclosure .header-value {
-    display: inline;
-    margin-right: 100px;
-    white-space: pre-wrap;
-    word-break: break-all;
-    margin-top: 1px;
-}
-
-.resource-view-headers .outline-disclosure .raw-form-data {
-    white-space:pre-wrap;
-}
-
-.resource-view .resource-view-content {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 0;
-    bottom: 0;
-}
-
-.resource-view.headers-visible .resource-view-content {
-    position: relative;
-    top: auto;
-    right: auto;
-    left: auto;
-    bottom: auto;
-}
-
-.resource-view.headers-visible .source-view-frame {
-    height: auto;
-    vertical-align: top;
-}
-
-.webkit-line-gutter-backdrop {
-    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
-    width: 31px;
-    background-color: rgb(240, 240, 240);
-    border-right: 1px solid rgb(187, 187, 187);
-    position: absolute;
-    z-index: -1;
-    left: 0;
-    top: 0;
-    height: 100%
-}
-
-.resource-view.font .resource-view-content {
-    font-size: 60px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    text-align: center;
-    padding: 15px;
-}
-
-.resource-view.image .resource-view-content > .image {
-    padding: 20px 20px 10px 20px;
-    text-align: center;
-}
-
-.resource-view.image .resource-view-content > .info {
-    padding-bottom: 10px;
-    font-size: 11px;
-    -webkit-user-select: text;
-}
-
-.resource-view.image img.resource-image-view {
-    max-width: 100%;
-    max-height: 1000px;
-    background-image: url(Images/checker.png);
-    -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
-    -webkit-user-select: text;
-    -webkit-user-drag: auto;
-}
-
-.resource-url {
-    vertical-align: middle;
-}
-
-.resource-status-image {
-    margin-top: -3px;
-    vertical-align: middle;
-}
-
-.resource-view.image .title {
-    text-align: center;
-    font-size: 13px;
-}
-
-.resource-view.image .infoList {
-    margin: 0;
-}
-
-.resource-view.image .infoList dt {
-    font-weight: bold;
-    display: inline-block;
-    width: 50%;
-    text-align: right;
-    color: rgb(76, 76, 76);
-}
-
-.resource-view.image .infoList dd {
-    display: inline-block;
-    padding-left: 8px;
-    width: 50%;
-    text-align: left;
-    margin: 0;
-}
-
-.resource-view.image .infoList dd::after {
-    white-space: pre;
-    content: "\A";
-}
-
-#elements-content {
-    display: block;
-    overflow: auto;
-    padding: 0;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 225px;
-    bottom: 0;
-}
-
-#elements-sidebar {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    width: 225px;
-    background-color: rgb(245, 245, 245);
-    border-left: 1px solid rgb(64%, 64%, 64%);
-    cursor: default;
-    overflow: auto;
-}
-
-.crumbs {
-    display: inline-block;
-    font-size: 11px;
-    line-height: 19px;
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-    color: rgb(20, 20, 20);
-    margin-left: -1px;
-    padding-right: 12px;
-}
-
-.crumbs .crumb {
-    height: 24px;
-    border-width: 0 12px 0 2px;
-    -webkit-border-image: url(Images/segment.png) 0 12 0 2;
-    margin-right: -12px;
-    padding-left: 18px;
-    padding-right: 2px;
-    white-space: nowrap;
-    line-height: 23px;
-    float: right;
-}
-
-.crumbs .crumb.collapsed > * {
-    display: none;
-}
-
-.crumbs .crumb.collapsed::before {
-    content: "\2026";
-    font-weight: bold;
-}
-
-.crumbs .crumb.compact .extra {
-    display: none;
-}
-
-.crumbs .crumb.dimmed {
-    color: rgba(0, 0, 0, 0.45);
-}
-
-.crumbs .crumb.start {
-    padding-left: 7px;
-}
-
-.crumbs .crumb.end {
-    border-width: 0 2px 0 2px;
-    padding-right: 6px;
-    -webkit-border-image: url(Images/segmentEnd.png) 0 2 0 2;
-}
-
-.crumbs .crumb.selected {
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
-    color: black;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-}
-
-.crumbs .crumb.selected:hover {
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
-}
-
-.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
-    -webkit-border-image: url(Images/segmentSelectedEnd.png) 0 2 0 2;
-}
-
-.crumbs .crumb:hover {
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
-    color: black;
-}
-
-.crumbs .crumb.dimmed:hover {
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
-    color: rgba(0, 0, 0, 0.75);
-}
-
-.crumbs .crumb.end:hover {
-    -webkit-border-image: url(Images/segmentHoverEnd.png) 0 2 0 2;
-}
-
-.outline-disclosure li.hovered:not(.selected) .selection {
-    display: block;
-    left: 3px;
-    right: 3px;
-    background-color: rgba(56, 121, 217, 0.1);
-    -webkit-border-radius: 5px;
-}
-
-.outline-disclosure li.highlighted .highlight {
-    background-color: rgb(255, 230, 179);
-    -webkit-border-radius: 4px;
-    padding-bottom: 2px;
-    margin-bottom: -2px;
-}
-
-.outline-disclosure li.selected.highlighted .highlight {
-    background-color: transparent;
-    padding-bottom: 0;
-    margin-bottom: 0;
-}
-
-.outline-disclosure li .selection {
-    display: none;
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 15px;
-    z-index: -1;
-}
-
-.outline-disclosure li.selected .selection {
-    display: block;
-    background-color: rgb(212, 212, 212);
-}
-
-.outline-disclosure ol:focus li.selected .selection {
-    background-color: rgb(56, 121, 217);
-}
-
-.outline-disclosure {
-    font-size: 11px;
-}
-
-.outline-disclosure > ol {
-    position: relative;
-    padding: 2px 6px !important;
-    margin: 0;
-    color: black;
-    cursor: default;
-    min-width: 100%;
-}
-
-.outline-disclosure, .outline-disclosure ol {
-    list-style-type: none;
-    -webkit-padding-start: 12px;
-    margin: 0;
-}
-
-.source-code {
-    font-family: monospace;
-    font-size: medium;
-    white-space: pre-wrap;
-}
-
-body.platform-windows .source-code {
-    font-family: Consolas, Lucida Console, monospace;
-    font-size: 12px;
-}
-
-.outline-disclosure li {
-    padding: 0 0 0 14px;
-    margin-top: 1px;
-    margin-bottom: 1px;
-    word-wrap: break-word;
-    text-indent: -2px;
-}
-
-.resources .outline-disclosure li {
-    text-indent: -1px;
-}
-
-.outline-disclosure ol:focus li.selected {
-    color: white;
-}
-
-.outline-disclosure ol:focus li.selected * {
-    color: inherit;
-}
-
-.outline-disclosure li.parent {
-    text-indent: -12px
-}
-
-.outline-disclosure li .webkit-html-tag.close {
-    margin-left: -12px;
-}
-
-.outline-disclosure li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-    float: left;
-    width: 8px;
-    height: 8px;
-    margin-top: 1px;
-    padding-right: 2px;
-}
-
-.outline-disclosure li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.outline-disclosure ol:focus li.parent.selected::before {
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.outline-disclosure li.parent.expanded::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.outline-disclosure ol:focus li.parent.expanded.selected::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.outline-disclosure ol.children {
-    display: none;
-}
-
-.outline-disclosure ol.children.expanded {
-    display: block;
-}
-
-.webkit-html-comment {
-    /* Keep this in sync with view-source.css (.webkit-html-comment) */
-    color: rgb(35, 110, 37);
-}
-
-.webkit-html-tag {
-    /* Keep this in sync with view-source.css (.webkit-html-tag) */
-    color: rgb(136, 18, 128);
-}
-
-.webkit-html-doctype {
-    /* Keep this in sync with view-source.css (.webkit-html-doctype) */
-    color: rgb(192, 192, 192);
-}
-
-.webkit-html-attribute-name {
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
-    color: rgb(153, 69, 0);
-}
-
-.webkit-html-attribute-value {
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
-    color: rgb(26, 26, 166);
-}
-
-.webkit-html-external-link, .webkit-html-resource-link {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */
-    color: #00e;
-}
-
-.webkit-html-external-link {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link) */
-    text-decoration: none;
-}
-
-.webkit-html-external-link:hover {
-    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */
-    text-decoration: underline;
-}
-
-.add-attribute {
-    margin-left: 1px;
-    margin-right: 1px;
-    white-space: nowrap;
-}
-
-.placard {
-    position: relative;
-    margin-top: 1px;
-    padding: 3px 8px 4px 18px;
-    min-height: 18px;
-    white-space: nowrap;
-}
-
-.placard:nth-of-type(2n) {
-    background-color: rgb(234, 243, 255);
-}
-
-.placard.selected {
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-:focus .placard.selected {
-    border-top: 1px solid rgb(68, 128, 200);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
-}
-
-body.inactive .placard.selected {
-    border-top: 1px solid rgb(151, 151, 151);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
-}
-
-.placard .title {
-    color: black;
-    font-weight: normal;
-    word-wrap: break-word;
-    white-space: normal;
-}
-
-.placard.selected .title {
-    color: white;
-    font-weight: bold;
-}
-
-.placard .subtitle {
-    float: right;
-    font-size: 10px;
-    margin-left: 5px;
-    max-width: 55%;
-    color: rgba(0, 0, 0, 0.7);
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.placard.selected .subtitle {
-    color: rgba(255, 255, 255, 0.7);
-}
-
-.placard .subtitle a {
-    color: inherit;
-}
-
-.section {
-    position: relative;
-    margin-top: 1px;
-}
-
-.section:nth-last-of-type(1), .event-bar:nth-last-of-type(1) {
-    margin-bottom: 1px;
-}
-
-.watch-expressions-buttons-container {
-    text-align: center;
-}
-
-.event-bar:first-child {
-    margin-top: 1px;
-}
-
-.event-bar:nth-last-of-type(1) .header {
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.section .header {
-    padding: 2px 8px 4px 18px;
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    min-height: 18px;
-    white-space: nowrap;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.section.no-affect .header {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(167, 167, 167)), to(rgb(123, 123, 123)))
-}
-
-.section .header::before {
-    position: absolute;
-    top: 4px;
-    left: 7px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.section.blank-section .header::before {
-    display: none;
-}
-
-.section.expanded .header::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.section .header .title, .event-bar .header .title {
-    color: white;
-    font-weight: bold;
-    word-wrap: break-word;
-    white-space: normal;
-}
-
-.section .header .title.blank-title {
-    font-style: italic;
-}
-
-.section .header label, .event-bar .header label {
-    display: none;
-}
-
-.section.expanded .header label, .event-bar.expanded .header label {
-    display: inline;
-}
-
-.section .header input[type=checkbox] {
-    height: 10px;
-    width: 10px;
-    margin-left: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: 2px;
-}
-
-.section .header .subtitle, .event-bar .header .subtitle {
-    float: right;
-    font-size: 10px;
-    margin-left: 5px;
-    max-width: 55%;
-    color: rgba(255, 255, 255, 0.7);
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.section .header .subtitle a {
-    color: inherit;
-}
-
-.section .properties, .event-bar .event-properties {
-    display: none;
-    margin: 0;
-    padding: 2px 6px 3px;
-    list-style: none;
-    background-color: white;
-    min-height: 18px;
-}
-
-.section.no-affect .properties li {
-    opacity: 0.5;
-}
-
-.section.no-affect .properties li.editing {
-    opacity: 1.0;
-}
-
-.section.expanded .properties, .event-bar.expanded .event-properties {
-    display: block;
-}
-
-.section .properties li, .event-properties li {
-    margin-left: 12px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    -webkit-user-select: text;
-    cursor: auto;
-}
-
-.section .properties li.parent, .event-properties li.parent {
-    margin-left: 1px;
-}
-
-.section .properties ol, .event-properties ol {
-    display: none;
-    margin: 0;
-    -webkit-padding-start: 12px;
-    list-style: none;
-}
-
-.section .properties ol.expanded, .event-properties ol.expanded {
-    display: block;
-}
-
-.section .properties li.parent::before, .event-properties li.parent::before {
-    content: url(Images/treeRightTriangleBlack.png);
-    opacity: 0.75;
-    float: left;
-    width: 8px;
-    height: 8px;
-    margin-top: 0;
-    padding-right: 3px;
-    -webkit-user-select: none;
-    cursor: default;
-}
-
-.section .properties li.parent.expanded::before, .event-properties li.parent.expanded::before {
-    content: url(Images/treeDownTriangleBlack.png);
-    margin-top: 1px;
-}
-
-.section .properties li .info, .event-properties li .info {
-    padding-top: 4px;
-    padding-bottom: 3px;
-}
-
-.section .event-bars {
-    display: none;
-}
-
-.section.expanded .event-bars {
-    display: block;
-}
-
-.event-bar {
-    position: relative;
-}
-
-.event-bar-connector {
-    position: absolute;
-    left: 75%;
-    bottom: -7px;
-    margin-left: -7px;
-    content: url(Images/grayConnectorPoint.png);
-    z-index: 3;
-}
-
-.event-bar.expanded .event-bar-connector {
-    content: url(Images/whiteConnectorPoint.png);
-}
-
-.event-bars .event-bar .header {
-    padding: 2px 8px 4px 18px;
-    border-top: 1px solid rgb(163, 163, 163);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), to(rgb(207, 207, 207)));
-    min-height: 18px;
-    white-space: nowrap;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.event-bars .event-bar.expanded .header {
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.event-bars .event-bar .header .title {
-    font-weight: bold;
-    color: #333;
-    text-shadow: white 0 1px 0; 
-}
-
-.event-bars .event-bar .header .subtitle {
-    color: rgba(90, 90, 90, 0.75);
-}
-
-.event-bars .event-bar .header::before {
-    position: absolute;
-    top: 4px;
-    left: 7px;
-    width: 8px;
-    height: 8px;
-    opacity: 0.75;
-    content: url(Images/treeRightTriangleBlack.png);
-}
-
-.event-bars .event-bar.expanded .header::before {
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-.editing {
-    -webkit-user-select: text;
-    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
-    outline: 1px solid rgb(66%, 66%, 66%) !important;
-    background-color: white;
-    -webkit-user-modify: read-write-plaintext-only;
-    text-overflow: clip;
-    padding-left: 2px;
-    margin-left: -2px;
-    padding-right: 2px;
-    margin-right: -2px;
-    margin-bottom: -1px;
-    padding-bottom: 1px;
-    opacity: 1.0 !important;
-}
-
-.editing, .editing * {
-    color: black !important;
-    text-decoration: none !important;
-}
-
-.elements-tree-editor {
-    -webkit-user-select: text;
-    -webkit-user-modify: read-write-plaintext-only;
-}
-
-.section .properties li.editing {
-    margin-left: 10px;
-    text-overflow: clip;
-}
-
-li.editing .swatch, li.editing .enabled-button,  li.editing-sub-part .delete-button {
-    display: none !important;
-}
-
-.watch-expressions > li.editing-sub-part .name {
-    display: block; 
-    width: 100%;
-}
-
-.watch-expressions > li.editing-sub-part .value, .watch-expressions > li.editing-sub-part .separator  {
-    display: none;
-}
-
-.watch-expressions-error-level {
-    color: red;
-}
-
-.section .properties li.editing-sub-part {
-    padding: 3px 6px 8px 18px;
-    margin: -3px -6px -8px -6px;
-    text-overflow: clip;
-}
-
-.section .properties .overloaded, .section .properties .disabled {
-    text-decoration: line-through;
-}
-
-.section.computed-style .properties .disabled {
-    text-decoration: none;
-    opacity: 0.5;
-}
-
-.section .properties .implicit, .section .properties .inherited {
-    opacity: 0.5;
-}
-
-.section:not(.show-inherited) .properties .inherited {
-    display: none;
-}
-
-.section .properties .enabled-button {
-    display: none;
-    float: right;
-    font-size: 10px;
-    margin: 0 0 0 4px;
-    vertical-align: top;
-    position: relative;
-    z-index: 1;
-}
-
-/* FIXME: need a better icon (comment in bug 27514) */
-.section .properties .delete-button {
-    width: 10px;
-    height: 10px;
-    background-image: url(Images/errorIcon.png);
-    background-position: 0 0;
-    background-color: transparent;
-    background-repeat: no-repeat;
-    border: 0 none transparent;
-}
-
-.section:hover .properties .enabled-button {
-    display: block;
-}
-
-.section .properties .name, .event-properties .name {
-    color: rgb(136, 19, 145);
-}
-
-.section .properties .value.dimmed {
-    color: rgb(100, 100, 100);
-}
-
-.section .properties .number, .event-properties .number {
-    color: blue;
-}
-
-.section .properties .priority {
-    color: rgb(128, 0, 0);
-}
-
-.section .properties .keyword, .event-properties .keyword {
-    color: rgb(136, 19, 79);
-}
-
-.section .properties .color, .event-properties .color {
-    color: rgb(118, 15, 21);
-}
-
-.swatch {
-    display: inline-block;
-    vertical-align: baseline;
-    margin-left: 1px;
-    margin-right: 2px;
-    margin-bottom: -1px;
-    width: 1em;
-    height: 1em;
-    border: 1px solid rgba(128, 128, 128, 0.6);
-}
-
-.swatch:hover {
-    border: 1px solid rgba(64, 64, 64, 0.8);
-}
-
-.pane:not(.expanded) + .pane, .pane:first-of-type {
-    margin-top: -1px;
-}
-
-.pane > .title {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));
-    height: 20px;
-    padding: 0 5px;
-    border-top: 1px solid rgb(189, 189, 189);
-    border-bottom: 1px solid rgb(189, 189, 189);
-    font-weight: bold;
-    font-size: 12px;
-    line-height: 18px;
-    color: rgb(110, 110, 110);
-    text-shadow: white 0 1px 0;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-.pane > .title:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(231, 231, 231)), color-stop(0.05, rgb(231, 231, 231)), color-stop(0.05, rgb(207, 207, 207)), to(rgb(186, 186, 186)));
-    border-top: 1px solid rgb(178, 178, 178);
-    border-bottom: 1px solid rgb(178, 178, 178);
-}
-
-.pane > .title::before {
-    content: url(Images/disclosureTriangleSmallRightBlack.png);
-    float: left;
-    width: 11px;
-    height: 12px;
-    margin-right: 2px;
-    margin-top: 1px;
-}
-
-.pane.expanded > .title::before {
-    content: url(Images/disclosureTriangleSmallDownBlack.png);
-}
-
-.pane > .title > select {
-    display: none;
-    float: right;
-    width: 23px;
-    height: 17px;
-    color: transparent;
-    background-color: transparent;
-    border: none;
-    background-image: url(Images/paneSettingsButtons.png);
-    background-repeat: no-repeat;
-    margin: 1px 0 0 0;
-    padding: 0;
-    -webkit-border-radius: 0;
-    -webkit-appearance: none;
-}
-
-.pane.expanded:hover > .title > select {
-    display: inline-block;
-}
-
-.pane > .title > select:hover {
-    background-position: -23px 0px;
-}
-
-.pane > .title > select:active {
-    background-position: -46px 0px;
-}
-
-.pane > .title > select > option, .pane > .title > select > hr {
-    color: black;
-}
-
-.pane > .body {
-    position: relative;
-    display: none;
-    background-color: white;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.pane > .body .info {
-    text-align: center;
-    font-style: italic;
-    font-size: 10px;
-    padding: 6px;
-    color: gray;
-}
-
-.pane.expanded > .body, .pane.expanded > .growbar {
-    display: block;
-}
-
-.pane.expanded:nth-last-of-type(1) {
-    border-bottom: 1px solid rgb(189, 189, 189);
-}
-
-.pane > .growbar {
-    display: none;
-    background-image: url(Images/paneGrowHandleLine.png), url(Images/paneBottomGrow.png);
-    background-repeat: no-repeat, repeat-x;
-    background-position: center center, bottom;
-    height: 5px;
-}
-
-.metrics {
-    padding: 8px;
-    font-size: 10px;
-    text-align: center;
-    white-space: nowrap;
-}
-
-.metrics .label {
-    position: absolute;
-    margin-top: -10px;
-    font-size: 9px;
-    color: grey;
-    background-color: white;
-    margin-left: 3px;
-    padding-left: 2px;
-    padding-right: 2px;
-}
-
-.metrics .position {
-    border: 1px rgb(66%, 66%, 66%) dotted;
-    display: inline-block;
-    text-align: center;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .margin {
-    border: 1px dashed;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .border {
-    border: 1px black solid;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .padding {
-    border: 1px grey dashed;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-}
-
-.metrics .content {
-    position: static;
-    border: 1px grey solid;
-    display: inline-block;
-    text-align: center;
-    vertical-align: middle;
-    padding: 3px;
-    margin: 3px;
-    min-width: 80px;
-    text-align: center;
-    overflow: visible;
-}
-
-.metrics .content span {
-    display: inline-block;
-}
-
-.metrics .editing {
-    position: relative;
-    z-index: 100;
-}
-
-.metrics .left {
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.metrics .right {
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.metrics .top {
-    display: inline-block;
-}
-
-.metrics .bottom {
-    display: inline-block;
-}
-
-.sidebar {
-    position: absolute;
-    top: 0;
-    min-height: 100%;
-    left: 0;
-    width: 200px;
-    overflow-y: auto;
-    overflow-x: hidden;
-    background-color: rgb(214, 221, 229);
-    border-right: 1px solid rgb(64%, 64%, 64%);
-}
-
-body.inactive .sidebar {
-    background-color: rgb(232, 232, 232);
-}
-
-.database-sidebar-tree-item .icon {
-    content: url(Images/database.png);
-}
-
-.database-table-sidebar-tree-item .icon {
-    content: url(Images/databaseTable.png);
-}
-
-.domstorage-sidebar-tree-item.local-storage .icon {
-    content: url(Images/localStorage.png);
-}
-
-.domstorage-sidebar-tree-item.session-storage .icon {
-    content: url(Images/sessionStorage.png);
-}
-
-.cookie-sidebar-tree-item .icon {
-    content: url(Images/cookie.png);
-}
-
-#storage-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-.storage-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.storage-view.visible {
-    display: block;
-}
-
-.storage-view.table {
-    overflow: hidden;
-}
-
-.storage-view.table .data-grid {
-    border: none;
-    height: 100%;
-}
-
-.storage-view.table .storage-table-empty, .storage-view.table .storage-table-error {
-    position: absolute;
-    top: 0;
-    bottom: 25%;
-    left: 0;
-    right: 0;
-    font-size: 24px;
-    color: rgb(75%, 75%, 75%);
-    margin-top: auto;
-    margin-bottom: auto;
-    height: 50px;
-    line-height: 26px;
-    text-align: center;
-    font-weight: bold;
-    padding: 10px;
-    white-space: pre-wrap;
-}
-
-.storage-view.table .storage-table-error {
-    color: rgb(66%, 33%, 33%);
-}
-
-.data-grid {
-    position: relative;
-    border: 1px solid #aaa;
-}
-
-.data-grid .highlight {
-    background-color: rgb(255, 230, 179);
-}
-
-.data-grid tr.selected .highlight {
-    background-color: transparent;
-}
-
-.data-grid table {
-    table-layout: fixed;
-    border-spacing: 0;
-    border-collapse: collapse;
-    width: 100%;
-    font-size: 10px;
-    font-family: Lucida Grande, sans-serif;
-}
-
-.data-grid .data-container {
-    position: absolute;
-    top: 16px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    padding-right: 14px;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
-    -webkit-background-size: 1px 32px;
-}
-
-.data-grid.inline .data-container {
-    position: static;
-}
-
-.data-grid th {
-    text-align: left;
-    background-image: url(Images/glossyHeader.png);
-    background-repeat: repeat-x;
-    border-right: 1px solid rgb(179, 179, 179);
-    border-bottom: 1px solid rgb(179, 179, 179);
-    height: 15px;
-    font-weight: normal;
-    vertical-align: middle;
-    padding: 0 4px;
-    white-space: nowrap;
-}
-
-.data-grid th.corner {
-    width: 15px;
-    border-right: 0 none transparent;
-}
-
-.data-grid tr.filler {
-    display: table-row !important;
-    height: auto !important;
-}
-
-.data-grid tr.filler td {
-    height: auto !important;
-    padding: 0 !important;
-}
-
-.data-grid table.data {
-    position: absolute;
-    left: 0;
-    top: 0;
-    right: 16px;
-    bottom: 0;
-    height: 100%;
-    border-top: 0 none transparent;
-    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
-    -webkit-background-size: 1px 32px;
-}
-
-.data-grid.inline table.data {
-    position: static;
-}
-
-.data-grid table.data tr {
-    display: none;
-}
-
-.data-grid table.data tr.revealed {
-    display: table-row;
-}
-
-.data-grid td {
-    vertical-align: top;
-    height: 12px;
-    line-height: 12px;
-    padding: 2px 4px;
-    white-space: nowrap;
-    border-right: 1px solid #aaa;
-    -webkit-user-select: text;
-}
-
-.data-grid td > div, .data-grid th > div {
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.data-grid .centered div {
-    text-align: center;
-}
-
-.data-grid .right div {
-    text-align: right;
-}
-
-.data-grid th.sortable div {
-    position: relative;
-}
-
-.data-grid th.sortable:active {
-    background-image: url(Images/glossyHeaderPressed.png);
-}
-
-.data-grid th.sort-ascending, .data-grid th.sort-descending {
-    border-right: 1px solid rgb(107, 140, 196);
-    border-bottom: 1px solid rgb(107, 140, 196);
-    background-image: url(Images/glossyHeaderSelected.png);
-    background-repeat: repeat-x;
-}
-
-.data-grid th.sortable.sort-ascending:active, .data-grid th.sortable.sort-descending:active {
-    background-image: url(Images/glossyHeaderSelectedPressed.png);
-}
-
-.data-grid th.sort-ascending div::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeUpTriangleBlack.png);
-}
-
-.data-grid th.sort-descending div::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    margin-top: 1px;
-    width: 8px;
-    height: 8px;
-    content: url(Images/treeDownTriangleBlack.png);
-}
-
-body.inactive .data-grid th.sort-ascending, body.inactive .data-grid th.sort-descending {
-    background-image: url(Images/glossyHeader.png);
-    border-right: 1px solid rgb(179, 179, 179);
-    border-bottom: 1px solid rgb(179, 179, 179);
-}
-
-.data-grid tr.parent td.disclosure::before {
-    float: left;
-    content: url(Images/treeRightTriangleBlack.png);
-    width: 8px;
-    height: 8px;
-    margin-right: 2px;
-    -webkit-user-select: none;
-}
-
-.data-grid tr.expanded td.disclosure::before {
-    content: url(Images/treeDownTriangleBlack.png);
-    width: 8px;
-    height: 8px;
-    margin-top: 1px;
-}
-
-.data-grid tr.selected {
-    background-color: rgb(212, 212, 212);
-    color: inherit;
-}
-
-.data-grid:focus tr.selected {
-    background-color: rgb(56, 121, 217);
-    color: white;
-}
-
-.data-grid:focus tr.parent.selected td.disclosure::before {
-    content: url(Images/treeRightTriangleWhite.png);
-}
-
-.data-grid:focus tr.expanded.selected td.disclosure::before {
-    content: url(Images/treeDownTriangleWhite.png);
-}
-
-.data-grid tr:not(.parent) td.disclosure {
-    text-indent: 10px;
-}
-
-.data-grid-resizer {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    width: 5px;
-    z-index: 500;
-    cursor: col-resize;
-}
-
-.storage-view.query {
-    font-size: initial;
-    font-family: monospace;
-    padding: 2px 0;
-    overflow-y: overlay;
-    overflow-x: hidden;
-    -webkit-text-size-adjust: auto;
-}
-
-.database-query-prompt {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-    white-space: pre-wrap;
-    -webkit-user-modify: read-write-plaintext-only;
-    -webkit-user-select: text;
-}
-
-.database-user-query::before, .database-query-prompt::before, .database-query-result::before {
-    position: absolute;
-    display: block;
-    content: "";
-    left: 7px;
-    top: 0.8em;
-    width: 10px;
-    height: 10px;
-    margin-top: -5px;
-    -webkit-user-select: none;
-}
-
-.database-query-prompt::before {
-    background-image: url(Images/userInputIcon.png);
-}
-
-.database-user-query {
-    position: relative;
-    border-bottom: 1px solid rgb(245, 245, 245);
-    padding: 1px 22px 1px 24px;
-    min-height: 16px; 
-}
-
-.database-user-query::before {
-    background-image: url(Images/userInputPreviousIcon.png);
-}
-
-.database-query-text {
-    color: rgb(0, 128, 255);
-    -webkit-user-select: text;
-}
-
-.database-query-result {
-    position: relative;
-    padding: 1px 22px 1px 24px;
-    min-height: 16px;
-    margin-left: -24px;
-    padding-right: 0;
-}
-
-.database-query-result.error {
-    color: red;
-    -webkit-user-select: text;
-}
-
-.database-query-result.error::before {
-    background-image: url(Images/errorIcon.png);
-}
-
-.panel-enabler-view {
-    z-index: 1000;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: white;
-    font-size: 13px;
-    text-align: center;
-    overflow-x: hidden;
-    overflow-y: overlay;
-    display: none;
-}
-
-.panel-enabler-view.visible {
-    display: block;
-}
-
-.panel-enabler-view .panel-enabler-view-content {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    max-height: 390px;
-    margin: auto;
-    white-space: nowrap;
-}
-
-.panel-enabler-view h1 {
-    color: rgb(110, 116, 128);
-    font-size: 16px;
-    line-height: 20px;
-    font-weight: normal;
-    margin-top: 0;
-}
-
-.panel-enabler-disclaimer {
-    font-size: 10px;
-    color: rgb(110, 116, 128);
-    margin-bottom: 12px;
-    margin-left: 20px;
-}
-
-.panel-enabler-disclaimer:empty {
-    display: none;
-}
-
-.panel-enabler-view img {
-    height: 100%;
-    min-height: 200px;
-    max-width: 100%;
-    top: 0;
-    bottom: 0;
-    padding: 20px 0 20px 20px;
-    margin: auto;
-    vertical-align: middle;
-}
-
-.panel-enabler-view img.hidden {
-    display: initial !important;
-    width: 0;
-}
-
-.panel-enabler-view form {
-    display: inline-block;
-    vertical-align: middle;
-    width: 330px;
-    margin: 0;
-    padding: 15px;
-    white-space: normal;
-}
-
-.panel-enabler-view label {
-    position: relative;
-    display: block;
-    text-align: left;
-    word-break: break-word;
-    margin: 0 0 5px 20px;
-}
-
-.panel-enabler-view button, .pane button {
-    color: rgb(6, 6, 6);
-    background-color: transparent;
-    border: 1px solid rgb(165, 165, 165);
-    background-color: rgb(237, 237, 237);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 12px;
-    -webkit-appearance: none;
-}
-
-.panel-enabler-view button {
-    font-size: 13px;
-    margin: 6px 0 0 0;
-    padding: 3px 20px;
-    height: 24px;
-}
-
-.pane button {
-    margin: 6px 0 6px 3px;
-    padding: 2px 9px;
-}
-
-.panel-enabler-view button:active, .pane button:active {
-    background-color: rgb(215, 215, 215);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-body.inactive .panel-enabler-view button, .panel-enabler-view button:disabled, body.inactive .pane button, .pane button:disabled {
-    color: rgb(130, 130, 130);
-    border-color: rgb(212, 212, 212);
-    background-color: rgb(239, 239, 239);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
-}
-
-.panel-enabler-view input {
-    height: 17px;
-    width: 17px;
-    border: 1px solid rgb(165, 165, 165);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-    -webkit-border-radius: 8px;
-    -webkit-appearance: none;
-    vertical-align: middle;
-    margin: 0 5px 5px 0;
-}
-
-.panel-enabler-view input:active {
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
-}
-
-.panel-enabler-view input:checked {
-    background: url(Images/radioDot.png) center no-repeat,
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
-}
-
-.panel-enabler-view.resources img {
-    content: url(Images/resourcesSilhouette.png);
-}
-
-.panel-enabler-view.scripts img {
-    content: url(Images/scriptsSilhouette.png);
-}
-
-.panel-enabler-view.profiles img {
-    content: url(Images/profilesSilhouette.png);
-}
-
-button.enable-toggle-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/enableOutlineButtonGlyph.png);
-}
-
-button.enable-toggle-status-bar-item.toggled-on .glyph {
-    -webkit-mask-image: url(Images/enableSolidButtonGlyph.png);
-}
-
-.scripts-pause-on-exceptions-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/pauseOnExceptionButtonGlyph.png);
-}
-
-#scripts-status-bar {
-    position: absolute;
-    top: -1px;
-    left: 0;
-    right: 0;
-    height: 24px;
-}
-
-#scripts-files {
-    max-width: 250px;
-}
-
-#scripts-functions {
-    max-width: 150px;
-}
-
-#scripts-status-bar .status-bar-item img {
-    margin-top: 2px;
-}
-
-#scripts-back img {
-    content: url(Images/back.png);
-}
-
-#scripts-forward img {
-    content: url(Images/forward.png);
-}
-
-#scripts-pause img {
-    content: url(Images/debuggerPause.png);
-}
-
-#scripts-pause.paused img {
-    content: url(Images/debuggerContinue.png);
-}
-
-#scripts-step-over img {
-    content: url(Images/debuggerStepOver.png);
-}
-
-#scripts-step-into img {
-    content: url(Images/debuggerStepInto.png);
-}
-
-#scripts-step-out img {
-    content: url(Images/debuggerStepOut.png);
-}
-
-#scripts-debugger-status {
-    position: absolute;
-    line-height: 24px;
-    top: 0;
-    right: 8px;
-}
-
-#scripts-sidebar-resizer-widget {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 225px;
-    width: 16px;
-    cursor: col-resize;
-    background-image: url(Images/statusbarResizerHorizontal.png);
-    background-repeat: no-repeat;
-    background-position: center;
-}
-
-#scripts-sidebar-buttons {
-    position: absolute;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    width: 225px;
-    overflow: hidden;
-    border-left: 1px solid rgb(64%, 64%, 64%);
-}
-
-#script-resource-views {
-    display: block;
-    overflow: auto;
-    padding: 0;
-    position: absolute;
-    top: 23px;
-    left: 0;
-    right: 225px;
-    bottom: 0;
-}
-
-.script-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.script-view.visible {
-    display: block;
-}
-
-#scripts-sidebar {
-    position: absolute;
-    top: 23px;
-    right: 0;
-    bottom: 0;
-    width: 225px;
-    background-color: rgb(245, 245, 245);
-    border-left: 1px solid rgb(64%, 64%, 64%);
-    cursor: default;
-    overflow: auto;
-}
-
-.resources-larger-resources-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);
-}
-
-#resources-filter, #console-filter.console-filter-top {
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
-    border-bottom: 1px solid rgb(64%, 64%, 64%);
-    width: 100%;
-}
-
-#console-messages.console-filter-top {
-    margin-top: 23px;
-}
-
-#console-filter {
-    margin-top: 1px;
-}
-
-.scope-bar {
-    height: 23px;
-    padding: 2px 10px 0;
-    overflow: hidden;
-}
-
-.scope-bar li {
-    display: inline-block;
-    margin: 1px 2px 0 0;
-    padding: 1px 7px 3px;
-    font-size: 11px;
-    line-height: 12px;
-    font-weight: bold;
-    color: rgb(46, 46, 46);
-    background: transparent;
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
-    -webkit-border-radius: 8px;
-    vertical-align: middle;
-}
-
-.scope-bar .divider {
-    margin: 1px 9px 0 8px;
-    background-color: rgba(0, 0, 0, 0.4);
-    height: 16px;
-    width: 1px;
-    vertical-align: middle;
-    display: inline-block;
-}
-
-.scope-bar li.selected, .scope-bar li:hover, .scope-bar li:active {
-    color: white;
-    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
-}
-
-.scope-bar li:hover {
-    background: rgba(0, 0, 0, 0.2);
-}
-
-.scope-bar li.selected {
-    background: rgba(0, 0, 0, 0.3);
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.scope-bar li:active {
-    background: rgba(0, 0, 0, 0.5);
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-#resources-container {
-    position: absolute;
-    top: 23px;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    border-right: 0 none transparent;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-#resources-container.viewing-resource {
-    right: auto;
-    width: 200px;
-    border-right: 1px solid rgb(64%, 64%, 64%);
-}
-
-#resources-container.viewing-resource #resources-sidebar {
-    width: 100%;
-    border-right: 0 none transparent;
-}
-
-#resources-sidebar {
-    min-height: 100%;
-    bottom: auto;
-    overflow: visible;
-}
-
-#resources-container-content {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    min-height: 100%;
-}
-
-#resources-container.viewing-resource #resources-container-content {
-    display: none;
-}
-
-#resources-summary {
-    position: absolute;
-    padding-top: 20px;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 93px;
-    margin-left: -1px;
-    border-left: 1px solid rgb(102, 102, 102);
-    background-color: rgb(101, 111, 130);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.5)));
-    background-repeat: repeat-x;
-    background-position: bottom;
-    text-align: center;
-    text-shadow: black 0 1px 1px;
-    white-space: nowrap;
-    color: white;
-    -webkit-background-size: 1px 6px;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-    z-index: 400;
-}
-
-.summary-graph-legend {
-    margin-top: -10px;
-    padding-left: 15px;
-}
-
-.summary-graph-legend-item {
-    display: inline-block;
-    font-weight: bold;
-    margin-right: 15px;
-    vertical-align: top;
-}
-
-.summary-graph-legend-item.total {
-    margin-left: 10px;
-}
-
-.summary-graph-legend-label {
-    display: inline-block;
-    text-align: left;
-}
-
-.summary-graph-legend-header {
-    font-size: 12px;
-}
-
-.summary-graph-legend-value {
-    font-size: 10px;
-}
-
-.summary-graph-legend-swatch {
-    vertical-align: top;
-    margin-top: 1px;
-    margin-right: 3px;
-}
-
-#resources-dividers {
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 100%;
-    top: 0;
-    z-index: -100;
-}
-
-#resources-event-dividers {
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: 100%;
-    top: 0;
-    z-index: 300;
-    pointer-events: none;
-}
-
-#resources-dividers-label-bar {
-    position: absolute;
-    top: 0;
-    left: 0px;
-    right: 0;
-    background-color: rgba(255, 255, 255, 0.8);
-    background-clip: padding;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
-    height: 20px;
-    z-index: 200;
-}
-
-.resources-divider {
-    position: absolute;
-    width: 1px;
-    top: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.1);
-}
-
-.resources-event-divider-padding {
-    position: absolute;
-    width: 8px;
-    top: 0;
-    bottom: 0;
-    pointer-events: auto;
-}
-
-.resources-onload-divider {
-    position: absolute;
-    width: 2px;
-    top: 0;
-    bottom: 0;
-    z-index: 300;
-    background-color: rgba(255, 0, 0, 0.5);
-}
-
-.resources-ondomcontent-divider {
-    position: absolute;
-    width: 2px;
-    top: 0;
-    bottom: 0;
-    z-index: 300;
-    background-color: rgba(0, 0, 255, 0.5);
-}
-
-.resources-divider.last {
-    background-color: transparent;
-}
-
-.resources-divider-label {
-    position: absolute;
-    top: 4px;
-    right: 3px;
-    font-size: 9px;
-    color: rgb(50%, 50%, 50%);
-    white-space: nowrap;
-}
-
-.resources-graph-label {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -7px;
-    height: 13px;
-    line-height: 13px;
-    font-size: 9px;
-    color: rgba(0, 0, 0, 0.75);
-    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;
-    z-index: 150;
-    overflow: hidden;
-    text-align: center;
-    font-weight: bold;
-    opacity: 0;
-    -webkit-transition: opacity 250ms ease-in-out;
-}
-
-.resources-graph-side:hover .resources-graph-label {
-    opacity: 1;
-}
-
-.resources-graph-label:empty {
-    display: none;
-}
-
-.resources-graph-label.waiting {
-    margin-right: 5px;
-}
-
-.resources-graph-label.before {
-    color: rgba(0, 0, 0, 0.7);
-    text-shadow: none;
-    text-align: right;
-    margin-right: 2px;
-}
-
-.resources-graph-label.before::after {
-    padding-left: 2px;
-    height: 6px;
-    content: url(Images/graphLabelCalloutLeft.png);
-}
-
-.resources-graph-label.after {
-    color: rgba(0, 0, 0, 0.7);
-    text-shadow: none;
-    text-align: left;
-    margin-left: 2px;
-}
-
-.resources-graph-label.after::before {
-    padding-right: 2px;
-    height: 6px;
-    content: url(Images/graphLabelCalloutRight.png);
-}
-
-.resources-graph-bar {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -7px;
-    border-width: 6px 7px;
-    height: 13px;
-    min-width: 14px;
-    opacity: 0.65;
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;
-}
-
-.resources-category-documents, .resources-category-stylesheets, .resources-category-images,
-.resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other {
-    display: none;
-}
-
-.filter-all .resources-category-documents, .filter-documents .resources-category-documents,
-.filter-all .resources-category-stylesheets, .filter-stylesheets .resources-category-stylesheets,
-.filter-all .resources-category-images, .filter-images .resources-category-images,
-.filter-all .resources-category-scripts, .filter-scripts .resources-category-scripts,
-.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,
-.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,
-.filter-all .resources-category-other, .filter-other .resources-category-other,
-.resource-sidebar-tree-item.selected {
-    display: list-item;
-}
-
-.console-warning-level, .console-error-level, .console-log-level {
-    display: none;
-}
-
-.filter-all .console-warning-level, .filter-warnings .console-warning-level,
-.filter-all .console-error-level, .filter-errors .console-error-level,
-.filter-all .console-log-level, .filter-logs .console-log-level {
-    display: block;
-}
-
-.console-user-command-result {
-    display: block;
-}
-
-.resources-graph-bar.waiting {
-    opacity: 0.35;
-}
-
-.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;
-}
-
-.resources-category-documents .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;
-}
-
-.resources-category-documents.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;
-}
-
-.resources-category-stylesheets .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;
-}
-
-.resources-category-stylesheets.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;
-}
-
-.resources-category-images .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;
-}
-
-.resources-category-images.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;
-}
-
-.resources-category-fonts .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;
-}
-
-.resources-category-fonts.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;
-}
-
-.resources-category-scripts .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;
-}
-
-.resources-category-scripts.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;
-}
-
-.resources-category-xhr .resources-graph-bar {
-    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;
-}
-
-.resources-category-xhr.resource-cached .resources-graph-bar {
-    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;
-}
-
-#resource-views {
-    position: absolute;
-    top: 23px;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-.source-view-frame {
-    width: 100%;
-    height: 100%;
-}
-
-.sidebar-resizer-vertical {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    width: 5px;
-    z-index: 500;
-    cursor: col-resize;
-}
-
-.resources .sidebar-resizer-vertical {
-    top: 23px;
-}
-
-.sidebar-tree, .sidebar-tree .children {
-    position: relative;
-    padding: 0;
-    margin: 0;
-    list-style: none;
-    font-size: 11px;
-}
-
-.sidebar-tree-section {
-    position: relative;
-    height: 18px;
-    padding: 4px 10px 6px 10px;
-    white-space: nowrap;
-    margin-top: 1px;
-    color: rgb(92, 110, 129);
-    font-weight: bold;
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
-}
-
-.sidebar-tree-item {
-    position: relative;
-    height: 36px;
-    padding: 0 5px 0 5px;
-    white-space: nowrap;
-    margin-top: 1px;
-    line-height: 34px;
-    border-top: 1px solid transparent;
-}
-
-.sidebar-tree .children {
-    display: none;
-}
-
-.sidebar-tree .children.expanded {
-    display: block;
-}
-
-.sidebar-tree-section + .children > .sidebar-tree-item {
-    padding-left: 10px !important;
-}
-
-.sidebar-tree-section + .children.small > .sidebar-tree-item {
-    padding-left: 17px !important;
-}
-
-.sidebar-tree > .children > .sidebar-tree-item {
-    padding-left: 37px;
-}
-
-.sidebar-tree > .children > .children > .sidebar-tree-item {
-    padding-left: 37px;
-}
-
-.sidebar-tree.hide-disclosure-buttons > .children {
-    display: none;
-}
-
-.sidebar-tree > .children.hide-disclosure-buttons > .children {
-    display: none;
-}
-
-.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {
-    margin-left: 16px;
-}
-
-.sidebar-tree-item .disclosure-button {
-    float: left;
-    width: 16px;
-    height: 100%;
-    border: 0;
-    background-color: transparent;
-    background-image: url(Images/disclosureTriangleSmallRight.png);
-    background-repeat: no-repeat;
-    background-position: center;
-    -webkit-apearance: none;
-}
-
-.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {
-    display: none;
-}
-
-body.inactive .sidebar-tree-item .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
-}
-
-body.inactive .sidebar-tree-item.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
-}
-
-body.inactive .sidebar-tree-item .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDownBlack.png);
-}
-
-.sidebar-tree-item.selected .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallRightWhite.png) !important;
-}
-
-.sidebar-tree-item.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDown.png);
-}
-
-.sidebar-tree-item.selected.expanded .disclosure-button {
-    background-image: url(Images/disclosureTriangleSmallDownWhite.png) !important;
-}
-
-.sidebar-tree-item.selected .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDownWhite.png) !important;
-}
-
-.sidebar-tree-item .disclosure-button:active {
-    background-image: url(Images/disclosureTriangleSmallRightDown.png);
-}
-
-.sidebar-tree-item .icon {
-    float: left;
-    width: 32px;
-    height: 32px;
-    margin-top: 1px;
-    margin-right: 3px;
-}
-
-.sidebar-tree-item .status {
-    float: right;
-    height: 16px;
-    margin-top: 9px;
-    margin-left: 4px;
-    line-height: 1em;
-}
-
-.sidebar-tree-item .status:empty {
-    display: none;
-}
-
-.sidebar-tree-item .status .bubble {
-    display: inline-block;
-    height: 14px;
-    min-width: 16px;
-    margin-top: 1px;
-    background-color: rgb(128, 151, 189);
-    vertical-align: middle;
-    white-space: nowrap;
-    padding: 1px 4px;
-    text-align: center;
-    font-size: 11px;
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-    text-shadow: none;
-    color: white;
-    -webkit-border-radius: 7px;
-}
-
-.sidebar-tree-item .status .bubble:empty {
-    display: none;
-}
-
-.sidebar-tree-item.selected .status .bubble {
-    background-color: white !important;
-    color: rgb(132, 154, 190) !important;
-}
-
-:focus .sidebar-tree-item.selected .status .bubble {
-    color: rgb(36, 98, 172) !important;
-}
-
-body.inactive .sidebar-tree-item.selected .status .bubble {
-    color: rgb(159, 159, 159) !important;
-}
-
-.sidebar-tree.small .sidebar-tree-item, .sidebar-tree .children.small .sidebar-tree-item, .sidebar-tree-item.small, .small .resources-graph-side {
-    height: 20px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .icon, .sidebar-tree .children.small .sidebar-tree-item .icon, .sidebar-tree-item.small .icon {
-    width: 16px;
-    height: 16px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .status, .sidebar-tree .children.small .sidebar-tree-item .status, .sidebar-tree-item.small .status {
-    margin-top: 1px;
-}
-
-.sidebar-tree-item.selected {
-    color: white;
-    border-top: 1px solid rgb(145, 160, 192);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
-    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;
-    font-weight: bold;
-    -webkit-background-origin: padding;
-    -webkit-background-clip: padding;
-}
-
-:focus .sidebar-tree-item.selected {
-    border-top: 1px solid rgb(68, 128, 200);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
-}
-
-body.inactive .sidebar-tree-item.selected {
-    border-top: 1px solid rgb(151, 151, 151);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
-}
-
-.sidebar-tree-item .titles {
-    position: relative;
-    top: 5px;
-    line-height: 11px;
-    padding-bottom: 1px;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    white-space: nowrap;
-}
-
-.sidebar-tree-item .titles.no-subtitle {
-    top: 10px;
-}
-
-.sidebar-tree.small .sidebar-tree-item .titles, .sidebar-tree .children.small .sidebar-tree-item .titles, .sidebar-tree-item.small .titles {
-    top: 2px;
-    line-height: normal;
-}
-
-.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after, .sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {
-    content: "\A";
-    white-space: pre;
-}
-
-.sidebar-tree-item .subtitle {
-    font-size: 9px;
-    color: rgba(0, 0, 0, 0.7);
-}
-
-.sidebar-tree.small .sidebar-tree-item .subtitle, .sidebar-tree .children.small .sidebar-tree-item .subtitle, .sidebar-tree-item.small .subtitle {
-    display: none;
-}
-
-.sidebar-tree-item.selected .subtitle {
-    color: rgba(255, 255, 255, 0.9);
-}
-
-#resources-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    max-height: 100%;
-    top: 112px;
-}
-
-.resources-graph-side {
-    position: relative;
-    height: 36px;
-    padding: 0 5px;
-    white-space: nowrap;
-    margin-top: 1px;
-    border-top: 1px solid transparent;
-    overflow: hidden;
-}
-
-.resources-graph-bar-area {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 8px;
-    left: 9px;
-}
-
-#resources-container:not(.viewing-resource) .resource-sidebar-tree-item:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-#resources-container:not(.viewing-resource) .resources-graph-side:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.resources-time-graph-sidebar-item .icon {
-    content: url(Images/resourcesTimeGraphIcon.png);
-}
-
-.resources-size-graph-sidebar-item .icon {
-    content: url(Images/resourcesSizeGraphIcon.png);
-}
-
-.resources-size-graph-sidebar-item .icon {
-    content: url(Images/resourcesSizeGraphIcon.png);
-}
-
-.resource-sidebar-tree-item .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item .icon {
-    content: url(Images/resourcePlainIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-documents .icon {
-    content: url(Images/resourceDocumentIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-documents .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-stylesheets .icon {
-    content: url(Images/resourceCSSIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-stylesheets .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-images .icon {
-    position: relative;
-    background-image: url(Images/resourcePlainIcon.png);
-    background-repeat: no-repeat;
-    content: "";
-}
-
-.resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
-    position: absolute;
-    margin: auto;
-    top: 3px;
-    bottom: 4px;
-    left: 5px;
-    right: 5px;
-    max-width: 18px;
-    max-height: 21px;
-    min-width: 1px;
-    min-height: 1px;
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-images .icon {
-    background-image: url(Images/resourcePlainIconSmall.png);
-    content: "";
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
-    top: 2px;
-    bottom: 1px;
-    left: 3px;
-    right: 3px;
-    max-width: 8px;
-    max-height: 11px;
-}
-
-.resource-sidebar-tree-item.resources-category-fonts .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-fonts .icon {
-    content: url(Images/resourcePlainIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-scripts .icon {
-    content: url(Images/resourceJSIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-scripts .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-category-xhr .icon {
-    content: url(Images/resourcePlainIcon.png);
-}
-
-.children.small .resource-sidebar-tree-item.resources-category-xhr .icon {
-    content: url(Images/resourceDocumentIconSmall.png);
-}
-
-.bubble.debug, .console-debug-level .bubble {
-    background-color: rgb(0, 0, 255) !important;
-}
-
-.bubble.warning, .console-warning-level .bubble {
-    background-color: rgb(232, 164, 0) !important;
-}
-
-.bubble.error, .console-error-level .bubble {
-    background-color: rgb(216, 35, 35) !important;
-}
-
-.bubble.search-matches {
-    background-image: url(Images/searchSmallWhite.png);
-    background-repeat: no-repeat;
-    background-position: 3px 2px;
-    padding-left: 13px !important;
-}
-
-.sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallBlue.png);
-}
-
-:focus .sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallBrightBlue.png);
-}
-
-body.inactive .sidebar-tree-item.selected .bubble.search-matches {
-    background-image: url(Images/searchSmallGray.png);
-}
-
-/* Timeline Style */
-
-#timeline-overview-panel {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 80px;
-}
-
-.timeline-sidebar-background {
-    top: 90px;
-    bottom: 0;
-}
-
-.timeline .sidebar {
-    overflow-y: hidden;
-    z-index: 100;
-}
-
-#timeline-overview-separator {
-    position: absolute;
-    top: 80px;
-    left: 0;
-    right: 0;
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(253, 253, 253)), to(rgb(213, 213, 213)));
-    border-top: 1px solid rgb(140, 140, 140);
-    border-bottom: 1px solid rgb(115, 115, 115);
-    height: 10px;
-}
-
-#timeline-overview-sidebar {
-    position: absolute;
-    width: 200px;
-    top: 0px;
-    bottom: 0px;
-    left: 0px;
-    padding-top: 1px;
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(242, 242, 242)), to(rgb(209, 209, 209)));
-    border-right: 1px solid rgb(163, 163, 163);
-}
-
-#timeline-overview-grid {
-    position: absolute;
-    top: 0px;
-    bottom: 0px;
-    left: 200px;
-    right: 0px;
-    background-color: rgb(224, 224, 224);
-}
-
-#timeline-overview-window {
-    background-color: white;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    z-index: 150;
-}
-
-.timeline-window-resizer {
-    position: absolute;
-    top: 35px;
-    bottom: 15px;
-    width: 5px;
-    margin-left: -3px;
-    margin-right: -2px;
-    background-color: rgb(153, 153, 153);
-    z-index: 500;
-    cursor: col-resize;
-    -webkit-border-radius: 2px;
-    -webkit-box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
-}
-
-#timeline-overview-grid #resources-graphs {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    height: 80px;
-}
-
-#timeline-container {
-    position: absolute;
-    top: 90px;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    border-right: 0 none transparent;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
-
-.timeline-clear-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
-}
-
-.timeline-category-tree-item {
-    height: 20px;
-    line-height: 20px;
-    padding-left: 6px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    font-weight: bold;
-}
-
-.timeline-category-tree-item .timeline-category-checkbox {
-    width: 10px;
-    height: 11px;
-    margin: 0 3px 0 5px;
-    padding: 0;
-    background-image: url(Images/timelineCheckmarks.png);
-    background-repeat: no-repeat;
-    background-position: 0 -66px;
-    vertical-align: -1px;
-    -webkit-appearance: none;
-}
-
-.timeline-category-tree-item .timeline-category-checkbox:checked {
-    background-position-x: -10px;
-}
-
-.timeline-category-tree-item.timeline-category-loading .timeline-category-checkbox {
-    background-position-y: 0;
-}
-
-.timeline-category-tree-item.timeline-category-scripting .timeline-category-checkbox {
-    background-position-y: -33px;
-}
-
-.timeline-category-tree-item.timeline-category-rendering .timeline-category-checkbox {
-    background-position-y: -11px;
-}
-
-.timeline-category-tree-item:nth-of-type(2n) {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-tree-item {
-    height: 18px;
-    line-height: 15px;
-    padding-right: 5px;
-    padding-left: 10px;
-    padding-top: 2px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-}
-
-.timeline-expandable {
-    position: absolute;
-    border-left: 1px solid rgb(163, 163, 163);
-}
-
-.timeline-expandable-left {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    width: 3px;
-    border-top: 1px solid rgb(163, 163, 163);
-    border-bottom: 1px solid rgb(163, 163, 163);
-}
-
-.timeline-expandable-collapsed {
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
-    background-position-x: 1px;
-    background-position-y: 2px;
-    background-repeat: no-repeat;
-}
-
-.timeline-expandable-expanded {
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
-    background-position-x: 1px;
-    background-position-y: 3px;
-    background-repeat: no-repeat;
-}
-
-.timeline-tree-item .type {
-    padding-left: 14px;
-}
-
-.timeline-tree-item .count {
-    font-family: Helvetica, Arial, sans-serif;
-    font-weight: bold;
-}
-
-.timeline-tree-item .timeline-tree-icon {
-    background-image: url(Images/timelineDots.png);
-    margin-top: 2px;
-    width: 12px;
-    height: 12px;
-    position: absolute;
-}
-
-.timeline-tree-item.even {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-tree-item .data.dimmed {
-    color: rgba(0, 0, 0, 0.7);
-}
-
-#timeline-overview-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    top: 20px;
-}
-
-#timeline-graphs {
-    position: absolute;
-    left: 0;
-    right: 0;
-    max-height: 100%;
-    top: 19px;
-}
-
-.timeline-graph-side {
-    position: relative;
-    height: 18px;
-    padding: 0 5px;
-    white-space: nowrap;
-    margin-top: 0px;
-    border-top: 1px solid transparent;
-    overflow: hidden;
-    pointer-events: none;
-}
-
-.timeline-overview-graph-side {
-    height: 20px;
-    z-index: 170;
-    pointer-events: none;
-}
-
-.timeline-overview-graph-side .timeline-graph-bar {
-    height: 13px;
-}
-
-.timeline-graph-bar-area {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    right: 0;
-    left: 3px;
-    pointer-events: none;
-}
-
-.timeline-graph-bar {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto -2px;
-    border-width: 4px 4px 5px;
-    height: 9px;
-    min-width: 5px;
-    opacity: 0.8;
-    -webkit-border-image: url(Images/timelineBarGray.png) 4 4 5 4;
-    pointer-events: none;
-}
-
-.timeline-graph-side.even {
-    background-color: rgba(0, 0, 0, 0.05);
-}
-
-.timeline-category-loading .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;
-}
-
-.timeline-category-scripting .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;
-}
-
-.timeline-category-rendering .timeline-graph-bar {
-    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;
-}
-
-.timeline-category-loading .timeline-tree-icon {
-    background-position-y: 0px;
-}
-
-.timeline-category-scripting .timeline-tree-icon {
-    background-position-y: 48px;
-}
-
-.timeline-category-rendering .timeline-tree-icon {
-    background-position-y: 72px;
-}
-
-/* Profiler Style */
-
-#profile-views {
-    position: absolute;
-    top: 0;
-    right: 0;
-    left: 200px;
-    bottom: 0;
-}
-
-#profile-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-.profile-sidebar-tree-item .icon {
-    content: url(Images/profileIcon.png);
-}
-
-.profile-sidebar-tree-item.small .icon {
-    content: url(Images/profileSmallIcon.png);
-}
-
-.profile-group-sidebar-tree-item .icon {
-    content: url(Images/profileGroupIcon.png);
-}
-
-.profile-view {
-    display: none;
-    overflow: hidden;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-}
-
-.profile-view.visible {
-    display: block;
-}
-
-.profile-view .data-grid {
-    border: none;
-    height: 100%;
-}
-
-.profile-view .data-grid th.average-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.average-column {
-    text-align: right;
-}
-
-.profile-view .data-grid th.self-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.self-column {
-    text-align: right;
-}
-
-.profile-view .data-grid th.total-column {
-    text-align: center;
-}
-
-.profile-view .data-grid td.total-column {
-    text-align: right;
-}
-
-.profile-view .data-grid .calls-column {
-    text-align: center;
-}
-
-.profile-node-file {
-    float: right;
-    color: gray;
-    margin-top: -1px;
-}
-
-.data-grid tr.selected .profile-node-file {
-    color: rgb(33%, 33%, 33%);
-}
-
-.data-grid:focus tr.selected .profile-node-file {
-    color: white;
-}
-
-button.enable-toggle-status-bar-item .glyph {
-}
-
-.record-profile-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/recordButtonGlyph.png);
-}
-
-.record-profile-status-bar-item.toggled-on .glyph {
-    -webkit-mask-image: url(Images/recordToggledButtonGlyph.png);
-    background-color: rgb(216, 0, 0) !important;
-}
-
-/* FIXME: should have its own glyph. */
-.heap-snapshot-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.node-search-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/nodeSearchButtonGlyph.png);
-}
-
-.percent-time-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/percentButtonGlyph.png);
-}
-
-.focus-profile-node-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);
-}
-
-.exclude-profile-node-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
-}
-
-.reset-profile-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
-}
-
-.delete-storage-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
-}
-
-#storage-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-.refresh-storage-status-bar-item .glyph {
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
-}
-
-#storage-view-status-bar-items {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 200px;
-    overflow: hidden;
-    border-left: 1px solid rgb(184, 184, 184);
-    margin-left: -1px;
-}
-
-ol.breakpoint-list {
-    -webkit-padding-start: 2px;
-    list-style: none;
-    margin: 0;
-}
-
-.breakpoint-list li {
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    margin: 4px 0;
-}
-
-.breakpoint-list .checkbox-elem {
-    font-size: 10px;
-    margin: 0 4px;
-    vertical-align: top;
-    position: relative;
-    z-index: 1;
-}
-
-.breakpoint-list .source-text {
-    font-family: monospace;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    margin: 2px 0 0px 20px;
-}
-
-.breakpoint-list a {
-    color: rgb(33%, 33%, 33%);
-    cursor: pointer;
-}
-
-.breakpoint-list a:hover {
-    color: rgb(15%, 15%, 15%);
-}
-
-.webkit-html-js-node, .webkit-html-css-node {
-    white-space: pre;
-}
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.html b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.html
deleted file mode 100644
index 9f78c0f..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspector.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<!--
-Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1.  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-2.  Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-    its contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-    <link rel="stylesheet" type="text/css" href="audits.css">
-    <link rel="stylesheet" type="text/css" href="inspector.css">
-    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
-    <script type="text/javascript" src="utilities.js"></script>
-    <script type="text/javascript" src="treeoutline.js"></script>
-    <script type="text/javascript" src="inspector.js"></script>
-    <script type="text/javascript" src="InspectorBackendStub.js"></script>
-    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
-    <script type="text/javascript" src="Object.js"></script>
-    <script type="text/javascript" src="Settings.js"></script>
-    <script type="text/javascript" src="ContextMenu.js"></script>
-    <script type="text/javascript" src="KeyboardShortcut.js"></script>
-    <script type="text/javascript" src="TextPrompt.js"></script>
-    <script type="text/javascript" src="Popup.js"></script>
-    <script type="text/javascript" src="Placard.js"></script>
-    <script type="text/javascript" src="View.js"></script>
-    <script type="text/javascript" src="Callback.js"></script>
-    <script type="text/javascript" src="Drawer.js"></script>
-    <script type="text/javascript" src="ChangesView.js"></script>
-    <script type="text/javascript" src="ConsoleView.js"></script>
-    <script type="text/javascript" src="Panel.js"></script>
-    <script type="text/javascript" src="TimelineGrid.js"></script>    
-    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
-    <script type="text/javascript" src="Resource.js"></script>
-    <script type="text/javascript" src="ResourceCategory.js"></script>
-    <script type="text/javascript" src="Database.js"></script>
-    <script type="text/javascript" src="DOMStorage.js"></script>
-    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
-    <script type="text/javascript" src="DataGrid.js"></script>
-    <script type="text/javascript" src="CookieItemsView.js"></script>
-    <script type="text/javascript" src="Script.js"></script>
-    <script type="text/javascript" src="Breakpoint.js"></script>
-    <script type="text/javascript" src="SidebarPane.js"></script>
-    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
-    <script type="text/javascript" src="SidebarTreeElement.js"></script>
-    <script type="text/javascript" src="Section.js"></script>
-    <script type="text/javascript" src="PropertiesSection.js"></script>
-    <script type="text/javascript" src="ObjectProxy.js"></script>
-    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
-    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
-    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
-    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
-    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
-    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
-    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
-    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
-    <script type="text/javascript" src="Color.js"></script>
-    <script type="text/javascript" src="StylesSidebarPane.js"></script>
-    <script type="text/javascript" src="PanelEnablerView.js"></script>
-    <script type="text/javascript" src="StatusBarButton.js"></script>
-    <script type="text/javascript" src="SummaryBar.js"></script>
-    <script type="text/javascript" src="ElementsPanel.js"></script>
-    <script type="text/javascript" src="ResourcesPanel.js"></script>
-    <script type="text/javascript" src="ScriptsPanel.js"></script>
-    <script type="text/javascript" src="StoragePanel.js"></script>
-    <script type="text/javascript" src="ProfilesPanel.js"></script>
-    <script type="text/javascript" src="ConsolePanel.js"></script>
-    <script type="text/javascript" src="AuditsPanel.js"></script>
-    <script type="text/javascript" src="AuditResultView.js"></script>
-    <script type="text/javascript" src="AuditLauncherView.js"></script>
-    <script type="text/javascript" src="ResourceView.js"></script>
-    <script type="text/javascript" src="SourceFrame.js"></script>
-    <script type="text/javascript" src="SourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="CSSSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="JavaScriptSourceSyntaxHighlighter.js"></script>
-    <script type="text/javascript" src="SourceView.js"></script>
-    <script type="text/javascript" src="FontView.js"></script>
-    <script type="text/javascript" src="ImageView.js"></script>
-    <script type="text/javascript" src="DatabaseTableView.js"></script>
-    <script type="text/javascript" src="DatabaseQueryView.js"></script>
-    <script type="text/javascript" src="ScriptView.js"></script>
-    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
-    <script type="text/javascript" src="ProfileView.js"></script>
-    <script type="text/javascript" src="DOMAgent.js"></script>
-    <script type="text/javascript" src="InjectedScript.js"></script>
-    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
-    <script type="text/javascript" src="TimelineAgent.js"></script>
-    <script type="text/javascript" src="TimelinePanel.js"></script>
-    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
-    <script type="text/javascript" src="TestController.js"></script>
-</head>
-<body class="detached">
-    <div id="toolbar">
-        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
-        <div class="toolbar-item flexable-space"></div>
-        <div class="toolbar-item hidden" id="search-results-matches"></div>
-        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
-        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
-    </div>
-    <div id="main">
-        <div id="main-panels" spellcheck="false"></div>
-        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
-    </div>
-    <div id="drawer">
-        <div id="console-view"><div id="console-messages"><div id="console-prompt" spellcheck="false"><br></div></div></div>
-        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
-    </div>
-</body>
-</html>
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
deleted file mode 100644
index e3e3074..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
- .webkit-css-comment { 
-     color: rgb(0, 116, 0);
- }
-
- .webkit-css-url, .webkit-css-color, .webkit-css-string, .webkit-css-keyword {
-     color: rgb(7, 144, 154);
- }
-
- .webkit-css-number {
-     color: rgb(50, 0, 255);
- }
-
- .webkit-css-property, .webkit-css-at-rule {
-     color: rgb(200, 0, 0);
- }
-
- .webkit-css-selector {
-     rgb(0, 0, 0);
- }
-
- .webkit-css-important {
-     color: rgb(200, 0, 180);
- }
-
-.webkit-javascript-comment {
-    color: rgb(0, 116, 0);
-}
-
-.webkit-javascript-keyword {
-    color: rgb(170, 13, 145);
-}
-
-.webkit-javascript-number {
-    color: rgb(28, 0, 207);
-}
-
-.webkit-javascript-string, .webkit-javascript-regexp {
-    color: rgb(196, 26, 22);
-}
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak
deleted file mode 100644
index a1eb124..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak
deleted file mode 100644
index 51ee6b0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak
deleted file mode 100644
index 6116887..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak
deleted file mode 100644
index 3759b1f..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak
deleted file mode 100644
index 6d3e488..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak
deleted file mode 100644
index 20deced..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf
deleted file mode 100644
index 6ecc8df..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf
deleted file mode 100644
index c06d0ed..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf
deleted file mode 100644
index 368ec78..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf
deleted file mode 100644
index 48a170b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak
deleted file mode 100644
index ef69886..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak
deleted file mode 100644
index 58e22d5..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nav.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nav.pdf
deleted file mode 100644
index 55f7ffb..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nav.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak
deleted file mode 100644
index f1792de..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab.pdf
deleted file mode 100644
index b384cf3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_h.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_h.pdf
deleted file mode 100644
index 5ac5a51..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_h.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_p.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_p.pdf
deleted file mode 100644
index 4f1f73b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/newtab_p.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak
deleted file mode 100644
index ab93b1c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak
deleted file mode 100644
index e48dfb0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/otr_icon.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/otr_icon.pdf
deleted file mode 100644
index 67af411..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/otr_icon.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak
deleted file mode 100644
index 17b448c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak
deleted file mode 100644
index ff3b4dd..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak
deleted file mode 100644
index dc9e431..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/reload_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/reload_Template.pdf
deleted file mode 100644
index 68d57ad..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/reload_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/renderer.sb b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/renderer.sb
deleted file mode 100644
index e9f6094..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/renderer.sb
+++ /dev/null
@@ -1,39 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for Fonts.
-(allow file-read-data (regex #"^/System/Library/Fonts"))  ; 10.5.6
-;10.6_ONLY (allow file-read-data (regex #"^/Library/Fonts"))  ; 10.6
-(allow mach-lookup (global-name "com.apple.FontObjectsServer"))  ; 10.5.6
-;10.6_ONLY (allow mach-lookup (global-name "com.apple.FontServer"))  ; 10.6
-
-; USER_HOMEDIR is substitued at runtime - http://crbug.com/11269 
-;10.6_ONLY (allow file-read-data (subpath "USER_HOMEDIR/Library/Fonts"))  ; 10.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak
deleted file mode 100644
index 9603123..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak
deleted file mode 100644
index 5903954..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak
deleted file mode 100644
index 0bc2f1d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak
deleted file mode 100644
index 44c9a2d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak
deleted file mode 100644
index 1862f21..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/star_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/star_Template.pdf
deleted file mode 100644
index 92800f2..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/star_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/starred.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/starred.pdf
deleted file mode 100644
index 4d90ad0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/starred.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/stop_Template.pdf b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/stop_Template.pdf
deleted file mode 100644
index f65484f..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/stop_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak
deleted file mode 100644
index 93517c1..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak
deleted file mode 100644
index 502f04d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak
deleted file mode 100644
index fb6e086..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak
deleted file mode 100644
index 177871d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak
deleted file mode 100644
index 5af0dc3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak
deleted file mode 100644
index cf5e31c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak
deleted file mode 100644
index 7f68b07..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/utility.sb b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/utility.sb
deleted file mode 100644
index 3f88f1c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/utility.sb
+++ /dev/null
@@ -1,40 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-; This is the Sandbox configuration file used for safeguarding the utility
-; process which is used for performing sandboxed operations that need to touch
-; the filesystem like decoding theme images and unpacking extensions.
-;
-; This configuration locks everything down, except access to one configurable
-; directory.  This is different from other sandbox configuration files where
-; file system access is entireley restricted.
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
-
-; Enable full access to given directory if needed.
-;ENABLE_DIRECTORY_ACCESS (allow file-read* file-write* (regex #"DIR_TO_ALLOW_ACCESS"))
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak
deleted file mode 100644
index c6b4af4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/worker.sb b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/worker.sb
deleted file mode 100644
index bc208c4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/worker.sb
+++ /dev/null
@@ -1,35 +0,0 @@
-;;
-;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-;;
-; This is the Sandbox configuration file used for safeguarding the worker
-; process which is used to run web workers in a sandboxed environment.
-;
-; This is the most restrictive sandbox profile and only enables just enough
-; to allow basic use of Cocoa.
-(version 1)
-(deny default)
-; Support for programmatically enabling verbose debugging.
-;ENABLE_LOGGING (debug deny)
-
-; Allow sending signals to self - http://crbug.com/20370
-(allow signal (target self))
-
-; Needed for full-page-zoomed controls - http://crbug.com/11325
-(allow sysctl-read)
-
-; Each line is marked with the System version that needs it.
-; This profile is tested with the following system versions:
-;     10.5.6, 10.6
-
-; Allow following symlinks
-(allow file-read-metadata)  ; 10.5.6
-
-; Loading System Libraries.
-(allow file-read-data (regex #"^/System/Library/Frameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/PrivateFrameworks"))  ; 10.5.6
-(allow file-read-data (regex #"^/System/Library/CoreServices"))  ; 10.5.6
-
-; Needed for IPC on 10.6
-;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak
deleted file mode 100644
index 234234c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak
deleted file mode 100644
index 9ddb1c4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Info.plist b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Info.plist
deleted file mode 100644
index 12ae98e..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Info.plist
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleDisplayName</key>
-	<string>Google Chrome Helper</string>
-	<key>CFBundleExecutable</key>
-	<string>Google Chrome Helper</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.google.Chrome.helper</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>Chrome Helper</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>4.0.287.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>287.0</string>
-	<key>LSFileQuarantineEnabled</key>
-	<true/>
-	<key>LSHasLocalizedDisplayName</key>
-	<string>1</string>
-	<key>LSMinimumSystemVersion</key>
-	<string>10.5.0</string>
-	<key>LSUIElement</key>
-	<string>1</string>
-</dict>
-</plist>
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper
deleted file mode 100755
index 9468662..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
deleted file mode 100755
index a290bd4..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
deleted file mode 100644
index ef431bf..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
deleted file mode 100644
index 9d05d0c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
deleted file mode 100644
index 8e03494..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
deleted file mode 100644
index f4ec1fd..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
deleted file mode 100644
index 1085c56..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
deleted file mode 100644
index 13924d2..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
deleted file mode 100644
index f0323c2..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
deleted file mode 100644
index a2f414b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
deleted file mode 100644
index 72a913c..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
deleted file mode 100644
index 7e98805..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
deleted file mode 100644
index 7e98805..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
deleted file mode 100644
index b03cdb6..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
deleted file mode 100644
index 53cb372..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
deleted file mode 100644
index 8775762..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
deleted file mode 100644
index 4591eb5..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
deleted file mode 100644
index 3089328..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
deleted file mode 100644
index a3eef64..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
deleted file mode 100644
index 36ab6d3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
deleted file mode 100644
index 2c0d998..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
deleted file mode 100644
index d415f12..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
deleted file mode 100644
index 53ef341..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
deleted file mode 100644
index 96c22b7..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
deleted file mode 100644
index 7103644..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
deleted file mode 100644
index 66a0727..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
deleted file mode 100644
index 7e98805..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
deleted file mode 100644
index 1df842e..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
deleted file mode 100644
index 1da7dfa..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
deleted file mode 100644
index 95f2b9b..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
deleted file mode 100644
index 0caf9b9..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
deleted file mode 100644
index e177ccf..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
deleted file mode 100644
index 00c124f..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
deleted file mode 100644
index 1276759..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
deleted file mode 100644
index 3399779..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
deleted file mode 100644
index ec612f2..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
deleted file mode 100644
index d525b4d..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
deleted file mode 100644
index 61ac381..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
deleted file mode 100644
index 7f9bbc0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
deleted file mode 100644
index 43cf381..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
deleted file mode 100644
index b39f2b3..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
deleted file mode 100644
index a9874dd..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
deleted file mode 100644
index ed557ee..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
deleted file mode 100644
index 19ae7a7..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
deleted file mode 100644
index f7cf895..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
deleted file mode 100644
index 8d7751a..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
deleted file mode 100644
index ebb5add..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
deleted file mode 100644
index 6bbec70..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
deleted file mode 100644
index 9458bcc..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
deleted file mode 100644
index d1025c0..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
deleted file mode 100644
index 4763f81..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
deleted file mode 100644
index 5b5be36..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
deleted file mode 100644
index 2207866..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
deleted file mode 100644
index e90f226..0000000
--- a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Google Chrome Framework b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Google Chrome Framework
new file mode 100755
index 0000000..da45df2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Google Chrome Framework
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib
new file mode 100755
index 0000000..a841723
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Libraries/libffmpegsumo.dylib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/About.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/About.nib
new file mode 100644
index 0000000..2e71031
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/About.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AboutIPC.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AboutIPC.nib
new file mode 100644
index 0000000..71e4605
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AboutIPC.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillAddressFormView.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillAddressFormView.nib
new file mode 100644
index 0000000..901e266
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillAddressFormView.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillCreditCardFormView.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillCreditCardFormView.nib
new file mode 100644
index 0000000..4dd19cd
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillCreditCardFormView.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillDialog.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillDialog.nib
new file mode 100644
index 0000000..a9cddad
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/AutoFillDialog.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib
new file mode 100644
index 0000000..bfe227f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkAllTabs.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib
new file mode 100644
index 0000000..6faa7d5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBar.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBarFolderWindow.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBarFolderWindow.nib
new file mode 100644
index 0000000..abfc2a3
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBarFolderWindow.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib
new file mode 100644
index 0000000..289ddf3
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkBubble.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib
new file mode 100644
index 0000000..e348a91
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkEditor.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkManager.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkManager.nib
new file mode 100644
index 0000000..4540bc7
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkManager.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib
new file mode 100644
index 0000000..b62faad
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BookmarkNameFolder.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib
new file mode 100644
index 0000000..d3341cb
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/BrowserWindow.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib
new file mode 100644
index 0000000..a6fb712
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ClearBrowsingData.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedCookies.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedCookies.nib
new file mode 100644
index 0000000..0bc9f6c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedCookies.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedImages.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedImages.nib
new file mode 100644
index 0000000..5a0dd11
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedImages.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedJavaScript.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedJavaScript.nib
new file mode 100644
index 0000000..02218f4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedJavaScript.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPlugins.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPlugins.nib
new file mode 100644
index 0000000..6fed044
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPlugins.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPopups.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPopups.nib
new file mode 100644
index 0000000..659d501
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentBlockedPopups.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentExceptionsWindow.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentExceptionsWindow.nib
new file mode 100644
index 0000000..c28a8d5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentExceptionsWindow.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentSettings.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentSettings.nib
new file mode 100644
index 0000000..c5221dc
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ContentSettings.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Cookies.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Cookies.nib
new file mode 100644
index 0000000..7ba2a46
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Cookies.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadItem.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadItem.nib
new file mode 100644
index 0000000..49e8997
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadItem.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib
new file mode 100644
index 0000000..b75d188
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/DownloadShelf.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib
new file mode 100644
index 0000000..5e34781
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/EditSearchEngine.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ExtensionInstalledBubble.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ExtensionInstalledBubble.nib
new file mode 100644
index 0000000..6acd9dd
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ExtensionInstalledBubble.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FindBar.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FindBar.nib
new file mode 100644
index 0000000..fa1c219
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FindBar.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib
new file mode 100644
index 0000000..283d2f7
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FirstRunDialog.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib
new file mode 100644
index 0000000..284c4d6
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/FontLanguageSettings.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib
new file mode 100644
index 0000000..d3bcd1f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HttpAuthLoginSheet.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib
new file mode 100644
index 0000000..7000b2a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/HungRendererDialog.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib
new file mode 100644
index 0000000..1b18111
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportProgressDialog.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib
new file mode 100644
index 0000000..0f1029f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ImportSettingsDialog.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Info.plist b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Info.plist
new file mode 100644
index 0000000..49ca5ec
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Info.plist
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>BreakpadProduct</key>
+	<string>Chrome_Mac</string>
+	<key>BreakpadProductDisplay</key>
+	<string>Chrome</string>
+	<key>BreakpadReportInterval</key>
+	<string>3600</string>
+	<key>BreakpadSendAndExit</key>
+	<string>YES</string>
+	<key>BreakpadSkipConfirm</key>
+	<string>YES</string>
+	<key>BreakpadURL</key>
+	<string>https://clients2.google.com/cr/report</string>
+	<key>BreakpadVersion</key>
+	<string>5.0.350.0</string>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>Google Chrome Framework</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.Chrome.framework</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>5.0.350.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>350.0</string>
+	<key>SVNPath</key>
+	<string>/trunk/src</string>
+	<key>SVNRevision</key>
+	<string>41134</string>
+</dict>
+</plist>
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBar.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBar.nib
new file mode 100644
index 0000000..3c7cd68
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBar.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib
new file mode 100644
index 0000000..e4161a7
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/InfoBarContainer.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib
new file mode 100644
index 0000000..a388cbb
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/KeywordEditor.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/MainMenu.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/MainMenu.nib
new file mode 100644
index 0000000..7529ae8
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/MainMenu.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/PageInfo.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/PageInfo.nib
new file mode 100644
index 0000000..3bb89d1
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/PageInfo.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Preferences.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Preferences.nib
new file mode 100644
index 0000000..34c549f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Preferences.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ReportBug.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ReportBug.nib
new file mode 100644
index 0000000..ae89ba7
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ReportBug.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SadTab.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SadTab.nib
new file mode 100644
index 0000000..ff41772
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SadTab.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib
new file mode 100644
index 0000000..ad81c14
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/SaveAccessoryView.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabContents.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabContents.nib
new file mode 100644
index 0000000..c8e20f2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabContents.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabView.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabView.nib
new file mode 100644
index 0000000..2b92db9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TabView.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TaskManager.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TaskManager.nib
new file mode 100644
index 0000000..f7509a6
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/TaskManager.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Toolbar.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Toolbar.nib
new file mode 100644
index 0000000..7c5f8b1
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/Toolbar.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/aliasCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/aliasCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/aliasCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/aliasCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak
new file mode 100644
index 0000000..27d0744
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/am.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak
new file mode 100644
index 0000000..0a00766
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ar.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/back_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/back_Template.pdf
new file mode 100644
index 0000000..740a39c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/back_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak
new file mode 100644
index 0000000..63779bc
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bg.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak
new file mode 100644
index 0000000..c138e8a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/bn.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak
new file mode 100644
index 0000000..8517a7b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ca.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/cellCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/cellCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/cellCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/cellCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/chevron.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/chevron.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/chevron.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/chevron.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/chrome.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/chrome.pak
new file mode 100644
index 0000000..5392d51
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/chrome.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar.pdf
new file mode 100644
index 0000000..d3d6be2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf
new file mode 100644
index 0000000..44011d0
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_h.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf
new file mode 100644
index 0000000..c2bb74d
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/close_bar_p.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/contextMenuCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/contextMenuCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/contextMenuCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/contextMenuCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/copyCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/copyCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/copyCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/copyCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_inspector b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_inspector
new file mode 100755
index 0000000..f8edb53
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_inspector
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Info.plist b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Info.plist
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Info.plist
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Info.plist
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender
new file mode 100755
index 0000000..ee73cf2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/MacOS/crash_report_sender
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/PkgInfo b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/PkgInfo
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/PkgInfo
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/PkgInfo
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/classes.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/classes.nib
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/classes.nib
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/classes.nib
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/info.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/info.nib
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/info.nib
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/info.nib
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/keyedobjects.nib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/keyedobjects.nib
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/keyedobjects.nib
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/Breakpad.nib/keyedobjects.nib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/English.lproj/Localizable.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/English.lproj/Localizable.strings
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/English.lproj/Localizable.strings
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/English.lproj/Localizable.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/crash_report_sender.icns b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/crash_report_sender.icns
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/crash_report_sender.icns
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crash_report_sender.app/Contents/Resources/crash_report_sender.icns
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crossHairCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crossHairCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/crossHairCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/crossHairCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak
new file mode 100644
index 0000000..cf1d025
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/cs.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak
new file mode 100644
index 0000000..58a5c7f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/da.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak
new file mode 100644
index 0000000..ffef2b4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/de.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/eastResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/eastResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/eastResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/eastResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/eastWestResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/eastWestResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/eastWestResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/eastWestResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak
new file mode 100644
index 0000000..dc67b8f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/el.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak
new file mode 100644
index 0000000..d163a32
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak
new file mode 100644
index 0000000..a788a9a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/en_GB.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak
new file mode 100644
index 0000000..80fffc5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak
new file mode 100644
index 0000000..ac9eded
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/es_419.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak
new file mode 100644
index 0000000..fab9bc9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/et.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak
new file mode 100644
index 0000000..d6066e9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fi.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak
new file mode 100644
index 0000000..0eb6aaa
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fil.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf
new file mode 100644
index 0000000..35595a2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_next_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf
new file mode 100644
index 0000000..e8bdedf
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/find_prev_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/forward_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/forward_Template.pdf
new file mode 100644
index 0000000..6203a7e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/forward_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak
new file mode 100644
index 0000000..783823a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/fr.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/go_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/go_Template.pdf
new file mode 100644
index 0000000..be0e69b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/go_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak
new file mode 100644
index 0000000..985fc96
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/gu.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak
new file mode 100644
index 0000000..662a72d
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/he.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/helpCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/helpCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/helpCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/helpCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak
new file mode 100644
index 0000000..440edff
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hi.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/home_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/home_Template.pdf
new file mode 100644
index 0000000..3fd6d4a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/home_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak
new file mode 100644
index 0000000..d4615f9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hr.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak
new file mode 100644
index 0000000..5fbc1f4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/hu.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak
new file mode 100644
index 0000000..2560bd1
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/id.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/DevTools.js b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/DevTools.js
new file mode 100644
index 0000000..8c598b3
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/DevTools.js
@@ -0,0 +1,44479 @@
+/* utilities.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+Object.proxyType = function(objectProxy)
+{
+    if (objectProxy === null)
+        return "null";
+
+    var type = typeof objectProxy;
+    if (type !== "object" && type !== "function")
+        return type;
+
+    return objectProxy.type;
+}
+
+Object.properties = function(obj)
+{
+    var properties = [];
+    for (var prop in obj)
+        properties.push(prop);
+    return properties;
+}
+
+Object.sortedProperties = function(obj, sortFunc)
+{
+    return Object.properties(obj).sort(sortFunc);
+}
+
+Function.prototype.bind = function(thisObject)
+{
+    var func = this;
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))) };
+}
+
+Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)
+{
+    var startNode;
+    var startOffset = 0;
+    var endNode;
+    var endOffset = 0;
+
+    if (!stayWithinNode)
+        stayWithinNode = this;
+
+    if (!direction || direction === "backward" || direction === "both") {
+        var node = this;
+        while (node) {
+            if (node === stayWithinNode) {
+                if (!startNode)
+                    startNode = stayWithinNode;
+                break;
+            }
+
+            if (node.nodeType === Node.TEXT_NODE) {
+                var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));
+                for (var i = start; i >= 0; --i) {
+                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
+                        startNode = node;
+                        startOffset = i + 1;
+                        break;
+                    }
+                }
+            }
+
+            if (startNode)
+                break;
+
+            node = node.traversePreviousNode(stayWithinNode);
+        }
+
+        if (!startNode) {
+            startNode = stayWithinNode;
+            startOffset = 0;
+        }
+    } else {
+        startNode = this;
+        startOffset = offset;
+    }
+
+    if (!direction || direction === "forward" || direction === "both") {
+        node = this;
+        while (node) {
+            if (node === stayWithinNode) {
+                if (!endNode)
+                    endNode = stayWithinNode;
+                break;
+            }
+
+            if (node.nodeType === Node.TEXT_NODE) {
+                var start = (node === this ? offset : 0);
+                for (var i = start; i < node.nodeValue.length; ++i) {
+                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
+                        endNode = node;
+                        endOffset = i;
+                        break;
+                    }
+                }
+            }
+
+            if (endNode)
+                break;
+
+            node = node.traverseNextNode(stayWithinNode);
+        }
+
+        if (!endNode) {
+            endNode = stayWithinNode;
+            endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;
+        }
+    } else {
+        endNode = this;
+        endOffset = offset;
+    }
+
+    var result = this.ownerDocument.createRange();
+    result.setStart(startNode, startOffset);
+    result.setEnd(endNode, endOffset);
+
+    return result;
+}
+
+Node.prototype.traverseNextTextNode = function(stayWithin)
+{
+    var node = this.traverseNextNode(stayWithin);
+    if (!node)
+        return;
+
+    while (node && node.nodeType !== Node.TEXT_NODE)
+        node = node.traverseNextNode(stayWithin);
+
+    return node;
+}
+
+Node.prototype.rangeBoundaryForOffset = function(offset)
+{
+    var node = this.traverseNextTextNode(this);
+    while (node && offset > node.nodeValue.length) {
+        offset -= node.nodeValue.length;
+        node = node.traverseNextTextNode(this);
+    }
+    if (!node)
+        return { container: this, offset: 0 };
+    return { container: node, offset: offset };
+}
+
+Element.prototype.removeStyleClass = function(className) 
+{
+    // Test for the simple case first.
+    if (this.className === className) {
+        this.className = "";
+        return;
+    }
+
+    var index = this.className.indexOf(className);
+    if (index === -1)
+        return;
+
+    var newClassName = " " + this.className + " ";
+    this.className = newClassName.replace(" " + className + " ", " ");
+}
+
+Element.prototype.removeMatchingStyleClasses = function(classNameRegex)
+{
+    var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");
+    if (regex.test(this.className))
+        this.className = this.className.replace(regex, " ");
+}
+
+Element.prototype.addStyleClass = function(className) 
+{
+    if (className && !this.hasStyleClass(className))
+        this.className += (this.className.length ? " " + className : className);
+}
+
+Element.prototype.hasStyleClass = function(className) 
+{
+    if (!className)
+        return false;
+    // Test for the simple case
+    if (this.className === className)
+        return true;
+
+    var index = this.className.indexOf(className);
+    if (index === -1)
+        return false;
+    var toTest = " " + this.className + " ";
+    return toTest.indexOf(" " + className + " ", index) !== -1;
+}
+
+Element.prototype.positionAt = function(x, y)
+{
+    this.style.left = x + "px";
+    this.style.top = y + "px";
+}
+
+Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
+{
+    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
+        for (var i = 0; i < nameArray.length; ++i)
+            if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
+                return node;
+    return null;
+}
+
+Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
+{
+    return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);
+}
+
+Node.prototype.enclosingNodeOrSelfWithClass = function(className)
+{
+    for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
+        if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))
+            return node;
+    return null;
+}
+
+Node.prototype.enclosingNodeWithClass = function(className)
+{
+    if (!this.parentNode)
+        return null;
+    return this.parentNode.enclosingNodeOrSelfWithClass(className);
+}
+
+Element.prototype.query = function(query) 
+{
+    return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+}
+
+Element.prototype.removeChildren = function()
+{
+    this.innerHTML = "";
+}
+
+Element.prototype.isInsertionCaretInside = function()
+{
+    var selection = window.getSelection();
+    if (!selection.rangeCount || !selection.isCollapsed)
+        return false;
+    var selectionRange = selection.getRangeAt(0);
+    return selectionRange.startContainer === this || selectionRange.startContainer.isDescendant(this);
+}
+
+Element.prototype.__defineGetter__("totalOffsetLeft", function()
+{
+    var total = 0;
+    for (var element = this; element; element = element.offsetParent)
+        total += element.offsetLeft + (this !== element ? element.clientLeft : 0);
+    return total;
+});
+
+Element.prototype.__defineGetter__("totalOffsetTop", function()
+{
+    var total = 0;
+    for (var element = this; element; element = element.offsetParent)
+        total += element.offsetTop + (this !== element ? element.clientTop : 0);
+    return total;
+});
+
+Element.prototype.offsetRelativeToWindow = function(targetWindow)
+{
+    var elementOffset = {x: 0, y: 0};
+    var curElement = this;
+    var curWindow = this.ownerDocument.defaultView;
+    while (curWindow && curElement) {
+        elementOffset.x += curElement.totalOffsetLeft;
+        elementOffset.y += curElement.totalOffsetTop;
+        if (curWindow === targetWindow)
+            break;
+
+        curElement = curWindow.frameElement;
+        curWindow = curWindow.parent;
+    }
+
+    return elementOffset;
+}
+
+Node.prototype.isWhitespace = isNodeWhitespace;
+Node.prototype.displayName = nodeDisplayName;
+Node.prototype.isAncestor = function(node)
+{
+    return isAncestorNode(this, node);
+};
+Node.prototype.isDescendant = isDescendantNode;
+Node.prototype.traverseNextNode = traverseNextNode;
+Node.prototype.traversePreviousNode = traversePreviousNode;
+Node.prototype.onlyTextChild = onlyTextChild;
+
+String.prototype.hasSubstring = function(string, caseInsensitive)
+{
+    if (!caseInsensitive)
+        return this.indexOf(string) !== -1;
+    return this.match(new RegExp(string.escapeForRegExp(), "i"));
+}
+
+String.prototype.escapeCharacters = function(chars)
+{
+    var foundChar = false;
+    for (var i = 0; i < chars.length; ++i) {
+        if (this.indexOf(chars.charAt(i)) !== -1) {
+            foundChar = true;
+            break;
+        }
+    }
+
+    if (!foundChar)
+        return this;
+
+    var result = "";
+    for (var i = 0; i < this.length; ++i) {
+        if (chars.indexOf(this.charAt(i)) !== -1)
+            result += "\\";
+        result += this.charAt(i);
+    }
+
+    return result;
+}
+
+String.prototype.escapeForRegExp = function()
+{
+    return this.escapeCharacters("^[]{}()\\.$*+?|");
+}
+
+String.prototype.escapeHTML = function()
+{
+    return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+}
+
+String.prototype.collapseWhitespace = function()
+{
+    return this.replace(/[\s\xA0]+/g, " ");
+}
+
+String.prototype.trimURL = function(baseURLDomain)
+{
+    var result = this.replace(/^https?:\/\//i, "");
+    if (baseURLDomain)
+        result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");
+    return result;
+}
+
+function isNodeWhitespace()
+{
+    if (!this || this.nodeType !== Node.TEXT_NODE)
+        return false;
+    if (!this.nodeValue.length)
+        return true;
+    return this.nodeValue.match(/^[\s\xA0]+$/);
+}
+
+function nodeDisplayName()
+{
+    if (!this)
+        return "";
+
+    switch (this.nodeType) {
+        case Node.DOCUMENT_NODE:
+            return "Document";
+
+        case Node.ELEMENT_NODE:
+            var name = "<" + this.nodeName.toLowerCase();
+
+            if (this.hasAttributes()) {
+                var value = this.getAttribute("id");
+                if (value)
+                    name += " id=\"" + value + "\"";
+                value = this.getAttribute("class");
+                if (value)
+                    name += " class=\"" + value + "\"";
+                if (this.nodeName.toLowerCase() === "a") {
+                    value = this.getAttribute("name");
+                    if (value)
+                        name += " name=\"" + value + "\"";
+                    value = this.getAttribute("href");
+                    if (value)
+                        name += " href=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "img") {
+                    value = this.getAttribute("src");
+                    if (value)
+                        name += " src=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "iframe") {
+                    value = this.getAttribute("src");
+                    if (value)
+                        name += " src=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "input") {
+                    value = this.getAttribute("name");
+                    if (value)
+                        name += " name=\"" + value + "\"";
+                    value = this.getAttribute("type");
+                    if (value)
+                        name += " type=\"" + value + "\"";
+                } else if (this.nodeName.toLowerCase() === "form") {
+                    value = this.getAttribute("action");
+                    if (value)
+                        name += " action=\"" + value + "\"";
+                }
+            }
+
+            return name + ">";
+
+        case Node.TEXT_NODE:
+            if (isNodeWhitespace.call(this))
+                return "(whitespace)";
+            return "\"" + this.nodeValue + "\"";
+
+        case Node.COMMENT_NODE:
+            return "<!--" + this.nodeValue + "-->";
+            
+        case Node.DOCUMENT_TYPE_NODE:
+            var docType = "<!DOCTYPE " + this.nodeName;
+            if (this.publicId) {
+                docType += " PUBLIC \"" + this.publicId + "\"";
+                if (this.systemId)
+                    docType += " \"" + this.systemId + "\"";
+            } else if (this.systemId)
+                docType += " SYSTEM \"" + this.systemId + "\"";
+            if (this.internalSubset)
+                docType += " [" + this.internalSubset + "]";
+            return docType + ">";
+    }
+
+    return this.nodeName.toLowerCase().collapseWhitespace();
+}
+
+function isAncestorNode(ancestor, node)
+{
+    if (!node || !ancestor)
+        return false;
+
+    var currentNode = node.parentNode;
+    while (currentNode) {
+        if (ancestor === currentNode)
+            return true;
+        currentNode = currentNode.parentNode;
+    }
+    return false;
+}
+
+function isDescendantNode(descendant)
+{
+    return isAncestorNode(descendant, this);
+}
+
+function traverseNextNode(stayWithin)
+{
+    if (!this)
+        return;
+
+    var node = this.firstChild;
+    if (node)
+        return node;
+
+    if (stayWithin && this === stayWithin)
+        return null;
+
+    node = this.nextSibling;
+    if (node)
+        return node;
+
+    node = this;
+    while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
+        node = node.parentNode;
+    if (!node)
+        return null;
+
+    return node.nextSibling;
+}
+
+function traversePreviousNode(stayWithin)
+{
+    if (!this)
+        return;
+    if (stayWithin && this === stayWithin)
+        return null;
+    var node = this.previousSibling;
+    while (node && node.lastChild)
+        node = node.lastChild;
+    if (node)
+        return node;
+    return this.parentNode;
+}
+
+function onlyTextChild()
+{
+    if (!this)
+        return null;
+
+    var firstChild = this.firstChild;
+    if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)
+        return null;
+
+    var sibling = firstChild.nextSibling;
+    return sibling ? null : firstChild;
+}
+
+function appropriateSelectorForNode(node, justSelector)
+{
+    if (!node)
+        return "";
+
+    var lowerCaseName = node.localName || node.nodeName.toLowerCase();
+
+    var id = node.getAttribute("id");
+    if (id) {
+        var selector = "#" + id;
+        return (justSelector ? selector : lowerCaseName + selector);
+    }
+
+    var className = node.getAttribute("class");
+    if (className) {
+        var selector = "." + className.replace(/\s+/, ".");
+        return (justSelector ? selector : lowerCaseName + selector);
+    }
+
+    if (lowerCaseName === "input" && node.getAttribute("type"))
+        return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";
+
+    return lowerCaseName;
+}
+
+function getDocumentForNode(node)
+{
+    return node.nodeType == Node.DOCUMENT_NODE ? node : node.ownerDocument;
+}
+
+function parentNode(node)
+{
+    return node.parentNode;
+}
+
+Number.secondsToString = function(seconds, formatterFunction, higherResolution)
+{
+    if (!formatterFunction)
+        formatterFunction = String.sprintf;
+
+    if (seconds === 0)
+        return "0";
+
+    var ms = seconds * 1000;
+    if (higherResolution && ms < 1000)
+        return formatterFunction("%.3fms", ms);
+    else if (ms < 1000)
+        return formatterFunction("%.0fms", ms);
+
+    if (seconds < 60)
+        return formatterFunction("%.2fs", seconds);
+
+    var minutes = seconds / 60;
+    if (minutes < 60)
+        return formatterFunction("%.1fmin", minutes);
+
+    var hours = minutes / 60;
+    if (hours < 24)
+        return formatterFunction("%.1fhrs", hours);
+
+    var days = hours / 24;
+    return formatterFunction("%.1f days", days);
+}
+
+Number.bytesToString = function(bytes, formatterFunction, higherResolution)
+{
+    if (!formatterFunction)
+        formatterFunction = String.sprintf;
+    if (typeof higherResolution === "undefined")
+        higherResolution = true;
+
+    if (bytes < 1024)
+        return formatterFunction("%.0fB", bytes);
+
+    var kilobytes = bytes / 1024;
+    if (higherResolution && kilobytes < 1024)
+        return formatterFunction("%.2fKB", kilobytes);
+    else if (kilobytes < 1024)
+        return formatterFunction("%.0fKB", kilobytes);
+
+    var megabytes = kilobytes / 1024;
+    if (higherResolution)
+        return formatterFunction("%.3fMB", megabytes);
+    else
+        return formatterFunction("%.0fMB", megabytes);
+}
+
+Number.constrain = function(num, min, max)
+{
+    if (num < min)
+        num = min;
+    else if (num > max)
+        num = max;
+    return num;
+}
+
+HTMLTextAreaElement.prototype.moveCursorToEnd = function()
+{
+    var length = this.value.length;
+    this.setSelectionRange(length, length);
+}
+
+Array.prototype.remove = function(value, onlyFirst)
+{
+    if (onlyFirst) {
+        var index = this.indexOf(value);
+        if (index !== -1)
+            this.splice(index, 1);
+        return;
+    }
+
+    var length = this.length;
+    for (var i = 0; i < length; ++i) {
+        if (this[i] === value)
+            this.splice(i, 1);
+    }
+}
+
+Array.prototype.keySet = function()
+{
+    var keys = {};
+    for (var i = 0; i < this.length; ++i)
+        keys[this[i]] = true;
+    return keys;
+}
+
+function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)
+{
+    // indexOf returns (-lowerBound - 1). Taking (-result - 1) works out to lowerBound.
+    return (-indexOfObjectInListSortedByFunction(anObject, aList, aFunction) - 1);
+}
+
+function indexOfObjectInListSortedByFunction(anObject, aList, aFunction)
+{
+    var first = 0;
+    var last = aList.length - 1;
+    var floor = Math.floor;
+    var mid, c;
+
+    while (first <= last) {
+        mid = floor((first + last) / 2);
+        c = aFunction(anObject, aList[mid]);
+
+        if (c > 0)
+            first = mid + 1;
+        else if (c < 0)
+            last = mid - 1;
+        else {
+            // Return the first occurance of an item in the list.
+            while (mid > 0 && aFunction(anObject, aList[mid - 1]) === 0)
+                mid--;
+            first = mid;
+            break;
+        }
+    }
+
+    // By returning 1 less than the negative lower search bound, we can reuse this function
+    // for both indexOf and insertionIndexFor, with some simple arithmetic.
+    return (-first - 1);
+}
+
+String.sprintf = function(format)
+{
+    return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));
+}
+
+String.tokenizeFormatString = function(format)
+{
+    var tokens = [];
+    var substitutionIndex = 0;
+
+    function addStringToken(str)
+    {
+        tokens.push({ type: "string", value: str });
+    }
+
+    function addSpecifierToken(specifier, precision, substitutionIndex)
+    {
+        tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });
+    }
+
+    var index = 0;
+    for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {
+        addStringToken(format.substring(index, precentIndex));
+        index = precentIndex + 1;
+
+        if (format[index] === "%") {
+            addStringToken("%");
+            ++index;
+            continue;
+        }
+
+        if (!isNaN(format[index])) {
+            // The first character is a number, it might be a substitution index.
+            var number = parseInt(format.substring(index));
+            while (!isNaN(format[index]))
+                ++index;
+            // If the number is greater than zero and ends with a "$",
+            // then this is a substitution index.
+            if (number > 0 && format[index] === "$") {
+                substitutionIndex = (number - 1);
+                ++index;
+            }
+        }
+
+        var precision = -1;
+        if (format[index] === ".") {
+            // This is a precision specifier. If no digit follows the ".",
+            // then the precision should be zero.
+            ++index;
+            precision = parseInt(format.substring(index));
+            if (isNaN(precision))
+                precision = 0;
+            while (!isNaN(format[index]))
+                ++index;
+        }
+
+        addSpecifierToken(format[index], precision, substitutionIndex);
+
+        ++substitutionIndex;
+        ++index;
+    }
+
+    addStringToken(format.substring(index));
+
+    return tokens;
+}
+
+String.standardFormatters = {
+    d: function(substitution)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+            substitution = substitution.description;
+        substitution = parseInt(substitution);
+        return !isNaN(substitution) ? substitution : 0;
+    },
+
+    f: function(substitution, token)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+            substitution = substitution.description;
+        substitution = parseFloat(substitution);
+        if (substitution && token.precision > -1)
+            substitution = substitution.toFixed(token.precision);
+        return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);
+    },
+
+    s: function(substitution)
+    {
+        if (typeof substitution == "object" && Object.proxyType(substitution) !== "null")
+            substitution = substitution.description;
+        return substitution;
+    },
+};
+
+String.vsprintf = function(format, substitutions)
+{
+    return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;
+}
+
+String.format = function(format, substitutions, formatters, initialValue, append)
+{
+    if (!format || !substitutions || !substitutions.length)
+        return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };
+
+    function prettyFunctionName()
+    {
+        return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";
+    }
+
+    function warn(msg)
+    {
+        console.warn(prettyFunctionName() + ": " + msg);
+    }
+
+    function error(msg)
+    {
+        console.error(prettyFunctionName() + ": " + msg);
+    }
+
+    var result = initialValue;
+    var tokens = String.tokenizeFormatString(format);
+    var usedSubstitutionIndexes = {};
+
+    for (var i = 0; i < tokens.length; ++i) {
+        var token = tokens[i];
+
+        if (token.type === "string") {
+            result = append(result, token.value);
+            continue;
+        }
+
+        if (token.type !== "specifier") {
+            error("Unknown token type \"" + token.type + "\" found.");
+            continue;
+        }
+
+        if (token.substitutionIndex >= substitutions.length) {
+            // If there are not enough substitutions for the current substitutionIndex
+            // just output the format specifier literally and move on.
+            error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");
+            result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);
+            continue;
+        }
+
+        usedSubstitutionIndexes[token.substitutionIndex] = true;
+
+        if (!(token.specifier in formatters)) {
+            // Encountered an unsupported format character, treat as a string.
+            warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");
+            result = append(result, substitutions[token.substitutionIndex]);
+            continue;
+        }
+
+        result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
+    }
+
+    var unusedSubstitutions = [];
+    for (var i = 0; i < substitutions.length; ++i) {
+        if (i in usedSubstitutionIndexes)
+            continue;
+        unusedSubstitutions.push(substitutions[i]);
+    }
+
+    return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
+}
+
+function isEnterKey(event) {
+    // Check if in IME.
+    return event.keyCode !== 229 && event.keyIdentifier === "Enter";
+}
+
+
+function highlightSearchResult(element, offset, length)
+{
+    var lineText = element.textContent;
+    var endOffset = offset + length;
+    var highlightNode = document.createElement("span");
+    highlightNode.className = "webkit-search-result";
+    highlightNode.textContent = lineText.substring(offset, endOffset);
+
+    var boundary = element.rangeBoundaryForOffset(offset);
+    var textNode = boundary.container;
+    var text = textNode.textContent;
+
+    if (boundary.offset + length < text.length) {
+        // Selection belong to a single split mode.
+        textNode.textContent = text.substring(boundary.offset + length);
+        textNode.parentElement.insertBefore(highlightNode, textNode);
+        var prefixNode = document.createTextNode(text.substring(0, boundary.offset));
+        textNode.parentElement.insertBefore(prefixNode, highlightNode);
+        return highlightNode;
+    }
+
+    var parentElement = textNode.parentElement;
+    var anchorElement = textNode.nextSibling;
+
+    length -= text.length - boundary.offset;
+    textNode.textContent = text.substring(0, boundary.offset);
+    textNode = textNode.traverseNextTextNode(element);
+
+    while (textNode) {
+        var text = textNode.textContent;
+        if (length < text.length) {
+            textNode.textContent = text.substring(length);
+            break;
+        }
+
+        length -= text.length;
+        textNode.textContent = "";
+        textNode = textNode.traverseNextTextNode(element);
+    }
+
+    parentElement.insertBefore(highlightNode, anchorElement);
+    return highlightNode;
+}
+
+function createSearchRegex(query)
+{
+    var regex = "";
+    for (var i = 0; i < query.length; ++i) {
+        var char = query.charAt(i);
+        if (char === "]")
+            char = "\\]";
+        regex += "[" + char + "]";
+    }
+    return new RegExp(regex, "i");
+}
+
+/* treeoutline.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function TreeOutline(listNode)
+{
+    this.children = [];
+    this.selectedTreeElement = null;
+    this._childrenListNode = listNode;
+    this._childrenListNode.removeChildren();
+    this._knownTreeElements = [];
+    this._treeElementsExpandedState = [];
+    this.expandTreeElementsWhenArrowing = false;
+    this.root = true;
+    this.hasChildren = false;
+    this.expanded = true;
+    this.selected = false;
+    this.treeOutline = this;
+
+    this._childrenListNode.tabIndex = 0;
+    this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
+}
+
+TreeOutline._knownTreeElementNextIdentifier = 1;
+
+TreeOutline._appendChild = function(child)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var lastChild = this.children[this.children.length - 1];
+    if (lastChild) {
+        lastChild.nextSibling = child;
+        child.previousSibling = lastChild;
+    } else {
+        child.previousSibling = null;
+        child.nextSibling = null;
+    }
+
+    this.children.push(child);
+    this.hasChildren = true;
+    child.parent = this;
+    child.treeOutline = this.treeOutline;
+    child.treeOutline._rememberTreeElement(child);
+
+    var current = child.children[0];
+    while (current) {
+        current.treeOutline = this.treeOutline;
+        current.treeOutline._rememberTreeElement(current);
+        current = current.traverseNextTreeElement(false, child, true);
+    }
+
+    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
+        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
+
+    if (!this._childrenListNode) {
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+    }
+
+    child._attach();
+}
+
+TreeOutline._insertChild = function(child, index)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var previousChild = (index > 0 ? this.children[index - 1] : null);
+    if (previousChild) {
+        previousChild.nextSibling = child;
+        child.previousSibling = previousChild;
+    } else {
+        child.previousSibling = null;
+    }
+
+    var nextChild = this.children[index];
+    if (nextChild) {
+        nextChild.previousSibling = child;
+        child.nextSibling = nextChild;
+    } else {
+        child.nextSibling = null;
+    }
+
+    this.children.splice(index, 0, child);
+    this.hasChildren = true;
+    child.parent = this;
+    child.treeOutline = this.treeOutline;
+    child.treeOutline._rememberTreeElement(child);
+
+    var current = child.children[0];
+    while (current) {
+        current.treeOutline = this.treeOutline;
+        current.treeOutline._rememberTreeElement(current);
+        current = current.traverseNextTreeElement(false, child, true);
+    }
+
+    if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)
+        child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];
+
+    if (!this._childrenListNode) {
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+    }
+
+    child._attach();
+}
+
+TreeOutline._removeChildAtIndex = function(childIndex)
+{
+    if (childIndex < 0 || childIndex >= this.children.length)
+        throw("childIndex out of range");
+
+    var child = this.children[childIndex];
+    this.children.splice(childIndex, 1);
+
+    var parent = child.parent;
+    if (child.deselect()) {
+        if (child.previousSibling)
+            child.previousSibling.select();
+        else if (child.nextSibling)
+            child.nextSibling.select();
+        else
+            parent.select();
+    }
+
+    if (child.previousSibling)
+        child.previousSibling.nextSibling = child.nextSibling;
+    if (child.nextSibling)
+        child.nextSibling.previousSibling = child.previousSibling;
+
+    if (child.treeOutline) {
+        child.treeOutline._forgetTreeElement(child);
+        child.treeOutline._forgetChildrenRecursive(child);
+    }
+
+    child._detach();
+    child.treeOutline = null;
+    child.parent = null;
+    child.nextSibling = null;
+    child.previousSibling = null;
+}
+
+TreeOutline._removeChild = function(child)
+{
+    if (!child)
+        throw("child can't be undefined or null");
+
+    var childIndex = this.children.indexOf(child);
+    if (childIndex === -1)
+        throw("child not found in this node's children");
+
+    TreeOutline._removeChildAtIndex.call(this, childIndex);
+}
+
+TreeOutline._removeChildren = function()
+{
+    for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i];
+        child.deselect();
+
+        if (child.treeOutline) {
+            child.treeOutline._forgetTreeElement(child);
+            child.treeOutline._forgetChildrenRecursive(child);
+        }
+
+        child._detach();
+        child.treeOutline = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+    }
+
+    this.children = [];
+}
+
+TreeOutline._removeChildrenRecursive = function()
+{
+    var childrenToRemove = this.children;
+
+    var child = this.children[0];
+    while (child) {
+        if (child.children.length)
+            childrenToRemove = childrenToRemove.concat(child.children);
+        child = child.traverseNextTreeElement(false, this, true);
+    }
+
+    for (var i = 0; i < childrenToRemove.length; ++i) {
+        var child = childrenToRemove[i];
+        child.deselect();
+        if (child.treeOutline)
+            child.treeOutline._forgetTreeElement(child);
+        child._detach();
+        child.children = [];
+        child.treeOutline = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+    }
+
+    this.children = [];
+}
+
+TreeOutline.prototype._rememberTreeElement = function(element)
+{
+    if (!this._knownTreeElements[element.identifier])
+        this._knownTreeElements[element.identifier] = [];
+
+    // check if the element is already known
+    var elements = this._knownTreeElements[element.identifier];
+    if (elements.indexOf(element) !== -1)
+        return;
+
+    // add the element
+    elements.push(element);
+}
+
+TreeOutline.prototype._forgetTreeElement = function(element)
+{
+    if (this._knownTreeElements[element.identifier])
+        this._knownTreeElements[element.identifier].remove(element, true);
+}
+
+TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)
+{
+    var child = parentElement.children[0];
+    while (child) {
+        this._forgetTreeElement(child);
+        child = child.traverseNextTreeElement(false, this, true);
+    }
+}
+
+TreeOutline.prototype.getCachedTreeElement = function(representedObject)
+{
+    if (!representedObject)
+        return null;
+
+    if ("__treeElementIdentifier" in representedObject) {
+        // If this representedObject has a tree element identifier, and it is a known TreeElement
+        // in our tree we can just return that tree element.
+        var elements = this._knownTreeElements[representedObject.__treeElementIdentifier];
+        if (elements) {
+            for (var i = 0; i < elements.length; ++i)
+                if (elements[i].representedObject === representedObject)
+                    return elements[i];
+        }
+    }
+    return null;
+}
+
+TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)
+{
+    if (!representedObject)
+        return null;
+
+    var cachedElement = this.getCachedTreeElement(representedObject);
+    if (cachedElement)
+        return cachedElement;
+
+    // The representedObject isn't know, so we start at the top of the tree and work down to find the first
+    // tree element that represents representedObject or one of its ancestors.
+    var item;
+    var found = false;
+    for (var i = 0; i < this.children.length; ++i) {
+        item = this.children[i];
+        if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
+            found = true;
+            break;
+        }
+    }
+
+    if (!found)
+        return null;
+
+    // Make sure the item that we found is connected to the root of the tree.
+    // Build up a list of representedObject's ancestors that aren't already in our tree.
+    var ancestors = [];
+    var currentObject = representedObject;
+    while (currentObject) {
+        ancestors.unshift(currentObject);
+        if (currentObject === item.representedObject)
+            break;
+        currentObject = getParent(currentObject);
+    }
+
+    // For each of those ancestors we populate them to fill in the tree.
+    for (var i = 0; i < ancestors.length; ++i) {
+        // Make sure we don't call findTreeElement with the same representedObject
+        // again, to prevent infinite recursion.
+        if (ancestors[i] === representedObject)
+            continue;
+        // FIXME: we could do something faster than findTreeElement since we will know the next
+        // ancestor exists in the tree.
+        item = this.findTreeElement(ancestors[i], isAncestor, getParent);
+        if (item && item.onpopulate)
+            item.onpopulate(item);
+    }
+
+    return this.getCachedTreeElement(representedObject);
+}
+
+TreeOutline.prototype.treeElementFromPoint = function(x, y)
+{
+    var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);
+    var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);
+    if (listNode)
+        return listNode.parentTreeElement || listNode.treeElement;
+    return null;
+}
+
+TreeOutline.prototype._treeKeyDown = function(event)
+{
+    if (event.target !== this._childrenListNode)
+        return;
+
+    if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
+        return;
+
+    var handled = false;
+    var nextSelectedElement;
+    if (event.keyIdentifier === "Up" && !event.altKey) {
+        nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
+        while (nextSelectedElement && !nextSelectedElement.selectable)
+            nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
+        handled = nextSelectedElement ? true : false;
+    } else if (event.keyIdentifier === "Down" && !event.altKey) {
+        nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
+        while (nextSelectedElement && !nextSelectedElement.selectable)
+            nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
+        handled = nextSelectedElement ? true : false;
+    } else if (event.keyIdentifier === "Left") {
+        if (this.selectedTreeElement.expanded) {
+            if (event.altKey)
+                this.selectedTreeElement.collapseRecursively();
+            else
+                this.selectedTreeElement.collapse();
+            handled = true;
+        } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {
+            handled = true;
+            if (this.selectedTreeElement.parent.selectable) {
+                nextSelectedElement = this.selectedTreeElement.parent;
+                handled = nextSelectedElement ? true : false;
+            } else if (this.selectedTreeElement.parent)
+                this.selectedTreeElement.parent.collapse();
+        }
+    } else if (event.keyIdentifier === "Right") {
+        if (!this.selectedTreeElement.revealed()) {
+            this.selectedTreeElement.reveal();
+            handled = true;
+        } else if (this.selectedTreeElement.hasChildren) {
+            handled = true;
+            if (this.selectedTreeElement.expanded) {
+                nextSelectedElement = this.selectedTreeElement.children[0];
+                handled = nextSelectedElement ? true : false;
+            } else {
+                if (event.altKey)
+                    this.selectedTreeElement.expandRecursively();
+                else
+                    this.selectedTreeElement.expand();
+            }
+        }
+    }
+
+    if (nextSelectedElement) {
+        nextSelectedElement.reveal();
+        nextSelectedElement.select();
+    }
+
+    if (handled) {
+        event.preventDefault();
+        event.stopPropagation();
+    }
+}
+
+TreeOutline.prototype.expand = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.collapse = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.revealed = function()
+{
+    return true;
+}
+
+TreeOutline.prototype.reveal = function()
+{
+    // this is the root, do nothing
+}
+
+TreeOutline.prototype.appendChild = TreeOutline._appendChild;
+TreeOutline.prototype.insertChild = TreeOutline._insertChild;
+TreeOutline.prototype.removeChild = TreeOutline._removeChild;
+TreeOutline.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
+TreeOutline.prototype.removeChildren = TreeOutline._removeChildren;
+TreeOutline.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
+
+function TreeElement(title, representedObject, hasChildren)
+{
+    this._title = title;
+    this.representedObject = (representedObject || {});
+
+    if (this.representedObject.__treeElementIdentifier)
+        this.identifier = this.representedObject.__treeElementIdentifier;
+    else {
+        this.identifier = TreeOutline._knownTreeElementNextIdentifier++;
+        this.representedObject.__treeElementIdentifier = this.identifier;
+    }
+
+    this._hidden = false;
+    this.expanded = false;
+    this.selected = false;
+    this.hasChildren = hasChildren;
+    this.children = [];
+    this.treeOutline = null;
+    this.parent = null;
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this._listItemNode = null;
+}
+
+TreeElement.prototype = {
+    selectable: true,
+    arrowToggleWidth: 10,
+
+    get listItemElement() {
+        return this._listItemNode;
+    },
+
+    get childrenListElement() {
+        return this._childrenListNode;
+    },
+
+    get title() {
+        return this._title;
+    },
+
+    set title(x) {
+        this._title = x;
+        if (this._listItemNode)
+            this._listItemNode.innerHTML = x;
+    },
+
+    get tooltip() {
+        return this._tooltip;
+    },
+
+    set tooltip(x) {
+        this._tooltip = x;
+        if (this._listItemNode)
+            this._listItemNode.title = x ? x : "";
+    },
+
+    get hasChildren() {
+        return this._hasChildren;
+    },
+
+    set hasChildren(x) {
+        if (this._hasChildren === x)
+            return;
+
+        this._hasChildren = x;
+
+        if (!this._listItemNode)
+            return;
+
+        if (x)
+            this._listItemNode.addStyleClass("parent");
+        else {
+            this._listItemNode.removeStyleClass("parent");
+            this.collapse();
+        }
+    },
+
+    get hidden() {
+        return this._hidden;
+    },
+
+    set hidden(x) {
+        if (this._hidden === x)
+            return;
+
+        this._hidden = x;
+
+        if (x) {
+            if (this._listItemNode)
+                this._listItemNode.addStyleClass("hidden");
+            if (this._childrenListNode)
+                this._childrenListNode.addStyleClass("hidden");
+        } else {
+            if (this._listItemNode)
+                this._listItemNode.removeStyleClass("hidden");
+            if (this._childrenListNode)
+                this._childrenListNode.removeStyleClass("hidden");
+        }
+    },
+
+    get shouldRefreshChildren() {
+        return this._shouldRefreshChildren;
+    },
+
+    set shouldRefreshChildren(x) {
+        this._shouldRefreshChildren = x;
+        if (x && this.expanded)
+            this.expand();
+    }
+}
+
+TreeElement.prototype.appendChild = TreeOutline._appendChild;
+TreeElement.prototype.insertChild = TreeOutline._insertChild;
+TreeElement.prototype.removeChild = TreeOutline._removeChild;
+TreeElement.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;
+TreeElement.prototype.removeChildren = TreeOutline._removeChildren;
+TreeElement.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;
+
+TreeElement.prototype._attach = function()
+{
+    if (!this._listItemNode || this.parent._shouldRefreshChildren) {
+        if (this._listItemNode && this._listItemNode.parentNode)
+            this._listItemNode.parentNode.removeChild(this._listItemNode);
+
+        this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");
+        this._listItemNode.treeElement = this;
+        this._listItemNode.innerHTML = this._title;
+        this._listItemNode.title = this._tooltip ? this._tooltip : "";
+
+        if (this.hidden)
+            this._listItemNode.addStyleClass("hidden");
+        if (this.hasChildren)
+            this._listItemNode.addStyleClass("parent");
+        if (this.expanded)
+            this._listItemNode.addStyleClass("expanded");
+        if (this.selected)
+            this._listItemNode.addStyleClass("selected");
+
+        this._listItemNode.addEventListener("mousedown", TreeElement.treeElementSelected, false);
+        this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);
+        this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);
+
+        if (this.onattach)
+            this.onattach(this);
+    }
+
+    var nextSibling = null;
+    if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)
+        nextSibling = this.nextSibling._listItemNode;
+    this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);
+    if (this._childrenListNode)
+        this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
+    if (this.selected)
+        this.select();
+    if (this.expanded)
+        this.expand();
+}
+
+TreeElement.prototype._detach = function()
+{
+    if (this._listItemNode && this._listItemNode.parentNode)
+        this._listItemNode.parentNode.removeChild(this._listItemNode);
+    if (this._childrenListNode && this._childrenListNode.parentNode)
+        this._childrenListNode.parentNode.removeChild(this._childrenListNode);
+}
+
+TreeElement.treeElementSelected = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement || !element.treeElement.selectable)
+        return;
+
+    if (element.treeElement.isEventWithinDisclosureTriangle(event))
+        return;
+
+    element.treeElement.select();
+}
+
+TreeElement.treeElementToggled = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement)
+        return;
+
+    if (!element.treeElement.isEventWithinDisclosureTriangle(event))
+        return;
+
+    if (element.treeElement.expanded) {
+        if (event.altKey)
+            element.treeElement.collapseRecursively();
+        else
+            element.treeElement.collapse();
+    } else {
+        if (event.altKey)
+            element.treeElement.expandRecursively();
+        else
+            element.treeElement.expand();
+    }
+}
+
+TreeElement.treeElementDoubleClicked = function(event)
+{
+    var element = event.currentTarget;
+    if (!element || !element.treeElement)
+        return;
+
+    if (element.treeElement.ondblclick)
+        element.treeElement.ondblclick.call(element.treeElement, event);
+    else if (element.treeElement.hasChildren && !element.treeElement.expanded)
+        element.treeElement.expand();
+}
+
+TreeElement.prototype.collapse = function()
+{
+    if (this._listItemNode)
+        this._listItemNode.removeStyleClass("expanded");
+    if (this._childrenListNode)
+        this._childrenListNode.removeStyleClass("expanded");
+
+    this.expanded = false;
+    if (this.treeOutline)
+        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
+
+    if (this.oncollapse)
+        this.oncollapse(this);
+}
+
+TreeElement.prototype.collapseRecursively = function()
+{
+    var item = this;
+    while (item) {
+        if (item.expanded)
+            item.collapse();
+        item = item.traverseNextTreeElement(false, this, true);
+    }
+}
+
+TreeElement.prototype.expand = function()
+{
+    if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))
+        return;
+
+    if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {
+        if (this._childrenListNode && this._childrenListNode.parentNode)
+            this._childrenListNode.parentNode.removeChild(this._childrenListNode);
+
+        this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
+        this._childrenListNode.parentTreeElement = this;
+        this._childrenListNode.addStyleClass("children");
+
+        if (this.hidden)
+            this._childrenListNode.addStyleClass("hidden");
+
+        if (this.onpopulate)
+            this.onpopulate(this);
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i]._attach();
+
+        delete this._shouldRefreshChildren;
+    }
+
+    if (this._listItemNode) {
+        this._listItemNode.addStyleClass("expanded");
+        if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)
+            this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
+    }
+
+    if (this._childrenListNode)
+        this._childrenListNode.addStyleClass("expanded");
+
+    this.expanded = true;
+    if (this.treeOutline)
+        this.treeOutline._treeElementsExpandedState[this.identifier] = true;
+
+    if (this.onexpand)
+        this.onexpand(this);
+}
+
+TreeElement.prototype.expandRecursively = function(maxDepth)
+{
+    var item = this;
+    var info = {};
+    var depth = 0;
+
+    // The Inspector uses TreeOutlines to represents object properties, so recursive expansion
+    // in some case can be infinite, since JavaScript objects can hold circular references.
+    // So default to a recursion cap of 3 levels, since that gives fairly good results.
+    if (typeof maxDepth === "undefined" || typeof maxDepth === "null")
+        maxDepth = 3;
+
+    while (item) {
+        if (depth < maxDepth)
+            item.expand();
+        item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);
+        depth += info.depthChange;
+    }
+}
+
+TreeElement.prototype.hasAncestor = function(ancestor) {
+    if (!ancestor)
+        return false;
+
+    var currentNode = this.parent;
+    while (currentNode) {
+        if (ancestor === currentNode)
+            return true;
+        currentNode = currentNode.parent;
+    }
+
+    return false;
+}
+
+TreeElement.prototype.reveal = function()
+{
+    var currentAncestor = this.parent;
+    while (currentAncestor && !currentAncestor.root) {
+        if (!currentAncestor.expanded)
+            currentAncestor.expand();
+        currentAncestor = currentAncestor.parent;
+    }
+
+    if (this.onreveal)
+        this.onreveal(this);
+}
+
+TreeElement.prototype.revealed = function()
+{
+    var currentAncestor = this.parent;
+    while (currentAncestor && !currentAncestor.root) {
+        if (!currentAncestor.expanded)
+            return false;
+        currentAncestor = currentAncestor.parent;
+    }
+
+    return true;
+}
+
+TreeElement.prototype.select = function(supressOnSelect)
+{
+    if (!this.treeOutline || !this.selectable || this.selected)
+        return;
+
+    if (this.treeOutline.selectedTreeElement)
+        this.treeOutline.selectedTreeElement.deselect();
+
+    this.selected = true;
+    this.treeOutline._childrenListNode.focus();
+    this.treeOutline.selectedTreeElement = this;
+    if (this._listItemNode)
+        this._listItemNode.addStyleClass("selected");
+
+    if (this.onselect && !supressOnSelect)
+        this.onselect(this);
+}
+
+TreeElement.prototype.deselect = function(supressOnDeselect)
+{
+    if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
+        return false;
+
+    this.selected = false;
+    this.treeOutline.selectedTreeElement = null;
+    if (this._listItemNode)
+        this._listItemNode.removeStyleClass("selected");
+
+    if (this.ondeselect && !supressOnDeselect)
+        this.ondeselect(this);
+    return true;
+}
+
+TreeElement.prototype.traverseNextTreeElement = function(skipHidden, stayWithin, dontPopulate, info)
+{
+    if (!dontPopulate && this.hasChildren && this.onpopulate)
+        this.onpopulate(this);
+
+    if (info)
+        info.depthChange = 0;
+
+    var element = skipHidden ? (this.revealed() ? this.children[0] : null) : this.children[0];
+    if (element && (!skipHidden || (skipHidden && this.expanded))) {
+        if (info)
+            info.depthChange = 1;
+        return element;
+    }
+
+    if (this === stayWithin)
+        return null;
+
+    element = skipHidden ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;
+    if (element)
+        return element;
+
+    element = this;
+    while (element && !element.root && !(skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {
+        if (info)
+            info.depthChange -= 1;
+        element = element.parent;
+    }
+
+    if (!element)
+        return null;
+
+    return (skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);
+}
+
+TreeElement.prototype.traversePreviousTreeElement = function(skipHidden, dontPopulate)
+{
+    var element = skipHidden ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;
+    if (!dontPopulate && element && element.hasChildren && element.onpopulate)
+        element.onpopulate(element);
+
+    while (element && (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {
+        if (!dontPopulate && element.hasChildren && element.onpopulate)
+            element.onpopulate(element);
+        element = (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);
+    }
+
+    if (element)
+        return element;
+
+    if (!this.parent || this.parent.root)
+        return null;
+
+    return this.parent;
+}
+
+TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
+{
+    var left = this._listItemNode.totalOffsetLeft;
+    return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
+}
+
+/* inspector.js */
+
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2007 Matt Lilek ([email protected]).
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function preloadImages()
+{
+    (new Image()).src = "Images/clearConsoleButtonGlyph.png";
+    (new Image()).src = "Images/consoleButtonGlyph.png";
+    (new Image()).src = "Images/dockButtonGlyph.png";
+    (new Image()).src = "Images/enableOutlineButtonGlyph.png";
+    (new Image()).src = "Images/enableSolidButtonGlyph.png";
+    (new Image()).src = "Images/excludeButtonGlyph.png";
+    (new Image()).src = "Images/focusButtonGlyph.png";
+    (new Image()).src = "Images/largerResourcesButtonGlyph.png";
+    (new Image()).src = "Images/nodeSearchButtonGlyph.png";
+    (new Image()).src = "Images/pauseOnExceptionButtonGlyph.png";
+    (new Image()).src = "Images/percentButtonGlyph.png";
+    (new Image()).src = "Images/recordButtonGlyph.png";
+    (new Image()).src = "Images/recordToggledButtonGlyph.png";
+    (new Image()).src = "Images/reloadButtonGlyph.png";
+    (new Image()).src = "Images/undockButtonGlyph.png";
+}
+
+preloadImages();
+
+var WebInspector = {
+    resources: {},
+    resourceURLMap: {},
+    cookieDomains: {},
+    missingLocalizedStrings: {},
+    pendingDispatches: 0,
+
+    // RegExp groups:
+    // 1 - scheme
+    // 2 - hostname
+    // 3 - ?port
+    // 4 - ?path
+    // 5 - ?fragment
+    URLRegExp: /^(http[s]?|file):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
+    GenericURLRegExp: /^([^:]+):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i,
+
+    get platform()
+    {
+        if (!("_platform" in this))
+            this._platform = InspectorFrontendHost.platform();
+
+        return this._platform;
+    },
+
+    get platformFlavor()
+    {
+        if (!("_platformFlavor" in this))
+            this._platformFlavor = this._detectPlatformFlavor();
+
+        return this._platformFlavor;
+    },
+
+    _detectPlatformFlavor: function()
+    {
+        const userAgent = navigator.userAgent;
+
+        if (this.platform === "windows") {
+            var match = userAgent.match(/Windows NT (\d+)\.(?:\d+)/);
+            if (match && match[1] >= 6)
+                return WebInspector.PlatformFlavor.WindowsVista;
+            return null;
+        } else if (this.platform === "mac") {
+            var match = userAgent.match(/Mac OS X\s*(?:(\d+)_(\d+))?/);
+            if (!match || match[1] != 10)
+                return WebInspector.PlatformFlavor.MacSnowLeopard;
+            switch (Number(match[2])) {
+                case 4:
+                    return WebInspector.PlatformFlavor.MacTiger;
+                case 5:
+                    return WebInspector.PlatformFlavor.MacLeopard;
+                case 6:
+                default:
+                    return WebInspector.PlatformFlavor.MacSnowLeopard;
+            }
+        }
+
+        return null;
+    },
+
+    get port()
+    {
+        if (!("_port" in this))
+            this._port = InspectorFrontendHost.port();
+
+        return this._port;
+    },
+
+    get previousFocusElement()
+    {
+        return this._previousFocusElement;
+    },
+
+    get currentFocusElement()
+    {
+        return this._currentFocusElement;
+    },
+
+    set currentFocusElement(x)
+    {
+        if (this._currentFocusElement !== x)
+            this._previousFocusElement = this._currentFocusElement;
+        this._currentFocusElement = x;
+
+        if (this._currentFocusElement) {
+            this._currentFocusElement.focus();
+
+            // Make a caret selection inside the new element if there isn't a range selection and
+            // there isn't already a caret selection inside.
+            var selection = window.getSelection();
+            if (selection.isCollapsed && !this._currentFocusElement.isInsertionCaretInside()) {
+                var selectionRange = this._currentFocusElement.ownerDocument.createRange();
+                selectionRange.setStart(this._currentFocusElement, 0);
+                selectionRange.setEnd(this._currentFocusElement, 0);
+
+                selection.removeAllRanges();
+                selection.addRange(selectionRange);
+            }
+        } else if (this._previousFocusElement)
+            this._previousFocusElement.blur();
+    },
+
+    get currentPanel()
+    {
+        return this._currentPanel;
+    },
+
+    set currentPanel(x)
+    {
+        if (this._currentPanel === x)
+            return;
+
+        if (this._currentPanel)
+            this._currentPanel.hide();
+
+        this._currentPanel = x;
+
+        this.updateSearchLabel();
+
+        if (x) {
+            x.show();
+
+            if (this.currentQuery) {
+                if (x.performSearch) {
+                    function performPanelSearch()
+                    {
+                        this.updateSearchMatchesCount();
+
+                        x.currentQuery = this.currentQuery;
+                        x.performSearch(this.currentQuery);
+                    }
+
+                    // Perform the search on a timeout so the panel switches fast.
+                    setTimeout(performPanelSearch.bind(this), 0);
+                } else {
+                    // Update to show Not found for panels that can't be searched.
+                    this.updateSearchMatchesCount();
+                }
+            }
+        }
+
+        for (var panelName in WebInspector.panels) {
+            if (WebInspector.panels[panelName] == x)
+                InspectorBackend.storeLastActivePanel(panelName);
+        }
+    },
+
+    _createPanels: function()
+    {
+        var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');
+        if (hiddenPanels.indexOf("elements") === -1)
+            this.panels.elements = new WebInspector.ElementsPanel();
+        if (hiddenPanels.indexOf("resources") === -1)
+            this.panels.resources = new WebInspector.ResourcesPanel();
+        if (hiddenPanels.indexOf("scripts") === -1)
+            this.panels.scripts = new WebInspector.ScriptsPanel();
+        if (hiddenPanels.indexOf("timeline") === -1)
+            this.panels.timeline = new WebInspector.TimelinePanel();
+        if (hiddenPanels.indexOf("profiles") === -1) {
+            this.panels.profiles = new WebInspector.ProfilesPanel();
+            this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());
+        }
+        if (hiddenPanels.indexOf("storage") === -1 && hiddenPanels.indexOf("databases") === -1)
+            this.panels.storage = new WebInspector.StoragePanel();
+        if (Preferences.auditsPanelEnabled && hiddenPanels.indexOf("audits") === -1)
+            this.panels.audits = new WebInspector.AuditsPanel();
+        if (hiddenPanels.indexOf("console") === -1)
+            this.panels.console = new WebInspector.ConsolePanel();
+    },
+
+    get attached()
+    {
+        return this._attached;
+    },
+
+    set attached(x)
+    {
+        if (this._attached === x)
+            return;
+
+        this._attached = x;
+
+        this.updateSearchLabel();
+
+        var dockToggleButton = document.getElementById("dock-status-bar-item");
+        var body = document.body;
+
+        if (x) {
+            InspectorFrontendHost.attach();
+            body.removeStyleClass("detached");
+            body.addStyleClass("attached");
+            dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
+        } else {
+            InspectorFrontendHost.detach();
+            body.removeStyleClass("attached");
+            body.addStyleClass("detached");
+            dockToggleButton.title = WebInspector.UIString("Dock to main window.");
+        }
+    },
+
+    get errors()
+    {
+        return this._errors || 0;
+    },
+
+    set errors(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._errors === x)
+            return;
+        this._errors = x;
+        this._updateErrorAndWarningCounts();
+    },
+
+    get warnings()
+    {
+        return this._warnings || 0;
+    },
+
+    set warnings(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._warnings === x)
+            return;
+        this._warnings = x;
+        this._updateErrorAndWarningCounts();
+    },
+
+    _updateErrorAndWarningCounts: function()
+    {
+        var errorWarningElement = document.getElementById("error-warning-count");
+        if (!errorWarningElement)
+            return;
+
+        if (!this.errors && !this.warnings) {
+            errorWarningElement.addStyleClass("hidden");
+            return;
+        }
+
+        errorWarningElement.removeStyleClass("hidden");
+
+        errorWarningElement.removeChildren();
+
+        if (this.errors) {
+            var errorElement = document.createElement("span");
+            errorElement.id = "error-count";
+            errorElement.textContent = this.errors;
+            errorWarningElement.appendChild(errorElement);
+        }
+
+        if (this.warnings) {
+            var warningsElement = document.createElement("span");
+            warningsElement.id = "warning-count";
+            warningsElement.textContent = this.warnings;
+            errorWarningElement.appendChild(warningsElement);
+        }
+
+        if (this.errors) {
+            if (this.warnings) {
+                if (this.errors == 1) {
+                    if (this.warnings == 1)
+                        errorWarningElement.title = WebInspector.UIString("%d error, %d warning", this.errors, this.warnings);
+                    else
+                        errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", this.errors, this.warnings);
+                } else if (this.warnings == 1)
+                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", this.errors, this.warnings);
+                else
+                    errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", this.errors, this.warnings);
+            } else if (this.errors == 1)
+                errorWarningElement.title = WebInspector.UIString("%d error", this.errors);
+            else
+                errorWarningElement.title = WebInspector.UIString("%d errors", this.errors);
+        } else if (this.warnings == 1)
+            errorWarningElement.title = WebInspector.UIString("%d warning", this.warnings);
+        else if (this.warnings)
+            errorWarningElement.title = WebInspector.UIString("%d warnings", this.warnings);
+        else
+            errorWarningElement.title = null;
+    },
+
+    get styleChanges()
+    {
+        return this._styleChanges;
+    },
+
+    set styleChanges(x)
+    {
+        x = Math.max(x, 0);
+
+        if (this._styleChanges === x)
+            return;
+        this._styleChanges = x;
+        this._updateChangesCount();
+    },
+
+    _updateChangesCount: function()
+    {
+        // TODO: Remove immediate return when enabling the Changes Panel
+        return;
+
+        var changesElement = document.getElementById("changes-count");
+        if (!changesElement)
+            return;
+
+        if (!this.styleChanges) {
+            changesElement.addStyleClass("hidden");
+            return;
+        }
+
+        changesElement.removeStyleClass("hidden");
+        changesElement.removeChildren();
+
+        if (this.styleChanges) {
+            var styleChangesElement = document.createElement("span");
+            styleChangesElement.id = "style-changes-count";
+            styleChangesElement.textContent = this.styleChanges;
+            changesElement.appendChild(styleChangesElement);
+        }
+
+        if (this.styleChanges) {
+            if (this.styleChanges === 1)
+                changesElement.title = WebInspector.UIString("%d style change", this.styleChanges);
+            else
+                changesElement.title = WebInspector.UIString("%d style changes", this.styleChanges);
+        }
+    },
+
+    get hoveredDOMNode()
+    {
+        return this._hoveredDOMNode;
+    },
+
+    set hoveredDOMNode(x)
+    {
+        if (this._hoveredDOMNode === x)
+            return;
+
+        this._hoveredDOMNode = x;
+
+        if (this._hoveredDOMNode)
+            this._updateHoverHighlightSoon(this.showingDOMNodeHighlight ? 50 : 500);
+        else
+            this._updateHoverHighlight();
+    },
+
+    _updateHoverHighlightSoon: function(delay)
+    {
+        if ("_updateHoverHighlightTimeout" in this)
+            clearTimeout(this._updateHoverHighlightTimeout);
+        this._updateHoverHighlightTimeout = setTimeout(this._updateHoverHighlight.bind(this), delay);
+    },
+
+    _updateHoverHighlight: function()
+    {
+        if ("_updateHoverHighlightTimeout" in this) {
+            clearTimeout(this._updateHoverHighlightTimeout);
+            delete this._updateHoverHighlightTimeout;
+        }
+
+        if (this._hoveredDOMNode) {
+            InspectorBackend.highlightDOMNode(this._hoveredDOMNode.id);
+            this.showingDOMNodeHighlight = true;
+        } else {
+            InspectorBackend.hideDOMNodeHighlight();
+            this.showingDOMNodeHighlight = false;
+        }
+    }
+}
+
+WebInspector.PlatformFlavor = {
+    WindowsVista: "windows-vista",
+    MacTiger: "mac-tiger",
+    MacLeopard: "mac-leopard",
+    MacSnowLeopard: "mac-snowleopard"
+}
+
+WebInspector.loaded = function()
+{
+    InspectorBackend.setInjectedScriptSource("(" + injectedScriptConstructor + ");");
+
+    var platform = WebInspector.platform;
+    document.body.addStyleClass("platform-" + platform);
+    var flavor = WebInspector.platformFlavor;
+    if (flavor)
+        document.body.addStyleClass("platform-" + flavor);
+    var port = WebInspector.port;
+    document.body.addStyleClass("port-" + port);
+
+    this.settings = new WebInspector.Settings();
+
+    this.drawer = new WebInspector.Drawer();
+    this.console = new WebInspector.ConsoleView(this.drawer);
+    // TODO: Uncomment when enabling the Changes Panel
+    // this.changes = new WebInspector.ChangesView(this.drawer);
+    // TODO: Remove class="hidden" from inspector.html on button#changes-status-bar-item
+    this.drawer.visibleView = this.console;
+    this.domAgent = new WebInspector.DOMAgent();
+
+    this.resourceCategories = {
+        documents: new WebInspector.ResourceCategory("documents", WebInspector.UIString("Documents"), "rgb(47,102,236)"),
+        stylesheets: new WebInspector.ResourceCategory("stylesheets", WebInspector.UIString("Stylesheets"), "rgb(157,231,119)"),
+        images: new WebInspector.ResourceCategory("images", WebInspector.UIString("Images"), "rgb(164,60,255)"),
+        scripts: new WebInspector.ResourceCategory("scripts", WebInspector.UIString("Scripts"), "rgb(255,121,0)"),
+        xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),
+        fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),
+        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
+    };
+
+    this.panels = {};
+    this._createPanels();
+
+    var toolbarElement = document.getElementById("toolbar");
+    var previousToolbarItem = toolbarElement.children[0];
+
+    this.panelOrder = [];
+    for (var panelName in this.panels)
+        previousToolbarItem = WebInspector.addPanelToolbarIcon(toolbarElement, this.panels[panelName], previousToolbarItem);
+
+    this.Tips = {
+        ResourceNotCompressed: {id: 0, message: WebInspector.UIString("You could save bandwidth by having your web server compress this transfer with gzip or zlib.")}
+    };
+
+    this.Warnings = {
+        IncorrectMIMEType: {id: 0, message: WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s.")}
+    };
+
+    this.addMainEventListeners(document);
+
+    window.addEventListener("unload", this.windowUnload.bind(this), true);
+    window.addEventListener("resize", this.windowResize.bind(this), true);
+
+    document.addEventListener("focus", this.focusChanged.bind(this), true);
+    document.addEventListener("keydown", this.documentKeyDown.bind(this), false);
+    document.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);
+    document.addEventListener("copy", this.documentCopy.bind(this), true);
+    document.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);
+
+    var dockToggleButton = document.getElementById("dock-status-bar-item");
+    dockToggleButton.addEventListener("click", this.toggleAttach.bind(this), false);
+
+    if (this.attached)
+        dockToggleButton.title = WebInspector.UIString("Undock into separate window.");
+    else
+        dockToggleButton.title = WebInspector.UIString("Dock to main window.");
+
+    var errorWarningCount = document.getElementById("error-warning-count");
+    errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);
+    this._updateErrorAndWarningCounts();
+
+    this.styleChanges = 0;
+    // TODO: Uncomment when enabling the Changes Panel
+    // var changesElement = document.getElementById("changes-count");
+    // changesElement.addEventListener("click", this.showChanges.bind(this), false);
+    // this._updateErrorAndWarningCounts();
+
+    var searchField = document.getElementById("search");
+    searchField.addEventListener("search", this.performSearch.bind(this), false); // when the search is emptied
+    searchField.addEventListener("mousedown", this._searchFieldManualFocus.bind(this), false); // when the search field is manually selected
+    searchField.addEventListener("keydown", this._searchKeyDown.bind(this), true);
+
+    toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);
+    document.getElementById("close-button-left").addEventListener("click", this.close, true);
+    document.getElementById("close-button-right").addEventListener("click", this.close, true);
+
+    InspectorFrontendHost.loaded();
+}
+
+WebInspector.addPanelToolbarIcon = function(toolbarElement, panel, previousToolbarItem)
+{
+    var panelToolbarItem = panel.toolbarItem;
+    this.panelOrder.push(panel);
+    panelToolbarItem.addEventListener("click", this._toolbarItemClicked.bind(this));
+    if (previousToolbarItem)
+        toolbarElement.insertBefore(panelToolbarItem, previousToolbarItem.nextSibling);
+    else
+        toolbarElement.insertBefore(panelToolbarItem, toolbarElement.firstChild);
+    return panelToolbarItem;
+}
+
+var windowLoaded = function()
+{
+    var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();
+    if (localizedStringsURL) {
+        var localizedStringsScriptElement = document.createElement("script");
+        localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);
+        localizedStringsScriptElement.type = "text/javascript";
+        localizedStringsScriptElement.src = localizedStringsURL;
+        document.head.appendChild(localizedStringsScriptElement);
+    } else
+        WebInspector.loaded();
+
+    window.removeEventListener("load", windowLoaded, false);
+    delete windowLoaded;
+};
+
+window.addEventListener("load", windowLoaded, false);
+
+WebInspector.dispatch = function() {
+    var methodName = arguments[0];
+    var parameters = Array.prototype.slice.call(arguments, 1);
+
+    // We'd like to enforce asynchronous interaction between the inspector controller and the frontend.
+    // This is important to LayoutTests.
+    function delayDispatch()
+    {
+        WebInspector[methodName].apply(WebInspector, parameters);
+        WebInspector.pendingDispatches--;
+    }
+    WebInspector.pendingDispatches++;
+    setTimeout(delayDispatch, 0);
+}
+
+WebInspector.windowUnload = function(event)
+{
+    InspectorFrontendHost.windowUnloading();
+}
+
+WebInspector.windowResize = function(event)
+{
+    if (this.currentPanel)
+        this.currentPanel.resize();
+    this.drawer.resize();
+}
+
+WebInspector.windowFocused = function(event)
+{
+    // Fires after blur, so when focusing on either the main inspector
+    // or an <iframe> within the inspector we should always remove the
+    // "inactive" class.
+    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
+        document.body.removeStyleClass("inactive");
+}
+
+WebInspector.windowBlurred = function(event)
+{
+    // Leaving the main inspector or an <iframe> within the inspector.
+    // We can add "inactive" now, and if we are moving the focus to another
+    // part of the inspector then windowFocused will correct this.
+    if (event.target.document.nodeType === Node.DOCUMENT_NODE)
+        document.body.addStyleClass("inactive");
+}
+
+WebInspector.focusChanged = function(event)
+{
+    this.currentFocusElement = event.target;
+}
+
+WebInspector.setAttachedWindow = function(attached)
+{
+    this.attached = attached;
+}
+
+WebInspector.close = function(event)
+{
+    InspectorFrontendHost.closeWindow();
+}
+
+WebInspector.documentMouseOver = function(event)
+{
+    if (event.target.tagName !== "A")
+        return;
+
+    const anchor = event.target;
+    if (!anchor.hasStyleClass("webkit-html-resource-link"))
+        return;
+    if (WebInspector.canShowSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel) || WebInspector.ProfileType.URLRegExp.exec(anchor.href)) {
+        if (event.target.originalTitle)
+            event.target.title = event.target.originalTitle;
+        return;
+    }
+
+    if (!event.target.originalTitle)
+        event.target.originalTitle = event.target.title;
+    event.target.title = WebInspector.UIString("Cannot open this link. Make sure that resource tracking is enabled in the Resources panel.");
+}
+
+WebInspector.documentClick = function(event)
+{
+    var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");
+    if (!anchor)
+        return;
+
+    // Prevent the link from navigating, since we don't do any navigation by following links normally.
+    event.preventDefault();
+
+    function followLink()
+    {
+        // FIXME: support webkit-html-external-link links here.
+        if (WebInspector.canShowSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel)) {
+            if (anchor.hasStyleClass("webkit-html-external-link")) {
+                anchor.removeStyleClass("webkit-html-external-link");
+                anchor.addStyleClass("webkit-html-resource-link");
+            }
+
+            WebInspector.showSourceLine(anchor.href, anchor.lineNumber, anchor.preferredPanel);
+            return;
+        }
+
+        const profileMatch = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
+        if (profileMatch) {
+            WebInspector.showProfileForURL(anchor.href);
+            return;
+        }
+
+        const urlMatch = WebInspector.GenericURLRegExp.exec(anchor.href);
+        if (urlMatch && urlMatch[1] === "webkit-link-action") {
+            if (urlMatch[2] === "show-panel") {
+                const panel = urlMatch[4].substring(1);
+                if (WebInspector.panels[panel])
+                    WebInspector.currentPanel = WebInspector.panels[panel];
+            }
+            return;
+        }
+    }
+
+    if (WebInspector.followLinkTimeout)
+        clearTimeout(WebInspector.followLinkTimeout);
+
+    if (anchor.preventFollowOnDoubleClick) {
+        // Start a timeout if this is the first click, if the timeout is canceled
+        // before it fires, then a double clicked happened or another link was clicked.
+        if (event.detail === 1)
+            WebInspector.followLinkTimeout = setTimeout(followLink, 333);
+        return;
+    }
+
+    followLink();
+}
+
+WebInspector.documentKeyDown = function(event)
+{
+    if (this.currentFocusElement && this.currentFocusElement.handleKeyEvent) {
+        this.currentFocusElement.handleKeyEvent(event);
+        if (event.handled) {
+            event.preventDefault();
+            return;
+        }
+    }
+
+    if (this.currentPanel && this.currentPanel.handleShortcut) {
+        this.currentPanel.handleShortcut(event);
+        if (event.handled) {
+            event.preventDefault();
+            return;
+        }
+    }
+
+    var isMac = WebInspector.isMac();
+
+    switch (event.keyIdentifier) {
+        case "U+001B": // Escape key
+            event.preventDefault();
+            if (this.drawer.fullPanel)
+                return;
+
+            this.drawer.visible = !this.drawer.visible;
+            break;
+
+        case "U+0046": // F key
+            if (isMac)
+                var isFindKey = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
+            else
+                var isFindKey = event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;
+
+            if (isFindKey) {
+                WebInspector.focusSearchField();
+                event.preventDefault();
+            }
+            break;
+
+        case "F3":
+            if (!isMac) {
+                WebInspector.focusSearchField();
+                event.preventDefault();
+            }
+            break;
+
+        case "U+0047": // G key
+            if (isMac)
+                var isFindAgainKey = event.metaKey && !event.ctrlKey && !event.altKey;
+            else
+                var isFindAgainKey = event.ctrlKey && !event.metaKey && !event.altKey;
+
+            if (isFindAgainKey) {
+                if (event.shiftKey) {
+                    if (this.currentPanel.jumpToPreviousSearchResult)
+                        this.currentPanel.jumpToPreviousSearchResult();
+                } else if (this.currentPanel.jumpToNextSearchResult)
+                    this.currentPanel.jumpToNextSearchResult();
+                event.preventDefault();
+            }
+
+            break;
+
+        // Windows and Mac have two different definitions of [, so accept both.
+        case "U+005B":
+        case "U+00DB": // [ key
+            if (isMac)
+                var isRotateLeft = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
+            else
+                var isRotateLeft = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+
+            if (isRotateLeft) {
+                var index = this.panelOrder.indexOf(this.currentPanel);
+                index = (index === 0) ? this.panelOrder.length - 1 : index - 1;
+                this.panelOrder[index].toolbarItem.click();
+                event.preventDefault();
+            }
+
+            break;
+
+        // Windows and Mac have two different definitions of ], so accept both.
+        case "U+005D":
+        case "U+00DD":  // ] key
+            if (isMac)
+                var isRotateRight = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;
+            else
+                var isRotateRight = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+
+            if (isRotateRight) {
+                var index = this.panelOrder.indexOf(this.currentPanel);
+                index = (index + 1) % this.panelOrder.length;
+                this.panelOrder[index].toolbarItem.click();
+                event.preventDefault();
+            }
+
+            break;
+
+        case "U+0052": // R key
+            if ((event.metaKey && isMac) || (event.ctrlKey && !isMac))
+                InspectorBackend.reloadPage();
+            break;
+        case "F5":
+            if (!isMac)
+                InspectorBackend.reloadPage();
+            break;
+    }
+}
+
+WebInspector.documentCanCopy = function(event)
+{
+    if (this.currentPanel && this.currentPanel.handleCopyEvent)
+        event.preventDefault();
+}
+
+WebInspector.documentCopy = function(event)
+{
+    if (this.currentPanel && this.currentPanel.handleCopyEvent)
+        this.currentPanel.handleCopyEvent(event);
+}
+
+WebInspector.contextMenuEventFired = function(event)
+{
+    if (event.handled || event.target.hasStyleClass("popup-glasspane"))
+        event.preventDefault();
+}
+
+WebInspector.animateStyle = function(animations, duration, callback)
+{
+    var interval;
+    var complete = 0;
+
+    const intervalDuration = (1000 / 30); // 30 frames per second.
+    const animationsLength = animations.length;
+    const propertyUnit = {opacity: ""};
+    const defaultUnit = "px";
+
+    function cubicInOut(t, b, c, d)
+    {
+        if ((t/=d/2) < 1) return c/2*t*t*t + b;
+        return c/2*((t-=2)*t*t + 2) + b;
+    }
+
+    // Pre-process animations.
+    for (var i = 0; i < animationsLength; ++i) {
+        var animation = animations[i];
+        var element = null, start = null, end = null, key = null;
+        for (key in animation) {
+            if (key === "element")
+                element = animation[key];
+            else if (key === "start")
+                start = animation[key];
+            else if (key === "end")
+                end = animation[key];
+        }
+
+        if (!element || !end)
+            continue;
+
+        if (!start) {
+            var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);
+            start = {};
+            for (key in end)
+                start[key] = parseInt(computedStyle.getPropertyValue(key));
+            animation.start = start;
+        } else
+            for (key in start)
+                element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+    }
+
+    function animateLoop()
+    {
+        // Advance forward.
+        complete += intervalDuration;
+        var next = complete + intervalDuration;
+
+        // Make style changes.
+        for (var i = 0; i < animationsLength; ++i) {
+            var animation = animations[i];
+            var element = animation.element;
+            var start = animation.start;
+            var end = animation.end;
+            if (!element || !end)
+                continue;
+
+            var style = element.style;
+            for (key in end) {
+                var endValue = end[key];
+                if (next < duration) {
+                    var startValue = start[key];
+                    var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);
+                    style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+                } else
+                    style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
+            }
+        }
+
+        // End condition.
+        if (complete >= duration) {
+            clearInterval(interval);
+            if (callback)
+                callback();
+        }
+    }
+
+    interval = setInterval(animateLoop, intervalDuration);
+    return interval;
+}
+
+WebInspector.updateSearchLabel = function()
+{
+    if (!this.currentPanel)
+        return;
+
+    var newLabel = WebInspector.UIString("Search %s", this.currentPanel.toolbarItemLabel);
+    if (this.attached)
+        document.getElementById("search").setAttribute("placeholder", newLabel);
+    else {
+        document.getElementById("search").removeAttribute("placeholder");
+        document.getElementById("search-toolbar-label").textContent = newLabel;
+    }
+}
+
+WebInspector.focusSearchField = function()
+{
+    var searchField = document.getElementById("search");
+    searchField.focus();
+    searchField.select();
+}
+
+WebInspector.toggleAttach = function()
+{
+    if (!this.attached && !InspectorFrontendHost.canAttachWindow())
+        return;
+
+    this.attached = !this.attached;
+    this.drawer.resize();
+}
+
+WebInspector.toolbarDragStart = function(event)
+{
+    if ((!WebInspector.attached && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacLeopard && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacSnowLeopard) || WebInspector.port == "qt")
+        return;
+
+    var target = event.target;
+    if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))
+        return;
+
+    var toolbar = document.getElementById("toolbar");
+    if (target !== toolbar && !target.hasStyleClass("toolbar-item"))
+        return;
+
+    toolbar.lastScreenX = event.screenX;
+    toolbar.lastScreenY = event.screenY;
+
+    WebInspector.elementDragStart(toolbar, WebInspector.toolbarDrag, WebInspector.toolbarDragEnd, event, (WebInspector.attached ? "row-resize" : "default"));
+}
+
+WebInspector.toolbarDragEnd = function(event)
+{
+    var toolbar = document.getElementById("toolbar");
+
+    WebInspector.elementDragEnd(event);
+
+    delete toolbar.lastScreenX;
+    delete toolbar.lastScreenY;
+}
+
+WebInspector.toolbarDrag = function(event)
+{
+    var toolbar = document.getElementById("toolbar");
+
+    if (WebInspector.attached) {
+        var height = window.innerHeight - (event.screenY - toolbar.lastScreenY);
+
+        InspectorFrontendHost.setAttachedWindowHeight(height);
+    } else {
+        var x = event.screenX - toolbar.lastScreenX;
+        var y = event.screenY - toolbar.lastScreenY;
+
+        // We cannot call window.moveBy here because it restricts the movement
+        // of the window at the edges.
+        InspectorFrontendHost.moveWindowBy(x, y);
+    }
+
+    toolbar.lastScreenX = event.screenX;
+    toolbar.lastScreenY = event.screenY;
+
+    event.preventDefault();
+}
+
+WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)
+{
+    if (this._elementDraggingEventListener || this._elementEndDraggingEventListener)
+        this.elementDragEnd(event);
+
+    this._elementDraggingEventListener = dividerDrag;
+    this._elementEndDraggingEventListener = elementDragEnd;
+
+    document.addEventListener("mousemove", dividerDrag, true);
+    document.addEventListener("mouseup", elementDragEnd, true);
+
+    document.body.style.cursor = cursor;
+
+    event.preventDefault();
+}
+
+WebInspector.elementDragEnd = function(event)
+{
+    document.removeEventListener("mousemove", this._elementDraggingEventListener, true);
+    document.removeEventListener("mouseup", this._elementEndDraggingEventListener, true);
+
+    document.body.style.removeProperty("cursor");
+
+    delete this._elementDraggingEventListener;
+    delete this._elementEndDraggingEventListener;
+
+    event.preventDefault();
+}
+
+WebInspector.showConsole = function()
+{
+    this.drawer.showView(this.console);
+}
+
+WebInspector.showChanges = function()
+{
+    this.drawer.showView(this.changes);
+}
+
+WebInspector.showElementsPanel = function()
+{
+    this.currentPanel = this.panels.elements;
+}
+
+WebInspector.showResourcesPanel = function()
+{
+    this.currentPanel = this.panels.resources;
+}
+
+WebInspector.showScriptsPanel = function()
+{
+    this.currentPanel = this.panels.scripts;
+}
+
+WebInspector.showTimelinePanel = function()
+{
+    this.currentPanel = this.panels.timeline;
+}
+
+WebInspector.showProfilesPanel = function()
+{
+    this.currentPanel = this.panels.profiles;
+}
+
+WebInspector.showStoragePanel = function()
+{
+    this.currentPanel = this.panels.storage;
+}
+
+WebInspector.showConsolePanel = function()
+{
+    this.currentPanel = this.panels.console;
+}
+
+WebInspector.clearConsoleMessages = function()
+{
+    WebInspector.console.clearMessages();
+}
+
+WebInspector.selectDatabase = function(o)
+{
+    WebInspector.showStoragePanel();
+    WebInspector.panels.storage.selectDatabase(o);
+}
+
+WebInspector.selectDOMStorage = function(o)
+{
+    WebInspector.showStoragePanel();
+    WebInspector.panels.storage.selectDOMStorage(o);
+}
+
+WebInspector.updateResource = function(identifier, payload)
+{
+    var resource = this.resources[identifier];
+    if (!resource) {
+        resource = new WebInspector.Resource(identifier, payload.url);
+        this.resources[identifier] = resource;
+        this.resourceURLMap[resource.url] = resource;
+        if (this.panels.resources)
+            this.panels.resources.addResource(resource);
+    }
+
+    if (payload.didRequestChange) {
+        resource.domain = payload.host;
+        resource.path = payload.path;
+        resource.lastPathComponent = payload.lastPathComponent;
+        resource.requestHeaders = payload.requestHeaders;
+        resource.mainResource = payload.mainResource;
+        resource.requestMethod = payload.requestMethod;
+        resource.requestFormData = payload.requestFormData;
+        resource.cached = payload.cached;
+        resource.documentURL = payload.documentURL;
+
+        if (resource.mainResource)
+            this.mainResource = resource;
+
+        var match = payload.documentURL.match(WebInspector.URLRegExp);
+        if (match) {
+            var protocol = match[1].toLowerCase();
+            if (protocol.indexOf("http") === 0 || protocol === "file")
+                this._addCookieDomain(protocol === "file" ? "" : match[2]);
+        }
+    }
+
+    if (payload.didResponseChange) {
+        resource.mimeType = payload.mimeType;
+        resource.suggestedFilename = payload.suggestedFilename;
+        resource.expectedContentLength = payload.expectedContentLength;
+        resource.statusCode = payload.statusCode;
+        resource.suggestedFilename = payload.suggestedFilename;
+        resource.responseHeaders = payload.responseHeaders;
+    }
+
+    if (payload.didTypeChange) {
+        resource.type = payload.type;
+    }
+
+    if (payload.didLengthChange) {
+        resource.resourceSize = payload.resourceSize;
+    }
+
+    if (payload.didCompletionChange) {
+        resource.failed = payload.failed;
+        resource.finished = payload.finished;
+    }
+
+    if (payload.didTimingChange) {
+        if (payload.startTime)
+            resource.startTime = payload.startTime;
+        if (payload.responseReceivedTime)
+            resource.responseReceivedTime = payload.responseReceivedTime;
+        if (payload.endTime)
+            resource.endTime = payload.endTime;
+
+        if (payload.loadEventTime) {
+            // This loadEventTime is for the main resource, and we want to show it
+            // for all resources on this page. This means we want to set it as a member
+            // of the resources panel instead of the individual resource.
+            if (this.panels.resources)
+                this.panels.resources.mainResourceLoadTime = payload.loadEventTime;
+            if (this.panels.audits)
+                this.panels.audits.mainResourceLoadTime = payload.loadEventTime;
+        }
+
+        if (payload.domContentEventTime) {
+            // This domContentEventTime is for the main resource, so it should go in
+            // the resources panel for the same reasons as above.
+            if (this.panels.resources)
+                this.panels.resources.mainResourceDOMContentTime = payload.domContentEventTime;
+            if (this.panels.audits)
+                this.panels.audits.mainResourceDOMContentTime = payload.domContentEventTime;
+        }
+    }
+}
+
+WebInspector.removeResource = function(identifier)
+{
+    var resource = this.resources[identifier];
+    if (!resource)
+        return;
+
+    resource.category.removeResource(resource);
+    delete this.resourceURLMap[resource.url];
+    delete this.resources[identifier];
+
+    if (this.panels.resources)
+        this.panels.resources.removeResource(resource);
+}
+
+WebInspector.addDatabase = function(payload)
+{
+    if (!this.panels.storage)
+        return;
+    var database = new WebInspector.Database(
+        payload.id,
+        payload.domain,
+        payload.name,
+        payload.version);
+    this.panels.storage.addDatabase(database);
+}
+
+WebInspector._addCookieDomain = function(domain)
+{
+    // Eliminate duplicate domains from the list.
+    if (domain in this.cookieDomains)
+        return;
+    this.cookieDomains[domain] = true;
+
+    if (!this.panels.storage)
+        return;
+    this.panels.storage.addCookieDomain(domain);
+}
+
+WebInspector.addDOMStorage = function(payload)
+{
+    if (!this.panels.storage)
+        return;
+    var domStorage = new WebInspector.DOMStorage(
+        payload.id,
+        payload.host,
+        payload.isLocalStorage);
+    this.panels.storage.addDOMStorage(domStorage);
+}
+
+WebInspector.updateDOMStorage = function(storageId)
+{
+    if (!this.panels.storage)
+        return;
+    this.panels.storage.updateDOMStorage(storageId);
+}
+
+WebInspector.resourceTrackingWasEnabled = function()
+{
+    this.panels.resources.resourceTrackingWasEnabled();
+}
+
+WebInspector.resourceTrackingWasDisabled = function()
+{
+    this.panels.resources.resourceTrackingWasDisabled();
+}
+
+
+WebInspector.searchingForNodeWasEnabled = function()
+{
+    this.panels.elements.searchingForNodeWasEnabled();
+}
+
+WebInspector.searchingForNodeWasDisabled = function()
+{
+    this.panels.elements.searchingForNodeWasDisabled();
+}
+
+WebInspector.attachDebuggerWhenShown = function()
+{
+    this.panels.scripts.attachDebuggerWhenShown();
+}
+
+WebInspector.debuggerWasEnabled = function()
+{
+    this.panels.scripts.debuggerWasEnabled();
+}
+
+WebInspector.updatePauseOnExceptionsState = function(pauseOnExceptionsState)
+{
+    this.panels.scripts.updatePauseOnExceptionsState(pauseOnExceptionsState);
+}
+
+WebInspector.debuggerWasDisabled = function()
+{
+    this.panels.scripts.debuggerWasDisabled();
+}
+
+WebInspector.profilerWasEnabled = function()
+{
+    this.panels.profiles.profilerWasEnabled();
+}
+
+WebInspector.profilerWasDisabled = function()
+{
+    this.panels.profiles.profilerWasDisabled();
+}
+
+WebInspector.parsedScriptSource = function(sourceID, sourceURL, source, startingLine)
+{
+    this.panels.scripts.addScript(sourceID, sourceURL, source, startingLine);
+}
+
+WebInspector.restoredBreakpoint = function(sourceID, sourceURL, line, enabled, condition)
+{
+    var breakpoint = new WebInspector.Breakpoint(sourceURL, line, sourceID, condition);
+    breakpoint.enabled = enabled;
+    this.panels.scripts.addBreakpoint(breakpoint);
+}
+
+WebInspector.failedToParseScriptSource = function(sourceURL, source, startingLine, errorLine, errorMessage)
+{
+    this.panels.scripts.addScript(null, sourceURL, source, startingLine, errorLine, errorMessage);
+}
+
+WebInspector.pausedScript = function(callFrames)
+{
+    this.panels.scripts.debuggerPaused(callFrames);
+}
+
+WebInspector.resumedScript = function()
+{
+    this.panels.scripts.debuggerResumed();
+}
+
+WebInspector.populateInterface = function()
+{
+    for (var panelName in this.panels) {
+        var panel = this.panels[panelName];
+        if ("populateInterface" in panel)
+            panel.populateInterface();
+    }
+}
+
+WebInspector.reset = function()
+{
+    for (var panelName in this.panels) {
+        var panel = this.panels[panelName];
+        if ("reset" in panel)
+            panel.reset();
+    }
+
+    for (var category in this.resourceCategories)
+        this.resourceCategories[category].removeAllResources();
+
+    this.resources = {};
+    this.resourceURLMap = {};
+    this.cookieDomains = {};
+    this.hoveredDOMNode = null;
+
+    delete this.mainResource;
+
+    this.console.clearMessages();
+}
+
+WebInspector.resourceURLChanged = function(resource, oldURL)
+{
+    delete this.resourceURLMap[oldURL];
+    this.resourceURLMap[resource.url] = resource;
+}
+
+WebInspector.didCommitLoad = function()
+{
+    // Cleanup elements panel early on inspected page refresh.
+    WebInspector.setDocument(null);
+}
+
+WebInspector.updateConsoleMessageExpiredCount = function(count)
+{
+    var message = String.sprintf(WebInspector.UIString("%d console messages are not shown."), count);
+    WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(message, WebInspector.ConsoleMessage.MessageLevel.Warning));
+}
+
+WebInspector.addConsoleMessage = function(payload, opt_args)
+{
+    var consoleMessage = new WebInspector.ConsoleMessage(
+        payload.source,
+        payload.type,
+        payload.level,
+        payload.line,
+        payload.url,
+        payload.groupLevel,
+        payload.repeatCount);
+    consoleMessage.setMessageBody(Array.prototype.slice.call(arguments, 1));
+    this.console.addMessage(consoleMessage);
+}
+
+WebInspector.updateConsoleMessageRepeatCount = function(count)
+{
+    this.console.updateMessageRepeatCount(count);
+}
+
+WebInspector.log = function(message)
+{
+    // remember 'this' for setInterval() callback
+    var self = this;
+
+    // return indication if we can actually log a message
+    function isLogAvailable()
+    {
+        return WebInspector.ConsoleMessage && WebInspector.ObjectProxy && self.console;
+    }
+
+    // flush the queue of pending messages
+    function flushQueue()
+    {
+        var queued = WebInspector.log.queued;
+        if (!queued)
+            return;
+
+        for (var i = 0; i < queued.length; ++i)
+            logMessage(queued[i]);
+
+        delete WebInspector.log.queued;
+    }
+
+    // flush the queue if it console is available
+    // - this function is run on an interval
+    function flushQueueIfAvailable()
+    {
+        if (!isLogAvailable())
+            return;
+
+        clearInterval(WebInspector.log.interval);
+        delete WebInspector.log.interval;
+
+        flushQueue();
+    }
+
+    // actually log the message
+    function logMessage(message)
+    {
+        var repeatCount = 1;
+        if (message == WebInspector.log.lastMessage)
+            repeatCount = WebInspector.log.repeatCount + 1;
+
+        WebInspector.log.lastMessage = message;
+        WebInspector.log.repeatCount = repeatCount;
+
+        // ConsoleMessage expects a proxy object
+        message = new WebInspector.ObjectProxy(null, null, [], message, false);
+
+        // post the message
+        var msg = new WebInspector.ConsoleMessage(
+            WebInspector.ConsoleMessage.MessageSource.Other,
+            WebInspector.ConsoleMessage.MessageType.Log,
+            WebInspector.ConsoleMessage.MessageLevel.Debug,
+            -1,
+            null,
+            null,
+            repeatCount,
+            message);
+
+        self.console.addMessage(msg);
+    }
+
+    // if we can't log the message, queue it
+    if (!isLogAvailable()) {
+        if (!WebInspector.log.queued)
+            WebInspector.log.queued = [];
+
+        WebInspector.log.queued.push(message);
+
+        if (!WebInspector.log.interval)
+            WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);
+
+        return;
+    }
+
+    // flush the pending queue if any
+    flushQueue();
+
+    // log the message
+    logMessage(message);
+}
+
+WebInspector.addProfileHeader = function(profile)
+{
+    this.panels.profiles.addProfileHeader(profile);
+}
+
+WebInspector.setRecordingProfile = function(isProfiling)
+{
+    this.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);
+    this.panels.profiles.updateProfileTypeButtons();
+}
+
+WebInspector.drawLoadingPieChart = function(canvas, percent) {
+    var g = canvas.getContext("2d");
+    var darkColor = "rgb(122, 168, 218)";
+    var lightColor = "rgb(228, 241, 251)";
+    var cx = 8;
+    var cy = 8;
+    var r = 7;
+
+    g.beginPath();
+    g.arc(cx, cy, r, 0, Math.PI * 2, false);
+    g.closePath();
+
+    g.lineWidth = 1;
+    g.strokeStyle = darkColor;
+    g.fillStyle = lightColor;
+    g.fill();
+    g.stroke();
+
+    var startangle = -Math.PI / 2;
+    var endangle = startangle + (percent * Math.PI * 2);
+
+    g.beginPath();
+    g.moveTo(cx, cy);
+    g.arc(cx, cy, r, startangle, endangle, false);
+    g.closePath();
+
+    g.fillStyle = darkColor;
+    g.fill();
+}
+
+WebInspector.updateFocusedNode = function(nodeId)
+{
+    var node = WebInspector.domAgent.nodeForId(nodeId);
+    if (!node)
+        // FIXME: Should we deselect if null is passed in?
+        return;
+
+    this.currentPanel = this.panels.elements;
+    this.panels.elements.focusedDOMNode = node;
+}
+
+WebInspector.displayNameForURL = function(url)
+{
+    if (!url)
+        return "";
+    var resource = this.resourceURLMap[url];
+    if (resource)
+        return resource.displayName;
+    return url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
+}
+
+WebInspector.resourceForURL = function(url)
+{
+    if (url in this.resourceURLMap)
+        return this.resourceURLMap[url];
+
+    // No direct match found. Search for resources that contain
+    // a substring of the URL.
+    for (var resourceURL in this.resourceURLMap) {
+        if (resourceURL.hasSubstring(url))
+            return this.resourceURLMap[resourceURL];
+    }
+
+    return null;
+}
+
+WebInspector._choosePanelToShowSourceLine = function(url, line, preferredPanel)
+{
+    preferredPanel = preferredPanel || "resources";
+    var panel = this.panels[preferredPanel];
+    if (panel && panel.canShowSourceLine(url, line))
+        return panel;
+    panel = this.panels.resources;
+    return panel.canShowSourceLine(url, line) ? panel : null;
+}
+
+WebInspector.canShowSourceLine = function(url, line, preferredPanel)
+{
+    return !!this._choosePanelToShowSourceLine(url, line, preferredPanel);
+}
+
+WebInspector.showSourceLine = function(url, line, preferredPanel)
+{
+    this.currentPanel = this._choosePanelToShowSourceLine(url, line, preferredPanel);
+    if (!this.currentPanel)
+        return false;
+    this.currentPanel.showSourceLine(url, line);
+    return true;
+}
+
+WebInspector.linkifyStringAsFragment = function(string)
+{
+    var container = document.createDocumentFragment();
+    var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;
+
+    while (string) {
+        var linkString = linkStringRegEx.exec(string);
+        if (!linkString)
+            break;
+
+        linkString = linkString[0];
+        var title = linkString;
+        var linkIndex = string.indexOf(linkString);
+        var nonLink = string.substring(0, linkIndex);
+        container.appendChild(document.createTextNode(nonLink));
+
+        var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);
+        if (profileStringMatches)
+            title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);
+
+        var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);
+        container.appendChild(WebInspector.linkifyURLAsNode(realURL, title, null, (realURL in WebInspector.resourceURLMap)));
+        string = string.substring(linkIndex + linkString.length, string.length);
+    }
+
+    if (string)
+        container.appendChild(document.createTextNode(string));
+
+    return container;
+}
+
+WebInspector.showProfileForURL = function(url)
+{
+    WebInspector.showProfilesPanel();
+    WebInspector.panels.profiles.showProfileForURL(url);
+}
+
+WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
+{
+    if (!linkText)
+        linkText = url;
+    classes = (classes ? classes + " " : "");
+    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";
+
+    var a = document.createElement("a");
+    a.href = url;
+    a.className = classes;
+    a.title = tooltipText || url;
+    a.target = "_blank";
+    a.textContent = linkText;
+
+    return a;
+}
+
+WebInspector.linkifyURL = function(url, linkText, classes, isExternal, tooltipText)
+{
+    // Use the DOM version of this function so as to avoid needing to escape attributes.
+    // FIXME:  Get rid of linkifyURL entirely.
+    return WebInspector.linkifyURLAsNode(url, linkText, classes, isExternal, tooltipText).outerHTML;
+}
+
+WebInspector.linkifyResourceAsNode = function(url, preferredPanel, lineNumber, classes, tooltipText)
+{
+    var linkText = WebInspector.displayNameForURL(url);
+    if (lineNumber)
+        linkText += ":" + lineNumber;
+    var node = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);
+    node.lineNumber = lineNumber;
+    node.preferredPanel = preferredPanel;
+    return node;
+}
+
+WebInspector.completeURL = function(baseURL, href)
+{
+    var match = baseURL.match(WebInspector.URLRegExp);
+    if (match) {
+        var path = href;
+        if (path.charAt(0) !== "/") {
+            var basePath = match[4] || "/";
+            path = basePath.substring(0, basePath.lastIndexOf("/")) + "/" + path;
+        }
+        return match[1] + "://" + match[2] + (match[3] ? (":" + match[3]) : "") + path;
+    }
+    return null;
+}
+
+WebInspector.addMainEventListeners = function(doc)
+{
+    doc.defaultView.addEventListener("focus", this.windowFocused.bind(this), false);
+    doc.defaultView.addEventListener("blur", this.windowBlurred.bind(this), false);
+    doc.addEventListener("click", this.documentClick.bind(this), true);
+    doc.addEventListener("mouseover", this.documentMouseOver.bind(this), true);
+}
+
+WebInspector._searchFieldManualFocus = function(event)
+{
+    this.currentFocusElement = event.target;
+    this._previousFocusElement = event.target;
+}
+
+WebInspector._searchKeyDown = function(event)
+{
+    // Escape Key will clear the field and clear the search results
+    if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
+        // If focus belongs here and text is empty - nothing to do, return unhandled.
+        if (event.target.value === "" && this.currentFocusElement === this.previousFocusElement)
+            return;
+        event.preventDefault();
+        event.stopPropagation();
+        // When search was selected manually and is currently blank, we'd like Esc stay unhandled
+        // and hit console drawer handler.
+        event.target.value = "";
+
+        this.performSearch(event);
+        this.currentFocusElement = this.previousFocusElement;
+        if (this.currentFocusElement === event.target)
+            this.currentFocusElement.select();
+        return false;
+    }
+
+    if (!isEnterKey(event))
+        return false;
+
+    // Select all of the text so the user can easily type an entirely new query.
+    event.target.select();
+
+    // Only call performSearch if the Enter key was pressed. Otherwise the search
+    // performance is poor because of searching on every key. The search field has
+    // the incremental attribute set, so we still get incremental searches.
+    this.performSearch(event);
+
+    // Call preventDefault since this was the Enter key. This prevents a "search" event
+    // from firing for key down. This stops performSearch from being called twice in a row.
+    event.preventDefault();
+}
+
+WebInspector.performSearch = function(event)
+{
+    var query = event.target.value;
+    var forceSearch = event.keyIdentifier === "Enter";
+    var isShortSearch = (query.length < 3);
+
+    // Clear a leftover short search flag due to a non-conflicting forced search.
+    if (isShortSearch && this.shortSearchWasForcedByKeyEvent && this.currentQuery !== query)
+        delete this.shortSearchWasForcedByKeyEvent;
+
+    // Indicate this was a forced search on a short query.
+    if (isShortSearch && forceSearch)
+        this.shortSearchWasForcedByKeyEvent = true;
+
+    if (!query || !query.length || (!forceSearch && isShortSearch)) {
+        // Prevent clobbering a short search forced by the user.
+        if (this.shortSearchWasForcedByKeyEvent) {
+            delete this.shortSearchWasForcedByKeyEvent;
+            return;
+        }
+
+        delete this.currentQuery;
+
+        for (var panelName in this.panels) {
+            var panel = this.panels[panelName];
+            if (panel.currentQuery && panel.searchCanceled)
+                panel.searchCanceled();
+            delete panel.currentQuery;
+        }
+
+        this.updateSearchMatchesCount();
+
+        return;
+    }
+
+    if (query === this.currentPanel.currentQuery && this.currentPanel.currentQuery === this.currentQuery) {
+        // When this is the same query and a forced search, jump to the next
+        // search result for a good user experience.
+        if (forceSearch && this.currentPanel.jumpToNextSearchResult)
+            this.currentPanel.jumpToNextSearchResult();
+        return;
+    }
+
+    this.currentQuery = query;
+
+    this.updateSearchMatchesCount();
+
+    if (!this.currentPanel.performSearch)
+        return;
+
+    this.currentPanel.currentQuery = query;
+    this.currentPanel.performSearch(query);
+}
+
+WebInspector.addNodesToSearchResult = function(nodeIds)
+{
+    WebInspector.panels.elements.addNodesToSearchResult(nodeIds);
+}
+
+WebInspector.updateSearchMatchesCount = function(matches, panel)
+{
+    if (!panel)
+        panel = this.currentPanel;
+
+    panel.currentSearchMatches = matches;
+
+    if (panel !== this.currentPanel)
+        return;
+
+    if (!this.currentPanel.currentQuery) {
+        document.getElementById("search-results-matches").addStyleClass("hidden");
+        return;
+    }
+
+    if (matches) {
+        if (matches === 1)
+            var matchesString = WebInspector.UIString("1 match");
+        else
+            var matchesString = WebInspector.UIString("%d matches", matches);
+    } else
+        var matchesString = WebInspector.UIString("Not Found");
+
+    var matchesToolbarElement = document.getElementById("search-results-matches");
+    matchesToolbarElement.removeStyleClass("hidden");
+    matchesToolbarElement.textContent = matchesString;
+}
+
+WebInspector.UIString = function(string)
+{
+    if (window.localizedStrings && string in window.localizedStrings)
+        string = window.localizedStrings[string];
+    else {
+        if (!(string in this.missingLocalizedStrings)) {
+            if (!WebInspector.InspectorBackendStub)
+                console.error("Localized string \"" + string + "\" not found.");
+            this.missingLocalizedStrings[string] = true;
+        }
+
+        if (Preferences.showMissingLocalizedStrings)
+            string += " (not localized)";
+    }
+
+    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
+}
+
+WebInspector.isMac = function()
+{
+    if (!("_isMac" in this))
+        this._isMac = WebInspector.platform === "mac";
+
+    return this._isMac;
+}
+
+WebInspector.isBeingEdited = function(element)
+{
+    return element.__editing;
+}
+
+WebInspector.startEditing = function(element, committedCallback, cancelledCallback, context, multiline)
+{
+    if (element.__editing)
+        return;
+    element.__editing = true;
+
+    var oldText = getContent(element);
+    var moveDirection = "";
+
+    element.addStyleClass("editing");
+
+    var oldTabIndex = element.tabIndex;
+    if (element.tabIndex < 0)
+        element.tabIndex = 0;
+
+    function blurEventListener() {
+        editingCommitted.call(element);
+    }
+
+    function getContent(element) {
+        if (element.tagName === "INPUT" && element.type === "text")
+            return element.value;
+        else
+            return element.textContent;
+    }
+
+    function cleanUpAfterEditing() {
+        delete this.__editing;
+
+        this.removeStyleClass("editing");
+        this.tabIndex = oldTabIndex;
+        this.scrollTop = 0;
+        this.scrollLeft = 0;
+
+        element.removeEventListener("blur", blurEventListener, false);
+        element.removeEventListener("keydown", keyDownEventListener, true);
+
+        if (element === WebInspector.currentFocusElement || element.isAncestor(WebInspector.currentFocusElement))
+            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
+    }
+
+    function editingCancelled() {
+        if (this.tagName === "INPUT" && this.type === "text")
+            this.value = oldText;
+        else
+            this.textContent = oldText;
+
+        cleanUpAfterEditing.call(this);
+
+        if (cancelledCallback)
+            cancelledCallback(this, context);
+    }
+
+    function editingCommitted() {
+        cleanUpAfterEditing.call(this);
+
+        if (committedCallback)
+            committedCallback(this, getContent(this), oldText, context, moveDirection);
+    }
+
+    function keyDownEventListener(event) {
+        var isMetaOrCtrl = WebInspector.isMac() ?
+            event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
+            event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
+        if (isEnterKey(event) && (!multiline || isMetaOrCtrl)) {
+            editingCommitted.call(element);
+            event.preventDefault();
+            event.stopPropagation();
+        } else if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Esc) {
+            editingCancelled.call(element);
+            event.preventDefault();
+            event.stopPropagation();
+        } else if (event.keyIdentifier === "U+0009") // Tab key
+            moveDirection = (event.shiftKey ? "backward" : "forward");
+    }
+
+    element.addEventListener("blur", blurEventListener, false);
+    element.addEventListener("keydown", keyDownEventListener, true);
+
+    WebInspector.currentFocusElement = element;
+}
+
+WebInspector._toolbarItemClicked = function(event)
+{
+    var toolbarItem = event.currentTarget;
+    this.currentPanel = toolbarItem.panel;
+}
+
+// This table maps MIME types to the Resource.Types which are valid for them.
+// The following line:
+//    "text/html":                {0: 1},
+// means that text/html is a valid MIME type for resources that have type
+// WebInspector.Resource.Type.Document (which has a value of 0).
+WebInspector.MIMETypes = {
+    "text/html":                   {0: true},
+    "text/xml":                    {0: true},
+    "text/plain":                  {0: true},
+    "application/xhtml+xml":       {0: true},
+    "text/css":                    {1: true},
+    "text/xsl":                    {1: true},
+    "image/jpeg":                  {2: true},
+    "image/png":                   {2: true},
+    "image/gif":                   {2: true},
+    "image/bmp":                   {2: true},
+    "image/vnd.microsoft.icon":    {2: true},
+    "image/x-icon":                {2: true},
+    "image/x-xbitmap":             {2: true},
+    "font/ttf":                    {3: true},
+    "font/opentype":               {3: true},
+    "application/x-font-type1":    {3: true},
+    "application/x-font-ttf":      {3: true},
+    "application/x-truetype-font": {3: true},
+    "text/javascript":             {4: true},
+    "text/ecmascript":             {4: true},
+    "application/javascript":      {4: true},
+    "application/ecmascript":      {4: true},
+    "application/x-javascript":    {4: true},
+    "text/javascript1.1":          {4: true},
+    "text/javascript1.2":          {4: true},
+    "text/javascript1.3":          {4: true},
+    "text/jscript":                {4: true},
+    "text/livescript":             {4: true},
+}
+
+/* InspectorBackendStub.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+if (!window.InspectorBackend) {
+
+WebInspector.InspectorBackendStub = function()
+{
+    this._searchingForNode = false;
+    this._attachedWindowHeight = 0;
+    this._timelineEnabled = false;
+}
+
+WebInspector.InspectorBackendStub.prototype = {
+    wrapCallback: function(func)
+    {
+        return func;
+    },
+
+    closeWindow: function()
+    {
+        this._windowVisible = false;
+    },
+
+    attach: function()
+    {
+    },
+
+    detach: function()
+    {
+    },
+
+    storeLastActivePanel: function(panel)
+    {
+    },
+
+    clearMessages: function()
+    {
+    },
+
+    searchingForNode: function()
+    {
+        return this._searchingForNode;
+    },
+
+    search: function(sourceRow, query)
+    {
+    },
+
+    toggleNodeSearch: function()
+    {
+        this._searchingForNode = !this._searchingForNode;
+    },
+
+    setAttachedWindowHeight: function(height)
+    {
+    },
+
+    moveByUnrestricted: function(x, y)
+    {
+    },
+
+    getResourceContent: function(callId, identifier)
+    {
+        WebInspector.didGetResourceContent(callId, "");
+    },
+
+    highlightDOMNode: function(node)
+    {
+    },
+
+    hideDOMNodeHighlight: function()
+    {
+    },
+
+    inspectedWindow: function()
+    {
+        return window;
+    },
+
+    loaded: function()
+    {
+    },
+
+    localizedStringsURL: function()
+    {
+        return undefined;
+    },
+
+    windowUnloading: function()
+    {
+        return false;
+    },
+
+    hiddenPanels: function()
+    {
+        return "";
+    },
+
+    enableResourceTracking: function()
+    {
+        WebInspector.resourceTrackingWasEnabled();
+    },
+
+    disableResourceTracking: function()
+    {
+        WebInspector.resourceTrackingWasDisabled();
+    },
+
+
+    enableSearchingForNode: function()
+    {
+        WebInspector.searchingForNodeWasEnabled();
+    },
+
+    disableSearchingForNode: function()
+    {
+        WebInspector.searchingForNodeWasDisabled();
+    },
+
+    reloadPage: function()
+    {
+    },
+
+    enableDebugger: function()
+    {
+        WebInspector.debuggerWasEnabled();
+    },
+
+    disableDebugger: function()
+    {
+        WebInspector.debuggerWasDisabled();
+    },
+
+    setBreakpoint: function(sourceID, line, enabled, condition)
+    {
+    },
+
+    removeBreakpoint: function(sourceID, line)
+    {
+    },
+
+    activateBreakpoints: function()
+    {
+        this._breakpointsActivated = true;
+    },
+
+    deactivateBreakpoints: function()
+    {
+        this._breakpointsActivated = false;
+    },
+
+    pauseInDebugger: function()
+    {
+    },
+
+    setPauseOnExceptionsState: function(value)
+    {
+        WebInspector.updatePauseOnExceptionsState(value);
+    },
+
+    resumeDebugger: function()
+    {
+    },
+
+    enableProfiler: function()
+    {
+        WebInspector.profilerWasEnabled();
+    },
+
+    disableProfiler: function()
+    {
+        WebInspector.profilerWasDisabled();
+    },
+
+    startProfiling: function()
+    {
+    },
+
+    stopProfiling: function()
+    {
+    },
+
+    getProfileHeaders: function(callId)
+    {
+        WebInspector.didGetProfileHeaders(callId, []);
+    },
+
+    getProfile: function(callId, uid)
+    {
+        if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
+        {
+            WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
+        }
+    },
+
+    takeHeapSnapshot: function()
+    {
+    },
+
+    databaseTableNames: function(database)
+    {
+        return [];
+    },
+
+    stepIntoStatementInDebugger: function()
+    {
+    },
+
+    stepOutOfFunctionInDebugger: function()
+    {
+    },
+
+    stepOverStatementInDebugger: function()
+    {
+    },
+
+    saveFrontendSettings: function()
+    {
+    },
+
+    dispatchOnInjectedScript: function()
+    {
+    },
+
+    releaseWrapperObjectGroup: function()
+    {
+    },
+
+    setInjectedScriptSource: function()
+    {
+    },
+    
+    addScriptToEvaluateOnLoad: function()
+    {
+    },
+
+    removeAllScriptsToEvaluateOnLoad: function()
+    {
+    }
+}
+
+InspectorBackend = new WebInspector.InspectorBackendStub();
+
+}
+
+/* InspectorFrontendHostStub.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+if (!window.InspectorFrontendHost) {
+
+WebInspector.InspectorFrontendHostStub = function()
+{
+    this._attachedWindowHeight = 0;
+}
+
+WebInspector._platformFlavor = WebInspector.PlatformFlavor.MacLeopard;
+
+WebInspector.InspectorFrontendHostStub.prototype = {
+    platform: function()
+    {
+        return "mac";
+    },
+
+    port: function()
+    {
+        return "unknown";
+    },
+
+    closeWindow: function()
+    {
+        this._windowVisible = false;
+    },
+
+    attach: function()
+    {
+    },
+
+    detach: function()
+    {
+    },
+
+    search: function(sourceRow, query)
+    {
+    },
+
+    setAttachedWindowHeight: function(height)
+    {
+    },
+
+    moveWindowBy: function(x, y)
+    {
+    },
+
+    loaded: function()
+    {
+    },
+
+    localizedStringsURL: function()
+    {
+        return undefined;
+    },
+
+    hiddenPanels: function()
+    {
+        return "";
+    },
+
+    windowUnloading: function()
+    {
+    },
+
+    copyText: function()
+    {
+    },
+
+    canAttachWindow: function()
+    {
+        return false;
+    }
+}
+
+InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
+
+}
+
+/* Object.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Object = function() {
+}
+
+WebInspector.Object.prototype = {
+    addEventListener: function(eventType, listener, thisObject) {
+        if (!("_listeners" in this))
+            this._listeners = {};
+        if (!(eventType in this._listeners))
+            this._listeners[eventType] = [];
+        this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
+    },
+
+    removeEventListener: function(eventType, listener, thisObject) {
+        if (!("_listeners" in this) || !(eventType in this._listeners))
+            return;
+        var listeners = this._listeners[eventType];
+        for (var i = 0; i < listeners.length; ++i) {
+            if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
+                listeners.splice(i, 1);
+            else if (!listener && thisObject && listeners[i].thisObject === thisObject)
+                listeners.splice(i, 1);
+        }
+
+        if (!listeners.length)
+            delete this._listeners[eventType];
+    },
+
+    dispatchEventToListeners: function(eventType) {
+        if (!("_listeners" in this) || !(eventType in this._listeners))
+            return;
+
+        var stoppedPropagation = false;
+
+        function stopPropagation()
+        {
+            stoppedPropagation = true;
+        }
+
+        function preventDefault()
+        {
+            this.defaultPrevented = true;
+        }
+
+        var event = {target: this, type: eventType, defaultPrevented: false};
+        event.stopPropagation = stopPropagation;
+        event.preventDefault = preventDefault;
+
+        var listeners = this._listeners[eventType].slice(0);
+        for (var i = 0; i < listeners.length; ++i) {
+            listeners[i].listener.call(listeners[i].thisObject, event);
+            if (stoppedPropagation)
+                break;
+        }
+
+        return event.defaultPrevented;
+    }
+}
+
+/* Settings.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+var Preferences = {
+    maxInlineTextChildLength: 80,
+    minConsoleHeight: 75,
+    minSidebarWidth: 100,
+    minElementsSidebarWidth: 200,
+    minScriptsSidebarWidth: 200,
+    styleRulesExpandedState: {},
+    showMissingLocalizedStrings: false,
+    samplingCPUProfiler: false,
+    showColorNicknames: true,
+    debuggerAlwaysEnabled: false,
+    profilerAlwaysEnabled: false,
+    auditsPanelEnabled: false
+}
+
+WebInspector.populateFrontendSettings = function(settingsString)
+{
+    WebInspector.settings._load(settingsString);
+}
+
+WebInspector.Settings = function()
+{
+}
+
+WebInspector.Settings.prototype = {
+    _load: function(settingsString)
+    {
+        try {
+            this._store = JSON.parse(settingsString);
+        } catch (e) {
+            // May fail;
+            this._store = {};
+        }
+
+        this._installSetting("eventListenersFilter", "event-listeners-filter", "all");
+        this._installSetting("colorFormat", "color-format", "hex");
+        this._installSetting("resourcesLargeRows", "resources-large-rows", true);
+        this._installSetting("watchExpressions", "watch-expressions", []);
+        this._installSetting("lastViewedScriptFile", "last-viewed-script-file");
+        this._installSetting("showInheritedComputedStyleProperties", "show-inherited-computed-style-properties", false);
+        this._installSetting("showUserAgentStyles", "show-user-agent-styles", true);
+        this._installSetting("resourceViewTab", "resource-view-tab", "content");
+        this.dispatchEventToListeners("loaded");
+    },
+
+    _installSetting: function(name, propertyName, defaultValue)
+    {
+        this.__defineGetter__(name, this._get.bind(this, propertyName));
+        this.__defineSetter__(name, this._set.bind(this, propertyName));
+        if (!(propertyName in this._store)) {
+            this._store[propertyName] = defaultValue;
+        }
+    },
+
+    _get: function(propertyName)
+    {
+        return this._store[propertyName];
+    },
+
+    _set: function(propertyName, newValue)
+    {
+        this._store[propertyName] = newValue;
+        try {
+            InspectorBackend.saveFrontendSettings(JSON.stringify(this._store));
+        } catch (e) {
+            // May fail;
+        }
+    }
+}
+
+WebInspector.Settings.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ContextMenu.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ContextMenu = function() {
+    this._items = [];
+    this._handlers = {};
+}
+
+WebInspector.ContextMenu.prototype = {
+    show: function(event)
+    {
+        // Remove trailing separator.
+        while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))
+            this._items.splice(this._items.length - 1, 1);
+
+        if (this._items.length) {
+            WebInspector._contextMenu = this;
+            InspectorFrontendHost.showContextMenu(event, this._items);
+        }
+    },
+
+    appendItem: function(label, handler)
+    {
+        var id = this._items.length;
+        this._items.push({id: id, label: label});
+        this._handlers[id] = handler;
+    },
+
+    appendSeparator: function()
+    {
+        // No separator dupes allowed.
+        if (this._items.length === 0)
+            return;
+        if (!("id" in this._items[this._items.length - 1]))
+            return;
+        this._items.push({});
+    },
+
+    _itemSelected: function(id)
+    {
+        if (this._handlers[id])
+            this._handlers[id].call(this);
+    }
+}
+
+WebInspector.contextMenuItemSelected = function(id)
+{
+    if (WebInspector._contextMenu)
+        WebInspector._contextMenu._itemSelected(id);
+}
+
+WebInspector.contextMenuCleared = function()
+{
+    // FIXME: Unfortunately, contextMenuCleared is invoked between show and item selected
+    // so we can't delete last menu object from WebInspector. Fix the contract.
+}
+
+/* KeyboardShortcut.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.KeyboardShortcut = function()
+{
+};
+
+/**
+ * Constants for encoding modifier key set as a bit mask.
+ * @see #_makeKeyFromCodeAndModifiers
+ */
+WebInspector.KeyboardShortcut.Modifiers = {
+    None: 0,   // Constant for empty modifiers set.
+    Shift: 1,
+    Ctrl: 2,
+    Alt: 4,
+    Meta: 8    // Command key on Mac, Win key on other platforms.
+};
+
+WebInspector.KeyboardShortcut.KeyCodes = {
+    Backspace: 8,
+    Tab: 9,
+    Esc: 27,
+    Space: 32,
+    PageUp: 33,      // also NUM_NORTH_EAST
+    PageDown: 34,    // also NUM_SOUTH_EAST
+    End: 35,         // also NUM_SOUTH_WEST
+    Home: 36,        // also NUM_NORTH_WEST
+    Left: 37,        // also NUM_WEST
+    Up: 38,          // also NUM_NORTH
+    Right: 39,       // also NUM_EAST
+    Down: 40,        // also NUM_SOUTH
+    Delete: 46,
+    Zero: 48,
+    F1: 112,
+    F2: 113,
+    F3: 114,
+    F4: 115,
+    F5: 116,
+    F6: 117,
+    F7: 118,
+    F8: 119,
+    F9: 120,
+    F10: 121,
+    F11: 122,
+    F12: 123,
+    Semicolon: 186,    // ;
+    Plus: 187,         // +
+    Comma: 188,        // ,
+    Minus: 189,        // -
+    Period: 190,       // .
+    Slash: 191,        // /
+    Apostrophe: 192,   // `
+    SingleQuote: 222   // '
+};
+
+/**
+ * Creates a number encoding keyCode in the lower 8 bits and modifiers mask in the higher 8 bits.
+ * It is useful for matching pressed keys.
+ * keyCode is the Code of the key, or a character "a-z" which is converted to a keyCode value.
+ * optModifiers is an Optional list of modifiers passed as additional paramerters.
+ */
+WebInspector.KeyboardShortcut.makeKey = function(keyCode, optModifiers)
+{
+    if (typeof keyCode === "string")
+        keyCode = keyCode.charCodeAt(0) - 32;
+    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
+    for (var i = 1; i < arguments.length; i++)
+        modifiers |= arguments[i];
+    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);
+};
+
+WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)
+{
+    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
+    if (keyboardEvent.shiftKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;
+    if (keyboardEvent.ctrlKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;
+    if (keyboardEvent.altKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;
+    if (keyboardEvent.metaKey)
+        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;
+    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);
+};
+
+WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)
+{
+    return (keyCode & 255) | (modifiers << 8);
+};
+
+/* TextPrompt.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextPrompt = function(element, completions, stopCharacters)
+{
+    this.element = element;
+    this.completions = completions;
+    this.completionStopCharacters = stopCharacters;
+    this.history = [];
+    this.historyOffset = 0;
+    this.element.addEventListener("keydown", this._onKeyDown.bind(this), true);
+}
+
+WebInspector.TextPrompt.prototype = {
+    get text()
+    {
+        return this.element.textContent;
+    },
+
+    set text(x)
+    {
+        if (!x) {
+            // Append a break element instead of setting textContent to make sure the selection is inside the prompt.
+            this.element.removeChildren();
+            this.element.appendChild(document.createElement("br"));
+        } else
+            this.element.textContent = x;
+
+        this.moveCaretToEndOfPrompt();
+    },
+
+    _onKeyDown: function(event)
+    {
+        function defaultAction()
+        {
+            this.clearAutoComplete();
+            this.autoCompleteSoon();
+        }
+
+        var handled = false;
+        switch (event.keyIdentifier) {
+            case "Up":
+                this._upKeyPressed(event);
+                break;
+            case "Down":
+                this._downKeyPressed(event);
+                break;
+            case "U+0009": // Tab
+                this._tabKeyPressed(event);
+                break;
+            case "Right":
+            case "End":
+                if (!this.acceptAutoComplete())
+                    this.autoCompleteSoon();
+                break;
+            case "Alt":
+            case "Meta":
+            case "Shift":
+            case "Control":
+                break;
+            case "U+0050": // Ctrl+P = Previous
+                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
+                    handled = true;
+                    this._moveBackInHistory();
+                    break;
+                }
+                defaultAction.call(this);
+                break;
+            case "U+004E": // Ctrl+N = Next
+                if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
+                    handled = true;
+                    this._moveForwardInHistory();
+                    break;
+                }
+                defaultAction.call(this);
+                break;
+            default:
+                defaultAction.call(this);
+                break;
+        }
+
+        if (handled) {
+            event.preventDefault();
+            event.stopPropagation();
+        }
+    },
+
+    acceptAutoComplete: function()
+    {
+        if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)
+            return false;
+
+        var text = this.autoCompleteElement.textContent;
+        var textNode = document.createTextNode(text);
+        this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);
+        delete this.autoCompleteElement;
+
+        var finalSelectionRange = document.createRange();
+        finalSelectionRange.setStart(textNode, text.length);
+        finalSelectionRange.setEnd(textNode, text.length);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+
+        return true;
+    },
+
+    clearAutoComplete: function(includeTimeout)
+    {
+        if (includeTimeout && "_completeTimeout" in this) {
+            clearTimeout(this._completeTimeout);
+            delete this._completeTimeout;
+        }
+
+        if (!this.autoCompleteElement)
+            return;
+
+        if (this.autoCompleteElement.parentNode)
+            this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
+        delete this.autoCompleteElement;
+
+        if (!this._userEnteredRange || !this._userEnteredText)
+            return;
+
+        this._userEnteredRange.deleteContents();
+
+        var userTextNode = document.createTextNode(this._userEnteredText);
+        this._userEnteredRange.insertNode(userTextNode);
+
+        var selectionRange = document.createRange();
+        selectionRange.setStart(userTextNode, this._userEnteredText.length);
+        selectionRange.setEnd(userTextNode, this._userEnteredText.length);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+
+        delete this._userEnteredRange;
+        delete this._userEnteredText;
+    },
+
+    autoCompleteSoon: function()
+    {
+        if (!("_completeTimeout" in this))
+            this._completeTimeout = setTimeout(this.complete.bind(this, true), 250);
+    },
+
+    complete: function(auto)
+    {
+        this.clearAutoComplete(true);
+        var selection = window.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+        if (!selectionRange.commonAncestorContainer.isDescendant(this.element))
+            return;
+        if (auto && !this.isCaretAtEndOfPrompt())
+            return;
+        var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this.completionStopCharacters, this.element, "backward");
+        this.completions(wordPrefixRange, auto, this._completionsReady.bind(this, selection, auto, wordPrefixRange));
+    },
+
+    _completionsReady: function(selection, auto, originalWordPrefixRange, completions)
+    {
+        if (!completions || !completions.length)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+
+        var fullWordRange = document.createRange();
+        fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);
+        fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);
+
+        if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())
+            return;
+
+        if (completions.length === 1 || selection.isCollapsed || auto) {
+            var completionText = completions[0];
+        } else {
+            var currentText = fullWordRange.toString();
+
+            var foundIndex = null;
+            for (var i = 0; i < completions.length; ++i)
+                if (completions[i] === currentText)
+                    foundIndex = i;
+
+            if (foundIndex === null || (foundIndex + 1) >= completions.length)
+                var completionText = completions[0];
+            else
+                var completionText = completions[foundIndex + 1];
+        }
+
+        var wordPrefixLength = originalWordPrefixRange.toString().length;
+
+        this._userEnteredRange = fullWordRange;
+        this._userEnteredText = fullWordRange.toString();
+
+        fullWordRange.deleteContents();
+
+        var finalSelectionRange = document.createRange();
+
+        if (auto) {
+            var prefixText = completionText.substring(0, wordPrefixLength);
+            var suffixText = completionText.substring(wordPrefixLength);
+
+            var prefixTextNode = document.createTextNode(prefixText);
+            fullWordRange.insertNode(prefixTextNode);
+
+            this.autoCompleteElement = document.createElement("span");
+            this.autoCompleteElement.className = "auto-complete-text";
+            this.autoCompleteElement.textContent = suffixText;
+
+            prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);
+
+            finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);
+            finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);
+        } else {
+            var completionTextNode = document.createTextNode(completionText);
+            fullWordRange.insertNode(completionTextNode);
+
+            if (completions.length > 1)
+                finalSelectionRange.setStart(completionTextNode, wordPrefixLength);
+            else
+                finalSelectionRange.setStart(completionTextNode, completionText.length);
+
+            finalSelectionRange.setEnd(completionTextNode, completionText.length);
+        }
+
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+    },
+
+    isCaretInsidePrompt: function()
+    {
+        return this.element.isInsertionCaretInside();
+    },
+
+    isCaretAtEndOfPrompt: function()
+    {
+        var selection = window.getSelection();
+        if (!selection.rangeCount || !selection.isCollapsed)
+            return false;
+
+        var selectionRange = selection.getRangeAt(0);
+        var node = selectionRange.startContainer;
+        if (node !== this.element && !node.isDescendant(this.element))
+            return false;
+
+        if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)
+            return false;
+
+        var foundNextText = false;
+        while (node) {
+            if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {
+                if (foundNextText)
+                    return false;
+                foundNextText = true;
+            }
+
+            node = node.traverseNextNode(this.element);
+        }
+
+        return true;
+    },
+
+    isCaretOnFirstLine: function()
+    {
+        var selection = window.getSelection();
+        var focusNode = selection.focusNode;
+        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
+            return true;
+
+        if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)
+            return false;
+        focusNode = focusNode.previousSibling;
+
+        while (focusNode) {
+            if (focusNode.nodeType !== Node.TEXT_NODE)
+                return true;
+            if (focusNode.textContent.indexOf("\n") !== -1)
+                return false;
+            focusNode = focusNode.previousSibling;
+        }
+
+        return true;
+    },
+
+    isCaretOnLastLine: function()
+    {
+        var selection = window.getSelection();
+        var focusNode = selection.focusNode;
+        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)
+            return true;
+
+        if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)
+            return false;
+        focusNode = focusNode.nextSibling;
+
+        while (focusNode) {
+            if (focusNode.nodeType !== Node.TEXT_NODE)
+                return true;
+            if (focusNode.textContent.indexOf("\n") !== -1)
+                return false;
+            focusNode = focusNode.nextSibling;
+        }
+
+        return true;
+    },
+
+    moveCaretToEndOfPrompt: function()
+    {
+        var selection = window.getSelection();
+        var selectionRange = document.createRange();
+
+        var offset = this.element.childNodes.length;
+        selectionRange.setStart(this.element, offset);
+        selectionRange.setEnd(this.element, offset);
+
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+    },
+
+    _tabKeyPressed: function(event)
+    {
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.complete();
+    },
+
+    _upKeyPressed: function(event)
+    {
+        if (!this.isCaretOnFirstLine())
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this._moveBackInHistory();
+    },
+
+    _downKeyPressed: function(event)
+    {
+        if (!this.isCaretOnLastLine())
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this._moveForwardInHistory();
+    },
+
+    _moveBackInHistory: function()
+    {
+        if (this.historyOffset == this.history.length)
+            return;
+
+        this.clearAutoComplete(true);
+
+        if (this.historyOffset === 0)
+            this.tempSavedCommand = this.text;
+
+        ++this.historyOffset;
+        this.text = this.history[this.history.length - this.historyOffset];
+
+        this.element.scrollIntoViewIfNeeded();
+        var firstNewlineIndex = this.text.indexOf("\n");
+        if (firstNewlineIndex === -1)
+            this.moveCaretToEndOfPrompt();
+        else {
+            var selection = window.getSelection();
+            var selectionRange = document.createRange();
+
+            selectionRange.setStart(this.element.firstChild, firstNewlineIndex);
+            selectionRange.setEnd(this.element.firstChild, firstNewlineIndex);
+
+            selection.removeAllRanges();
+            selection.addRange(selectionRange);
+        }
+    },
+
+    _moveForwardInHistory: function()
+    {
+        if (this.historyOffset === 0)
+            return;
+
+        this.clearAutoComplete(true);
+
+        --this.historyOffset;
+
+        if (this.historyOffset === 0) {
+            this.text = this.tempSavedCommand;
+            delete this.tempSavedCommand;
+            return;
+        }
+
+        this.text = this.history[this.history.length - this.historyOffset];
+        this.element.scrollIntoViewIfNeeded();
+    }
+}
+
+/* Popover.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Popover = function(contentElement)
+{
+    this.element = document.createElement("div");
+    this.element.className = "popover";
+
+    this._popupArrowElement = document.createElement("div");
+    this._popupArrowElement.className = "arrow";
+    this.element.appendChild(this._popupArrowElement);
+
+    this.contentElement = contentElement;
+    this._contentDiv = document.createElement("div");
+    this._contentDiv.className = "content";
+}
+
+WebInspector.Popover.prototype = {
+    show: function(anchor, preferredWidth, preferredHeight)
+    {
+        // This should not happen, but we hide previous popup to be on the safe side.
+        if (WebInspector.Popover._popoverElement)
+            document.body.removeChild(WebInspector.Popover._popoverElement);
+        WebInspector.Popover._popoverElement = this.element;
+
+        // Temporarily attach in order to measure preferred dimensions.
+        this.contentElement.positionAt(0, 0);
+        document.body.appendChild(this.contentElement);
+        var preferredWidth = preferredWidth || this.contentElement.offsetWidth;
+        var preferredHeight = preferredHeight || this.contentElement.offsetHeight;
+
+        this._contentDiv.appendChild(this.contentElement);
+        this.element.appendChild(this._contentDiv);
+        document.body.appendChild(this.element);
+        this._positionElement(anchor, preferredWidth, preferredHeight);
+    },
+
+    hide: function()
+    {
+        if (WebInspector.Popover._popoverElement) {
+            delete WebInspector.Popover._popoverElement;
+            document.body.removeChild(this.element);
+        }
+    },
+
+    _positionElement: function(anchorElement, preferredWidth, preferredHeight)
+    {
+        const borderWidth = 25;
+        const scrollerWidth = 11;
+        const arrowHeight = 15;
+        const arrowOffset = 10;
+        const borderRadius = 10;
+
+        // Skinny tooltips are not pretty, their arrow location is not nice.
+        preferredWidth = Math.max(preferredWidth, 50);
+        const totalWidth = window.innerWidth;
+        const totalHeight = window.innerHeight;
+
+        var anchorBox = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};
+        while (anchorElement !== document.body) {
+            if (anchorElement.scrollLeft)
+                anchorBox.x -= anchorElement.scrollLeft;
+            if (anchorElement.scrollTop)
+                anchorBox.y -= anchorElement.scrollTop;
+            anchorElement = anchorElement.parentElement;
+        }
+
+        var newElementPosition = { x: 0, y: 0, width: preferredWidth + scrollerWidth, height: preferredHeight };
+
+        var verticalAlignment;
+        var roomAbove = anchorBox.y;
+        var roomBelow = totalHeight - anchorBox.y - anchorBox.height;
+
+        if (roomAbove > roomBelow) {
+            // Positioning above the anchor.
+            if (anchorBox.y > newElementPosition.height + arrowHeight + borderRadius)
+                newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;
+            else {
+                newElementPosition.y = borderRadius * 2;
+                newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;
+            }
+            verticalAlignment = "bottom";
+        } else {
+            // Positioning below the anchor.
+            newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;
+            if (newElementPosition.y + newElementPosition.height + arrowHeight - borderWidth >= totalHeight)
+                newElementPosition.height = totalHeight - anchorBox.y - anchorBox.height - borderRadius * 2 - arrowHeight;
+            // Align arrow.
+            verticalAlignment = "top";
+        }
+
+        var horizontalAlignment;
+        if (anchorBox.x + newElementPosition.width < totalWidth) {
+            newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);
+            horizontalAlignment = "left";
+        } else if (newElementPosition.width + borderRadius * 2 < totalWidth) {
+            newElementPosition.x = totalWidth - newElementPosition.width - borderRadius;
+            horizontalAlignment = "right";
+            // Position arrow accurately.
+            var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);
+            arrowRightPosition += anchorBox.width / 2;
+            this._popupArrowElement.style.right = arrowRightPosition + "px";
+        } else {
+            newElementPosition.x = borderRadius;
+            newElementPosition.width = totalWidth - borderRadius * 2;
+            newElementPosition.height += scrollerWidth;
+            horizontalAlignment = "left";
+            if (verticalAlignment === "bottom")
+                newElementPosition.y -= scrollerWidth;
+            // Position arrow accurately.
+            this._popupArrowElement.style.left = Math.max(0, anchorBox.x - borderRadius * 2 - arrowOffset) + "px";
+            this._popupArrowElement.style.left += anchorBox.width / 2;
+        }
+
+        this.element.className = "popover " + verticalAlignment + "-" + horizontalAlignment + "-arrow";
+        this.element.positionAt(newElementPosition.x - borderWidth, newElementPosition.y - borderWidth);
+        this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";
+        this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";
+    }
+}
+
+WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopup, showOnClick, onHide)
+{
+    this._panelElement = panelElement;
+    this._getAnchor = getAnchor;
+    this._showPopup = showPopup;
+    this._showOnClick = showOnClick;
+    this._onHide = onHide;
+    panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);
+    panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);
+}
+
+WebInspector.PopoverHelper.prototype = {
+    _mouseDown: function(event)
+    {
+        this._killHidePopupTimer();
+        this._handleMouseAction(event, true);
+    },
+
+    _mouseMove: function(event)
+    {
+        // Pretend that nothing has happened.
+        if (this._hoverElement === event.target || (this._hoverElement && this._hoverElement.isAncestor(event.target)))
+            return;
+
+        // User has 500ms to reach the popup.
+        if (this._popup && !this._hidePopupTimer) {
+            var self = this;
+            function doHide()
+            {
+                self.hidePopup();
+                delete self._hidePopupTimer;
+            }
+            this._hidePopupTimer = setTimeout(doHide, 500);
+        }
+
+        this._handleMouseAction(event);
+    },
+
+    _handleMouseAction: function(event, isMouseDown)
+    {
+        this._resetHoverTimer();
+
+        this._hoverElement = this._getAnchor(event.target);
+        if (!this._hoverElement)
+            return;
+
+        const toolTipDelay = isMouseDown ? 0 : (this._popup ? 600 : 1000);
+        this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
+    },
+
+    _resetHoverTimer: function()
+    {
+        if (this._hoverTimer) {
+            clearTimeout(this._hoverTimer);
+            delete this._hoverTimer;
+        }
+    },
+
+    hidePopup: function()
+    {
+        if (!this._popup)
+            return;
+
+        if (this._onHide)
+            this._onHide();
+
+        this._popup.hide();
+        delete this._popup;
+    },
+
+    _mouseHover: function(element)
+    {
+        delete this._hoverTimer;
+
+        this._popup = this._showPopup(element);
+        this._popup.contentElement.addEventListener("mousemove", this._killHidePopupTimer.bind(this), true);
+    },
+
+    _killHidePopupTimer: function()
+    {
+        if (this._hidePopupTimer) {
+            clearTimeout(this._hidePopupTimer);
+            delete this._hidePopupTimer;
+
+            // We know that we reached the popup, but we might have moved over other elements.
+            // Discard pending command.
+            this._resetHoverTimer();
+        }
+    }
+}
+
+/* Placard.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Placard = function(title, subtitle)
+{
+    this.element = document.createElement("div");
+    this.element.className = "placard";
+    this.element.placard = this;
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+
+    this.subtitleElement = document.createElement("div");
+    this.subtitleElement.className = "subtitle";
+
+    this.element.appendChild(this.subtitleElement);
+    this.element.appendChild(this.titleElement);
+
+    this.title = title;
+    this.subtitle = subtitle;
+    this.selected = false;
+}
+
+WebInspector.Placard.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.titleElement.textContent = x;
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        if (this._subtitle === x)
+            return;
+        this._subtitle = x;
+        this.subtitleElement.innerHTML = x;
+    },
+
+    get selected()
+    {
+        return this._selected;
+    },
+
+    set selected(x)
+    {
+        if (x)
+            this.select();
+        else
+            this.deselect();
+    },
+
+    select: function()
+    {
+        if (this._selected)
+            return;
+        this._selected = true;
+        this.element.addStyleClass("selected");
+    },
+
+    deselect: function()
+    {
+        if (!this._selected)
+            return;
+        this._selected = false;
+        this.element.removeStyleClass("selected");
+    },
+
+    toggleSelected: function()
+    {
+        this.selected = !this.selected;
+    }
+}
+
+/* View.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.View = function(element)
+{
+    this.element = element || document.createElement("div");
+    this._visible = false;
+}
+
+WebInspector.View.prototype = {
+    get visible()
+    {
+        return this._visible;
+    },
+
+    set visible(x)
+    {
+        if (this._visible === x)
+            return;
+
+        if (x)
+            this.show();
+        else
+            this.hide();
+    },
+
+    show: function(parentElement)
+    {
+        this._visible = true;
+        if (parentElement && parentElement !== this.element.parentNode) {
+            this.detach();
+            parentElement.appendChild(this.element);
+        }
+        if (!this.element.parentNode && this.attach)
+            this.attach();
+        this.element.addStyleClass("visible");
+    },
+
+    hide: function()
+    {
+        this.element.removeStyleClass("visible");
+        this._visible = false;
+    },
+
+    detach: function()
+    {
+        if (this.element.parentNode)
+            this.element.parentNode.removeChild(this.element);
+    }
+}
+
+WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* Callback.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Callback = function()
+{
+    this._lastCallbackId = 1;
+    this._callbacks = {};
+}
+
+WebInspector.Callback.prototype = {
+    wrap: function(callback)
+    {
+        var callbackId = this._lastCallbackId++;
+        this._callbacks[callbackId] = callback || function() {};
+        return callbackId;
+    },
+
+    processCallback: function(callbackId, opt_vararg)
+    {
+        var args = Array.prototype.slice.call(arguments, 1);
+        var callback = this._callbacks[callbackId];
+        callback.apply(null, args);
+        delete this._callbacks[callbackId];
+    }
+}
+
+WebInspector.Callback._INSTANCE = new WebInspector.Callback();
+WebInspector.Callback.wrap = WebInspector.Callback._INSTANCE.wrap.bind(WebInspector.Callback._INSTANCE);
+WebInspector.Callback.processCallback = WebInspector.Callback._INSTANCE.processCallback.bind(WebInspector.Callback._INSTANCE);
+
+/* Drawer.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Drawer = function()
+{
+    WebInspector.View.call(this, document.getElementById("drawer"));
+
+    this._savedHeight = 200; // Default.
+    this.state = WebInspector.Drawer.State.Hidden;
+    this.fullPanel = false;
+
+    this.mainElement = document.getElementById("main");
+    this.toolbarElement = document.getElementById("toolbar");
+    this.mainStatusBar = document.getElementById("main-status-bar");
+    this.mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
+    this.viewStatusBar = document.getElementById("other-drawer-status-bar-items");
+}
+
+WebInspector.Drawer.prototype = {
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x) {
+            if (this.visible && this.fullPanel)
+                return;
+            this.visible = !this.visible;
+            return;
+        }
+
+        var firstTime = !this._visibleView;
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x && !firstTime) {
+            this._safelyRemoveChildren();
+            this.viewStatusBar.removeChildren(); // optimize this? call old.detach()
+            x.attach(this.element, this.viewStatusBar);
+            x.show();
+            this.visible = true;
+        }
+    },
+
+    get savedHeight()
+    {
+        var height = this._savedHeight || this.element.offsetHeight;
+        return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this.mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+    },
+
+    showView: function(view)
+    {
+        if (!this.visible || this.visibleView !== view)
+            this.visibleView = view;
+    },
+
+    show: function()
+    {
+        if (this._animating || this.visible)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.show();
+
+        WebInspector.View.prototype.show.call(this);
+
+        this._animating = true;
+
+        document.body.addStyleClass("drawer-visible");
+
+        var anchoredItems = document.getElementById("anchored-status-bar-items");
+        var height = (this.fullPanel ? window.innerHeight - this.toolbarElement.offsetHeight : this.savedHeight);
+        var animations = [
+            {element: this.element, end: {height: height}},
+            {element: document.getElementById("main"), end: {bottom: height}},
+            {element: document.getElementById("main-status-bar"), start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
+            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 0}, end: {opacity: 1}}
+        ];
+
+        var drawerStatusBar = document.getElementById("drawer-status-bar");
+        drawerStatusBar.insertBefore(anchoredItems, drawerStatusBar.firstChild);
+
+        function animationFinished()
+        {
+            if ("updateStatusBarItems" in WebInspector.currentPanel)
+                WebInspector.currentPanel.updateStatusBarItems();
+            if (this.visibleView.afterShow)
+                this.visibleView.afterShow();
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    hide: function()
+    {
+        if (this._animating || !this.visible)
+            return;
+
+        WebInspector.View.prototype.hide.call(this);
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        this._animating = true;
+
+        if (!this.fullPanel)
+            this._savedHeight = this.element.offsetHeight;
+
+        if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))
+            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
+
+        var anchoredItems = document.getElementById("anchored-status-bar-items");
+
+        // Temporarily set properties and classes to mimic the post-animation values so panels
+        // like Elements in their updateStatusBarItems call will size things to fit the final location.
+        this.mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
+        document.body.removeStyleClass("drawer-visible");
+        if ("updateStatusBarItems" in WebInspector.currentPanel)
+            WebInspector.currentPanel.updateStatusBarItems();
+        document.body.addStyleClass("drawer-visible");
+
+        var animations = [
+            {element: document.getElementById("main"), end: {bottom: 0}},
+            {element: document.getElementById("main-status-bar"), start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
+            {element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 1}, end: {opacity: 0}}
+        ];
+
+        function animationFinished()
+        {
+            WebInspector.currentPanel.resize();
+            var mainStatusBar = document.getElementById("main-status-bar");
+            mainStatusBar.insertBefore(anchoredItems, mainStatusBar.firstChild);
+            mainStatusBar.style.removeProperty("padding-left");
+            document.body.removeStyleClass("drawer-visible");
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = WebInspector.Drawer.State.Hidden;
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    resize: function()
+    {
+        if (this.state === WebInspector.Drawer.State.Hidden)
+            return;
+
+        var height;
+        var mainElement = document.getElementById("main");
+        if (this.state === WebInspector.Drawer.State.Variable) {
+            height = parseInt(this.element.style.height);
+            height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+        } else
+            height = window.innerHeight - this.toolbarElement.offsetHeight;
+
+        mainElement.style.bottom = height + "px";
+        this.element.style.height = height + "px";
+    },
+
+    enterPanelMode: function()
+    {
+        this._cancelAnimationIfNeeded();
+        this.fullPanel = true;
+        
+        if (this.visible) {
+            this._savedHeight = this.element.offsetHeight;
+            var height = window.innerHeight - this.toolbarElement.offsetHeight;
+            this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);
+        }
+    },
+
+    exitPanelMode: function()
+    {
+        this._cancelAnimationIfNeeded();
+        this.fullPanel = false;
+
+        if (this.visible) {
+            // If this animation gets cancelled, we want the state of the drawer to be Variable,
+            // so that the new animation can't do an immediate transition between Hidden/Full states.
+            this.state = WebInspector.Drawer.State.Variable;
+            var height = this.savedHeight;
+            this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);
+        }
+    },
+
+    immediatelyExitPanelMode: function()
+    {
+        this.visible = false;
+        this.fullPanel = false;
+    },
+
+    _cancelAnimationIfNeeded: function()
+    {
+        if (this._animating) {
+            clearInterval(this._currentAnimationInterval);
+            delete this._animating;
+            delete this._currentAnimationInterval;
+        }
+    },
+
+    _animateDrawerHeight: function(height, finalState)
+    {
+        this._animating = true;
+        var animations = [
+            {element: this.element, end: {height: height}},
+            {element: document.getElementById("main"), end: {bottom: height}}
+        ];
+
+        function animationFinished()
+        {
+            delete this._animating;
+            delete this._currentAnimationInterval;
+            this.state = finalState;
+        }
+
+        this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
+    },
+
+    _animationDuration: function()
+    {
+        // Immediate if going between Hidden and Full in full panel mode
+        if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))
+            return 0;
+
+        return (window.event && window.event.shiftKey ? 2000 : 250);
+    },
+
+    _safelyRemoveChildren: function()
+    {
+        var child = this.element.firstChild;
+        while (child) {
+            if (child.id !== "drawer-status-bar") {
+                var moveTo = child.nextSibling;
+                this.element.removeChild(child);
+                child = moveTo;
+            } else
+                child = child.nextSibling;
+        }
+    },
+
+    _startStatusBarDragging: function(event)
+    {
+        if (!this.visible || event.target !== this.mainStatusBar)
+            return;
+
+        WebInspector.elementDragStart(this.mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
+
+        this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;
+
+        event.stopPropagation();
+    },
+
+    _statusBarDragging: function(event)
+    {
+        var mainElement = document.getElementById("main");
+        var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
+        height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);
+
+        mainElement.style.bottom = height + "px";
+        this.element.style.height = height + "px";
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    _endStatusBarDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+
+        this._savedHeight = this.element.offsetHeight;
+        delete this._statusBarDragOffset;
+
+        event.stopPropagation();
+    }
+}
+
+WebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.Drawer.State = {
+    Hidden: 0,
+    Variable: 1,
+    Full: 2
+};
+
+/* ChangesView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ChangesView = function(drawer)
+{
+    WebInspector.View.call(this);
+    this.element.innerHTML = "<div style=\"bottom:25%;color:rgb(192,192,192);font-size:12px;height:65px;left:0px;margin:auto;position:absolute;right:0px;text-align:center;top:0px;\"><h1>Not Implemented Yet</h1></div>";
+
+    this.drawer = drawer;
+
+    this.clearButton = document.createElement("button");
+    this.clearButton.id = "clear-changes-status-bar-item";
+    this.clearButton.title = WebInspector.UIString("Clear changes log.");
+    this.clearButton.className = "status-bar-item";
+    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.toggleChangesButton = document.getElementById("changes-status-bar-item");
+    this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
+    this.toggleChangesButton.addEventListener("click", this._toggleChangesButtonClicked.bind(this), false);
+    var anchoredStatusBar = document.getElementById("anchored-status-bar-items");
+    anchoredStatusBar.appendChild(this.toggleChangesButton);
+}
+
+WebInspector.ChangesView.prototype = {
+    _clearButtonClicked: function()
+    {
+        // Not Implemented Yet
+    },
+
+    _toggleChangesButtonClicked: function()
+    {
+        this.drawer.visibleView = this;
+    },
+
+    attach: function(mainElement, statusBarElement)
+    {
+        mainElement.appendChild(this.element);
+        statusBarElement.appendChild(this.clearButton);
+    },
+
+    show: function()
+    {
+        this.toggleChangesButton.addStyleClass("toggled-on");
+        this.toggleChangesButton.title = WebInspector.UIString("Hide changes view.");
+    },
+
+    hide: function()
+    {
+        this.toggleChangesButton.removeStyleClass("toggled-on");
+        this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");
+    }
+}
+
+WebInspector.ChangesView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ConsoleView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
+
+WebInspector.ConsoleView = function(drawer)
+{
+    WebInspector.View.call(this, document.getElementById("console-view"));
+
+    this.messages = [];
+    this.drawer = drawer;
+
+    this.clearButton = document.getElementById("clear-console-status-bar-item");
+    this.clearButton.title = WebInspector.UIString("Clear console log.");
+    this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.messagesElement = document.getElementById("console-messages");
+    this.messagesElement.addEventListener("selectstart", this._messagesSelectStart.bind(this), false);
+    this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);
+
+    this.promptElement = document.getElementById("console-prompt");
+    this.promptElement.className = "source-code";
+    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
+    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");
+
+    this.topGroup = new WebInspector.ConsoleGroup(null, 0);
+    this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
+    this.groupLevel = 0;
+    this.currentGroup = this.topGroup;
+
+    this.toggleConsoleButton = document.getElementById("console-status-bar-item");
+    this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
+    this.toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);
+
+    // Will hold the list of filter elements
+    this.filterBarElement = document.getElementById("console-filter");
+
+    function createDividerElement() {
+        var dividerElement = document.createElement("div");
+        dividerElement.addStyleClass("divider");
+        this.filterBarElement.appendChild(dividerElement);
+    }
+
+    var updateFilterHandler = this._updateFilter.bind(this);
+    function createFilterElement(category) {
+        var categoryElement = document.createElement("li");
+        categoryElement.category = category;
+        categoryElement.addStyleClass(categoryElement.category);            
+        categoryElement.addEventListener("click", updateFilterHandler, false);
+
+        var label = category.toString();
+        categoryElement.appendChild(document.createTextNode(label));
+
+        this.filterBarElement.appendChild(categoryElement);
+        return categoryElement;
+    }
+    
+    this.allElement = createFilterElement.call(this, "All");
+    createDividerElement.call(this);
+    this.errorElement = createFilterElement.call(this, "Errors");
+    this.warningElement = createFilterElement.call(this, "Warnings");
+    this.logElement = createFilterElement.call(this, "Logs");
+
+    this.filter(this.allElement, false);
+
+    this._shortcuts = {};
+
+    var shortcut;
+    var clearConsoleHandler = this.requestClearMessages.bind(this);
+
+    shortcut = WebInspector.KeyboardShortcut.makeKey("k", WebInspector.KeyboardShortcut.Modifiers.Meta);
+    this._shortcuts[shortcut] = clearConsoleHandler;
+    this._shortcuts[shortcut].isMacOnly = true;
+    shortcut = WebInspector.KeyboardShortcut.makeKey("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = clearConsoleHandler;
+
+    // Since the Context Menu for the Console View will always be the same, we can create it in
+    // the constructor.
+    this._contextMenu = new WebInspector.ContextMenu();
+    this._contextMenu.appendItem(WebInspector.UIString("Clear Console"), clearConsoleHandler);
+    this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);
+    
+    this._customFormatters = {
+        "object": this._formatobject,
+        "array":  this._formatarray,
+        "node":   this._formatnode,
+        "string": this._formatstring
+    };
+}
+
+WebInspector.ConsoleView.prototype = {
+    
+    _updateFilter: function(e)
+    {
+        var isMac = WebInspector.isMac();
+        var selectMultiple = false;
+        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+
+        this.filter(e.target, selectMultiple);
+    },
+    
+    filter: function(target, selectMultiple)
+    {
+        function unselectAll()
+        {
+            this.allElement.removeStyleClass("selected");
+            this.errorElement.removeStyleClass("selected");
+            this.warningElement.removeStyleClass("selected");
+            this.logElement.removeStyleClass("selected");
+            
+            this.messagesElement.removeStyleClass("filter-all");
+            this.messagesElement.removeStyleClass("filter-errors");
+            this.messagesElement.removeStyleClass("filter-warnings");
+            this.messagesElement.removeStyleClass("filter-logs");
+        }
+        
+        var targetFilterClass = "filter-" + target.category.toLowerCase();
+
+        if (target.category == "All") {
+            if (target.hasStyleClass("selected")) {
+                // We can't unselect all, so we break early here
+                return;
+            }
+
+            unselectAll.call(this);
+        } else {
+            // Something other than all is being selected, so we want to unselect all
+            if (this.allElement.hasStyleClass("selected")) {
+                this.allElement.removeStyleClass("selected");
+                this.messagesElement.removeStyleClass("filter-all");
+            }
+        }
+        
+        if (!selectMultiple) {
+            // If multiple selection is off, we want to unselect everything else
+            // and just select ourselves.
+            unselectAll.call(this);
+            
+            target.addStyleClass("selected");
+            this.messagesElement.addStyleClass(targetFilterClass);
+            
+            return;
+        }
+        
+        if (target.hasStyleClass("selected")) {
+            // If selectMultiple is turned on, and we were selected, we just
+            // want to unselect ourselves.
+            target.removeStyleClass("selected");
+            this.messagesElement.removeStyleClass(targetFilterClass);
+        } else {
+            // If selectMultiple is turned on, and we weren't selected, we just
+            // want to select ourselves.
+            target.addStyleClass("selected");
+            this.messagesElement.addStyleClass(targetFilterClass);
+        }
+    },
+    
+    _toggleConsoleButtonClicked: function()
+    {
+        this.drawer.visibleView = this;
+    },
+
+    attach: function(mainElement, statusBarElement)
+    {
+        mainElement.appendChild(this.element);
+        statusBarElement.appendChild(this.clearButton);
+        statusBarElement.appendChild(this.filterBarElement);
+    },
+
+    show: function()
+    {
+        this.toggleConsoleButton.addStyleClass("toggled-on");
+        this.toggleConsoleButton.title = WebInspector.UIString("Hide console.");
+        if (!this.prompt.isCaretInsidePrompt())
+            this.prompt.moveCaretToEndOfPrompt();
+    },
+
+    afterShow: function()
+    {
+        WebInspector.currentFocusElement = this.promptElement;  
+    },
+
+    hide: function()
+    {
+        this.toggleConsoleButton.removeStyleClass("toggled-on");
+        this.toggleConsoleButton.title = WebInspector.UIString("Show console.");
+    },
+
+    _scheduleScrollIntoView: function()
+    {
+        if (this._scrollIntoViewTimer)
+            return;
+
+        function scrollIntoView()
+        {
+            this.promptElement.scrollIntoView(false);
+            delete this._scrollIntoViewTimer;
+        }
+        this._scrollIntoViewTimer = setTimeout(scrollIntoView.bind(this), 20);
+    },
+
+    addMessage: function(msg)
+    {
+        if (msg instanceof WebInspector.ConsoleMessage && !(msg instanceof WebInspector.ConsoleCommandResult)) {
+            this._incrementErrorWarningCount(msg);
+
+            // Add message to the resource panel
+            if (msg.url in WebInspector.resourceURLMap) {
+                msg.resource = WebInspector.resourceURLMap[msg.url];
+                if (WebInspector.panels.resources)
+                    WebInspector.panels.resources.addMessageToResource(msg.resource, msg);
+            }
+
+            this.commandSincePreviousMessage = false;
+            this.previousMessage = msg;
+        } else if (msg instanceof WebInspector.ConsoleCommand) {
+            if (this.previousMessage) {
+                this.commandSincePreviousMessage = true;
+            }
+        }
+
+        this.messages.push(msg);
+
+        if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
+            if (this.groupLevel < 1)
+                return;
+
+            this.groupLevel--;
+
+            this.currentGroup = this.currentGroup.parentGroup;
+        } else {
+            if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
+                this.groupLevel++;
+
+                var group = new WebInspector.ConsoleGroup(this.currentGroup, this.groupLevel);
+                this.currentGroup.messagesElement.appendChild(group.element);
+                this.currentGroup = group;
+            }
+
+            this.currentGroup.addMessage(msg);
+        }
+
+        this._scheduleScrollIntoView();
+    },
+
+    updateMessageRepeatCount: function(count)
+    {
+        var msg = this.previousMessage;
+        var prevRepeatCount = msg.totalRepeatCount;
+        
+        if (!this.commandSincePreviousMessage) {
+            msg.repeatDelta = count - prevRepeatCount;
+            msg.repeatCount = msg.repeatCount + msg.repeatDelta;
+            msg.totalRepeatCount = count;
+            msg._updateRepeatCount();
+            this._incrementErrorWarningCount(msg);
+        } else {
+            msgCopy = new WebInspector.ConsoleMessage(msg.source, msg.type, msg.level, msg.line, msg.url, msg.groupLevel, count - prevRepeatCount);
+            msgCopy.totalRepeatCount = count;
+            msgCopy.setMessageBody(msg.args);
+            this.addMessage(msgCopy);
+        }
+    },
+
+    _incrementErrorWarningCount: function(msg)
+    {
+        switch (msg.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                WebInspector.warnings += msg.repeatDelta;
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                WebInspector.errors += msg.repeatDelta;
+                break;
+        }
+    },
+
+    requestClearMessages: function()
+    {
+        InjectedScriptAccess.getDefault().clearConsoleMessages(function() {});
+    },
+
+    clearMessages: function()
+    {
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.clearMessages();
+
+        this.messages = [];
+
+        this.groupLevel = 0;
+        this.currentGroup = this.topGroup;
+        this.topGroup.messagesElement.removeChildren();
+
+        WebInspector.errors = 0;
+        WebInspector.warnings = 0;
+
+        delete this.commandSincePreviousMessage;
+        delete this.previousMessage;
+    },
+
+    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
+    {
+        // Pass less stop characters to rangeOfWord so the range will be a more complete expression.
+        var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");
+        var expressionString = expressionRange.toString();
+        var lastIndex = expressionString.length - 1;
+
+        var dotNotation = (expressionString[lastIndex] === ".");
+        var bracketNotation = (expressionString[lastIndex] === "[");
+
+        if (dotNotation || bracketNotation)
+            expressionString = expressionString.substr(0, lastIndex);
+
+        var prefix = wordRange.toString();
+        if (!expressionString && !prefix)
+            return;
+
+        var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);
+        // Collect comma separated object properties for the completion.
+
+        var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);
+        var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();
+        var injectedScriptAccess;
+        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
+            var selectedCallFrame = WebInspector.panels.scripts.sidebarPanes.callstack.selectedCallFrame;
+            injectedScriptAccess = InjectedScriptAccess.get(selectedCallFrame.injectedScriptId);
+        } else
+            injectedScriptAccess = InjectedScriptAccess.getDefault();
+        injectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);
+    },
+
+    _reportCompletions: function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
+        if (isException)
+            return;
+
+        if (bracketNotation) {
+            if (prefix.length && prefix[0] === "'")
+                var quoteUsed = "'";
+            else
+                var quoteUsed = "\"";
+        }
+
+        var results = [];
+        var properties = Object.sortedProperties(result);
+
+        for (var i = 0; i < properties.length; ++i) {
+            var property = properties[i];
+
+            if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
+                continue;
+
+            if (bracketNotation) {
+                if (!/^[0-9]+$/.test(property))
+                    property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;
+                property += "]";
+            }
+
+            if (property.length < prefix.length)
+                continue;
+            if (property.indexOf(prefix) !== 0)
+                continue;
+
+            results.push(property);
+            if (bestMatchOnly)
+                break;
+        }
+        completionsReadyCallback(results);
+    },
+
+    _clearButtonClicked: function()
+    {
+        this.requestClearMessages();
+    },
+
+    _handleContextMenuEvent: function(event)
+    {
+        if (!window.getSelection().isCollapsed) {
+            // If there is a selection, we want to show our normal context menu
+            // (with Copy, etc.), and not Clear Console.
+            return;
+        }
+
+        this._contextMenu.show(event);
+    },
+
+    _messagesSelectStart: function(event)
+    {
+        if (this._selectionTimeout)
+            clearTimeout(this._selectionTimeout);
+
+        this.prompt.clearAutoComplete();
+
+        function moveBackIfOutside()
+        {
+            delete this._selectionTimeout;
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+            this.prompt.autoCompleteSoon();
+        }
+
+        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
+    },
+
+    _messagesClicked: function(event)
+    {
+        var link = event.target.enclosingNodeOrSelfWithNodeName("a");
+        if (!link || !link.representedNode)
+            return;
+
+        WebInspector.updateFocusedNode(link.representedNode.id);
+        event.stopPropagation();
+        event.preventDefault();
+    },
+
+    _promptKeyDown: function(event)
+    {
+        if (isEnterKey(event)) {
+            this._enterKeyPressed(event);
+            return;
+        }
+
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            if (!this._shortcuts[shortcut].isMacOnly || WebInspector.isMac()) {
+                handler();
+                event.preventDefault();
+                return;
+            }
+        }
+    },
+
+    evalInInspectedWindow: function(expression, objectGroup, callback)
+    {
+        if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
+            WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);
+            return;
+        }
+        this.doEvalInWindow(expression, objectGroup, callback);
+    },
+
+    doEvalInWindow: function(expression, objectGroup, callback)
+    {
+        if (!expression) {
+            // There is no expression, so the completion should happen against global properties.
+            expression = "this";
+        }
+
+        function evalCallback(result)
+        {
+            callback(result.value, result.isException);
+        };
+        InjectedScriptAccess.getDefault().evaluate(expression, objectGroup, evalCallback);
+    },
+
+    _enterKeyPressed: function(event)
+    {
+        if (event.altKey)
+            return;
+
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.prompt.clearAutoComplete(true);
+
+        var str = this.prompt.text;
+        if (!str.length)
+            return;
+
+        var commandMessage = new WebInspector.ConsoleCommand(str);
+        this.addMessage(commandMessage);
+
+        var self = this;
+        function printResult(result, exception)
+        {
+            self.prompt.history.push(str);
+            self.prompt.historyOffset = 0;
+            self.prompt.text = "";
+            self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+        }
+        this.evalInInspectedWindow(str, "console", printResult);
+    },
+
+    _format: function(output, forceObjectFormat)
+    {
+        var isProxy = (output != null && typeof output === "object");
+        var type = (forceObjectFormat ? "object" : Object.proxyType(output));
+
+        var formatter = this._customFormatters[type];
+        if (!formatter || !isProxy) {
+            formatter = this._formatvalue;
+            output = output.description;
+        }
+
+        var span = document.createElement("span");
+        span.className = "console-formatted-" + type + " source-code";
+        formatter.call(this, output, span);
+        return span;
+    },
+
+    _formatvalue: function(val, elem)
+    {
+        elem.appendChild(document.createTextNode(val));
+    },
+
+    _formatobject: function(obj, elem)
+    {
+        elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description, null, true).element);
+    },
+
+    _formatnode: function(object, elem)
+    {
+        function printNode(nodeId)
+        {
+            if (!nodeId)
+                return;
+            var treeOutline = new WebInspector.ElementsTreeOutline();
+            treeOutline.showInElementsPanelEnabled = true;
+            treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);
+            treeOutline.element.addStyleClass("outline-disclosure");
+            if (!treeOutline.children[0].hasChildren)
+                treeOutline.element.addStyleClass("single-node");
+            elem.appendChild(treeOutline.element);
+        }
+
+        InjectedScriptAccess.get(object.injectedScriptId).pushNodeToFrontend(object, printNode);
+    },
+
+    _formatarray: function(arr, elem)
+    {
+        InjectedScriptAccess.get(arr.injectedScriptId).getProperties(arr, false, false, this._printArray.bind(this, elem));
+    },
+
+    _formatstring: function(output, elem)
+    {
+        var span = document.createElement("span");
+        span.className = "console-formatted-string source-code";
+        span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
+
+        // Make black quotes.
+        elem.removeStyleClass("console-formatted-string");
+        elem.appendChild(document.createTextNode("\""));
+        elem.appendChild(span);
+        elem.appendChild(document.createTextNode("\""));
+    },
+
+    _printArray: function(elem, properties)
+    {
+        if (!properties)
+            return;
+
+        var elements = [];
+        for (var i = 0; i < properties.length; ++i) {
+            var name = properties[i].name;
+            if (name == parseInt(name))
+                elements[name] = this._format(properties[i].value);
+        }
+
+        elem.appendChild(document.createTextNode("["));
+        for (var i = 0; i < elements.length; ++i) {
+            var element = elements[i];
+            if (element)
+                elem.appendChild(element);
+            else
+                elem.appendChild(document.createTextNode("undefined"))
+            if (i < elements.length - 1)
+                elem.appendChild(document.createTextNode(", "));
+        }
+        elem.appendChild(document.createTextNode("]"));
+    }
+}
+
+WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.ConsoleMessage = function(source, type, level, line, url, groupLevel, repeatCount)
+{
+    this.source = source;
+    this.type = type;
+    this.level = level;
+    this.line = line;
+    this.url = url;
+    this.groupLevel = groupLevel;
+    this.repeatCount = repeatCount;
+    this.repeatDelta = repeatCount;
+    this.totalRepeatCount = repeatCount;
+    if (arguments.length > 7)
+        this.setMessageBody(Array.prototype.slice.call(arguments, 7));
+}
+
+WebInspector.ConsoleMessage.prototype = {
+    setMessageBody: function(args)
+    {
+        this.args = args;
+        switch (this.type) {
+            case WebInspector.ConsoleMessage.MessageType.Trace:
+                var span = document.createElement("span");
+                span.className = "console-formatted-trace source-code";
+                var stack = Array.prototype.slice.call(args);
+                var funcNames = stack.map(function(f) {
+                    return f || WebInspector.UIString("(anonymous function)");
+                });
+                span.appendChild(document.createTextNode(funcNames.join("\n")));
+                this.formattedMessage = span;
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Object:
+                this.formattedMessage = this._format(["%O", args[0]]);
+                break;
+            default:
+                this.formattedMessage = this._format(args);
+                break;
+        }
+
+        // This is used for inline message bubbles in SourceFrames, or other plain-text representations.
+        this.message = this.formattedMessage.textContent;
+    },
+
+    isErrorOrWarning: function()
+    {
+        return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
+    },
+
+    _format: function(parameters)
+    {
+        // This node is used like a Builder. Values are continually appended onto it.
+        var formattedResult = document.createElement("span");
+        if (!parameters.length)
+            return formattedResult;
+
+        // Formatting code below assumes that parameters are all wrappers whereas frontend console
+        // API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here.
+        for (var i = 0; i < parameters.length; ++i)
+            if (typeof parameters[i] !== "object" && typeof parameters[i] !== "function")
+                parameters[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(parameters[i]);
+
+        // There can be string log and string eval result. We distinguish between them based on message type.
+        var shouldFormatMessage = Object.proxyType(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
+
+        // Multiple parameters with the first being a format string. Save unused substitutions.
+        if (shouldFormatMessage) {
+            // Multiple parameters with the first being a format string. Save unused substitutions.
+            var result = this._formatWithSubstitutionString(parameters, formattedResult);
+            parameters = result.unusedSubstitutions;
+            if (parameters.length)
+                formattedResult.appendChild(document.createTextNode(" "));
+        }
+
+        // Single parameter, or unused substitutions from above.
+        for (var i = 0; i < parameters.length; ++i) {
+            // Inline strings when formatting.
+            if (shouldFormatMessage && parameters[i].type === "string")
+                formattedResult.appendChild(document.createTextNode(parameters[i].description));
+            else
+                formattedResult.appendChild(WebInspector.console._format(parameters[i]));
+            if (i < parameters.length - 1)
+                formattedResult.appendChild(document.createTextNode(" "));
+        }
+        return formattedResult;
+    },
+
+    _formatWithSubstitutionString: function(parameters, formattedResult)
+    {
+        var formatters = {}
+        for (var i in String.standardFormatters)
+            formatters[i] = String.standardFormatters[i];
+
+        function consoleFormatWrapper(force)
+        {
+            return function(obj) {
+                return WebInspector.console._format(obj, force);
+            };
+        }
+
+        // Firebug uses %o for formatting objects.
+        formatters.o = consoleFormatWrapper();
+        // Firebug allows both %i and %d for formatting integers.
+        formatters.i = formatters.d;
+        // Support %O to force object formatting, instead of the type-based %o formatting.
+        formatters.O = consoleFormatWrapper(true);
+
+        function append(a, b)
+        {
+            if (!(b instanceof Node))
+                a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));
+            else
+                a.appendChild(b);
+            return a;
+        }
+
+        // String.format does treat formattedResult like a Builder, result is an object.
+        return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);
+    },
+
+    toMessageElement: function()
+    {
+        if (this._element)
+            return this._element;
+
+        var element = document.createElement("div");
+        element.message = this;
+        element.className = "console-message";
+
+        this._element = element;
+
+        switch (this.source) {
+            case WebInspector.ConsoleMessage.MessageSource.HTML:
+                element.addStyleClass("console-html-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.WML:
+                element.addStyleClass("console-wml-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.XML:
+                element.addStyleClass("console-xml-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.JS:
+                element.addStyleClass("console-js-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.CSS:
+                element.addStyleClass("console-css-source");
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.Other:
+                element.addStyleClass("console-other-source");
+                break;
+        }
+
+        switch (this.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Tip:
+                element.addStyleClass("console-tip-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Log:
+                element.addStyleClass("console-log-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Debug:
+                element.addStyleClass("console-debug-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                element.addStyleClass("console-warning-level");
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                element.addStyleClass("console-error-level");
+                break;
+        }
+        
+        if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup)
+            element.addStyleClass("console-group-title");
+
+        if (this.elementsTreeOutline) {
+            element.addStyleClass("outline-disclosure");
+            element.appendChild(this.elementsTreeOutline.element);
+            return element;
+        }
+
+        if (this.url && this.url !== "undefined") {
+            var urlElement = document.createElement("a");
+            urlElement.className = "console-message-url webkit-html-resource-link";
+            urlElement.href = this.url;
+            urlElement.lineNumber = this.line;
+
+            if (this.source === WebInspector.ConsoleMessage.MessageSource.JS)
+                urlElement.preferredPanel = "scripts";
+
+            if (this.line > 0)
+                urlElement.textContent = WebInspector.displayNameForURL(this.url) + ":" + this.line;
+            else
+                urlElement.textContent = WebInspector.displayNameForURL(this.url);
+
+            element.appendChild(urlElement);
+        }
+
+        var messageTextElement = document.createElement("span");
+        messageTextElement.className = "console-message-text source-code";
+        if (this.type === WebInspector.ConsoleMessage.MessageType.Assert)
+            messageTextElement.appendChild(document.createTextNode(WebInspector.UIString("Assertion failed: ")));
+        messageTextElement.appendChild(this.formattedMessage);
+        element.appendChild(messageTextElement);
+
+        if (this.repeatCount > 1)
+            this._updateRepeatCount();
+
+        return element;
+    },
+
+    _updateRepeatCount: function() {
+        if (!this.repeatCountElement) {
+            this.repeatCountElement = document.createElement("span");
+            this.repeatCountElement.className = "bubble";
+    
+            this._element.insertBefore(this.repeatCountElement, this._element.firstChild);
+            this._element.addStyleClass("repeated-message");
+        }
+        this.repeatCountElement.textContent = this.repeatCount;
+    },
+
+    toString: function()
+    {
+        var sourceString;
+        switch (this.source) {
+            case WebInspector.ConsoleMessage.MessageSource.HTML:
+                sourceString = "HTML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.WML:
+                sourceString = "WML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.XML:
+                sourceString = "XML";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.JS:
+                sourceString = "JS";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.CSS:
+                sourceString = "CSS";
+                break;
+            case WebInspector.ConsoleMessage.MessageSource.Other:
+                sourceString = "Other";
+                break;
+        }
+
+        var typeString;
+        switch (this.type) {
+            case WebInspector.ConsoleMessage.MessageType.Log:
+                typeString = "Log";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Object:
+                typeString = "Object";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Trace:
+                typeString = "Trace";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.StartGroup:
+                typeString = "Start Group";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.EndGroup:
+                typeString = "End Group";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Assert:
+                typeString = "Assert";
+                break;
+            case WebInspector.ConsoleMessage.MessageType.Result:
+                typeString = "Result";
+                break;
+        }
+        
+        var levelString;
+        switch (this.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Tip:
+                levelString = "Tip";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Log:
+                levelString = "Log";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                levelString = "Warning";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Debug:
+                levelString = "Debug";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                levelString = "Error";
+                break;
+        }
+
+        return sourceString + " " + typeString + " " + levelString + ": " + this.formattedMessage.textContent + "\n" + this.url + " line " + this.line;
+    },
+
+    isEqual: function(msg, disreguardGroup)
+    {
+        if (!msg)
+            return false;
+
+        var ret = (this.source == msg.source)
+            && (this.type == msg.type)
+            && (this.level == msg.level)
+            && (this.line == msg.line)
+            && (this.url == msg.url)
+            && (this.message == msg.message);
+
+        return (disreguardGroup ? ret : (ret && (this.groupLevel == msg.groupLevel)));
+    }
+}
+
+// Note: Keep these constants in sync with the ones in Console.h
+WebInspector.ConsoleMessage.MessageSource = {
+    HTML: 0,
+    WML: 1,
+    XML: 2,
+    JS: 3,
+    CSS: 4,
+    Other: 5
+}
+
+WebInspector.ConsoleMessage.MessageType = {
+    Log: 0,
+    Object: 1,
+    Trace: 2,
+    StartGroup: 3,
+    EndGroup: 4,
+    Assert: 5,
+    Result: 6
+}
+
+WebInspector.ConsoleMessage.MessageLevel = {
+    Tip: 0,
+    Log: 1,
+    Warning: 2,
+    Error: 3,
+    Debug: 4
+}
+
+WebInspector.ConsoleCommand = function(command)
+{
+    this.command = command;
+}
+
+WebInspector.ConsoleCommand.prototype = {
+    toMessageElement: function()
+    {
+        var element = document.createElement("div");
+        element.command = this;
+        element.className = "console-user-command";
+
+        var commandTextElement = document.createElement("span");
+        commandTextElement.className = "console-message-text source-code";
+        commandTextElement.textContent = this.command;
+        element.appendChild(commandTextElement);
+
+        return element;
+    }
+}
+
+WebInspector.ConsoleTextMessage = function(text, level)
+{
+    level = level || WebInspector.ConsoleMessage.MessageLevel.Log;
+    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Log, level, 0, null, null, 1, text);
+}
+
+WebInspector.ConsoleTextMessage.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
+
+WebInspector.ConsoleCommandResult = function(result, exception, originatingCommand)
+{
+    var level = (exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
+    var message = result;
+    if (exception) {
+        // Distinguish between strings and errors (no need to quote latter).
+        message = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
+        message.type = "error";
+    }
+    var line = (exception ? result.line : -1);
+    var url = (exception ? result.sourceURL : null);
+
+    this.originatingCommand = originatingCommand;
+
+    WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, line, url, null, 1, message);
+}
+
+WebInspector.ConsoleCommandResult.prototype = {
+    toMessageElement: function()
+    {
+        var element = WebInspector.ConsoleMessage.prototype.toMessageElement.call(this);
+        element.addStyleClass("console-user-command-result");
+        return element;
+    }
+}
+
+WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
+
+WebInspector.ConsoleGroup = function(parentGroup, level)
+{
+    this.parentGroup = parentGroup;
+    this.level = level;
+
+    var element = document.createElement("div");
+    element.className = "console-group";
+    element.group = this;
+    this.element = element;
+
+    var messagesElement = document.createElement("div");
+    messagesElement.className = "console-group-messages";
+    element.appendChild(messagesElement);
+    this.messagesElement = messagesElement;
+}
+
+WebInspector.ConsoleGroup.prototype = {
+    addMessage: function(msg)
+    {
+        var element = msg.toMessageElement();
+        
+        if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup) {
+            this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
+            element.addEventListener("click", this._titleClicked.bind(this), true);
+        } else
+            this.messagesElement.appendChild(element);
+
+        if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
+            element.previousSibling.addStyleClass("console-adjacent-user-command-result");
+    },
+
+    _titleClicked: function(event)
+    {
+        var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");
+        if (groupTitleElement) {
+            var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");
+            if (groupElement)
+                if (groupElement.hasStyleClass("collapsed"))
+                    groupElement.removeStyleClass("collapsed");
+                else
+                    groupElement.addStyleClass("collapsed");
+            groupTitleElement.scrollIntoViewIfNeeded(true);
+        }
+
+        event.stopPropagation();
+        event.preventDefault();
+    }
+}
+
+/* Panel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Panel = function()
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel");
+}
+
+WebInspector.Panel.prototype = {
+    get toolbarItem()
+    {
+        if (this._toolbarItem)
+            return this._toolbarItem;
+
+        // Sample toolbar item as markup:
+        // <button class="toolbar-item resources toggleable">
+        // <div class="toolbar-icon"></div>
+        // <div class="toolbar-label">Resources</div>
+        // </button>
+
+        this._toolbarItem = document.createElement("button");
+        this._toolbarItem.className = "toolbar-item toggleable";
+        this._toolbarItem.panel = this;
+
+        if ("toolbarItemClass" in this)
+            this._toolbarItem.addStyleClass(this.toolbarItemClass);
+
+        var iconElement = document.createElement("div");
+        iconElement.className = "toolbar-icon";
+        this._toolbarItem.appendChild(iconElement);
+
+        if ("toolbarItemLabel" in this) {
+            var labelElement = document.createElement("div");
+            labelElement.className = "toolbar-label";
+            labelElement.textContent = this.toolbarItemLabel;
+            this._toolbarItem.appendChild(labelElement);
+        }
+
+        return this._toolbarItem;
+    },
+
+    show: function()
+    {
+        WebInspector.View.prototype.show.call(this);
+
+        var statusBarItems = this.statusBarItems;
+        if (statusBarItems) {
+            this._statusBarItemContainer = document.createElement("div");
+            for (var i = 0; i < statusBarItems.length; ++i)
+                this._statusBarItemContainer.appendChild(statusBarItems[i]);
+            document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
+        }
+
+        if ("_toolbarItem" in this)
+            this._toolbarItem.addStyleClass("toggled-on");
+
+        WebInspector.currentFocusElement = this.defaultFocusedElement;
+
+        this.updateSidebarWidth();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+
+        if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)
+            this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);
+        delete this._statusBarItemContainer;
+        if ("_toolbarItem" in this)
+            this._toolbarItem.removeStyleClass("toggled-on");
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.sidebarTreeElement || this.element;
+    },
+
+    attach: function()
+    {
+        if (!this.element.parentNode)
+            document.getElementById("main-panels").appendChild(this.element);
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var view = this._searchResults[i];
+                if (view.searchCanceled)
+                    view.searchCanceled();
+                delete view.currentQuery;
+            }
+        }
+
+        WebInspector.updateSearchMatchesCount(0, this);
+
+        if (this._currentSearchChunkIntervalIdentifier) {
+            clearInterval(this._currentSearchChunkIntervalIdentifier);
+            delete this._currentSearchChunkIntervalIdentifier;
+        }
+
+        this._totalSearchMatches = 0;
+        this._currentSearchResultIndex = 0;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled(true);
+
+        var searchableViews = this.searchableViews;
+        if (!searchableViews || !searchableViews.length)
+            return;
+
+        var parentElement = this.viewsContainerElement;
+        var visibleView = this.visibleView;
+        var sortFuction = this.searchResultsSortFunction;
+
+        var matchesCountUpdateTimeout = null;
+
+        function updateMatchesCount()
+        {
+            WebInspector.updateSearchMatchesCount(this._totalSearchMatches, this);
+            matchesCountUpdateTimeout = null;
+        }
+
+        function updateMatchesCountSoon()
+        {
+            if (matchesCountUpdateTimeout)
+                return;
+            // Update the matches count every half-second so it doesn't feel twitchy.
+            matchesCountUpdateTimeout = setTimeout(updateMatchesCount.bind(this), 500);
+        }
+
+        function finishedCallback(view, searchMatches)
+        {
+            if (!searchMatches)
+                return;
+
+            this._totalSearchMatches += searchMatches;
+            this._searchResults.push(view);
+
+            if (sortFuction)
+                this._searchResults.sort(sortFuction);
+
+            if (this.searchMatchFound)
+                this.searchMatchFound(view, searchMatches);
+
+            updateMatchesCountSoon.call(this);
+
+            if (view === visibleView)
+                view.jumpToFirstSearchResult();
+        }
+
+        var i = 0;
+        var panel = this;
+        var boundFinishedCallback = finishedCallback.bind(this);
+        var chunkIntervalIdentifier = null;
+
+        // Split up the work into chunks so we don't block the
+        // UI thread while processing.
+
+        function processChunk()
+        {
+            var view = searchableViews[i];
+
+            if (++i >= searchableViews.length) {
+                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
+                    delete panel._currentSearchChunkIntervalIdentifier;
+                clearInterval(chunkIntervalIdentifier);
+            }
+
+            if (!view)
+                return;
+
+            if (view.element.parentNode !== parentElement && view.element.parentNode && parentElement)
+                view.detach();
+
+            view.currentQuery = query;
+            view.performSearch(query, boundFinishedCallback);
+        }
+
+        processChunk();
+
+        chunkIntervalIdentifier = setInterval(processChunk, 25);
+        this._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this.showView || !this._searchResults || !this._searchResults.length)
+            return;
+
+        var showFirstResult = false;
+
+        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
+        if (this._currentSearchResultIndex === -1) {
+            this._currentSearchResultIndex = 0;
+            showFirstResult = true;
+        }
+
+        var currentView = this._searchResults[this._currentSearchResultIndex];
+
+        if (currentView.showingLastSearchResult()) {
+            if (this.searchIteratesOverViews()) {
+                if (++this._currentSearchResultIndex >= this._searchResults.length)
+                    this._currentSearchResultIndex = 0;
+                currentView = this._searchResults[this._currentSearchResultIndex];
+            }
+            showFirstResult = true;
+        }
+
+        if (currentView !== this.visibleView) {
+            this.showView(currentView);
+            WebInspector.focusSearchField();
+        }
+
+        if (showFirstResult)
+            currentView.jumpToFirstSearchResult();
+        else
+            currentView.jumpToNextSearchResult();
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this.showView || !this._searchResults || !this._searchResults.length)
+            return;
+
+        var showLastResult = false;
+
+        this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);
+        if (this._currentSearchResultIndex === -1) {
+            this._currentSearchResultIndex = 0;
+            showLastResult = true;
+        }
+
+        var currentView = this._searchResults[this._currentSearchResultIndex];
+
+        if (currentView.showingFirstSearchResult()) {
+            if (this.searchIteratesOverViews()) {
+                if (--this._currentSearchResultIndex < 0)
+                    this._currentSearchResultIndex = (this._searchResults.length - 1);
+                currentView = this._searchResults[this._currentSearchResultIndex];
+            }
+            showLastResult = true;
+        }
+
+        if (currentView !== this.visibleView) {
+            this.showView(currentView);
+            WebInspector.focusSearchField();
+        }
+
+        if (showLastResult)
+            currentView.jumpToLastSearchResult();
+        else
+            currentView.jumpToPreviousSearchResult();
+    },
+
+    createSidebar: function(parentElement, resizerParentElement)
+    {
+        if (this.hasSidebar)
+            return;
+
+        if (!parentElement)
+            parentElement = this.element;
+
+        if (!resizerParentElement)
+            resizerParentElement = parentElement;
+
+        this.hasSidebar = true;
+
+        this.sidebarElement = document.createElement("div");
+        this.sidebarElement.className = "sidebar";
+        parentElement.appendChild(this.sidebarElement);
+
+        this.sidebarResizeElement = document.createElement("div");
+        this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+        this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
+        resizerParentElement.appendChild(this.sidebarResizeElement);
+
+        this.sidebarTreeElement = document.createElement("ol");
+        this.sidebarTreeElement.className = "sidebar-tree";
+        this.sidebarElement.appendChild(this.sidebarTreeElement);
+
+        this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
+    },
+
+    _startSidebarDragging: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
+    },
+
+    _sidebarDragging: function(event)
+    {
+        this.updateSidebarWidth(event.pageX);
+
+        event.preventDefault();
+    },
+
+    _endSidebarDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    },
+
+    updateSidebarWidth: function(width)
+    {
+        if (!this.hasSidebar)
+            return;
+
+        if (this.sidebarElement.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        if (!("_currentSidebarWidth" in this))
+            this._currentSidebarWidth = this.sidebarElement.offsetWidth;
+
+        if (typeof width === "undefined")
+            width = this._currentSidebarWidth;
+
+        width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
+
+        this._currentSidebarWidth = width;
+        this.setSidebarWidth(width);
+
+        this.updateMainViewWidth(width);
+    },
+
+    setSidebarWidth: function(width)
+    {
+        this.sidebarElement.style.width = width + "px";
+        this.sidebarResizeElement.style.left = (width - 3) + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        // Should be implemented by ancestors.
+    },
+
+    resize: function()
+    {
+        var visibleView = this.visibleView;
+        if (visibleView && "resize" in visibleView)
+            visibleView.resize();
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        return false;
+    },
+
+    showSourceLine: function(url, line)
+    {
+        return false;
+    },
+
+    searchIteratesOverViews: function()
+    {
+        return false;
+    }
+}
+
+WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;
+
+/* TimelineGrid.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineGrid = function()
+{
+    this.element = document.createElement("div");
+
+    this._itemsGraphsElement = document.createElement("div");
+    this._itemsGraphsElement.id = "resources-graphs";
+    this.element.appendChild(this._itemsGraphsElement);
+
+    this._dividersElement = document.createElement("div");
+    this._dividersElement.id = "resources-dividers";
+    this.element.appendChild(this._dividersElement);
+
+    this._eventDividersElement = document.createElement("div");
+    this._eventDividersElement.id = "resources-event-dividers";
+    this.element.appendChild(this._eventDividersElement);
+
+    this._dividersLabelBarElement = document.createElement("div");
+    this._dividersLabelBarElement.id = "resources-dividers-label-bar";
+    this.element.appendChild(this._dividersLabelBarElement);
+}
+
+WebInspector.TimelineGrid.prototype = {
+    get itemsGraphsElement()
+    {
+        return this._itemsGraphsElement;
+    },
+
+    updateDividers: function(force, calculator, paddingLeft)
+    {
+        var dividerCount = Math.round(this._dividersElement.offsetWidth / 64);
+        var slice = calculator.boundarySpan / dividerCount;
+        if (!force && this._currentDividerSlice === slice)
+            return false;
+
+        if (typeof paddingLeft !== "number")
+            paddingLeft = 0;
+        this._currentDividerSlice = slice;
+
+        this._eventDividersElement.removeChildren();
+        // Reuse divider elements and labels.
+        var divider = this._dividersElement.firstChild;
+        var dividerLabelBar = this._dividersLabelBarElement.firstChild;
+
+        var dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;
+        var clientWidth = dividersLabelBarElementClientWidth - paddingLeft;
+        for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {
+            if (!divider) {
+                divider = document.createElement("div");
+                divider.className = "resources-divider";
+                this._dividersElement.appendChild(divider);
+
+                dividerLabelBar = document.createElement("div");
+                dividerLabelBar.className = "resources-divider";
+                var label = document.createElement("div");
+                label.className = "resources-divider-label";
+                dividerLabelBar._labelElement = label;
+                dividerLabelBar.appendChild(label);
+                this._dividersLabelBarElement.appendChild(dividerLabelBar);
+                dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;
+            }
+
+            if (i === dividerCount)
+                divider.addStyleClass("last");
+            else
+                divider.removeStyleClass("last");
+
+            var left = paddingLeft + clientWidth * (i / dividerCount);
+            var percentLeft = 100 * left / dividersLabelBarElementClientWidth;
+            this._setDividerAndBarLeft(divider, dividerLabelBar, percentLeft);
+
+            if (!isNaN(slice))
+                dividerLabelBar._labelElement.textContent = calculator.formatValue(slice * i);
+            else
+                dividerLabelBar._labelElement.textContent = "";
+
+            divider = divider.nextSibling;
+            dividerLabelBar = dividerLabelBar.nextSibling;
+        }
+
+        // Remove extras.
+        while (divider) {
+            var nextDivider = divider.nextSibling;
+            this._dividersElement.removeChild(divider);
+            divider = nextDivider;
+        }
+        while (dividerLabelBar) {
+            var nextDivider = dividerLabelBar.nextSibling;
+            this._dividersLabelBarElement.removeChild(dividerLabelBar);
+            dividerLabelBar = nextDivider;
+        }
+        return true;
+    },
+
+    _setDividerAndBarLeft: function(divider, dividerLabelBar, percentLeft)
+    {
+        var percentStyleLeft = parseFloat(divider.style.left);
+        if (!isNaN(percentStyleLeft) && Math.abs(percentStyleLeft - percentLeft) < 0.1)
+            return;
+        divider.style.left = percentLeft + "%";
+        dividerLabelBar.style.left = percentLeft + "%";
+    },
+
+    addEventDivider: function(divider)
+    {
+        this._eventDividersElement.appendChild(divider);
+    },
+
+    setScrollAndDividerTop: function(scrollTop, dividersTop)
+    {
+        this._dividersElement.style.top = scrollTop + "px";
+        this._eventDividersElement.style.top = scrollTop + "px";
+        this._dividersLabelBarElement.style.top = dividersTop + "px";
+    }
+}
+
+/* AbstractTimelinePanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AbstractTimelinePanel = function()
+{
+    WebInspector.Panel.call(this);
+    this._items = [];
+    this._staleItems = [];
+}
+
+WebInspector.AbstractTimelinePanel.prototype = {
+    get categories()
+    {
+        // Should be implemented by the concrete subclasses.
+        return {};
+    },
+
+    populateSidebar: function()
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    createItemTreeElement: function(item)
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    createItemGraph: function(item)
+    {
+        // Should be implemented by the concrete subclasses.
+    },
+
+    get items()
+    {
+        return this._items;
+    },
+
+    createInterface: function()
+    {
+        this.containerElement = document.createElement("div");
+        this.containerElement.id = "resources-container";
+        this.containerElement.addEventListener("scroll", this._updateDividersLabelBarPosition.bind(this), false);
+        this.element.appendChild(this.containerElement);
+
+        this.createSidebar(this.containerElement, this.element);
+        this.sidebarElement.id = "resources-sidebar";
+        this.populateSidebar();
+
+        this._containerContentElement = document.createElement("div");
+        this._containerContentElement.id = "resources-container-content";
+        this.containerElement.appendChild(this._containerContentElement);
+
+        this.summaryBar = new WebInspector.SummaryBar(this.categories);
+        this.summaryBar.element.id = "resources-summary";
+        this._containerContentElement.appendChild(this.summaryBar.element);
+
+        this._timelineGrid = new WebInspector.TimelineGrid();
+        this._containerContentElement.appendChild(this._timelineGrid.element);
+        this.itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
+    },
+
+    createFilterPanel: function()
+    {
+        this.filterBarElement = document.createElement("div");
+        this.filterBarElement.id = "resources-filter";
+        this.filterBarElement.className = "scope-bar";
+        this.element.appendChild(this.filterBarElement);
+
+        function createFilterElement(category)
+        {
+            if (category === "all")
+                var label = WebInspector.UIString("All");
+            else if (this.categories[category])
+                var label = this.categories[category].title;
+
+            var categoryElement = document.createElement("li");
+            categoryElement.category = category;
+            categoryElement.addStyleClass(category);
+            categoryElement.appendChild(document.createTextNode(label));
+            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
+            this.filterBarElement.appendChild(categoryElement);
+
+            return categoryElement;
+        }
+
+        this.filterAllElement = createFilterElement.call(this, "all");
+
+        // Add a divider
+        var dividerElement = document.createElement("div");
+        dividerElement.addStyleClass("divider");
+        this.filterBarElement.appendChild(dividerElement);
+
+        for (var category in this.categories)
+            createFilterElement.call(this, category);
+    },
+
+    showCategory: function(category)
+    {
+        var filterClass = "filter-" + category.toLowerCase();
+        this.itemsGraphsElement.addStyleClass(filterClass);
+        this.itemsTreeElement.childrenListElement.addStyleClass(filterClass);
+    },
+
+    hideCategory: function(category)
+    {
+        var filterClass = "filter-" + category.toLowerCase();
+        this.itemsGraphsElement.removeStyleClass(filterClass);
+        this.itemsTreeElement.childrenListElement.removeStyleClass(filterClass);
+    },
+
+    filter: function(target, selectMultiple)
+    {
+        function unselectAll()
+        {
+            for (var i = 0; i < this.filterBarElement.childNodes.length; ++i) {
+                var child = this.filterBarElement.childNodes[i];
+                if (!child.category)
+                    continue;
+
+                child.removeStyleClass("selected");
+                this.hideCategory(child.category);
+            }
+        }
+
+        if (target === this.filterAllElement) {
+            if (target.hasStyleClass("selected")) {
+                // We can't unselect All, so we break early here
+                return;
+            }
+
+            // If All wasn't selected, and now is, unselect everything else.
+            unselectAll.call(this);
+        } else {
+            // Something other than All is being selected, so we want to unselect All.
+            if (this.filterAllElement.hasStyleClass("selected")) {
+                this.filterAllElement.removeStyleClass("selected");
+                this.hideCategory("all");
+            }
+        }
+
+        if (!selectMultiple) {
+            // If multiple selection is off, we want to unselect everything else
+            // and just select ourselves.
+            unselectAll.call(this);
+
+            target.addStyleClass("selected");
+            this.showCategory(target.category);
+            return;
+        }
+
+        if (target.hasStyleClass("selected")) {
+            // If selectMultiple is turned on, and we were selected, we just
+            // want to unselect ourselves.
+            target.removeStyleClass("selected");
+            this.hideCategory(target.category);
+        } else {
+            // If selectMultiple is turned on, and we weren't selected, we just
+            // want to select ourselves.
+            target.addStyleClass("selected");
+            this.showCategory(target.category);
+        }
+    },
+
+    _updateFilter: function(e)
+    {
+        var isMac = WebInspector.isMac();
+        var selectMultiple = false;
+        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
+            selectMultiple = true;
+
+        this.filter(e.target, selectMultiple);
+
+        // When we are updating our filtering, scroll to the top so we don't end up
+        // in blank graph under all the resources.
+        this.containerElement.scrollTop = 0;
+    },
+
+    updateGraphDividersIfNeeded: function(force)
+    {
+        if (!this.visible) {
+            this.needsRefresh = true;
+            return false;
+        }
+        return this._timelineGrid.updateDividers(force, this.calculator);
+    },
+
+    _updateDividersLabelBarPosition: function()
+    {
+        const scrollTop = this.containerElement.scrollTop;
+        const offsetHeight = this.summaryBar.element.offsetHeight;
+        const dividersTop = (scrollTop < offsetHeight ? offsetHeight : scrollTop);
+        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
+    },
+
+    get needsRefresh()
+    {
+        return this._needsRefresh;
+    },
+
+    set needsRefresh(x)
+    {
+        if (this._needsRefresh === x)
+            return;
+
+        this._needsRefresh = x;
+
+        if (x) {
+            if (this.visible && !("_refreshTimeout" in this))
+                this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
+        } else {
+            if ("_refreshTimeout" in this) {
+                clearTimeout(this._refreshTimeout);
+                delete this._refreshTimeout;
+            }
+        }
+    },
+
+    refreshIfNeeded: function()
+    {
+        if (this.needsRefresh)
+            this.refresh();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+
+        this._updateDividersLabelBarPosition();
+        this.refreshIfNeeded();
+    },
+
+    resize: function()
+    {
+        WebInspector.Panel.prototype.resize.call(this);
+
+        this.updateGraphDividersIfNeeded();
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._containerContentElement.style.left = width + "px";
+        this.resize();
+    },
+
+    invalidateAllItems: function()
+    {
+        this._staleItems = this._items.slice();
+    },
+
+    refresh: function()
+    {
+        this.needsRefresh = false;
+
+        var staleItemsLength = this._staleItems.length;
+
+        var boundariesChanged = false;
+
+        for (var i = 0; i < staleItemsLength; ++i) {
+            var item = this._staleItems[i];
+            if (!item._itemsTreeElement) {
+                // Create the timeline tree element and graph.
+                item._itemsTreeElement = this.createItemTreeElement(item);
+                item._itemsTreeElement._itemGraph = this.createItemGraph(item);
+
+                this.itemsTreeElement.appendChild(item._itemsTreeElement);
+                this.itemsGraphsElement.appendChild(item._itemsTreeElement._itemGraph.graphElement);
+            }
+
+            if (item._itemsTreeElement.refresh)
+                item._itemsTreeElement.refresh();
+
+            if (this.calculator.updateBoundaries(item))
+                boundariesChanged = true;
+        }
+
+        if (boundariesChanged) {
+            // The boundaries changed, so all item graphs are stale.
+            this._staleItems = this._items.slice();
+            staleItemsLength = this._staleItems.length;
+        }
+
+
+        const isBarOpaqueAtLeft = this.sidebarTree.selectedTreeElement && this.sidebarTree.selectedTreeElement.isBarOpaqueAtLeft;
+        for (var i = 0; i < staleItemsLength; ++i)
+            this._staleItems[i]._itemsTreeElement._itemGraph.refresh(this.calculator, isBarOpaqueAtLeft);
+
+        this._staleItems = [];
+
+        this.updateGraphDividersIfNeeded();
+    },
+
+    reset: function()
+    {
+        this.containerElement.scrollTop = 0;
+
+        if (this._calculator)
+            this._calculator.reset();
+
+        if (this._items) {
+            var itemsLength = this._items.length;
+            for (var i = 0; i < itemsLength; ++i) {
+                var item = this._items[i];
+                delete item._itemsTreeElement;
+            }
+        }
+
+        this._items = [];
+        this._staleItems = [];
+
+        this.itemsTreeElement.removeChildren();
+        this.itemsGraphsElement.removeChildren();
+
+        this.updateGraphDividersIfNeeded(true);
+    },
+
+    get calculator()
+    {
+        return this._calculator;
+    },
+
+    set calculator(x)
+    {
+        if (!x || this._calculator === x)
+            return;
+
+        this._calculator = x;
+        this._calculator.reset();
+
+        this._staleItems = this._items.slice();
+        this.refresh();
+    },
+
+    addItem: function(item)
+    {
+        this._items.push(item);
+        this.refreshItem(item);
+    },
+
+    removeItem: function(item)
+    {
+        this._items.remove(item, true);
+
+        if (item._itemsTreeElement) {
+            this.itemsTreeElement.removeChild(item._itemsTreeElement);
+            this.itemsGraphsElement.removeChild(item._itemsTreeElement._itemGraph.graphElement);
+        }
+
+        delete item._itemsTreeElement;
+        this.adjustScrollPosition();
+    },
+
+    refreshItem: function(item)
+    {
+        this._staleItems.push(item);
+        this.needsRefresh = true;
+    },
+
+    revealAndSelectItem: function(item)
+    {
+        if (item._itemsTreeElement) {
+            item._itemsTreeElement.reveal();
+            item._itemsTreeElement.select(true);
+        }
+    },
+
+    sortItems: function(sortingFunction)
+    {
+        var sortedElements = [].concat(this.itemsTreeElement.children);
+        sortedElements.sort(sortingFunction);
+
+        var sortedElementsLength = sortedElements.length;
+        for (var i = 0; i < sortedElementsLength; ++i) {
+            var treeElement = sortedElements[i];
+            if (treeElement === this.itemsTreeElement.children[i])
+                continue;
+
+            var wasSelected = treeElement.selected;
+            this.itemsTreeElement.removeChild(treeElement);
+            this.itemsTreeElement.insertChild(treeElement, i);
+            if (wasSelected)
+                treeElement.select(true);
+
+            var graphElement = treeElement._itemGraph.graphElement;
+            this.itemsGraphsElement.insertBefore(graphElement, this.itemsGraphsElement.children[i]);
+        }
+    },
+
+    adjustScrollPosition: function()
+    {
+        // Prevent the container from being scrolled off the end.
+        if ((this.containerElement.scrollTop + this.containerElement.offsetHeight) > this.sidebarElement.offsetHeight)
+            this.containerElement.scrollTop = (this.sidebarElement.offsetHeight - this.containerElement.offsetHeight);
+    },
+
+    addEventDivider: function(divider)
+    {
+        this._timelineGrid.addEventDivider(divider);
+    }
+}
+
+WebInspector.AbstractTimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.AbstractTimelineCalculator = function()
+{
+}
+
+WebInspector.AbstractTimelineCalculator.prototype = {
+    computeSummaryValues: function(items)
+    {
+        var total = 0;
+        var categoryValues = {};
+
+        var itemsLength = items.length;
+        for (var i = 0; i < itemsLength; ++i) {
+            var item = items[i];
+            var value = this._value(item);
+            if (typeof value === "undefined")
+                continue;
+            if (!(item.category.name in categoryValues))
+                categoryValues[item.category.name] = 0;
+            categoryValues[item.category.name] += value;
+            total += value;
+        }
+
+        return {categoryValues: categoryValues, total: total};
+    },
+
+    computeBarGraphPercentages: function(item)
+    {
+        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
+    },
+
+    computeBarGraphLabels: function(item)
+    {
+        const label = this.formatValue(this._value(item));
+        return {left: label, right: label, tooltip: label};
+    },
+
+    get boundarySpan()
+    {
+        return this.maximumBoundary - this.minimumBoundary;
+    },
+
+    updateBoundaries: function(item)
+    {
+        this.minimumBoundary = 0;
+
+        var value = this._value(item);
+        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
+            this.maximumBoundary = value;
+            return true;
+        }
+        return false;
+    },
+
+    reset: function()
+    {
+        delete this.minimumBoundary;
+        delete this.maximumBoundary;
+    },
+
+    _value: function(item)
+    {
+        return 0;
+    },
+
+    formatValue: function(value)
+    {
+        return value.toString();
+    }
+}
+
+WebInspector.AbstractTimelineCategory = function(name, title, color)
+{
+    this.name = name;
+    this.title = title;
+    this.color = color;
+}
+
+WebInspector.AbstractTimelineCategory.prototype = {
+    toString: function()
+    {
+        return this.title;
+    }
+}
+
+/* Resource.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Resource = function(identifier, url)
+{
+    this.identifier = identifier;
+    this._url = url;
+    this._startTime = -1;
+    this._endTime = -1;
+    this._requestMethod = "";
+    this._requestFormData = "";
+    this._category = WebInspector.resourceCategories.other;
+}
+
+WebInspector.Resource.StatusText = {
+    100: "Continue",
+    101: "Switching Protocols",
+    102: "Processing (WebDav)",
+    200: "OK",
+    201: "Created",
+    202: "Accepted",
+    203: "Non-Authoritative Information",
+    204: "No Content",
+    205: "Reset Content",
+    206: "Partial Content",
+    207: "Multi-Status (WebDav)",
+    300: "Multiple Choices",
+    301: "Moved Permanently",
+    302: "Found",
+    303: "See Other",
+    304: "Not Modified",
+    305: "Use Proxy",
+    306: "Switch Proxy",
+    307: "Temporary",
+    400: "Bad Request",
+    401: "Unauthorized",
+    402: "Payment Required",
+    403: "Forbidden",
+    404: "Not Found",
+    405: "Method Not Allowed",
+    406: "Not Acceptable",
+    407: "Proxy Authentication Required",
+    408: "Request Timeout",
+    409: "Conflict",
+    410: "Gone",
+    411: "Length Required",
+    412: "Precondition Failed",
+    413: "Request Entity Too Large",
+    414: "Request-URI Too Long",
+    415: "Unsupported Media Type",
+    416: "Requested Range Not Satisfiable",
+    417: "Expectation Failed",
+    418: "I'm a teapot",
+    422: "Unprocessable Entity (WebDav)",
+    423: "Locked (WebDav)",
+    424: "Failed Dependency (WebDav)",
+    425: "Unordered Collection",
+    426: "Upgrade Required",
+    449: "Retry With",
+    500: "Internal Server Error",
+    501: "Not Implemented",
+    502: "Bad Gateway",
+    503: "Service Unavailable",
+    504: "Gateway Timeout",
+    505: "HTTP Version Not Supported",
+    506: "Variant Also Negotiates",
+    507: "Insufficient Storage (WebDav)",
+    509: "Bandwidth Limit Exceeded",
+    510: "Not Extended"
+};
+
+// Keep these in sync with WebCore::InspectorResource::Type
+WebInspector.Resource.Type = {
+    Document:   0,
+    Stylesheet: 1,
+    Image:      2,
+    Font:       3,
+    Script:     4,
+    XHR:        5,
+    Media:      6,
+    Other:      7,
+
+    isTextType: function(type)
+    {
+        return (type === this.Document) || (type === this.Stylesheet) || (type === this.Script) || (type === this.XHR);
+    },
+
+    toString: function(type)
+    {
+        switch (type) {
+            case this.Document:
+                return WebInspector.UIString("document");
+            case this.Stylesheet:
+                return WebInspector.UIString("stylesheet");
+            case this.Image:
+                return WebInspector.UIString("image");
+            case this.Font:
+                return WebInspector.UIString("font");
+            case this.Script:
+                return WebInspector.UIString("script");
+            case this.XHR:
+                return WebInspector.UIString("XHR");
+            case this.Other:
+            default:
+                return WebInspector.UIString("other");
+        }
+    }
+}
+
+WebInspector.Resource.prototype = {
+    get url()
+    {
+        return this._url;
+    },
+
+    set url(x)
+    {
+        if (this._url === x)
+            return;
+
+        var oldURL = this._url;
+        this._url = x;
+
+        // FIXME: We should make the WebInspector object listen for the "url changed" event.
+        // Then resourceURLChanged can be removed.
+        WebInspector.resourceURLChanged(this, oldURL);
+
+        this.dispatchEventToListeners("url changed");
+    },
+
+    get documentURL()
+    {
+        return this._documentURL;
+    },
+
+    set documentURL(x)
+    {
+        if (this._documentURL === x)
+            return;
+        this._documentURL = x;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    set domain(x)
+    {
+        if (this._domain === x)
+            return;
+        this._domain = x;
+    },
+
+    get lastPathComponent()
+    {
+        return this._lastPathComponent;
+    },
+
+    set lastPathComponent(x)
+    {
+        if (this._lastPathComponent === x)
+            return;
+        this._lastPathComponent = x;
+        this._lastPathComponentLowerCase = x ? x.toLowerCase() : null;
+    },
+
+    get displayName()
+    {
+        var title = this.lastPathComponent;
+        if (!title)
+            title = this.displayDomain;
+        if (!title && this.url)
+            title = this.url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");
+        if (title === "/")
+            title = this.url;
+        return title;
+    },
+
+    get displayDomain()
+    {
+        // WebInspector.Database calls this, so don't access more than this.domain.
+        if (this.domain && (!WebInspector.mainResource || (WebInspector.mainResource && this.domain !== WebInspector.mainResource.domain)))
+            return this.domain;
+        return "";
+    },
+
+    get startTime()
+    {
+        return this._startTime || -1;
+    },
+
+    set startTime(x)
+    {
+        if (this._startTime === x)
+            return;
+
+        this._startTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get responseReceivedTime()
+    {
+        return this._responseReceivedTime || -1;
+    },
+
+    set responseReceivedTime(x)
+    {
+        if (this._responseReceivedTime === x)
+            return;
+
+        this._responseReceivedTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get endTime()
+    {
+        return this._endTime || -1;
+    },
+
+    set endTime(x)
+    {
+        if (this._endTime === x)
+            return;
+
+        this._endTime = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get duration()
+    {
+        if (this._endTime === -1 || this._startTime === -1)
+            return -1;
+        return this._endTime - this._startTime;
+    },
+
+    get latency()
+    {
+        if (this._responseReceivedTime === -1 || this._startTime === -1)
+            return -1;
+        return this._responseReceivedTime - this._startTime;
+    },
+
+    get resourceSize()
+    {
+        return this._resourceSize || 0;
+    },
+
+    set resourceSize(x)
+    {
+        if (this._resourceSize === x)
+            return;
+
+        this._resourceSize = x;
+
+        if (WebInspector.panels.resources)
+            WebInspector.panels.resources.refreshResource(this);
+    },
+
+    get transferSize()
+    {
+        // FIXME: this is wrong for chunked-encoding resources.
+        return this.cached ? 0 : Number(this.responseHeaders["Content-Length"] || this.resourceSize || 0);
+    },
+
+    get expectedContentLength()
+    {
+        return this._expectedContentLength || 0;
+    },
+
+    set expectedContentLength(x)
+    {
+        if (this._expectedContentLength === x)
+            return;
+        this._expectedContentLength = x;
+    },
+
+    get finished()
+    {
+        return this._finished;
+    },
+
+    set finished(x)
+    {
+        if (this._finished === x)
+            return;
+
+        this._finished = x;
+
+        if (x) {
+            this._checkWarnings();
+            this.dispatchEventToListeners("finished");
+        }
+    },
+
+    get failed()
+    {
+        return this._failed;
+    },
+
+    set failed(x)
+    {
+        this._failed = x;
+    },
+
+    get category()
+    {
+        return this._category;
+    },
+
+    set category(x)
+    {
+        if (this._category === x)
+            return;
+
+        var oldCategory = this._category;
+        if (oldCategory)
+            oldCategory.removeResource(this);
+
+        this._category = x;
+
+        if (this._category)
+            this._category.addResource(this);
+
+        if (WebInspector.panels.resources) {
+            WebInspector.panels.resources.refreshResource(this);
+            WebInspector.panels.resources.recreateViewForResourceIfNeeded(this);
+        }
+    },
+
+    get mimeType()
+    {
+        return this._mimeType;
+    },
+
+    set mimeType(x)
+    {
+        if (this._mimeType === x)
+            return;
+
+        this._mimeType = x;
+    },
+
+    get type()
+    {
+        return this._type;
+    },
+
+    set type(x)
+    {
+        if (this._type === x)
+            return;
+
+        this._type = x;
+
+        switch (x) {
+            case WebInspector.Resource.Type.Document:
+                this.category = WebInspector.resourceCategories.documents;
+                break;
+            case WebInspector.Resource.Type.Stylesheet:
+                this.category = WebInspector.resourceCategories.stylesheets;
+                break;
+            case WebInspector.Resource.Type.Script:
+                this.category = WebInspector.resourceCategories.scripts;
+                break;
+            case WebInspector.Resource.Type.Image:
+                this.category = WebInspector.resourceCategories.images;
+                break;
+            case WebInspector.Resource.Type.Font:
+                this.category = WebInspector.resourceCategories.fonts;
+                break;
+            case WebInspector.Resource.Type.XHR:
+                this.category = WebInspector.resourceCategories.xhr;
+                break;
+            case WebInspector.Resource.Type.Other:
+            default:
+                this.category = WebInspector.resourceCategories.other;
+                break;
+        }
+    },
+
+    get requestHeaders()
+    {
+        if (this._requestHeaders === undefined)
+            this._requestHeaders = {};
+        return this._requestHeaders;
+    },
+
+    set requestHeaders(x)
+    {
+        if (this._requestHeaders === x)
+            return;
+
+        this._requestHeaders = x;
+        delete this._sortedRequestHeaders;
+
+        this.dispatchEventToListeners("requestHeaders changed");
+    },
+
+    get sortedRequestHeaders()
+    {
+        if (this._sortedRequestHeaders !== undefined)
+            return this._sortedRequestHeaders;
+
+        this._sortedRequestHeaders = [];
+        for (var key in this.requestHeaders)
+            this._sortedRequestHeaders.push({header: key, value: this.requestHeaders[key]});
+        this._sortedRequestHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
+
+        return this._sortedRequestHeaders;
+    },
+
+    get responseHeaders()
+    {
+        if (this._responseHeaders === undefined)
+            this._responseHeaders = {};
+        return this._responseHeaders;
+    },
+
+    set responseHeaders(x)
+    {
+        if (this._responseHeaders === x)
+            return;
+
+        this._responseHeaders = x;
+        delete this._sortedResponseHeaders;
+
+        this.dispatchEventToListeners("responseHeaders changed");
+    },
+
+    get sortedResponseHeaders()
+    {
+        if (this._sortedResponseHeaders !== undefined)
+            return this._sortedResponseHeaders;
+
+        this._sortedResponseHeaders = [];
+        for (var key in this.responseHeaders)
+            this._sortedResponseHeaders.push({header: key, value: this.responseHeaders[key]});
+        this._sortedResponseHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });
+
+        return this._sortedResponseHeaders;
+    },
+
+    get scripts()
+    {
+        if (!("_scripts" in this))
+            this._scripts = [];
+        return this._scripts;
+    },
+
+    addScript: function(script)
+    {
+        if (!script)
+            return;
+        this.scripts.unshift(script);
+        script.resource = this;
+    },
+
+    removeAllScripts: function()
+    {
+        if (!this._scripts)
+            return;
+
+        for (var i = 0; i < this._scripts.length; ++i) {
+            if (this._scripts[i].resource === this)
+                delete this._scripts[i].resource;
+        }
+
+        delete this._scripts;
+    },
+
+    removeScript: function(script)
+    {
+        if (!script)
+            return;
+
+        if (script.resource === this)
+            delete script.resource;
+
+        if (!this._scripts)
+            return;
+
+        this._scripts.remove(script);
+    },
+
+    get errors()
+    {
+        return this._errors || 0;
+    },
+
+    set errors(x)
+    {
+        this._errors = x;
+    },
+
+    get warnings()
+    {
+        return this._warnings || 0;
+    },
+
+    set warnings(x)
+    {
+        this._warnings = x;
+    },
+
+    _mimeTypeIsConsistentWithType: function()
+    {
+        if (typeof this.type === "undefined"
+         || this.type === WebInspector.Resource.Type.Other
+         || this.type === WebInspector.Resource.Type.XHR)
+            return true;
+
+        if (this.mimeType in WebInspector.MIMETypes)
+            return this.type in WebInspector.MIMETypes[this.mimeType];
+
+        return false;
+    },
+
+    _checkWarnings: function()
+    {
+        for (var warning in WebInspector.Warnings)
+            this._checkWarning(WebInspector.Warnings[warning]);
+    },
+
+    _checkWarning: function(warning)
+    {
+        var msg;
+        switch (warning.id) {
+            case WebInspector.Warnings.IncorrectMIMEType.id:
+                if (!this._mimeTypeIsConsistentWithType())
+                    msg = new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,
+                        WebInspector.ConsoleMessage.MessageType.Log, 
+                        WebInspector.ConsoleMessage.MessageLevel.Warning, -1, this.url, null, 1,
+                        String.sprintf(WebInspector.Warnings.IncorrectMIMEType.message,
+                        WebInspector.Resource.Type.toString(this.type), this.mimeType));
+                break;
+        }
+
+        if (msg)
+            WebInspector.console.addMessage(msg);
+    }
+}
+
+WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.Resource.CompareByStartTime = function(a, b)
+{
+    return a.startTime - b.startTime;
+}
+
+WebInspector.Resource.CompareByResponseReceivedTime = function(a, b)
+{
+    var aVal = a.responseReceivedTime;
+    var bVal = b.responseReceivedTime;
+    if (aVal === -1 ^ bVal === -1)
+        return bVal - aVal;
+    return aVal - bVal;
+}
+
+WebInspector.Resource.CompareByEndTime = function(a, b)
+{
+    var aVal = a.endTime;
+    var bVal = b.endTime;
+    if (aVal === -1 ^ bVal === -1)
+        return bVal - aVal;
+    return aVal - bVal;
+}
+
+WebInspector.Resource.CompareByDuration = function(a, b)
+{
+    return a.duration - b.duration;
+}
+
+WebInspector.Resource.CompareByLatency = function(a, b)
+{
+    return a.latency - b.latency;
+}
+
+WebInspector.Resource.CompareBySize = function(a, b)
+{
+    return a.resourceSize - b.resourceSize;
+}
+
+WebInspector.Resource.CompareByTransferSize = function(a, b)
+{
+    return a.transferSize - b.transferSize;
+}
+
+
+WebInspector.Resource.StatusTextForCode = function(code)
+{
+    return code ? code + " " + WebInspector.Resource.StatusText[code] : "";
+}
+
+/* ResourceCategory.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourceCategory = function(name, title, color)
+{
+    WebInspector.AbstractTimelineCategory.call(this, name, title, color);
+    this.resources = [];
+}
+
+WebInspector.ResourceCategory.prototype = {
+
+    addResource: function(resource)
+    {
+        var a = resource;
+        var resourcesLength = this.resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var b = this.resources[i];
+            if (a._lastPathComponentLowerCase && b._lastPathComponentLowerCase)
+                if (a._lastPathComponentLowerCase < b._lastPathComponentLowerCase)
+                    break;
+            else if (a.name && b.name)
+                if (a.name < b.name)
+                    break;
+        }
+
+        this.resources.splice(i, 0, resource);
+    },
+
+    removeResource: function(resource)
+    {
+        this.resources.remove(resource, true);
+    },
+
+    removeAllResources: function(resource)
+    {
+        this.resources = [];
+    }
+}
+
+WebInspector.ResourceCategory.prototype.__proto__ = WebInspector.AbstractTimelineCategory.prototype;
+
+/* Database.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Database = function(id, domain, name, version)
+{
+    this._id = id;
+    this._domain = domain;
+    this._name = name;
+    this._version = version;
+}
+
+WebInspector.Database.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get name()
+    {
+        return this._name;
+    },
+
+    set name(x)
+    {
+        this._name = x;
+    },
+
+    get version()
+    {
+        return this._version;
+    },
+
+    set version(x)
+    {
+        this._version = x;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    set domain(x)
+    {
+        this._domain = x;
+    },
+
+    get displayDomain()
+    {
+        return WebInspector.Resource.prototype.__lookupGetter__("displayDomain").call(this);
+    },
+
+    getTableNames: function(callback)
+    {
+        function sortingCallback(names)
+        {
+            callback(names.sort());
+        }
+        var callId = WebInspector.Callback.wrap(sortingCallback);
+        InspectorBackend.getDatabaseTableNames(callId, this._id);
+    },
+    
+    executeSql: function(query, onSuccess, onError)
+    {
+        function callback(result)
+        {
+            if (!(result instanceof Array)) {
+                onError(result);
+                return;
+            }
+            onSuccess(result);
+        }
+        // FIXME: execute the query in the frame the DB comes from.
+        InjectedScriptAccess.getDefault().executeSql(this._id, query, callback);
+    }
+}
+
+WebInspector.didGetDatabaseTableNames = WebInspector.Callback.processCallback;
+
+/* DOMStorage.js */
+
+/*
+ * Copyright (C) 2008 Nokia Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMStorage = function(id, domain, isLocalStorage)
+{
+    this._id = id;
+    this._domain = domain;
+    this._isLocalStorage = isLocalStorage;
+}
+
+WebInspector.DOMStorage.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get domStorage()
+    {
+        return this._domStorage;
+    },
+
+    get domain()
+    {
+        return this._domain;
+    },
+
+    get isLocalStorage()
+    {
+        return this._isLocalStorage;
+    },
+
+    getEntries: function(callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.getDOMStorageEntries(callId, this._id);
+    },
+    
+    setItem: function(key, value, callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.setDOMStorageItem(callId, this._id, key, value);
+    },
+    
+    removeItem: function(key, callback)
+    {
+        var callId = WebInspector.Callback.wrap(callback);
+        InspectorBackend.removeDOMStorageItem(callId, this._id, key);
+    }
+}
+
+WebInspector.didGetDOMStorageEntries = WebInspector.Callback.processCallback;
+WebInspector.didSetDOMStorageItem = WebInspector.Callback.processCallback;
+WebInspector.didRemoveDOMStorageItem = WebInspector.Callback.processCallback;
+
+/* DOMStorageItemsView.js */
+
+/*
+ * Copyright (C) 2008 Nokia Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMStorageItemsView = function(domStorage)
+{
+    WebInspector.View.call(this);
+
+    this.domStorage = domStorage;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
+    this.deleteButton.visible = false;
+    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+}
+
+WebInspector.DOMStorageItemsView.prototype = {
+    get statusBarItems()
+    {
+        return [this.refreshButton.element, this.deleteButton.element];
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.update();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.deleteButton.visible = false;
+    },
+
+    update: function()
+    {
+        this.element.removeChildren();
+        var callback = this._showDOMStorageEntries.bind(this);
+        this.domStorage.getEntries(callback);
+    },
+
+    _showDOMStorageEntries: function(entries)
+    {
+        this._dataGrid = this._dataGridForDOMStorageEntries(entries);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.autoSizeColumns(10);
+        this.deleteButton.visible = true;
+    },
+
+    resize: function()
+    {
+        if (this._dataGrid)
+            this._dataGrid.updateWidths();
+    },
+
+    _dataGridForDOMStorageEntries: function(entries)
+    {
+        var columns = {};
+        columns[0] = {};
+        columns[1] = {};
+        columns[0].title = WebInspector.UIString("Key");
+        columns[1].title = WebInspector.UIString("Value");
+
+        var nodes = [];
+
+        var keys = [];
+        var length = entries.length;
+        for (var i = 0; i < entries.length; i++) {
+            var data = {};
+
+            var key = entries[i][0];
+            data[0] = key;
+            var value = entries[i][1];
+            data[1] = value;
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = true;
+            nodes.push(node);
+            keys.push(key);
+        }
+
+        var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
+        var length = nodes.length;
+        for (var i = 0; i < length; ++i)
+            dataGrid.appendChild(nodes[i]);
+        dataGrid.addCreationNode(false);
+        if (length > 0)
+            nodes[0].selected = true;
+        return dataGrid;
+    },
+
+    _deleteButtonClicked: function(event)
+    {
+        if (!this._dataGrid || !this._dataGrid.selectedNode)
+            return;
+
+        this._deleteCallback(this._dataGrid.selectedNode);
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this.update();
+    },
+    
+    _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
+    {
+        var domStorage = this.domStorage;
+        if (columnIdentifier === 0) {
+            if (oldText)
+                domStorage.removeItem(oldText);
+
+            domStorage.setItem(newText, editingNode.data[1]);
+        } else {
+            domStorage.setItem(editingNode.data[0], newText);
+        }
+        
+        this.update();
+    },
+    
+    _deleteCallback: function(node)
+    {
+        if (!node || node.isCreationNode)
+            return;
+
+        if (this.domStorage)
+            this.domStorage.removeItem(node.data[0]);
+            
+        this.update();
+    }
+}
+
+WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* DataGrid.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *        notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *        notice, this list of conditions and the following disclaimer in the
+ *        documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.         IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DataGrid = function(columns, editCallback, deleteCallback)
+{
+    this.element = document.createElement("div");
+    this.element.className = "data-grid";
+    this.element.tabIndex = 0;
+    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
+
+    this._headerTable = document.createElement("table");
+    this._headerTable.className = "header";
+
+    this._dataTable = document.createElement("table");
+    this._dataTable.className = "data";
+
+    this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
+    this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
+    
+    this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
+    
+    // FIXME: Add a createCallback which is different from editCallback and has different
+    // behavior when creating a new node.
+    if (editCallback) {
+        this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
+        this._editCallback = editCallback;
+    }
+    if (deleteCallback)
+        this._deleteCallback = deleteCallback;
+    
+    this.aligned = {};
+
+    var scrollContainer = document.createElement("div");
+    scrollContainer.className = "data-container";
+    scrollContainer.appendChild(this._dataTable);
+
+    this.element.appendChild(this._headerTable);
+    this.element.appendChild(scrollContainer);
+
+    var headerRow = document.createElement("tr");
+    var columnGroup = document.createElement("colgroup");
+    this._columnCount = 0;
+
+    for (var columnIdentifier in columns) {
+        var column = columns[columnIdentifier];
+        if (column.disclosure)
+            this.disclosureColumnIdentifier = columnIdentifier;
+
+        var col = document.createElement("col");
+        if (column.width)
+            col.style.width = column.width;
+        column.element = col;
+        columnGroup.appendChild(col);
+
+        var cell = document.createElement("th");
+        cell.className = columnIdentifier + "-column";
+        cell.columnIdentifier = columnIdentifier;
+
+        var div = document.createElement("div");
+        div.textContent = column.title;
+        cell.appendChild(div);
+
+        if (column.sort) {
+            cell.addStyleClass("sort-" + column.sort);
+            this._sortColumnCell = cell;
+        }
+
+        if (column.sortable) {
+            cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
+            cell.addStyleClass("sortable");
+        }
+
+        if (column.aligned) {
+            cell.addStyleClass(column.aligned);
+            this.aligned[columnIdentifier] = column.aligned;
+        }
+
+        headerRow.appendChild(cell);
+
+        ++this._columnCount;
+    }
+
+    columnGroup.span = this._columnCount;
+
+    var cell = document.createElement("th");
+    cell.className = "corner";
+    headerRow.appendChild(cell);
+
+    this._headerTableColumnGroup = columnGroup;
+    this._headerTable.appendChild(this._headerTableColumnGroup);
+    this.headerTableBody.appendChild(headerRow);
+
+    var fillerRow = document.createElement("tr");
+    fillerRow.className = "filler";
+
+    for (var i = 0; i < this._columnCount; ++i) {
+        var cell = document.createElement("td");
+        fillerRow.appendChild(cell);
+    }
+    
+    this._dataTableColumnGroup = columnGroup.cloneNode(true);
+    this._dataTable.appendChild(this._dataTableColumnGroup);
+    this.dataTableBody.appendChild(fillerRow);
+
+    this.columns = columns || {};
+    this.children = [];
+    this.selectedNode = null;
+    this.expandNodesWhenArrowing = false;
+    this.root = true;
+    this.hasChildren = false;
+    this.expanded = true;
+    this.revealed = true;
+    this.selected = false;
+    this.dataGrid = this;
+    this.indentWidth = 15;
+    this.resizers = [];
+    this.columnWidthsInitialized = false;
+}
+
+WebInspector.DataGrid.prototype = {
+    _ondblclick: function(event)
+    {
+        if (this._editing || this._editingNode)
+            return;
+
+        this._startEditing(event.target);
+    },
+
+    _startEditingColumnOfDataGridNode: function(node, column)
+    {
+        this._editing = true;
+        this._editingNode = node;
+        this._editingNode.select();
+
+        var element = this._editingNode._element.children[column];
+        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    _startEditing: function(target)
+    {
+        var element = target.enclosingNodeOrSelfWithNodeName("td");
+        if (!element)
+            return;
+
+        this._editingNode = this.dataGridNodeFromNode(target);
+        if (!this._editingNode) {
+            if (!this.creationNode)
+                return;
+            this._editingNode = this.creationNode;
+        }
+
+        // Force editing the 1st column when editing the creation node
+        if (this._editingNode.isCreationNode)
+            return this._startEditingColumnOfDataGridNode(this._editingNode, 0);
+
+        this._editing = true;
+        WebInspector.startEditing(element, this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    _editingCommitted: function(element, newText, oldText, context, moveDirection)
+    {
+        // FIXME: We need more column identifiers here throughout this function.
+        // Not needed yet since only editable DataGrid is DOM Storage, which is Key - Value.
+        
+        // FIXME: Better way to do this than regular expressions?
+        var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1]);
+
+        var textBeforeEditing = this._editingNode.data[columnIdentifier];
+        var currentEditingNode = this._editingNode;
+
+        function moveToNextIfNeeded(wasChange) {
+            if (!moveDirection)
+                return;
+
+            if (moveDirection === "forward") {
+                if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)
+                    return;
+
+                if (columnIdentifier === 0)
+                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);
+
+                var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
+                if (nextDataGridNode)
+                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);
+                if (currentEditingNode.isCreationNode && wasChange) {
+                    addCreationNode(false);
+                    return this._startEditingColumnOfDataGridNode(this.creationNode, 0);
+                }
+                return;
+            }
+
+            if (moveDirection === "backward") {
+                if (columnIdentifier === 1)
+                    return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);
+                    var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);
+
+                if (nextDataGridNode)
+                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);
+                return;
+            }
+        }
+
+        if (textBeforeEditing == newText) {
+            this._editingCancelled(element);
+            moveToNextIfNeeded.call(this, false);
+            return;
+        }
+
+        // Update the text in the datagrid that we typed
+        this._editingNode.data[columnIdentifier] = newText;
+        
+        // Make the callback - expects an editing node (table row), the column number that is being edited,
+        // the text that used to be there, and the new text.
+        this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
+
+        if (this._editingNode.isCreationNode)
+            this.addCreationNode(false);
+
+        this._editingCancelled(element);
+        moveToNextIfNeeded.call(this, true);
+    },
+
+    _editingCancelled: function(element, context)
+    {
+        delete this._editing;
+        this._editingNode = null;
+    },
+    
+    get sortColumnIdentifier()
+    {
+        if (!this._sortColumnCell)
+            return null;
+        return this._sortColumnCell.columnIdentifier;
+    },
+
+    get sortOrder()
+    {
+        if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))
+            return "ascending";
+        if (this._sortColumnCell.hasStyleClass("sort-descending"))
+            return "descending";
+        return null;
+    },
+
+    get headerTableBody()
+    {
+        if ("_headerTableBody" in this)
+            return this._headerTableBody;
+
+        this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
+        if (!this._headerTableBody) {
+            this._headerTableBody = this.element.ownerDocument.createElement("tbody");
+            this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
+        }
+
+        return this._headerTableBody;
+    },
+
+    get dataTableBody()
+    {
+        if ("_dataTableBody" in this)
+            return this._dataTableBody;
+
+        this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
+        if (!this._dataTableBody) {
+            this._dataTableBody = this.element.ownerDocument.createElement("tbody");
+            this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
+        }
+
+        return this._dataTableBody;
+    },
+
+    autoSizeColumns: function(minPercent, maxPercent)
+    {
+        if (minPercent)
+            minPercent = Math.min(minPercent, Math.floor(100 / this._columnCount));
+        var widths = {};
+        var columns = this.columns;
+        for (var columnIdentifier in columns)
+            widths[columnIdentifier] = (columns[columnIdentifier].title || "").length;
+
+        for (var i = 0; i < this.children.length; ++i) {
+            var node = this.children[i];
+            for (var columnIdentifier in columns) {
+                var text = node.data[columnIdentifier] || "";
+                if (text.length > widths[columnIdentifier])
+                    widths[columnIdentifier] = text.length;
+            }
+        }
+
+        var totalColumnWidths = 0;
+        for (var columnIdentifier in columns)
+            totalColumnWidths += widths[columnIdentifier];
+
+        var recoupPercent = 0;
+        for (var columnIdentifier in columns) {
+            var width = Math.round(100 * widths[columnIdentifier] / totalColumnWidths);
+            if (minPercent && width < minPercent) {
+                recoupPercent += (minPercent - width);
+                width = minPercent;
+            } else if (maxPercent && width > maxPercent) {
+                recoupPercent -= (width - maxPercent);
+                width = maxPercent;
+            }
+            widths[columnIdentifier] = width;
+        }
+
+        while (minPercent && recoupPercent > 0) {
+            for (var columnIdentifier in columns) {
+                if (widths[columnIdentifier] > minPercent) {
+                    --widths[columnIdentifier];
+                    --recoupPercent;
+                    if (!recoupPercent)
+                        break;
+                }
+            }
+        }
+
+        while (maxPercent && recoupPercent < 0) {
+            for (var columnIdentifier in columns) {
+                if (widths[columnIdentifier] < maxPercent) {
+                    ++widths[columnIdentifier];
+                    ++recoupPercent;
+                    if (!recoupPercent)
+                        break;
+                }
+            }
+        }
+
+        for (var columnIdentifier in columns)
+            columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%";
+        this.columnWidthsInitialized = false;
+        this.updateWidths();
+    },
+
+    // Updates the widths of the table, including the positions of the column
+    // resizers.
+    //
+    // IMPORTANT: This function MUST be called once after the element of the
+    // DataGrid is attached to its parent element and every subsequent time the
+    // width of the parent element is changed in order to make it possible to
+    // resize the columns.
+    //
+    // If this function is not called after the DataGrid is attached to its
+    // parent element, then the DataGrid's columns will not be resizable.
+    updateWidths: function()
+    {
+        var headerTableColumns = this._headerTableColumnGroup.children;
+        
+        var left = 0;
+        var tableWidth = this._dataTable.offsetWidth;
+        var numColumns = headerTableColumns.length;
+        
+        if (!this.columnWidthsInitialized) {
+            // Give all the columns initial widths now so that during a resize,
+            // when the two columns that get resized get a percent value for
+            // their widths, all the other columns already have percent values
+            // for their widths.
+            for (var i = 0; i < numColumns; i++) {
+                var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
+                var percentWidth = ((columnWidth / tableWidth) * 100) + "%";
+                this._headerTableColumnGroup.children[i].style.width = percentWidth;
+                this._dataTableColumnGroup.children[i].style.width = percentWidth;
+            }
+            this.columnWidthsInitialized = true;
+        }
+        
+        // Make n - 1 resizers for n columns. 
+        for (var i = 0; i < numColumns - 1; i++) {
+            var resizer = this.resizers[i];
+
+            if (!resizer) {
+                // This is the first call to updateWidth, so the resizers need
+                // to be created.
+                resizer = document.createElement("div");
+                resizer.addStyleClass("data-grid-resizer");
+                // This resizer is associated with the column to its right.
+                resizer.rightNeighboringColumnID = i + 1;
+                resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);
+                this.element.appendChild(resizer);
+                this.resizers[i] = resizer;
+            }
+
+            // Get the width of the cell in the first (and only) row of the
+            // header table in order to determine the width of the column, since
+            // it is not possible to query a column for its width.
+            left += this.headerTableBody.rows[0].cells[i].offsetWidth;
+            
+            resizer.style.left = left + "px";
+        }
+    },
+
+    addCreationNode: function(hasChildren)
+    {
+        if (this.creationNode)
+            this.creationNode.makeNormal();
+
+        var emptyData = {};
+        for (var column in this.columns)
+            emptyData[column] = '';
+        this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
+        this.appendChild(this.creationNode);
+    },
+
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        if (!child)
+            throw("insertChild: Node can't be undefined or null.");
+        if (child.parent === this)
+            throw("insertChild: Node is already a child of this node.");
+
+        if (child.parent)
+            child.parent.removeChild(child);
+
+        this.children.splice(index, 0, child);
+        this.hasChildren = true;
+
+        child.parent = this;
+        child.dataGrid = this.dataGrid;
+        child._recalculateSiblings(index);
+
+        delete child._depth;
+        delete child._revealed;
+        delete child._attached;
+        child._shouldRefreshChildren = true;
+
+        var current = child.children[0];
+        while (current) {
+            current.dataGrid = this.dataGrid;
+            delete current._depth;
+            delete current._revealed;
+            delete current._attached;
+            current._shouldRefreshChildren = true;
+            current = current.traverseNextNode(false, child, true);
+        }
+
+        if (this.expanded)
+            child._attach();
+    },
+
+    removeChild: function(child)
+    {
+        if (!child)
+            throw("removeChild: Node can't be undefined or null.");
+        if (child.parent !== this)
+            throw("removeChild: Node is not a child of this node.");
+
+        child.deselect();
+
+        this.children.remove(child, true);
+
+        if (child.previousSibling)
+            child.previousSibling.nextSibling = child.nextSibling;
+        if (child.nextSibling)
+            child.nextSibling.previousSibling = child.previousSibling;
+
+        child.dataGrid = null;
+        child.parent = null;
+        child.nextSibling = null;
+        child.previousSibling = null;
+
+        if (this.children.length <= 0)
+            this.hasChildren = false;
+    },
+
+    removeChildren: function()
+    {
+        for (var i = 0; i < this.children.length; ++i) {
+            var child = this.children[i];
+            child.deselect();
+            child._detach();
+
+            child.dataGrid = null;
+            child.parent = null;
+            child.nextSibling = null;
+            child.previousSibling = null;
+        }
+
+        this.children = [];
+        this.hasChildren = false;
+    },
+
+    removeChildrenRecursive: function()
+    {
+        var childrenToRemove = this.children;
+
+        var child = this.children[0];
+        while (child) {
+            if (child.children.length)
+                childrenToRemove = childrenToRemove.concat(child.children);
+            child = child.traverseNextNode(false, this, true);
+        }
+
+        for (var i = 0; i < childrenToRemove.length; ++i) {
+            var child = childrenToRemove[i];
+            child.deselect();
+            child._detach();
+
+            child.children = [];
+            child.dataGrid = null;
+            child.parent = null;
+            child.nextSibling = null;
+            child.previousSibling = null;
+        }
+
+        this.children = [];
+    },
+
+
+    _keyDown: function(event)
+    {
+        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
+            return;
+
+        var handled = false;
+        var nextSelectedNode;
+        if (event.keyIdentifier === "Up" && !event.altKey) {
+            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
+            while (nextSelectedNode && !nextSelectedNode.selectable)
+                nextSelectedNode = nextSelectedNode.traversePreviousNode(!this.expandTreeNodesWhenArrowing);
+            handled = nextSelectedNode ? true : false;
+        } else if (event.keyIdentifier === "Down" && !event.altKey) {
+            nextSelectedNode = this.selectedNode.traverseNextNode(true);
+            while (nextSelectedNode && !nextSelectedNode.selectable)
+                nextSelectedNode = nextSelectedNode.traverseNextNode(!this.expandTreeNodesWhenArrowing);
+            handled = nextSelectedNode ? true : false;
+        } else if (event.keyIdentifier === "Left") {
+            if (this.selectedNode.expanded) {
+                if (event.altKey)
+                    this.selectedNode.collapseRecursively();
+                else
+                    this.selectedNode.collapse();
+                handled = true;
+            } else if (this.selectedNode.parent && !this.selectedNode.parent.root) {
+                handled = true;
+                if (this.selectedNode.parent.selectable) {
+                    nextSelectedNode = this.selectedNode.parent;
+                    handled = nextSelectedNode ? true : false;
+                } else if (this.selectedNode.parent)
+                    this.selectedNode.parent.collapse();
+            }
+        } else if (event.keyIdentifier === "Right") {
+            if (!this.selectedNode.revealed) {
+                this.selectedNode.reveal();
+                handled = true;
+            } else if (this.selectedNode.hasChildren) {
+                handled = true;
+                if (this.selectedNode.expanded) {
+                    nextSelectedNode = this.selectedNode.children[0];
+                    handled = nextSelectedNode ? true : false;
+                } else {
+                    if (event.altKey)
+                        this.selectedNode.expandRecursively();
+                    else
+                        this.selectedNode.expand();
+                }
+            }
+        } else if (event.keyCode === 8 || event.keyCode === 46) {
+            if (this._deleteCallback) {
+                handled = true;
+                this._deleteCallback(this.selectedNode);
+            }
+        } else if (isEnterKey(event)) {
+            if (this._editCallback) {
+                handled = true;
+                // The first child of the selected element is the <td class="0-column">,
+                // and that's what we want to edit.
+                this._startEditing(this.selectedNode._element.children[0]);
+            }
+        }
+
+        if (nextSelectedNode) {
+            nextSelectedNode.reveal();
+            nextSelectedNode.select();
+        }
+
+        if (handled) {
+            event.preventDefault();
+            event.stopPropagation();
+        }
+    },
+
+    expand: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    collapse: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    reveal: function()
+    {
+        // This is the root, do nothing.
+    },
+
+    dataGridNodeFromNode: function(target)
+    {
+        var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
+        return rowElement._dataGridNode;
+    },
+
+    dataGridNodeFromPoint: function(x, y)
+    {
+        var node = this._dataTable.ownerDocument.elementFromPoint(x, y);
+        var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");
+        return rowElement._dataGridNode;
+    },
+
+    _clickInHeaderCell: function(event)
+    {
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
+        if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))
+            return;
+
+        var sortOrder = this.sortOrder;
+
+        if (this._sortColumnCell) {
+            this._sortColumnCell.removeStyleClass("sort-ascending");
+            this._sortColumnCell.removeStyleClass("sort-descending");
+        }
+
+        if (cell == this._sortColumnCell) {
+            if (sortOrder == "ascending")
+                sortOrder = "descending";
+            else
+                sortOrder = "ascending";
+        }
+
+        this._sortColumnCell = cell;
+
+        cell.addStyleClass("sort-" + sortOrder);
+
+        this.dispatchEventToListeners("sorting changed");
+    },
+
+    _mouseDownInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.selectable)
+            return;
+
+        if (gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (event.metaKey) {
+            if (gridNode.selected)
+                gridNode.deselect();
+            else
+                gridNode.select();
+        } else
+            gridNode.select();
+    },
+    
+    _contextMenuInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.selectable)
+            return;
+        
+        if (gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+      
+        var contextMenu = new WebInspector.ContextMenu();
+        
+        // FIXME: Use the column names for Editing, instead of just "Edit".
+        if (this.dataGrid._editCallback) {
+            if (gridNode === this.creationNode)
+                contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));
+            else
+                contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));
+        }
+        if (this.dataGrid._deleteCallback && gridNode !== this.creationNode)
+            contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
+        
+        contextMenu.show(event);
+    },
+
+    _clickInDataTable: function(event)
+    {
+        var gridNode = this.dataGridNodeFromNode(event.target);
+        if (!gridNode || !gridNode.hasChildren)
+            return;
+
+        if (!gridNode.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (gridNode.expanded) {
+            if (event.altKey)
+                gridNode.collapseRecursively();
+            else
+                gridNode.collapse();
+        } else {
+            if (event.altKey)
+                gridNode.expandRecursively();
+            else
+                gridNode.expand();
+        }
+    },
+    
+    _startResizerDragging: function(event)
+    {
+        this.currentResizer = event.target;
+        if (!this.currentResizer.rightNeighboringColumnID)
+            return;
+        WebInspector.elementDragStart(this.lastResizer, this._resizerDragging.bind(this),
+            this._endResizerDragging.bind(this), event, "col-resize");
+    },
+    
+    _resizerDragging: function(event)
+    {
+        var resizer = this.currentResizer;
+        if (!resizer)
+            return;
+        
+        // Constrain the dragpoint to be within the containing div of the
+        // datagrid.
+        var dragPoint = event.clientX - this.element.totalOffsetLeft;
+        // Constrain the dragpoint to be within the space made up by the
+        // column directly to the left and the column directly to the right.
+        var leftEdgeOfPreviousColumn = 0;
+        var firstRowCells = this.headerTableBody.rows[0].cells;
+        for (var i = 0; i < resizer.rightNeighboringColumnID - 1; i++)
+            leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
+            
+        var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.rightNeighboringColumnID - 1].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth;
+        
+        // Give each column some padding so that they don't disappear.               
+        var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
+        var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
+        
+        dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
+        
+        resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";
+        
+        var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";
+        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
+        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn;
+        
+        var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";
+        this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width =  percentRightColumn;
+        this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn;
+        
+        event.preventDefault();
+    },
+    
+    _endResizerDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+        this.currentResizer = null;
+    },
+    
+    ColumnResizePadding: 10,
+    
+    CenterResizerOverBorderAdjustment: 3,
+}
+
+WebInspector.DataGrid.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.DataGridNode = function(data, hasChildren)
+{
+    this._expanded = false;
+    this._selected = false;
+    this._shouldRefreshChildren = true;
+    this._data = data || {};
+    this.hasChildren = hasChildren || false;
+    this.children = [];
+    this.dataGrid = null;
+    this.parent = null;
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.disclosureToggleWidth = 10;
+}
+
+WebInspector.DataGridNode.prototype = {
+    selectable: true,
+
+    get element()
+    {
+        if (this._element)
+            return this._element;
+
+        if (!this.dataGrid)
+            return null;
+
+        this._element = document.createElement("tr");
+        this._element._dataGridNode = this;
+
+        if (this.hasChildren)
+            this._element.addStyleClass("parent");
+        if (this.expanded)
+            this._element.addStyleClass("expanded");
+        if (this.selected)
+            this._element.addStyleClass("selected");
+        if (this.revealed)
+            this._element.addStyleClass("revealed");
+
+        for (var columnIdentifier in this.dataGrid.columns) {
+            var cell = this.createCell(columnIdentifier);
+            this._element.appendChild(cell);
+        }
+
+        return this._element;
+    },
+
+    get data()
+    {
+        return this._data;
+    },
+
+    set data(x)
+    {
+        this._data = x || {};
+        this.refresh();
+    },
+
+    get revealed()
+    {
+        if ("_revealed" in this)
+            return this._revealed;
+
+        var currentAncestor = this.parent;
+        while (currentAncestor && !currentAncestor.root) {
+            if (!currentAncestor.expanded) {
+                this._revealed = false;
+                return false;
+            }
+
+            currentAncestor = currentAncestor.parent;
+        }
+
+        this._revealed = true;
+        return true;
+    },
+
+    set hasChildren(x)
+    {
+        if (this._hasChildren === x)
+            return;
+
+        this._hasChildren = x;
+
+        if (!this._element)
+            return;
+
+        if (this._hasChildren)
+        {
+            this._element.addStyleClass("parent");
+            if (this.expanded)
+                this._element.addStyleClass("expanded");
+        }
+        else
+        {
+            this._element.removeStyleClass("parent");
+            this._element.removeStyleClass("expanded");
+        }
+    },
+
+    get hasChildren()
+    {
+        return this._hasChildren;
+    },
+
+    set revealed(x)
+    {
+        if (this._revealed === x)
+            return;
+
+        this._revealed = x;
+
+        if (this._element) {
+            if (this._revealed)
+                this._element.addStyleClass("revealed");
+            else
+                this._element.removeStyleClass("revealed");
+        }
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i].revealed = x && this.expanded;
+    },
+
+    get depth()
+    {
+        if ("_depth" in this)
+            return this._depth;
+        if (this.parent && !this.parent.root)
+            this._depth = this.parent.depth + 1;
+        else
+            this._depth = 0;
+        return this._depth;
+    },
+
+    get shouldRefreshChildren()
+    {
+        return this._shouldRefreshChildren;
+    },
+
+    set shouldRefreshChildren(x)
+    {
+        this._shouldRefreshChildren = x;
+        if (x && this.expanded)
+            this.expand();
+    },
+
+    get selected()
+    {
+        return this._selected;
+    },
+
+    set selected(x)
+    {
+        if (x)
+            this.select();
+        else
+            this.deselect();
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    refresh: function()
+    {
+        if (!this._element || !this.dataGrid)
+            return;
+
+        this._element.removeChildren();
+
+        for (var columnIdentifier in this.dataGrid.columns) {
+            var cell = this.createCell(columnIdentifier);
+            this._element.appendChild(cell);
+        }
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = document.createElement("td");
+        cell.className = columnIdentifier + "-column";
+
+        var alignment = this.dataGrid.aligned[columnIdentifier];
+        if (alignment)
+            cell.addStyleClass(alignment);
+
+        var div = document.createElement("div");
+        div.textContent = this.data[columnIdentifier];
+        cell.appendChild(div);
+
+        if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
+            cell.addStyleClass("disclosure");
+            if (this.depth)
+                cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
+        }
+
+        return cell;
+    },
+
+    // Share these functions with DataGrid. They are written to work with a DataGridNode this object.
+    appendChild: WebInspector.DataGrid.prototype.appendChild,
+    insertChild: WebInspector.DataGrid.prototype.insertChild,
+    removeChild: WebInspector.DataGrid.prototype.removeChild,
+    removeChildren: WebInspector.DataGrid.prototype.removeChildren,
+    removeChildrenRecursive: WebInspector.DataGrid.prototype.removeChildrenRecursive,
+
+    _recalculateSiblings: function(myIndex)
+    {
+        if (!this.parent)
+            return;
+
+        var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);
+
+        if (previousChild) {
+            previousChild.nextSibling = this;
+            this.previousSibling = previousChild;
+        } else
+            this.previousSibling = null;
+
+        var nextChild = this.parent.children[myIndex + 1];
+
+        if (nextChild) {
+            nextChild.previousSibling = this;
+            this.nextSibling = nextChild;
+        } else
+            this.nextSibling = null;
+    },
+
+    collapse: function()
+    {
+        if (this._element)
+            this._element.removeStyleClass("expanded");
+
+        this._expanded = false;
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i].revealed = false;
+
+        this.dispatchEventToListeners("collapsed");
+    },
+
+    collapseRecursively: function()
+    {
+        var item = this;
+        while (item) {
+            if (item.expanded)
+                item.collapse();
+            item = item.traverseNextNode(false, this, true);
+        }
+    },
+
+    expand: function()
+    {
+        if (!this.hasChildren || this.expanded)
+            return;
+
+        if (this.revealed && !this._shouldRefreshChildren)
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i].revealed = true;
+
+        if (this._shouldRefreshChildren) {
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i]._detach();
+
+            this.dispatchEventToListeners("populate");
+
+            if (this._attached) {
+                for (var i = 0; i < this.children.length; ++i) {
+                    var child = this.children[i];
+                    if (this.revealed)
+                        child.revealed = true;
+                    child._attach();
+                }
+            }
+
+            delete this._shouldRefreshChildren;
+        }
+
+        if (this._element)
+            this._element.addStyleClass("expanded");
+
+        this._expanded = true;
+
+        this.dispatchEventToListeners("expanded");
+    },
+
+    expandRecursively: function()
+    {
+        var item = this;
+        while (item) {
+            item.expand();
+            item = item.traverseNextNode(false, this);
+        }
+    },
+
+    reveal: function()
+    {
+        var currentAncestor = this.parent;
+        while (currentAncestor && !currentAncestor.root) {
+            if (!currentAncestor.expanded)
+                currentAncestor.expand();
+            currentAncestor = currentAncestor.parent;
+        }
+
+        this.element.scrollIntoViewIfNeeded(false);
+
+        this.dispatchEventToListeners("revealed");
+    },
+
+    select: function(supressSelectedEvent)
+    {
+        if (!this.dataGrid || !this.selectable || this.selected)
+            return;
+
+        if (this.dataGrid.selectedNode)
+            this.dataGrid.selectedNode.deselect();
+
+        this._selected = true;
+        this.dataGrid.selectedNode = this;
+
+        if (this._element)
+            this._element.addStyleClass("selected");
+
+        if (!supressSelectedEvent)
+            this.dispatchEventToListeners("selected");
+    },
+
+    deselect: function(supressDeselectedEvent)
+    {
+        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
+            return;
+
+        this._selected = false;
+        this.dataGrid.selectedNode = null;
+
+        if (this._element)
+            this._element.removeStyleClass("selected");
+
+        if (!supressDeselectedEvent)
+            this.dispatchEventToListeners("deselected");
+    },
+
+    traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
+    {
+        if (!dontPopulate && this.hasChildren)
+            this.dispatchEventToListeners("populate");
+
+        if (info)
+            info.depthChange = 0;
+
+        var node = (!skipHidden || this.revealed) ? this.children[0] : null;
+        if (node && (!skipHidden || this.expanded)) {
+            if (info)
+                info.depthChange = 1;
+            return node;
+        }
+
+        if (this === stayWithin)
+            return null;
+
+        node = (!skipHidden || this.revealed) ? this.nextSibling : null;
+        if (node)
+            return node;
+
+        node = this;
+        while (node && !node.root && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
+            if (info)
+                info.depthChange -= 1;
+            node = node.parent;
+        }
+
+        if (!node)
+            return null;
+
+        return (!skipHidden || node.revealed) ? node.nextSibling : null;
+    },
+
+    traversePreviousNode: function(skipHidden, dontPopulate)
+    {
+        var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
+        if (!dontPopulate && node && node.hasChildren)
+            node.dispatchEventToListeners("populate");
+
+        while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
+            if (!dontPopulate && node.hasChildren)
+                node.dispatchEventToListeners("populate");
+            node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
+        }
+
+        if (node)
+            return node;
+
+        if (!this.parent || this.parent.root)
+            return null;
+
+        return this.parent;
+    },
+
+    isEventWithinDisclosureTriangle: function(event)
+    {
+        if (!this.hasChildren)
+            return false;
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell.hasStyleClass("disclosure"))
+            return false;
+        var computedLeftPadding = window.getComputedStyle(cell).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
+        var left = cell.totalOffsetLeft + computedLeftPadding;
+        return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
+    },
+
+    _attach: function()
+    {
+        if (!this.dataGrid || this._attached)
+            return;
+
+        this._attached = true;
+
+        var nextNode = null;
+        var previousNode = this.traversePreviousNode(true, true);
+        if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)
+            var nextNode = previousNode.element.nextSibling;
+        if (!nextNode)
+            nextNode = this.dataGrid.dataTableBody.lastChild;
+        this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);
+
+        if (this.expanded)
+            for (var i = 0; i < this.children.length; ++i)
+                this.children[i]._attach();
+    },
+
+    _detach: function()
+    {
+        if (!this._attached)
+            return;
+
+        this._attached = false;
+
+        if (this._element && this._element.parentNode)
+            this._element.parentNode.removeChild(this._element);
+
+        for (var i = 0; i < this.children.length; ++i)
+            this.children[i]._detach();
+    },
+
+    savePosition: function()
+    {
+        if (this._savedPosition)
+            return;
+
+        if (!this.parent)
+            throw("savePosition: Node must have a parent.");
+        this._savedPosition = {
+            parent: this.parent,
+            index: this.parent.children.indexOf(this)
+        };
+    },
+
+    restorePosition: function()
+    {
+        if (!this._savedPosition)
+            return;
+
+        if (this.parent !== this._savedPosition.parent)
+            this._savedPosition.parent.insertChild(this, this._savedPosition.index);
+
+        delete this._savedPosition;
+    }
+}
+
+WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.CreationDataGridNode = function(data, hasChildren)
+{
+    WebInspector.DataGridNode.call(this, data, hasChildren);
+    this.isCreationNode = true;
+}
+
+WebInspector.CreationDataGridNode.prototype = {
+    makeNormal: function()
+    {
+        delete this.isCreationNode;
+        delete this.makeNormal;
+    }
+}
+
+WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+/* CookieItemsView.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.CookieItemsView = function(treeElement, cookieDomain)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
+    this.deleteButton.visible = false;
+    this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+    
+    this._treeElement = treeElement;
+    this._cookieDomain = cookieDomain;
+
+    this._emptyMsgElement = document.createElement("div");
+    this._emptyMsgElement.className = "storage-table-empty";
+    this._emptyMsgElement.textContent = WebInspector.UIString("This site has no cookies.");
+    this.element.appendChild(this._emptyMsgElement);
+}
+
+WebInspector.CookieItemsView.prototype = {
+    get statusBarItems()
+    {
+        return [this.refreshButton.element, this.deleteButton.element];
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this._update();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.deleteButton.visible = false;
+    },
+
+    _update: function()
+    {
+        WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));
+    },
+
+    _updateWithCookies: function(allCookies, isAdvanced)
+    {
+        if (isAdvanced)
+            this._filterCookiesForDomain(allCookies);
+        else
+            this._cookies = allCookies;
+
+        if (!this._cookies.length) {
+            // Nothing to show.
+            this._emptyMsgElement.removeStyleClass("hidden");
+            this.deleteButton.visible = false;
+            if (this._dataGrid)
+                this._dataGrid.element.addStyleClass("hidden");
+            return;
+        }
+
+        if (!this._dataGrid) {
+            if (isAdvanced) {
+                this._createDataGrid();
+                this._populateDataGrid();
+                this._dataGrid.autoSizeColumns(6, 33);
+                this._treeElement.subtitle = String.sprintf(WebInspector.UIString("%d cookies (%s)"), this._cookies.length,
+                    Number.bytesToString(this._totalSize, WebInspector.UIString));
+            } else {
+                this._createSimpleDataGrid();
+                this._populateSimpleDataGrid();
+                this._dataGrid.autoSizeColumns(20, 80);
+            }
+        } else {
+            if (isAdvanced)
+                this._populateDataGrid();
+            else
+                this._populateSimpleDataGrid();
+        }
+
+        this._dataGrid.element.removeStyleClass("hidden");
+        this._emptyMsgElement.addStyleClass("hidden");
+        if (isAdvanced)
+            this.deleteButton.visible = true;
+    },
+
+    _filterCookiesForDomain: function(allCookies)
+    {
+        this._cookies = [];
+        var resourceURLsForDocumentURL = [];
+        this._totalSize = 0;
+
+        for (var id in WebInspector.resources) {
+            var resource = WebInspector.resources[id];
+            var match = resource.documentURL.match(WebInspector.URLRegExp);
+            if (match && match[2] === this._cookieDomain)
+                resourceURLsForDocumentURL.push(resource.url);
+        }
+
+        for (var i = 0; i < allCookies.length; ++i) {
+            var pushed = false;
+            var size = allCookies[i].size;
+            for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {
+                var resourceURL = resourceURLsForDocumentURL[j];
+                if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {
+                    this._totalSize += size;
+                    if (!pushed) {
+                        pushed = true;
+                        this._cookies.push(allCookies[i]);
+                    }
+                }
+            }
+        }
+    },
+
+    _createDataGrid: function()
+    {
+        var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };
+        columns[0].title = WebInspector.UIString("Name");
+        columns[0].sortable = true;
+        columns[1].title = WebInspector.UIString("Value");
+        columns[1].sortable = true;
+        columns[2].title = WebInspector.UIString("Domain");
+        columns[2].sortable = true;
+        columns[3].title = WebInspector.UIString("Path");
+        columns[3].sortable = true;
+        columns[4].title = WebInspector.UIString("Expires");
+        columns[4].sortable = true;
+        columns[5].title = WebInspector.UIString("Size");
+        columns[5].aligned = "right";
+        columns[5].sortable = true;
+        columns[6].title = WebInspector.UIString("HTTP");
+        columns[6].aligned = "centered";
+        columns[6].sortable = true;
+        columns[7].title = WebInspector.UIString("Secure");
+        columns[7].aligned = "centered";
+        columns[7].sortable = true;
+
+        this._dataGrid = new WebInspector.DataGrid(columns, null, this._deleteCookieCallback.bind(this));
+        this._dataGrid.addEventListener("sorting changed", this._populateDataGrid, this);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.updateWidths();
+    },
+
+    _populateDataGrid: function()
+    {
+        var selectedCookie = this._dataGrid.selectedNode ? this._dataGrid.selectedNode.cookie : null;
+        var sortDirection = this._dataGrid.sortOrder === "ascending" ? 1 : -1;
+
+        function localeCompare(field, cookie1, cookie2)
+        {
+            return sortDirection * (cookie1[field] + "").localeCompare(cookie2[field] + "")
+        }
+
+        function numberCompare(field, cookie1, cookie2)
+        {
+            return sortDirection * (cookie1[field] - cookie2[field]);
+        }
+
+        function expiresCompare(cookie1, cookie2)
+        {
+            if (cookie1.session !== cookie2.session)
+                return sortDirection * (cookie1.session ? 1 : -1);
+
+            if (cookie1.session)
+                return 0;
+
+            return sortDirection * (cookie1.expires - cookie2.expires);
+        }
+
+        var comparator;
+        switch (parseInt(this._dataGrid.sortColumnIdentifier)) {
+            case 0: comparator = localeCompare.bind(this, "name"); break;
+            case 1: comparator = localeCompare.bind(this, "value"); break;
+            case 2: comparator = localeCompare.bind(this, "domain"); break;
+            case 3: comparator = localeCompare.bind(this, "path"); break;
+            case 4: comparator = expiresCompare; break;
+            case 5: comparator = numberCompare.bind(this, "size"); break;
+            case 6: comparator = localeCompare.bind(this, "httpOnly"); break;
+            case 7: comparator = localeCompare.bind(this, "secure"); break;
+            default: localeCompare.bind(this, "name");
+        }
+
+        this._cookies.sort(comparator);
+
+        this._dataGrid.removeChildren();
+        var nodeToSelect;
+        for (var i = 0; i < this._cookies.length; ++i) {
+            var data = {};
+            var cookie = this._cookies[i];
+            data[0] = cookie.name;
+            data[1] = cookie.value;
+            data[2] = cookie.domain;
+            data[3] = cookie.path;
+            data[4] = (cookie.session ? WebInspector.UIString("Session") : new Date(cookie.expires).toGMTString());
+            data[5] = Number.bytesToString(cookie.size, WebInspector.UIString);
+            data[6] = (cookie.httpOnly ? "\u2713" : ""); // Checkmark
+            data[7] = (cookie.secure ? "\u2713" : ""); // Checkmark
+
+            var node = new WebInspector.DataGridNode(data);
+            node.cookie = cookie;
+            node.selectable = true;
+            this._dataGrid.appendChild(node);
+            if (cookie === selectedCookie)
+                nodeToSelect = node;
+        }
+        if (nodeToSelect)
+            nodeToSelect.selected = true;
+        else
+            this._dataGrid.children[0].selected = true;
+    },
+
+    _createSimpleDataGrid: function()
+    {
+        var columns = {};
+        columns[0] = {};
+        columns[1] = {};
+        columns[0].title = WebInspector.UIString("Name");
+        columns[1].title = WebInspector.UIString("Value");
+
+        this._dataGrid = new WebInspector.DataGrid(columns);
+        this.element.appendChild(this._dataGrid.element);
+        this._dataGrid.updateWidths();
+    },
+
+    _populateSimpleDataGrid: function()
+    {
+        var cookies = this._cookies;
+        this._dataGrid.removeChildren();
+        var addedCookies = {};
+        for (var i = 0; i < cookies.length; ++i) {
+            if (addedCookies[cookies[i].name])
+                continue;
+            addedCookies[cookies[i].name] = true;
+            var data = {};
+            data[0] = cookies[i].name;
+            data[1] = cookies[i].value;
+
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = true;
+            this._dataGrid.appendChild(node);
+        }
+        this._dataGrid.children[0].selected = true;
+    },
+
+    resize: function()
+    {
+        if (this._dataGrid)
+            this._dataGrid.updateWidths();
+    },
+
+    _deleteButtonClicked: function(event)
+    {
+        if (!this._dataGrid || !this._dataGrid.selectedNode)
+            return;
+
+        this._deleteCookieCallback(this._dataGrid.selectedNode);
+    },
+
+    _deleteCookieCallback: function(node)
+    {
+        var cookie = node.cookie;
+        InspectorBackend.deleteCookie(cookie.name, this._cookieDomain);
+        this._update();
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this._update();
+    }
+}
+
+WebInspector.CookieItemsView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* Script.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
+{
+    this.sourceID = sourceID;
+    this.sourceURL = sourceURL;
+    this.source = source;
+    this.startingLine = startingLine;
+    this.errorLine = errorLine;
+    this.errorMessage = errorMessage;
+
+    // if no URL, look for "//@ sourceURL=" decorator
+    // note that this sourceURL comment decorator is behavior that FireBug added
+    // in it's 1.1 release as noted in the release notes:
+    // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
+    if (!sourceURL) {
+        // use of [ \t] rather than \s is to prevent \n from matching
+        var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
+        var match = pattern.exec(source);
+
+        if (match)
+            this.sourceURL = match[1];
+    }
+}
+
+WebInspector.Script.prototype = {
+    get linesCount()
+    {
+        if (!this.source)
+            return 0;
+        this._linesCount = 0;
+        var lastIndex = this.source.indexOf("\n");
+        while (lastIndex !== -1) {
+            lastIndex = this.source.indexOf("\n", lastIndex + 1)
+            this._linesCount++;
+        }
+    }
+}
+
+/* Breakpoint.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Breakpoint = function(url, line, sourceID, condition)
+{
+    this.url = url;
+    this.line = line;
+    this.sourceID = sourceID;
+    this._enabled = true;
+    this._sourceText = "";
+    this._condition = condition || "";
+}
+
+WebInspector.Breakpoint.prototype = {
+    get enabled()
+    {
+        return this._enabled;
+    },
+
+    set enabled(x)
+    {
+        if (this._enabled === x)
+            return;
+
+        this._enabled = x;
+
+        if (this._enabled)
+            this.dispatchEventToListeners("enabled");
+        else
+            this.dispatchEventToListeners("disabled");
+    },
+
+    get sourceText()
+    {
+        return this._sourceText;
+    },
+
+    set sourceText(text)
+    {
+        this._sourceText = text;
+        this.dispatchEventToListeners("text-changed");
+    },
+
+    get label()
+    {
+        var displayName = (this.url ? WebInspector.displayNameForURL(this.url) : WebInspector.UIString("(program)"));
+        return displayName + ":" + this.line;
+    },
+
+    get id()
+    {
+        return this.sourceID + ":" + this.line;
+    },
+
+    get condition()
+    {
+        return this._condition;
+    },
+
+    set condition(c)
+    {
+        c = c || "";
+        if (this._condition === c)
+            return;
+
+        this._condition = c;
+        this.dispatchEventToListeners("condition-changed");
+
+        if (this.enabled)
+            InspectorBackend.setBreakpoint(this.sourceID, this.line, this.enabled, this.condition);
+    }
+}
+
+WebInspector.Breakpoint.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* SidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SidebarPane = function(title)
+{
+    this.element = document.createElement("div");
+    this.element.className = "pane";
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+    this.titleElement.tabIndex = 0;
+    this.titleElement.addEventListener("click", this.toggleExpanded.bind(this), false);
+    this.titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
+
+    this.bodyElement = document.createElement("div");
+    this.bodyElement.className = "body";
+
+    this.element.appendChild(this.titleElement);
+    this.element.appendChild(this.bodyElement);
+
+    this.title = title;
+    this.growbarVisible = false;
+    this.expanded = false;
+}
+
+WebInspector.SidebarPane.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.titleElement.textContent = x;
+    },
+
+    get growbarVisible()
+    {
+        return this._growbarVisible;
+    },
+
+    set growbarVisible(x)
+    {
+        if (this._growbarVisible === x)
+            return;
+
+        this._growbarVisible = x;
+
+        if (x && !this._growbarElement) {
+            this._growbarElement = document.createElement("div");
+            this._growbarElement.className = "growbar";
+            this.element.appendChild(this._growbarElement);
+        } else if (!x && this._growbarElement) {
+            if (this._growbarElement.parentNode)
+                this._growbarElement.parentNode(this._growbarElement);
+            delete this._growbarElement;
+        }
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    expand: function()
+    {
+        if (this._expanded)
+            return;
+        this._expanded = true;
+        this.element.addStyleClass("expanded");
+        if (this.onexpand)
+            this.onexpand(this);
+    },
+
+    collapse: function()
+    {
+        if (!this._expanded)
+            return;
+        this._expanded = false;
+        this.element.removeStyleClass("expanded");
+        if (this.oncollapse)
+            this.oncollapse(this);
+    },
+
+    toggleExpanded: function()
+    {
+        this.expanded = !this.expanded;
+    },
+
+    _onTitleKeyDown: function(event)
+    {
+        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Space)
+            this.toggleExpanded();
+    }
+}
+
+WebInspector.SidebarPane.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ElementsTreeOutline.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <[email protected]>
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ElementsTreeOutline = function() {
+    this.element = document.createElement("ol");
+    this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);
+    this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);
+    this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);
+
+    TreeOutline.call(this, this.element);
+
+    this.includeRootDOMNode = true;
+    this.selectEnabled = false;
+    this.showInElementsPanelEnabled = false;
+    this.rootDOMNode = null;
+    this.focusedDOMNode = null;
+
+    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);
+    this.element.addEventListener("keydown", this._keyDown.bind(this), true);
+}
+
+WebInspector.ElementsTreeOutline.prototype = {
+    get rootDOMNode()
+    {
+        return this._rootDOMNode;
+    },
+
+    set rootDOMNode(x)
+    {
+        if (this._rootDOMNode === x)
+            return;
+
+        this._rootDOMNode = x;
+
+        this._isXMLMimeType = !!(WebInspector.mainResource && WebInspector.mainResource.mimeType && WebInspector.mainResource.mimeType.match(/x(?:ht)?ml/i));
+
+        this.update();
+    },
+
+    get isXMLMimeType()
+    {
+        return this._isXMLMimeType;
+    },
+
+    get focusedDOMNode()
+    {
+        return this._focusedDOMNode;
+    },
+
+    set focusedDOMNode(x)
+    {
+        if (this._focusedDOMNode === x) {
+            this.revealAndSelectNode(x);
+            return;
+        }
+
+        this._focusedDOMNode = x;
+
+        this.revealAndSelectNode(x);
+
+        // The revealAndSelectNode() method might find a different element if there is inlined text,
+        // and the select() call would change the focusedDOMNode and reenter this setter. So to
+        // avoid calling focusedNodeChanged() twice, first check if _focusedDOMNode is the same
+        // node as the one passed in.
+        if (this._focusedDOMNode === x) {
+            this.focusedNodeChanged();
+
+            if (x && !this.suppressSelectHighlight) {
+                InspectorBackend.highlightDOMNode(x.id);
+
+                if ("_restorePreviousHighlightNodeTimeout" in this)
+                    clearTimeout(this._restorePreviousHighlightNodeTimeout);
+
+                function restoreHighlightToHoveredNode()
+                {
+                    var hoveredNode = WebInspector.hoveredDOMNode;
+                    if (hoveredNode)
+                        InspectorBackend.highlightDOMNode(hoveredNode.id);
+                    else
+                        InspectorBackend.hideDOMNodeHighlight();
+                }
+
+                this._restorePreviousHighlightNodeTimeout = setTimeout(restoreHighlightToHoveredNode, 2000);
+            }
+        }
+    },
+
+    update: function()
+    {
+        var selectedNode = this.selectedTreeElement ? this.selectedTreeElement.representedObject : null;
+
+        this.removeChildren();
+
+        if (!this.rootDOMNode)
+            return;
+
+        var treeElement;
+        if (this.includeRootDOMNode) {
+            treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);
+            treeElement.selectable = this.selectEnabled;
+            this.appendChild(treeElement);
+        } else {
+            // FIXME: this could use findTreeElement to reuse a tree element if it already exists
+            var node = this.rootDOMNode.firstChild;
+            while (node) {
+                treeElement = new WebInspector.ElementsTreeElement(node);
+                treeElement.selectable = this.selectEnabled;
+                this.appendChild(treeElement);
+                node = node.nextSibling;
+            }
+        }
+
+        if (selectedNode)
+            this.revealAndSelectNode(selectedNode);
+    },
+
+    updateSelection: function()
+    {
+        if (!this.selectedTreeElement)
+            return;
+        var element = this.treeOutline.selectedTreeElement;
+        element.updateSelection();
+    },
+
+    focusedNodeChanged: function(forceUpdate) {},
+
+    findTreeElement: function(node)
+    {
+        var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestorNode, parentNode);
+        if (!treeElement && node.nodeType === Node.TEXT_NODE) {
+            // The text node might have been inlined if it was short, so try to find the parent element.
+            treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestorNode, parentNode);
+        }
+
+        return treeElement;
+    },
+
+    createTreeElementFor: function(node)
+    {
+        var treeElement = this.findTreeElement(node);
+        if (treeElement)
+            return treeElement;
+        if (!node.parentNode)
+            return null;
+
+        var treeElement = this.createTreeElementFor(node.parentNode);
+        if (treeElement && treeElement.showChild(node.index))
+            return treeElement.children[node.index];
+
+        return null;
+    },
+
+    revealAndSelectNode: function(node)
+    {
+        if (!node)
+            return;
+
+        var treeElement = this.createTreeElementFor(node);
+        if (!treeElement)
+            return;
+
+        treeElement.reveal();
+        treeElement.select();
+    },
+
+    _treeElementFromEvent: function(event)
+    {
+        var root = this.element;
+
+        // We choose this X coordinate based on the knowledge that our list
+        // items extend nearly to the right edge of the outer <ol>.
+        var x = root.totalOffsetLeft + root.offsetWidth - 20;
+
+        var y = event.pageY;
+
+        // Our list items have 1-pixel cracks between them vertically. We avoid
+        // the cracks by checking slightly above and slightly below the mouse
+        // and seeing if we hit the same element each time.
+        var elementUnderMouse = this.treeElementFromPoint(x, y);
+        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);
+        var element;
+        if (elementUnderMouse === elementAboveMouse)
+            element = elementUnderMouse;
+        else
+            element = this.treeElementFromPoint(x, y + 2);
+
+        return element;
+    },
+    
+    _keyDown: function(event)
+    {
+        if (event.target !== this.treeOutline.element)
+            return;
+
+        var selectedElement = this.selectedTreeElement;
+        if (!selectedElement)
+            return;
+
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Backspace ||
+                event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Delete) {
+            selectedElement.remove();
+            event.preventDefault();
+            event.stopPropagation();
+            return;
+        }
+
+        // On Enter or Return start editing the first attribute
+        // or create a new attribute on the selected element.
+        if (isEnterKey(event)) {
+            if (this._editing)
+                return;
+
+            selectedElement._startEditing();
+
+            // prevent a newline from being immediately inserted
+            event.preventDefault();
+            event.stopPropagation();
+            return;
+        }
+    },
+
+    _onmousedown: function(event)
+    {
+        var element = this._treeElementFromEvent(event);
+
+        if (!element || element.isEventWithinDisclosureTriangle(event))
+            return;
+
+        element.select();
+    },
+
+    _onmousemove: function(event)
+    {
+        var element = this._treeElementFromEvent(event);
+        if (element && this._previousHoveredElement === element)
+            return;
+
+        if (this._previousHoveredElement) {
+            this._previousHoveredElement.hovered = false;
+            delete this._previousHoveredElement;
+        }
+
+        if (element && !element.elementCloseTag) {
+            element.hovered = true;
+            this._previousHoveredElement = element;
+        }
+
+        WebInspector.hoveredDOMNode = (element && !element.elementCloseTag ? element.representedObject : null);
+    },
+
+    _onmouseout: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.element))
+            return;
+
+        if (this._previousHoveredElement) {
+            this._previousHoveredElement.hovered = false;
+            delete this._previousHoveredElement;
+        }
+
+        WebInspector.hoveredDOMNode = null;
+    },
+
+    _contextMenuEventFired: function(event)
+    {
+        var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");
+        if (!listItem || !listItem.treeElement)
+            return;
+
+        var contextMenu = new WebInspector.ContextMenu();
+
+        var tag = event.target.enclosingNodeOrSelfWithClass("webkit-html-tag");
+        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
+        if (tag && listItem.treeElement._populateTagContextMenu)
+            listItem.treeElement._populateTagContextMenu(contextMenu, event);
+        else if (textNode && listItem.treeElement._populateTextContextMenu)
+            listItem.treeElement._populateTextContextMenu(contextMenu, textNode);
+        contextMenu.show(event);
+    }
+}
+
+WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;
+
+WebInspector.ElementsTreeElement = function(node)
+{
+    var hasChildrenOverride = node.hasChildNodes() && !this._showInlineText(node);
+
+    // The title will be updated in onattach.
+    TreeElement.call(this, "", node, hasChildrenOverride);
+
+    if (this.representedObject.nodeType == Node.ELEMENT_NODE)
+        this._canAddAttributes = true;
+    this._searchQuery = null;
+    this._expandedChildrenLimit = WebInspector.ElementsTreeElement.InitialChildrenLimit;
+}
+
+WebInspector.ElementsTreeElement.InitialChildrenLimit = 500;
+
+// A union of HTML4 and HTML5-Draft elements that explicitly
+// or implicitly (for HTML5) forbid the closing tag.
+// FIXME: Revise once HTML5 Final is published.
+WebInspector.ElementsTreeElement.ForbiddenClosingTagElements = [
+    "area", "base", "basefont", "br", "canvas", "col", "command", "embed", "frame",
+    "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source"
+].keySet();
+
+WebInspector.ElementsTreeElement.prototype = {
+    highlightSearchResults: function(searchQuery)
+    {
+        if (this._searchQuery === searchQuery)
+            return;
+
+        this._searchQuery = searchQuery;
+        this.updateTitle();
+    },
+
+    get hovered()
+    {
+        return this._hovered;
+    },
+
+    set hovered(x)
+    {
+        if (this._hovered === x)
+            return;
+
+        this._hovered = x;
+
+        if (this.listItemElement) {
+            if (x) {
+                this.updateSelection();
+                this.listItemElement.addStyleClass("hovered");
+            } else {
+                this.listItemElement.removeStyleClass("hovered");
+            }
+        }
+    },
+
+    get expandedChildrenLimit()
+    {
+        return this._expandedChildrenLimit;
+    },
+
+    set expandedChildrenLimit(x)
+    {
+        if (this._expandedChildrenLimit === x)
+            return;
+
+        this._expandedChildrenLimit = x;
+        if (this.treeOutline && !this._updateChildrenInProgress)
+            this._updateChildren(true);
+    },
+
+    get expandedChildCount()
+    {
+        var count = this.children.length;
+        if (count && this.children[count - 1].elementCloseTag)
+            count--;
+        if (count && this.children[count - 1].expandAllButton)
+            count--;
+        return count;
+    },
+
+    showChild: function(index)
+    {
+        if (index >= this.expandedChildrenLimit) {
+            this._expandedChildrenLimit = index + 1;
+            this._updateChildren(true);
+        }
+
+        // Whether index-th child is visible in the children tree
+        return this.expandedChildCount > index;
+    },
+
+    createTooltipForImageNode: function(node, callback)
+    {
+        function createTooltipThenCallback(properties)
+        {
+            if (!properties) {
+                callback();
+                return;
+            }
+
+            var tooltipText = null;
+            if (properties.offsetHeight === properties.naturalHeight && properties.offsetWidth === properties.naturalWidth)
+                tooltipText = WebInspector.UIString("%d × %d pixels", properties.offsetWidth, properties.offsetHeight);
+            else
+                tooltipText = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);
+            callback(tooltipText);
+        }
+        var objectProxy = new WebInspector.ObjectProxy(node.injectedScriptId, node.id);
+        WebInspector.ObjectProxy.getPropertiesAsync(objectProxy, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], createTooltipThenCallback);
+    },
+
+    updateSelection: function()
+    {
+        var listItemElement = this.listItemElement;
+        if (!listItemElement)
+            return;
+
+        if (document.body.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        if (!this.selectionElement) {
+            this.selectionElement = document.createElement("div");
+            this.selectionElement.className = "selection selected";
+            listItemElement.insertBefore(this.selectionElement, listItemElement.firstChild);
+        }
+
+        this.selectionElement.style.height = listItemElement.offsetHeight + "px";
+    },
+
+    onattach: function()
+    {
+        this.listItemElement.addEventListener("mousedown", this.onmousedown.bind(this), false);
+
+        if (this._hovered) {
+            this.updateSelection();
+            this.listItemElement.addStyleClass("hovered");
+        }
+
+        this.updateTitle();
+
+        this._preventFollowingLinksOnDoubleClick();
+    },
+
+    _preventFollowingLinksOnDoubleClick: function()
+    {
+        var links = this.listItemElement.querySelectorAll("li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");
+        if (!links)
+            return;
+
+        for (var i = 0; i < links.length; ++i)
+            links[i].preventFollowOnDoubleClick = true;
+    },
+
+    onpopulate: function()
+    {
+        if (this.children.length || this._showInlineText(this.representedObject))
+            return;
+
+        this.updateChildren();
+    },
+    
+    updateChildren: function(fullRefresh)
+    {
+        WebInspector.domAgent.getChildNodesAsync(this.representedObject, this._updateChildren.bind(this, fullRefresh));
+    },
+
+    insertChildElement: function(child, index)
+    {
+        var newElement = new WebInspector.ElementsTreeElement(child);
+        newElement.selectable = this.treeOutline.selectEnabled;
+        this.insertChild(newElement, index);
+        return newElement;
+    },
+
+    moveChild: function(child, targetIndex)
+    {
+        var wasSelected = child.selected;
+        treeElement.removeChild(child);
+        treeElement.insertChild(child, targetIndex);
+        if (wasSelected)
+            existingTreeElement.select();
+    },
+
+    _updateChildren: function(fullRefresh)
+    {
+        if (this._updateChildrenInProgress)
+            return;
+
+        this._updateChildrenInProgress = true;
+        var focusedNode = this.treeOutline.focusedDOMNode;
+        var originalScrollTop;
+        if (fullRefresh) {
+            var treeOutlineContainerElement = this.treeOutline.element.parentNode;
+            originalScrollTop = treeOutlineContainerElement.scrollTop;
+            var selectedTreeElement = this.treeOutline.selectedTreeElement;
+            if (selectedTreeElement && selectedTreeElement.hasAncestor(this))
+                this.select();
+            this.removeChildren();
+        }
+
+        var treeElement = this;
+        var treeChildIndex = 0;
+        var elementToSelect;
+
+        function updateChildrenOfNode(node)
+        {
+            var treeOutline = treeElement.treeOutline;
+            var child = node.firstChild;
+            while (child) {
+                var currentTreeElement = treeElement.children[treeChildIndex];
+                if (!currentTreeElement || currentTreeElement.representedObject !== child) {
+                    // Find any existing element that is later in the children list.
+                    var existingTreeElement = null;
+                    for (var i = (treeChildIndex + 1), size = treeElement.expandedChildCount; i < size; ++i) {
+                        if (treeElement.children[i].representedObject === child) {
+                            existingTreeElement = treeElement.children[i];
+                            break;
+                        }
+                    }
+
+                    if (existingTreeElement && existingTreeElement.parent === treeElement) {
+                        // If an existing element was found and it has the same parent, just move it.
+                        treeElement.moveChild(existingTreeElement, treeChildIndex);
+                    } else {
+                        // No existing element found, insert a new element.
+                        if (treeChildIndex < treeElement.expandedChildrenLimit) {
+                            var newElement = treeElement.insertChildElement(child, treeChildIndex);
+                            if (child === focusedNode)
+                                elementToSelect = newElement;
+                            if (treeElement.expandedChildCount > treeElement.expandedChildrenLimit)
+                                treeElement.expandedChildrenLimit++;
+                        }
+                    }
+                }
+
+                child = child.nextSibling;
+                ++treeChildIndex;
+            }
+        }
+
+        // Remove any tree elements that no longer have this node (or this node's contentDocument) as their parent.
+        for (var i = (this.children.length - 1); i >= 0; --i) {
+            if ("elementCloseTag" in this.children[i])
+                continue;
+
+            var currentChild = this.children[i];
+            var currentNode = currentChild.representedObject;
+            var currentParentNode = currentNode.parentNode;
+
+            if (currentParentNode === this.representedObject)
+                continue;
+
+            var selectedTreeElement = this.treeOutline.selectedTreeElement;
+            if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild)))
+                this.select();
+
+            this.removeChildAtIndex(i);
+        }
+
+        updateChildrenOfNode(this.representedObject);
+        this.adjustCollapsedRange(false);
+
+        var lastChild = this.children[this.children.length - 1];
+        if (this.representedObject.nodeType == Node.ELEMENT_NODE && (!lastChild || !lastChild.elementCloseTag)) {
+            var title = "<span class=\"webkit-html-tag close\">&lt;/" + this.representedObject.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
+            var item = new TreeElement(title, null, false);
+            item.selectable = false;
+            item.elementCloseTag = true;
+            this.appendChild(item);
+        }
+
+        // We want to restore the original selection and tree scroll position after a full refresh, if possible.
+        if (fullRefresh && elementToSelect) {
+            elementToSelect.select();
+            if (treeOutlineContainerElement && originalScrollTop <= treeOutlineContainerElement.scrollHeight)
+                treeOutlineContainerElement.scrollTop = originalScrollTop;
+        }
+
+        delete this._updateChildrenInProgress;
+    },
+
+    adjustCollapsedRange: function()
+    {
+        // Ensure precondition: only the tree elements for node children are found in the tree
+        // (not the Expand All button or the closing tag).
+        if (this.expandAllButtonElement && this.expandAllButtonElement.__treeElement.parent)
+            this.removeChild(this.expandAllButtonElement.__treeElement);
+
+        const node = this.representedObject;
+        if (!node.children)
+            return;
+        const childNodeCount = node.children.length;
+
+        // In case some nodes from the expanded range were removed, pull some nodes from the collapsed range into the expanded range at the bottom.
+        for (var i = this.expandedChildCount, limit = Math.min(this.expandedChildrenLimit, childNodeCount); i < limit; ++i)
+            this.insertChildElement(node.children[i], i);
+
+        const expandedChildCount = this.expandedChildCount;
+        if (childNodeCount > this.expandedChildCount) {
+            var targetButtonIndex = expandedChildCount;
+            if (!this.expandAllButtonElement) {
+                var title = "<button class=\"show-all-nodes\" value=\"\" />";
+                var item = new TreeElement(title, null, false);
+                item.selectable = false;
+                item.expandAllButton = true;
+                this.insertChild(item, targetButtonIndex);
+                this.expandAllButtonElement = item.listItemElement.firstChild;
+                this.expandAllButtonElement.__treeElement = item;
+                this.expandAllButtonElement.addEventListener("click", this.handleLoadAllChildren.bind(this), false);
+            } else if (!this.expandAllButtonElement.__treeElement.parent)
+                this.insertChild(this.expandAllButtonElement.__treeElement, targetButtonIndex);
+            this.expandAllButtonElement.textContent = WebInspector.UIString("Show All Nodes (%d More)", childNodeCount - expandedChildCount);
+        } else if (this.expandAllButtonElement)
+            delete this.expandAllButtonElement;
+    },
+
+    handleLoadAllChildren: function()
+    {
+        this.expandedChildrenLimit = Math.max(this.representedObject._childNodeCount, this.expandedChildrenLimit + WebInspector.ElementsTreeElement.InitialChildrenLimit);
+    },
+
+    onexpand: function()
+    {
+        this.updateTitle();
+        this.treeOutline.updateSelection();
+    },
+
+    oncollapse: function()
+    {
+        this.updateTitle();
+        this.treeOutline.updateSelection();
+    },
+
+    onreveal: function()
+    {
+        if (this.listItemElement)
+            this.listItemElement.scrollIntoViewIfNeeded(false);
+    },
+
+    onselect: function()
+    {
+        this.treeOutline.focusedDOMNode = this.representedObject;
+        this.updateSelection();
+    },
+
+    onmousedown: function(event)
+    {
+        if (this._editing)
+            return;
+
+        if (this.isEventWithinDisclosureTriangle(event))
+            return;
+
+        if (this.treeOutline.showInElementsPanelEnabled) {    
+            WebInspector.showElementsPanel();
+            WebInspector.panels.elements.focusedDOMNode = this.representedObject;
+        }
+
+        // Prevent selecting the nearest word on double click.
+        if (event.detail >= 2)
+            event.preventDefault();
+    },
+
+    ondblclick: function(event)
+    {
+        if (this._editing)
+            return;
+
+        if (this._startEditingFromEvent(event))
+            return;
+
+        if (this.hasChildren && !this.expanded)
+            this.expand();
+    },
+
+    _insertInLastAttributePosition: function(tag, node)
+    {
+        if (tag.getElementsByClassName("webkit-html-attribute").length > 0)
+            tag.insertBefore(node, tag.lastChild);
+        else {
+            var nodeName = tag.textContent.match(/^<(.*?)>$/)[1];
+            tag.textContent = '';
+            tag.appendChild(document.createTextNode('<'+nodeName));
+            tag.appendChild(node);
+            tag.appendChild(document.createTextNode('>'));
+        }
+
+        this.updateSelection();
+    },
+
+    _startEditingFromEvent: function(event)
+    {
+        if (this.treeOutline.focusedDOMNode != this.representedObject)
+            return;
+
+        if (this.representedObject.nodeType != Node.ELEMENT_NODE && this.representedObject.nodeType != Node.TEXT_NODE)
+            return false;
+
+        var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");
+        if (textNode)
+            return this._startEditingTextNode(textNode);
+
+        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
+        if (attribute)
+            return this._startEditingAttribute(attribute, event.target);
+
+        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
+        if (newAttribute)
+            return this._addNewAttribute();
+
+        return false;
+    },
+
+    _populateTagContextMenu: function(contextMenu, event)
+    {
+        var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");
+        var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");
+
+        // Add attribute-related actions.
+        contextMenu.appendItem(WebInspector.UIString("Add Attribute"), this._addNewAttribute.bind(this));
+        if (attribute && !newAttribute)
+            contextMenu.appendItem(WebInspector.UIString("Edit Attribute"), this._startEditingAttribute.bind(this, attribute, event.target));
+        contextMenu.appendSeparator();
+
+        // Add node-related actions.
+        contextMenu.appendItem(WebInspector.UIString("Edit as HTML"), this._editAsHTML.bind(this));
+        contextMenu.appendItem(WebInspector.UIString("Copy as HTML"), this._copyHTML.bind(this));
+        contextMenu.appendItem(WebInspector.UIString("Delete Node"), this.remove.bind(this));
+    },
+
+    _populateTextContextMenu: function(contextMenu, textNode)
+    {
+        contextMenu.appendItem(WebInspector.UIString("Edit Text"), this._startEditingTextNode.bind(this, textNode));
+    },
+
+    _startEditing: function()
+    {
+        if (this.treeOutline.focusedDOMNode !== this.representedObject)
+            return;
+
+        var listItem = this._listItemNode;
+
+        if (this._canAddAttributes) {
+            var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];
+            if (attribute)
+                return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-value")[0]);
+
+            return this._addNewAttribute();
+        }
+
+        if (this.representedObject.nodeType === Node.TEXT_NODE) {
+            var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];
+            if (textNode)
+                return this._startEditingTextNode(textNode);
+            return;
+        }
+    },
+
+    _addNewAttribute: function()
+    {
+        var attr = document.createElement("span");
+        attr.className = "webkit-html-attribute";
+        attr.style.marginLeft = "2px"; // overrides the .editing margin rule
+        attr.style.marginRight = "2px"; // overrides the .editing margin rule
+        var name = document.createElement("span");
+        name.className = "webkit-html-attribute-name new-attribute";
+        name.textContent = " ";
+        var value = document.createElement("span");
+        value.className = "webkit-html-attribute-value";
+        attr.appendChild(name);
+        attr.appendChild(value);
+
+        var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];
+        this._insertInLastAttributePosition(tag, attr);
+        return this._startEditingAttribute(attr, attr);
+    },
+
+    _triggerEditAttribute: function(attributeName)
+    {
+        var attributeElements = this.listItemElement.getElementsByClassName("webkit-html-attribute-name");
+        for (var i = 0, len = attributeElements.length; i < len; ++i) {
+            if (attributeElements[i].textContent === attributeName) {
+                for (var elem = attributeElements[i].nextSibling; elem; elem = elem.nextSibling) {
+                    if (elem.nodeType !== Node.ELEMENT_NODE)
+                        continue;
+
+                    if (elem.hasStyleClass("webkit-html-attribute-value"))
+                        return this._startEditingAttribute(attributeElements[i].parentNode, elem);
+                }
+            }
+        }
+    },
+
+    _startEditingAttribute: function(attribute, elementForSelection)
+    {
+        if (WebInspector.isBeingEdited(attribute))
+            return true;
+
+        var attributeNameElement = attribute.getElementsByClassName("webkit-html-attribute-name")[0];
+        if (!attributeNameElement)
+            return false;
+
+        var attributeName = attributeNameElement.innerText;
+
+        function removeZeroWidthSpaceRecursive(node)
+        {
+            if (node.nodeType === Node.TEXT_NODE) {
+                node.nodeValue = node.nodeValue.replace(/\u200B/g, "");
+                return;
+            }
+
+            if (node.nodeType !== Node.ELEMENT_NODE)
+                return;
+
+            for (var child = node.firstChild; child; child = child.nextSibling)
+                removeZeroWidthSpaceRecursive(child);
+        }
+
+        // Remove zero-width spaces that were added by nodeTitleInfo.
+        removeZeroWidthSpaceRecursive(attribute);
+
+        this._editing = true;
+
+        WebInspector.startEditing(attribute, this._attributeEditingCommitted.bind(this), this._editingCancelled.bind(this), attributeName);
+        window.getSelection().setBaseAndExtent(elementForSelection, 0, elementForSelection, 1);
+
+        return true;
+    },
+
+    _startEditingTextNode: function(textNode)
+    {
+        if (WebInspector.isBeingEdited(textNode))
+            return true;
+
+        this._editing = true;
+
+        WebInspector.startEditing(textNode, this._textNodeEditingCommitted.bind(this), this._editingCancelled.bind(this));
+        window.getSelection().setBaseAndExtent(textNode, 0, textNode, 1);
+
+        return true;
+    },
+
+    _startEditingAsHTML: function(commitCallback, initialValue)
+    {
+        if (this._htmlEditElement && WebInspector.isBeingEdited(this._htmlEditElement))
+            return true;
+
+        this._editing = true;
+
+        this._htmlEditElement = document.createElement("div");
+        this._htmlEditElement.className = "source-code elements-tree-editor";
+        this._htmlEditElement.textContent = initialValue;
+
+        // Hide header items.
+        var child = this.listItemElement.firstChild;
+        while (child) {
+            child.style.display = "none";
+            child = child.nextSibling;
+        }
+        // Hide children item.
+        if (this._childrenListNode)
+            this._childrenListNode.style.display = "none";
+        // Append editor.
+        this.listItemElement.appendChild(this._htmlEditElement);
+
+        this.updateSelection();
+
+        function commit()
+        {
+            commitCallback(this._htmlEditElement.textContent);
+            dispose.call(this);
+        }
+
+        function dispose()
+        {
+            delete this._editing;
+
+            // Remove editor.
+            this.listItemElement.removeChild(this._htmlEditElement);
+            delete this._htmlEditElement;
+            // Unhide children item.
+            if (this._childrenListNode)
+                this._childrenListNode.style.removeProperty("display");
+            // Unhide header items.
+            var child = this.listItemElement.firstChild;
+            while (child) {
+                child.style.removeProperty("display");
+                child = child.nextSibling;
+            }
+
+            this.updateSelection();
+        }
+
+        WebInspector.startEditing(this._htmlEditElement, commit.bind(this), dispose.bind(this), null, true);
+    },
+
+    _attributeEditingCommitted: function(element, newText, oldText, attributeName, moveDirection)
+    {
+        delete this._editing;
+
+        // Before we do anything, determine where we should move
+        // next based on the current element's settings
+        var moveToAttribute;
+        var newAttribute;
+        if (moveDirection) {
+            var found = false;
+            var attributes = this.representedObject.attributes;
+            for (var i = 0, len = attributes.length; i < len; ++i) {
+                if (attributes[i].name === attributeName) {
+                    found = true;
+                    if (moveDirection === "backward" && i > 0)
+                        moveToAttribute = attributes[i - 1].name;
+                    else if (moveDirection === "forward" && i < attributes.length - 1)
+                        moveToAttribute = attributes[i + 1].name;
+                    else if (moveDirection === "forward" && i === attributes.length - 1)
+                        newAttribute = true;
+                }
+            }
+
+            if (!found && moveDirection === "backward" && attributes.length > 0)
+                moveToAttribute = attributes[attributes.length - 1].name;
+            else if (!found && moveDirection === "forward" && !/^\s*$/.test(newText))
+                newAttribute = true;
+        }
+
+        function moveToNextAttributeIfNeeded() {
+            if (moveToAttribute)
+                this._triggerEditAttribute(moveToAttribute);
+            else if (newAttribute)
+                this._addNewAttribute(this.listItemElement);
+        }
+
+        var parseContainerElement = document.createElement("span");
+        parseContainerElement.innerHTML = "<span " + newText + "></span>";
+        var parseElement = parseContainerElement.firstChild;
+
+        if (!parseElement) {
+            this._editingCancelled(element, attributeName);
+            moveToNextAttributeIfNeeded.call(this);
+            return;
+        }
+
+        if (!parseElement.hasAttributes()) {
+            this.representedObject.removeAttribute(attributeName);
+            moveToNextAttributeIfNeeded.call(this);
+            return;
+        }
+
+        var foundOriginalAttribute = false;
+        for (var i = 0; i < parseElement.attributes.length; ++i) {
+            var attr = parseElement.attributes[i];
+            foundOriginalAttribute = foundOriginalAttribute || attr.name === attributeName;
+            try {
+                this.representedObject.setAttribute(attr.name, attr.value);
+            } catch(e) {} // ignore invalid attribute (innerHTML doesn't throw errors, but this can)
+        }
+
+        if (!foundOriginalAttribute)
+            this.representedObject.removeAttribute(attributeName);
+
+        this.treeOutline.focusedNodeChanged(true);
+
+        moveToNextAttributeIfNeeded.call(this);
+    },
+
+    _textNodeEditingCommitted: function(element, newText)
+    {
+        delete this._editing;
+
+        var textNode;
+        if (this.representedObject.nodeType == Node.ELEMENT_NODE) {
+            // We only show text nodes inline in elements if the element only
+            // has a single child, and that child is a text node.
+            textNode = this.representedObject.firstChild;
+        } else if (this.representedObject.nodeType == Node.TEXT_NODE)
+            textNode = this.representedObject;
+
+        textNode.nodeValue = newText;
+
+        // Need to restore attributes / node structure.
+        this.updateTitle();
+    },
+
+    _editingCancelled: function(element, context)
+    {
+        delete this._editing;
+
+        // Need to restore attributes structure.
+        this.updateTitle();
+    },
+
+    updateTitle: function()
+    {
+        // If we are editing, return early to prevent canceling the edit.
+        // After editing is committed updateTitle will be called.
+        if (this._editing)
+            return;
+
+        var self = this;
+        function callback(tooltipText)
+        {
+            var title = self._nodeTitleInfo(WebInspector.linkifyURL, tooltipText).title;
+            self.title = "<span class=\"highlight\">" + title + "</span>";
+            delete self.selectionElement;
+            self.updateSelection();
+            self._preventFollowingLinksOnDoubleClick();
+            self._highlightSearchResults();
+        };
+
+        // TODO: Replace with InjectedScriptAccess.getBasicProperties(obj, [names]).
+        if (this.representedObject.nodeName.toLowerCase() !== "img")
+            callback();
+        else
+            this.createTooltipForImageNode(this.representedObject, callback);
+    },
+
+    _rewriteAttrHref: function(node, hrefValue)
+    {
+        if (!hrefValue || hrefValue.indexOf("://") > 0)
+            return hrefValue;
+
+        for (var frameOwnerCandidate = node; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {
+            if (frameOwnerCandidate.documentURL) {
+                var result = WebInspector.completeURL(frameOwnerCandidate.documentURL, hrefValue);
+                if (result)
+                    return result;
+                break;
+            }
+        }
+
+        // documentURL not found or has bad value
+        for (var url in WebInspector.resourceURLMap) {
+            var match = url.match(WebInspector.URLRegExp);
+            if (match && match[4] === hrefValue)
+                return url;
+        }
+        return hrefValue;
+    },
+
+    _nodeTitleInfo: function(linkify, tooltipText)
+    {
+        var node = this.representedObject;
+        var info = {title: "", hasChildren: this.hasChildren};
+        
+        switch (node.nodeType) {
+            case Node.DOCUMENT_NODE:
+                info.title = "Document";
+                break;
+                
+            case Node.DOCUMENT_FRAGMENT_NODE:
+                info.title = "Document Fragment";
+                break;
+
+            case Node.ELEMENT_NODE:
+                var tagName = node.nodeName.toLowerCase().escapeHTML();
+                info.title = "<span class=\"webkit-html-tag\">&lt;" + tagName;
+                
+                if (node.hasAttributes()) {
+                    for (var i = 0; i < node.attributes.length; ++i) {
+                        var attr = node.attributes[i];
+                        info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
+                        
+                        var value = attr.value;
+                        if (linkify && (attr.name === "src" || attr.name === "href")) {
+                            var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
+                            info.title += linkify(this._rewriteAttrHref(node, attr.value), value, "webkit-html-attribute-value", node.nodeName.toLowerCase() == "a", tooltipText);
+                        } else {
+                            var value = value.escapeHTML();
+                            value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
+                            info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
+                        }
+                        info.title += "\"</span>";
+                    }
+                }
+                info.title += "&gt;</span>&#8203;";
+                
+                const closingTagHTML = "<span class=\"webkit-html-tag\">&lt;/" + tagName + "&gt;</span>&#8203;";
+                var textChild = onlyTextChild.call(node);
+                var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
+
+                if (!this.expanded && (!showInlineText && (this.treeOutline.isXMLMimeType || !WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName]))) {
+                    if (this.hasChildren)
+                        info.title += "<span class=\"webkit-html-text-node\">&#8230;</span>&#8203;";
+                    info.title += closingTagHTML;
+                }
+
+                // If this element only has a single child that is a text node,
+                // just show that text and the closing tag inline rather than
+                // create a subtree for them
+                if (showInlineText) {
+                    info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;" + closingTagHTML;
+                    info.hasChildren = false;
+                }
+                break;
+                
+            case Node.TEXT_NODE:
+                if (isNodeWhitespace.call(node))
+                    info.title = "(whitespace)";
+                else {
+                    if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "script") {
+                        var newNode = document.createElement("span");
+                        newNode.textContent = node.textContent;
+
+                        var javascriptSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/javascript");
+                        javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);
+                        
+                        info.title = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+                    } else if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "style") {
+                        var newNode = document.createElement("span");
+                        newNode.textContent = node.textContent;
+                        
+                        var cssSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/css");
+                        cssSyntaxHighlighter.syntaxHighlightNode(newNode);
+                        
+                        info.title = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+                    } else {
+                        info.title = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\""; 
+                    }
+                } 
+                break;
+                
+            case Node.COMMENT_NODE:
+                info.title = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";
+                break;
+                
+            case Node.DOCUMENT_TYPE_NODE:
+                info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;
+                if (node.publicId) {
+                    info.title += " PUBLIC \"" + node.publicId + "\"";
+                    if (node.systemId)
+                        info.title += " \"" + node.systemId + "\"";
+                } else if (node.systemId)
+                    info.title += " SYSTEM \"" + node.systemId + "\"";
+                if (node.internalSubset)
+                    info.title += " [" + node.internalSubset + "]";
+                info.title += "&gt;</span>";
+                break;
+            default:
+                info.title = node.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
+        }
+        
+        return info;
+    },
+
+    _showInlineText: function(node)
+    {
+        if (node.nodeType === Node.ELEMENT_NODE) {
+            var textChild = onlyTextChild.call(node);
+            if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)
+                return true;
+        }
+        return false;
+    },
+    
+    remove: function()
+    {
+        var parentElement = this.parent;
+        if (!parentElement)
+            return;
+
+        var self = this;
+        function removeNodeCallback(removedNodeId)
+        {
+            // -1 is an error code, which means removing the node from the DOM failed,
+            // so we shouldn't remove it from the tree.
+            if (removedNodeId === -1)
+                return;
+
+            parentElement.removeChild(self);
+            parentElement.adjustCollapsedRange(true);
+        }
+
+        var callId = WebInspector.Callback.wrap(removeNodeCallback);
+        InspectorBackend.removeNode(callId, this.representedObject.id);
+    },
+
+    _editAsHTML: function()
+    {
+        var treeOutline = this.treeOutline;
+        var node = this.representedObject;
+        var wasExpanded = this.expanded;
+
+        function selectNode(nodeId)
+        {
+            if (!nodeId)
+                return;
+
+            // Select it and expand if necessary. We force tree update so that it processes dom events and is up to date.
+            WebInspector.panels.elements.updateModifiedNodes();
+
+            WebInspector.updateFocusedNode(nodeId);
+            if (wasExpanded) {
+                var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));
+                if (newTreeItem)
+                    newTreeItem.expand();
+            }
+        }
+
+        function commitChange(value)
+        {
+            InjectedScriptAccess.get(node.injectedScriptId).setOuterHTML(node.id, value, wasExpanded, selectNode.bind(this));
+        }
+
+        InjectedScriptAccess.get(node.injectedScriptId).getNodePropertyValue(node.id, "outerHTML", this._startEditingAsHTML.bind(this, commitChange));
+    },
+
+    _copyHTML: function()
+    {
+        InspectorBackend.copyNode(this.representedObject.id);
+    },
+
+    _highlightSearchResults: function()
+    {
+        if (!this._searchQuery)
+            return;
+        var text = this.listItemElement.textContent;
+        var regexObject = createSearchRegex(this._searchQuery);
+
+        var offset = 0;
+        var match = regexObject.exec(text);
+        while (match) {
+            highlightSearchResult(this.listItemElement, offset + match.index, match[0].length);
+            offset += match.index + 1;
+            text = text.substring(match.index + 1);
+            match = regexObject.exec(text);
+        }
+    }
+}
+
+WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.didRemoveNode = WebInspector.Callback.processCallback;
+
+/* SidebarTreeElement.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)
+{
+    TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);
+}
+
+WebInspector.SidebarSectionTreeElement.prototype = {
+    selectable: false,
+
+    get smallChildren()
+    {
+        return this._smallChildren;
+    },
+
+    set smallChildren(x)
+    {
+        if (this._smallChildren === x)
+            return;
+
+        this._smallChildren = x;
+
+        if (this._smallChildren)
+            this._childrenListNode.addStyleClass("small");
+        else
+            this._childrenListNode.removeStyleClass("small");
+    },
+
+    onattach: function()
+    {
+        this._listItemNode.addStyleClass("sidebar-tree-section");
+    },
+
+    onreveal: function()
+    {
+        if (this.listItemElement)
+            this.listItemElement.scrollIntoViewIfNeeded(false);
+    }
+}
+
+WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)
+{
+    TreeElement.call(this, "", representedObject || {}, hasChildren);
+
+    if (hasChildren) {
+        this.disclosureButton = document.createElement("button");
+        this.disclosureButton.className = "disclosure-button";
+    }
+
+    if (!this.iconElement) {
+        this.iconElement = document.createElement("img");
+        this.iconElement.className = "icon";
+    }
+
+    this.statusElement = document.createElement("div");
+    this.statusElement.className = "status";
+
+    this.titlesElement = document.createElement("div");
+    this.titlesElement.className = "titles";
+
+    this.titleElement = document.createElement("span");
+    this.titleElement.className = "title";
+    this.titlesElement.appendChild(this.titleElement);
+
+    this.subtitleElement = document.createElement("span");
+    this.subtitleElement.className = "subtitle";
+    this.titlesElement.appendChild(this.subtitleElement);
+
+    this.className = className;
+    this.mainTitle = title;
+    this.subtitle = subtitle;
+}
+
+WebInspector.SidebarTreeElement.prototype = {
+    get small()
+    {
+        return this._small;
+    },
+
+    set small(x)
+    {
+        this._small = x;
+
+        if (this._listItemNode) {
+            if (this._small)
+                this._listItemNode.addStyleClass("small");
+            else
+                this._listItemNode.removeStyleClass("small");
+        }
+    },
+
+    get mainTitle()
+    {
+        return this._mainTitle;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        this._subtitle = x;
+        this.refreshTitles();
+    },
+
+    get bubbleText()
+    {
+        return this._bubbleText;
+    },
+
+    set bubbleText(x)
+    {
+        if (!this.bubbleElement) {
+            this.bubbleElement = document.createElement("div");
+            this.bubbleElement.className = "bubble";
+            this.statusElement.appendChild(this.bubbleElement);
+        }
+
+        this._bubbleText = x;
+        this.bubbleElement.textContent = x;
+    },
+
+    refreshTitles: function()
+    {
+        var mainTitle = this.mainTitle;
+        if (this.titleElement.textContent !== mainTitle)
+            this.titleElement.textContent = mainTitle;
+
+        var subtitle = this.subtitle;
+        if (subtitle) {
+            if (this.subtitleElement.textContent !== subtitle)
+                this.subtitleElement.textContent = subtitle;
+            this.titlesElement.removeStyleClass("no-subtitle");
+        } else
+            this.titlesElement.addStyleClass("no-subtitle");
+    },
+
+    isEventWithinDisclosureTriangle: function(event)
+    {
+        return event.target === this.disclosureButton;
+    },
+
+    onattach: function()
+    {
+        this._listItemNode.addStyleClass("sidebar-tree-item");
+
+        if (this.className)
+            this._listItemNode.addStyleClass(this.className);
+
+        if (this.small)
+            this._listItemNode.addStyleClass("small");
+
+        if (this.hasChildren && this.disclosureButton)
+            this._listItemNode.appendChild(this.disclosureButton);
+
+        this._listItemNode.appendChild(this.iconElement);
+        this._listItemNode.appendChild(this.statusElement);
+        this._listItemNode.appendChild(this.titlesElement);
+    },
+
+    onreveal: function()
+    {
+        if (this._listItemNode)
+            this._listItemNode.scrollIntoViewIfNeeded(false);
+    }
+}
+
+WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* Section.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Section = function(title, subtitle)
+{
+    this.element = document.createElement("div");
+    this.element.className = "section";
+    this.element.sectionForTest = this;
+
+    this.headerElement = document.createElement("div");
+    this.headerElement.className = "header";
+
+    this.titleElement = document.createElement("div");
+    this.titleElement.className = "title";
+
+    this.subtitleElement = document.createElement("div");
+    this.subtitleElement.className = "subtitle";
+
+    this.headerElement.appendChild(this.subtitleElement);
+    this.headerElement.appendChild(this.titleElement);
+
+    this.headerElement.addEventListener("click", this.toggleExpanded.bind(this), false);
+    this.element.appendChild(this.headerElement);
+
+    this.title = title;
+    this.subtitle = subtitle;
+    this._expanded = false;
+}
+
+WebInspector.Section.prototype = {
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+
+        if (x instanceof Node) {
+            this.titleElement.removeChildren();
+            this.titleElement.appendChild(x);
+        } else
+          this.titleElement.textContent = x;
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        if (this._subtitle === x)
+            return;
+        this._subtitle = x;
+        this.subtitleElement.innerHTML = x;
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(x)
+    {
+        if (x)
+            this.expand();
+        else
+            this.collapse();
+    },
+
+    get populated()
+    {
+        return this._populated;
+    },
+
+    set populated(x)
+    {
+        this._populated = x;
+        if (!x && this.onpopulate && this._expanded) {
+            this.onpopulate(this);
+            this._populated = true;
+        }
+    },
+
+    expand: function()
+    {
+        if (this._expanded)
+            return;
+        this._expanded = true;
+        this.element.addStyleClass("expanded");
+
+        if (!this._populated && this.onpopulate) {
+            this.onpopulate(this);
+            this._populated = true;
+        }
+    },
+
+    collapse: function()
+    {
+        if (!this._expanded)
+            return;
+        this._expanded = false;
+        this.element.removeStyleClass("expanded");
+    },
+
+    toggleExpanded: function()
+    {
+        this.expanded = !this.expanded;
+    }
+}
+
+/* PropertiesSection.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PropertiesSection = function(title, subtitle)
+{
+    WebInspector.Section.call(this, title, subtitle);
+
+    this.propertiesElement = document.createElement("ol");
+    this.propertiesElement.className = "properties source-code";
+    this.propertiesElement.tabIndex = 0;
+    this.propertiesTreeOutline = new TreeOutline(this.propertiesElement);
+    this.propertiesTreeOutline.section = this;
+
+    this.element.appendChild(this.propertiesElement);
+}
+
+WebInspector.PropertiesSection.prototype.__proto__ = WebInspector.Section.prototype;
+
+/* ObjectProxy.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ObjectProxy = function(injectedScriptId, objectId, path, description, hasChildren)
+{
+    this.objectId = objectId;
+    this.injectedScriptId = injectedScriptId;
+    this.path = path || [];
+    this.description = description;
+    this.hasChildren = hasChildren;
+}
+
+WebInspector.ObjectProxy.wrapPrimitiveValue = function(value)
+{
+    var proxy = new WebInspector.ObjectProxy();
+    proxy.type = typeof value;
+    proxy.description = value;
+    return proxy;
+}
+
+WebInspector.ObjectProxy.getPropertiesAsync = function(objectProxy, propertiesToQueryFor, callback)
+{
+    function createPropertiesMapThenCallback(propertiesPayload)
+    {
+        if (!propertiesPayload) {
+            callback();
+            return;
+        }
+
+        var result = [];
+        for (var i = 0; i < propertiesPayload.length; ++i)
+            if (propertiesToQueryFor.indexOf(propertiesPayload[i].name) !== -1)
+                result[propertiesPayload[i].name] = propertiesPayload[i].value.description;
+        callback(result);
+    };
+    InjectedScriptAccess.get(objectProxy.injectedScriptId).getProperties(objectProxy, true, false, createPropertiesMapThenCallback);
+}
+
+WebInspector.ObjectPropertyProxy = function(name, value)
+{
+    this.name = name;
+    this.value = value;
+}
+
+/* ObjectPropertiesSection.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ObjectPropertiesSection = function(object, title, subtitle, emptyPlaceholder, ignoreHasOwnProperty, extraProperties, treeElementConstructor)
+{
+    this.emptyPlaceholder = (emptyPlaceholder || WebInspector.UIString("No Properties"));
+    this.object = object;
+    this.ignoreHasOwnProperty = ignoreHasOwnProperty;
+    this.extraProperties = extraProperties;
+    this.treeElementConstructor = treeElementConstructor || WebInspector.ObjectPropertyTreeElement;
+    this.editable = true;
+
+    WebInspector.PropertiesSection.call(this, title, subtitle);
+}
+
+WebInspector.ObjectPropertiesSection.prototype = {
+    onpopulate: function()
+    {
+        this.update();
+    },
+
+    update: function()
+    {
+        var self = this;
+        var callback = function(properties) {
+            if (!properties)
+                return;
+            self.updateProperties(properties);
+        };
+        InjectedScriptAccess.get(this.object.injectedScriptId).getProperties(this.object, this.ignoreHasOwnProperty, true, callback);
+    },
+
+    updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)
+    {
+        if (!rootTreeElementConstructor)
+            rootTreeElementConstructor = this.treeElementConstructor;
+            
+        if (!rootPropertyComparer)
+            rootPropertyComparer = WebInspector.ObjectPropertiesSection.CompareProperties;
+            
+        if (this.extraProperties)
+            for (var i = 0; i < this.extraProperties.length; ++i)
+                properties.push(this.extraProperties[i]);
+                
+        properties.sort(rootPropertyComparer);
+
+        this.propertiesTreeOutline.removeChildren();
+
+        for (var i = 0; i < properties.length; ++i)
+            this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));
+
+        if (!this.propertiesTreeOutline.children.length) {
+            var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";
+            var infoElement = new TreeElement(title, null, false);
+            this.propertiesTreeOutline.appendChild(infoElement);
+        }
+        this.propertiesForTest = properties;
+    }
+}
+
+WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) 
+{
+    var a = propertyA.name;
+    var b = propertyB.name;
+    if (a === "__proto__")
+        return 1;
+    if (b === "__proto__")
+        return -1;
+
+    // if used elsewhere make sure to
+    //  - convert a and b to strings (not needed here, properties are all strings)
+    //  - check if a == b (not needed here, no two properties can be the same)
+
+    var diff = 0;
+    var chunk = /^\d+|^\D+/;
+    var chunka, chunkb, anum, bnum;
+    while (diff === 0) {
+        if (!a && b)
+            return -1;
+        if (!b && a)
+            return 1;
+        chunka = a.match(chunk)[0];
+        chunkb = b.match(chunk)[0];
+        anum = !isNaN(chunka);
+        bnum = !isNaN(chunkb);
+        if (anum && !bnum)
+            return -1;
+        if (bnum && !anum)
+            return 1;
+        if (anum && bnum) {
+            diff = chunka - chunkb;
+            if (diff === 0 && chunka.length !== chunkb.length) {
+                if (!+chunka && !+chunkb) // chunks are strings of all 0s (special case)
+                    return chunka.length - chunkb.length;
+                else
+                    return chunkb.length - chunka.length;
+            }
+        } else if (chunka !== chunkb)
+            return (chunka < chunkb) ? -1 : 1;
+        a = a.substring(chunka.length);
+        b = b.substring(chunkb.length);
+    }
+    return diff;
+}
+
+WebInspector.ObjectPropertyTreeElement = function(property)
+{
+    this.property = property;
+
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, false);
+}
+
+WebInspector.ObjectPropertyTreeElement.prototype = {
+    onpopulate: function()
+    {
+        if (this.children.length && !this.shouldRefreshChildren)
+            return;
+
+        var callback = function(properties) {
+            this.removeChildren();
+            if (!properties)
+                return;
+
+            properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);
+            for (var i = 0; i < properties.length; ++i) {
+                this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));
+            }
+        };
+        InjectedScriptAccess.get(this.property.value.injectedScriptId).getProperties(this.property.value, false, true, callback.bind(this));
+    },
+
+    ondblclick: function(event)
+    {
+        this.startEditing();
+    },
+
+    onattach: function()
+    {
+        this.update();
+    },
+
+    update: function()
+    {
+        this.nameElement = document.createElement("span");
+        this.nameElement.className = "name";
+        this.nameElement.textContent = this.property.name;
+
+        var separatorElement = document.createElement("span");
+        separatorElement.className = "separator";
+        separatorElement.textContent = ": ";
+        
+        this.valueElement = document.createElement("span");
+        this.valueElement.className = "value";
+        this.valueElement.textContent = this.property.value.description;
+        if (typeof this.property.value.propertyLength !== "undefined")
+            this.valueElement.textContent += " (" + this.property.value.propertyLength + ")";
+        if (this.property.isGetter)
+            this.valueElement.addStyleClass("dimmed");
+        if (this.property.isError)
+            this.valueElement.addStyleClass("error");
+
+        this.listItemElement.removeChildren();
+
+        this.listItemElement.appendChild(this.nameElement);
+        this.listItemElement.appendChild(separatorElement);
+        this.listItemElement.appendChild(this.valueElement);
+        this.hasChildren = this.property.value.hasChildren;
+    },
+
+    updateSiblings: function()
+    {
+        if (this.parent.root)
+            this.treeOutline.section.update();
+        else
+            this.parent.shouldRefreshChildren = true;
+    },
+
+    startEditing: function()
+    {
+        if (WebInspector.isBeingEdited(this.valueElement) || !this.treeOutline.section.editable)
+            return;
+
+        var context = { expanded: this.expanded };
+
+        // Lie about our children to prevent expanding on double click and to collapse subproperties.
+        this.hasChildren = false;
+
+        this.listItemElement.addStyleClass("editing-sub-part");
+
+        WebInspector.startEditing(this.valueElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingEnded: function(context)
+    {
+        this.listItemElement.scrollLeft = 0;
+        this.listItemElement.removeStyleClass("editing-sub-part");
+        if (context.expanded)
+            this.expand();
+    },
+
+    editingCancelled: function(element, context)
+    {
+        this.update();
+        this.editingEnded(context);
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context)
+    {
+        if (userInput === previousContent)
+            return this.editingCancelled(element, context); // nothing changed, so cancel
+
+        this.applyExpression(userInput, true);
+
+        this.editingEnded(context);
+    },
+
+    applyExpression: function(expression, updateInterface)
+    {
+        expression = expression.trim();
+        var expressionLength = expression.length;
+        var self = this;
+        var callback = function(success) {
+            if (!updateInterface)
+                return;
+
+            if (!success)
+                self.update();
+
+            if (!expressionLength) {
+                // The property was deleted, so remove this tree element.
+                self.parent.removeChild(this);
+            } else {
+                // Call updateSiblings since their value might be based on the value that just changed.
+                self.updateSiblings();
+            }
+        };
+        InjectedScriptAccess.get(this.property.parentObjectProxy.injectedScriptId).setPropertyValue(this.property.parentObjectProxy, this.property.name, expression.trim(), callback);
+    }
+}
+
+WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* BreakpointsSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.BreakpointsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
+
+    this.breakpoints = {};
+
+    this.listElement = document.createElement("ol");
+    this.listElement.className = "breakpoint-list";
+
+    this.emptyElement = document.createElement("div");
+    this.emptyElement.className = "info";
+    this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
+
+    this.bodyElement.appendChild(this.emptyElement);
+}
+
+WebInspector.BreakpointsSidebarPane.prototype = {
+    reset: function()
+    {
+        this.breakpoints = {};
+        this.listElement.removeChildren();
+        if (this.listElement.parentElement) {
+            this.bodyElement.removeChild(this.listElement);
+            this.bodyElement.appendChild(this.emptyElement);
+        }
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        if (this.breakpoints[breakpoint.id])
+            return;
+
+        this.breakpoints[breakpoint.id] = breakpoint;
+
+        breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
+        breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
+        breakpoint.addEventListener("text-changed", this._breakpointTextChanged, this);
+
+        this._appendBreakpointElement(breakpoint);
+
+        if (this.emptyElement.parentElement) {
+            this.bodyElement.removeChild(this.emptyElement);
+            this.bodyElement.appendChild(this.listElement);
+        }
+
+        InspectorBackend.setBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.enabled, breakpoint.condition);
+    },
+
+    _appendBreakpointElement: function(breakpoint)
+    {
+        function checkboxClicked(event)
+        {
+            breakpoint.enabled = !breakpoint.enabled;
+
+            // without this, we'd switch to the source of the clicked breakpoint
+            event.stopPropagation();
+        }
+
+        function breakpointClicked()
+        {
+            var script = WebInspector.panels.scripts.scriptOrResourceForID(breakpoint.sourceID);
+            if (script)
+                WebInspector.panels.scripts.showScript(script, breakpoint.line);
+        }
+
+        var breakpointElement = document.createElement("li");
+        breakpoint._breakpointListElement = breakpointElement;
+        breakpointElement._breakpointObject = breakpoint;
+        breakpointElement.addEventListener("click", breakpointClicked, false);
+
+        var checkboxElement = document.createElement("input");
+        checkboxElement.className = "checkbox-elem";
+        checkboxElement.type = "checkbox";
+        checkboxElement.checked = breakpoint.enabled;
+        checkboxElement.addEventListener("click", checkboxClicked, false);
+        breakpointElement.appendChild(checkboxElement);
+
+        var labelElement = document.createTextNode(breakpoint.label);
+        breakpointElement.appendChild(labelElement);
+
+        var sourceTextElement = document.createElement("div");
+        sourceTextElement.textContent = breakpoint.sourceText;
+        sourceTextElement.className = "source-text monospace";
+        breakpointElement.appendChild(sourceTextElement);
+
+        var currentElement = this.listElement.firstChild;
+        while (currentElement) {
+            var currentBreak = currentElement._breakpointObject;
+            if (currentBreak.url > breakpoint.url) {
+                this.listElement.insertBefore(breakpointElement, currentElement);
+                return;
+            } else if (currentBreak.url == breakpoint.url && currentBreak.line > breakpoint.line) {
+                this.listElement.insertBefore(breakpointElement, currentElement);
+                return;
+            }
+            currentElement = currentElement.nextSibling;
+        }
+        this.listElement.appendChild(breakpointElement);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        if (!this.breakpoints[breakpoint.id])
+            return;
+        delete this.breakpoints[breakpoint.id];
+
+        breakpoint.removeEventListener("enabled", null, this);
+        breakpoint.removeEventListener("disabled", null, this);
+        breakpoint.removeEventListener("text-changed", null, this);
+
+        var element = breakpoint._breakpointListElement;
+        element.parentElement.removeChild(element);
+
+        if (!this.listElement.firstChild) {
+            this.bodyElement.removeChild(this.listElement);
+            this.bodyElement.appendChild(this.emptyElement);
+        }
+
+        InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
+    },
+
+    _breakpointEnableChanged: function(event)
+    {
+        var breakpoint = event.target;
+
+        var checkbox = breakpoint._breakpointListElement.firstChild;
+        checkbox.checked = breakpoint.enabled;
+        InspectorBackend.setBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.enabled, breakpoint.condition);
+    },
+
+    _breakpointTextChanged: function(event)
+    {
+        var breakpoint = event.target;
+
+        var sourceTextElement = breakpoint._breakpointListElement.firstChild.nextSibling.nextSibling;
+        sourceTextElement.textContent = breakpoint.sourceText;
+    }
+}
+
+WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* CallStackSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.CallStackSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
+    
+    this._shortcuts = {};
+
+    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Period,
+                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = this._selectNextCallFrameOnStack.bind(this);
+
+    var shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Comma,
+                                                         WebInspector.KeyboardShortcut.Modifiers.Ctrl);
+    this._shortcuts[shortcut] = this._selectPreviousCallFrameOnStack.bind(this);
+}
+
+WebInspector.CallStackSidebarPane.prototype = {
+    update: function(callFrames, sourceIDMap)
+    {
+        this.bodyElement.removeChildren();
+
+        this.placards = [];
+        delete this._selectedCallFrame;
+
+        if (!callFrames) {
+            var infoElement = document.createElement("div");
+            infoElement.className = "info";
+            infoElement.textContent = WebInspector.UIString("Not Paused");
+            this.bodyElement.appendChild(infoElement);
+            return;
+        }
+
+        var title;
+        var subtitle;
+        var scriptOrResource;
+
+        for (var i = 0; i < callFrames.length; ++i) {
+            var callFrame = callFrames[i];
+            switch (callFrame.type) {
+            case "function":
+                title = callFrame.functionName || WebInspector.UIString("(anonymous function)");
+                break;
+            case "program":
+                title = WebInspector.UIString("(program)");
+                break;
+            }
+
+            scriptOrResource = sourceIDMap[callFrame.sourceID];
+            subtitle = WebInspector.displayNameForURL(scriptOrResource.sourceURL || scriptOrResource.url);
+
+            if (callFrame.line > 0) {
+                if (subtitle)
+                    subtitle += ":" + callFrame.line;
+                else
+                    subtitle = WebInspector.UIString("line %d", callFrame.line);
+            }
+
+            var placard = new WebInspector.Placard(title, subtitle);
+            placard.callFrame = callFrame;
+
+            placard.element.addEventListener("click", this._placardSelected.bind(this), false);
+
+            this.placards.push(placard);
+            this.bodyElement.appendChild(placard.element);
+        }
+    },
+
+    get selectedCallFrame()
+    {
+        return this._selectedCallFrame;
+    },
+
+    set selectedCallFrame(x)
+    {
+        if (this._selectedCallFrame === x)
+            return;
+
+        this._selectedCallFrame = x;
+
+        for (var i = 0; i < this.placards.length; ++i) {
+            var placard = this.placards[i];
+            placard.selected = (placard.callFrame === this._selectedCallFrame);
+        }
+
+        this.dispatchEventToListeners("call frame selected");
+    },
+
+    handleShortcut: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.handled = true;
+        }
+    },
+
+    _selectNextCallFrameOnStack: function()
+    {
+        var index = this._selectedCallFrameIndex();
+        if (index == -1)
+            return;
+        this._selectedPlacardByIndex(index + 1);
+    },
+
+    _selectPreviousCallFrameOnStack: function()
+    {
+        var index = this._selectedCallFrameIndex();
+        if (index == -1)
+            return;
+        this._selectedPlacardByIndex(index - 1);
+    },
+
+    _selectedPlacardByIndex: function(index)
+    {
+        if (index < 0 || index >= this.placards.length)
+            return;
+        var placard = this.placards[index];
+        this.selectedCallFrame = placard.callFrame
+    },
+
+    _selectedCallFrameIndex: function()
+    {
+        if (!this._selectedCallFrame)
+            return -1;
+        for (var i = 0; i < this.placards.length; ++i) {
+            var placard = this.placards[i];
+            if (placard.callFrame === this._selectedCallFrame)
+                return i;
+        }
+        return -1;
+    },
+
+    _placardSelected: function(event)
+    {
+        var placardElement = event.target.enclosingNodeOrSelfWithClass("placard");
+        this.selectedCallFrame = placardElement.placard.callFrame;
+    }
+}
+
+WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* ScopeChainSidebarPane.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScopeChainSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Scope Variables"));
+    this._expandedProperties = [];
+}
+
+WebInspector.ScopeChainSidebarPane.prototype = {
+    update: function(callFrame)
+    {
+        this.bodyElement.removeChildren();
+
+        this.sections = [];
+        this.callFrame = callFrame;
+
+        if (!callFrame) {
+            var infoElement = document.createElement("div");
+            infoElement.className = "info";
+            infoElement.textContent = WebInspector.UIString("Not Paused");
+            this.bodyElement.appendChild(infoElement);
+            return;
+        }
+
+        var foundLocalScope = false;
+        var scopeChain = callFrame.scopeChain;
+        for (var i = 0; i < scopeChain.length; ++i) {
+            var scopeObjectProxy = scopeChain[i];
+            var title = null;
+            var subtitle = scopeObjectProxy.description;
+            var emptyPlaceholder = null;
+            var extraProperties = null;
+
+            if (scopeObjectProxy.isLocal) {
+                foundLocalScope = true;
+                title = WebInspector.UIString("Local");
+                emptyPlaceholder = WebInspector.UIString("No Variables");
+                subtitle = null;
+                if (scopeObjectProxy.thisObject)
+                    extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
+            } else if (scopeObjectProxy.isClosure) {
+                title = WebInspector.UIString("Closure");
+                emptyPlaceholder = WebInspector.UIString("No Variables");
+                subtitle = null;
+            } else if (i === (scopeChain.length - 1))
+                title = WebInspector.UIString("Global");
+            else if (scopeObjectProxy.isElement)
+                title = WebInspector.UIString("Event Target");
+            else if (scopeObjectProxy.isDocument)
+                title = WebInspector.UIString("Event Document");
+            else if (scopeObjectProxy.isWithBlock)
+                title = WebInspector.UIString("With Block");
+
+            if (!title || title === subtitle)
+                subtitle = null;
+
+            var section = new WebInspector.ObjectPropertiesSection(scopeObjectProxy, title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
+            section.editInSelectedCallFrameWhenPaused = true;
+            section.pane = this;
+
+            if (!foundLocalScope || scopeObjectProxy.isLocal)
+                section.expanded = true;
+
+            this.sections.push(section);
+            this.bodyElement.appendChild(section.element);
+        }
+    }
+}
+
+WebInspector.ScopeChainSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.ScopeVariableTreeElement = function(property)
+{
+    WebInspector.ObjectPropertyTreeElement.call(this, property);
+}
+
+WebInspector.ScopeVariableTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);
+        if (this.hasChildren && this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)
+            this.expand();
+    },
+
+    onexpand: function()
+    {
+        this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier] = true;
+    },
+
+    oncollapse: function()
+    {
+        delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];
+    },
+
+    get propertyIdentifier()
+    {
+        if ("_propertyIdentifier" in this)
+            return this._propertyIdentifier;
+        var section = this.treeOutline.section;
+        this._propertyIdentifier = section.title + ":" + (section.subtitle ? section.subtitle + ":" : "") + this.propertyPath;
+        return this._propertyIdentifier;
+    },
+
+    get propertyPath()
+    {
+        if ("_propertyPath" in this)
+            return this._propertyPath;
+
+        var current = this;
+        var result;
+
+        do {
+            if (result)
+                result = current.property.name + "." + result;
+            else
+                result = current.property.name;
+            current = current.parent;
+        } while (current && !current.root);
+
+        this._propertyPath = result;
+        return result;
+    }
+}
+
+WebInspector.ScopeVariableTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
+
+/* WatchExpressionsSidebarPane.js */
+
+/*
+ * Copyright (C) IBM Corp. 2009  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of IBM Corp. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WatchExpressionsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+}
+
+WebInspector.WatchExpressionsSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        this.bodyElement.removeChildren();
+
+        this.expanded = WebInspector.settings.watchExpressions.length > 0;
+        this.section = new WebInspector.WatchExpressionsSection();
+        this.bodyElement.appendChild(this.section.element);
+
+        var addElement = document.createElement("button");
+        addElement.setAttribute("type", "button");
+        addElement.textContent = WebInspector.UIString("Add");
+        addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);
+
+        var refreshElement = document.createElement("button");
+        refreshElement.setAttribute("type", "button");
+        refreshElement.textContent = WebInspector.UIString("Refresh");
+        refreshElement.addEventListener("click", this.section.update.bind(this.section), false);
+
+        var centerElement = document.createElement("div");
+        centerElement.addStyleClass("watch-expressions-buttons-container");
+        centerElement.appendChild(addElement);
+        centerElement.appendChild(refreshElement);
+        this.bodyElement.appendChild(centerElement);
+
+        this.onexpand = this.refreshExpressions.bind(this);
+    },
+
+    refreshExpressions: function()
+    {
+        if (this.section)
+            this.section.update();
+    }
+}
+
+WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.WatchExpressionsSection = function()
+{
+    this._watchObjectGroupId = "watch-group";
+
+    WebInspector.ObjectPropertiesSection.call(this);
+
+    this.watchExpressions = WebInspector.settings.watchExpressions;
+
+    this.headerElement.className = "hidden";
+    this.editable = true;
+    this.expanded = true;
+    this.propertiesElement.addStyleClass("watch-expressions");
+}
+
+WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
+
+WebInspector.WatchExpressionsSection.prototype = {
+    update: function()
+    {
+        function appendResult(expression, watchIndex, result, exception)
+        {
+            if (exception) {
+                // Exception results are not wrappers, but text messages.
+                result = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
+            } else if (result.type === "string") {
+                // Evaluation result is intentionally not abbreviated. However, we'd like to distinguish between null and "null"
+                result.description = "\"" + result.description + "\"";
+            }
+
+            var property = new WebInspector.ObjectPropertyProxy(expression, result);
+            property.watchIndex = watchIndex;
+            property.isException = exception;
+
+            // For newly added, empty expressions, set description to "",
+            // since otherwise you get DOMWindow
+            if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) 
+                property.value.description = "";
+
+            // To clarify what's going on here: 
+            // In the outer function, we calculate the number of properties
+            // that we're going to be updating, and set that in the
+            // propertyCount variable.  
+            // In this function, we test to see when we are processing the 
+            // last property, and then call the superclass's updateProperties() 
+            // method to get all the properties refreshed at once.
+            properties.push(property);
+            
+            if (properties.length == propertyCount) {
+                this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
+
+                // check to see if we just added a new watch expression,
+                // which will always be the last property
+                if (this._newExpressionAdded) {
+                    delete this._newExpressionAdded;
+
+                    treeElement = this.findAddedTreeElement();
+                    if (treeElement)
+                        treeElement.startEditing();
+                }
+            }
+        }
+
+        // TODO: pass exact injected script id.
+        InspectorBackend.releaseWrapperObjectGroup(0, this._watchObjectGroupId)
+        var properties = [];
+
+        // Count the properties, so we known when to call this.updateProperties()
+        // in appendResult()
+        var propertyCount = 0;
+        for (var i = 0; i < this.watchExpressions.length; ++i) {
+            if (!this.watchExpressions[i]) 
+                continue;
+            ++propertyCount;
+        }
+
+        // Now process all the expressions, since we have the actual count,
+        // which is checked in the appendResult inner function.
+        for (var i = 0; i < this.watchExpressions.length; ++i) {
+            var expression = this.watchExpressions[i];
+            if (!expression)
+                continue;
+
+            WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));
+        }
+
+        // note this is setting the expansion of the tree, not the section;
+        // with no expressions, and expanded tree, we get some extra vertical
+        // white space
+        // FIXME: should change to use header buttons instead of the buttons
+        // at the bottom of the section, then we can add a "No Watch Expressions
+        // element when there are no watch expressions, and this issue should
+        // go away.
+        this.expanded = (propertyCount != 0);
+    },
+
+    addExpression: function()
+    {
+        this._newExpressionAdded = true;
+        this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);
+        this.update();
+    },
+
+    updateExpression: function(element, value)
+    {
+        this.watchExpressions[element.property.watchIndex] = value;
+        this.saveExpressions();
+        this.update();
+    },
+
+    findAddedTreeElement: function()
+    {
+        var children = this.propertiesTreeOutline.children;
+        for (var i = 0; i < children.length; ++i)
+            if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
+                return children[i];
+    },
+
+    saveExpressions: function()
+    {
+        var toSave = [];
+        for (var i = 0; i < this.watchExpressions.length; i++)
+            if (this.watchExpressions[i])
+                toSave.push(this.watchExpressions[i]);
+
+        WebInspector.settings.watchExpressions = toSave;
+        return toSave.length;
+    }
+}
+
+WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
+
+WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) 
+{
+    if (propertyA.watchIndex == propertyB.watchIndex)
+        return 0;
+    else if (propertyA.watchIndex < propertyB.watchIndex)
+        return -1;
+    else
+        return 1;
+}
+
+WebInspector.WatchExpressionTreeElement = function(property)
+{
+    WebInspector.ObjectPropertyTreeElement.call(this, property);
+}
+
+WebInspector.WatchExpressionTreeElement.prototype = {
+    update: function()
+    {
+        WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
+
+        if (this.property.isException)
+            this.valueElement.addStyleClass("watch-expressions-error-level");
+
+        var deleteButton = document.createElement("input");
+        deleteButton.type = "button";
+        deleteButton.title = WebInspector.UIString("Delete watch expression.");
+        deleteButton.addStyleClass("enabled-button");
+        deleteButton.addStyleClass("delete-button");
+        deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
+
+        this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);
+    },
+
+    _deleteButtonClicked: function()
+    {
+        this.treeOutline.section.updateExpression(this, null);
+    },
+
+    startEditing: function()
+    {
+        if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)
+            return;
+
+        this.nameElement.textContent = this.property.name.trim();
+
+        var context = { expanded: this.expanded };
+
+        // collapse temporarily, if required
+        this.hasChildren = false;
+
+        this.listItemElement.addStyleClass("editing-sub-part");
+
+        WebInspector.startEditing(this.nameElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingCancelled: function(element, context)
+    {
+        if (!this.nameElement.textContent)
+            this.treeOutline.section.updateExpression(this, null);
+            
+        this.update();
+        this.editingEnded(context);
+    },
+
+    applyExpression: function(expression, updateInterface)
+    {
+        expression = expression.trim();
+
+        if (!expression)
+            expression = null;
+
+        this.property.name = expression;
+        this.treeOutline.section.updateExpression(this, expression);
+    }
+}
+
+WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
+
+/* MetricsSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.MetricsSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));
+    this._inlineStyleId = null;
+    this._inlineStyleInjectedScriptId = null;
+}
+
+WebInspector.MetricsSidebarPane.prototype = {
+    update: function(node)
+    {
+        if (node)
+            this.node = node;
+        else
+            node = this.node;
+
+        if (!node || !node.ownerDocument.defaultView || node.nodeType !== Node.ELEMENT_NODE) {
+            this.bodyElement.removeChildren();
+            return;
+        }
+
+        var self = this;
+        var callback = function(stylePayload) {
+            if (!stylePayload)
+                return;
+            var style = WebInspector.CSSStyleDeclaration.parseStyle(stylePayload);
+            self._update(style);
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getComputedStyle(node.id, callback);
+
+        var inlineStyleCallback = function(stylePayload) {
+            if (!stylePayload)
+                return;
+            self._inlineStyleId = stylePayload.id;
+            self._inlineStyleInjectedScriptId = stylePayload.injectedScriptId;
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getInlineStyle(node.id, inlineStyleCallback);
+    },
+
+    _update: function(style)
+    {
+        var metricsElement = document.createElement("div");
+        metricsElement.className = "metrics";
+
+        function createBoxPartElement(style, name, side, suffix)
+        {
+            var propertyName = (name !== "position" ? name + "-" : "") + side + suffix;
+            var value = style.getPropertyValue(propertyName);
+            if (value === "" || (name !== "position" && value === "0px"))
+                value = "\u2012";
+            else if (name === "position" && value === "auto")
+                value = "\u2012";
+            value = value.replace(/px$/, "");
+
+            var element = document.createElement("div");
+            element.className = side;
+            element.textContent = value;
+            element.addEventListener("dblclick", this.startEditing.bind(this, element, name, propertyName), false);
+            return element;
+        }
+
+        // Display types for which margin is ignored.
+        var noMarginDisplayType = {
+            "table-cell": true,
+            "table-column": true,
+            "table-column-group": true,
+            "table-footer-group": true,
+            "table-header-group": true,
+            "table-row": true,
+            "table-row-group": true
+        };
+
+        // Display types for which padding is ignored.
+        var noPaddingDisplayType = {
+            "table-column": true,
+            "table-column-group": true,
+            "table-footer-group": true,
+            "table-header-group": true,
+            "table-row": true,
+            "table-row-group": true
+        };
+
+        // Position types for which top, left, bottom and right are ignored.
+        var noPositionType = {
+            "static": true
+        };
+
+        var boxes = ["content", "padding", "border", "margin", "position"];
+        var boxLabels = [WebInspector.UIString("content"), WebInspector.UIString("padding"), WebInspector.UIString("border"), WebInspector.UIString("margin"), WebInspector.UIString("position")];
+        var previousBox;
+        for (var i = 0; i < boxes.length; ++i) {
+            var name = boxes[i];
+
+            if (name === "margin" && noMarginDisplayType[style.display])
+                continue;
+            if (name === "padding" && noPaddingDisplayType[style.display])
+                continue;
+            if (name === "position" && noPositionType[style.position])
+                continue;
+
+            var boxElement = document.createElement("div");
+            boxElement.className = name;
+
+            if (name === "content") {
+                var width = style.width.replace(/px$/, "");
+                var widthElement = document.createElement("span");
+                widthElement.textContent = width;
+                widthElement.addEventListener("dblclick", this.startEditing.bind(this, widthElement, "width", "width"), false);
+
+                var height = style.height.replace(/px$/, "");
+                var heightElement = document.createElement("span");
+                heightElement.textContent = height;
+                heightElement.addEventListener("dblclick", this.startEditing.bind(this, heightElement, "height", "height"), false);
+
+                boxElement.appendChild(widthElement);
+                boxElement.appendChild(document.createTextNode(" \u00D7 "));
+                boxElement.appendChild(heightElement);
+            } else {
+                var suffix = (name === "border" ? "-width" : "");
+
+                var labelElement = document.createElement("div");
+                labelElement.className = "label";
+                labelElement.textContent = boxLabels[i];
+                boxElement.appendChild(labelElement);
+
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "top", suffix));
+                boxElement.appendChild(document.createElement("br"));
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "left", suffix));
+
+                if (previousBox)
+                    boxElement.appendChild(previousBox);
+
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "right", suffix));
+                boxElement.appendChild(document.createElement("br"));
+                boxElement.appendChild(createBoxPartElement.call(this, style, name, "bottom", suffix));
+            }
+
+            previousBox = boxElement;
+        }
+
+        metricsElement.appendChild(previousBox);
+        this.bodyElement.removeChildren();
+        this.bodyElement.appendChild(metricsElement);
+    },
+
+    startEditing: function(targetElement, box, styleProperty)
+    {
+        if (WebInspector.isBeingEdited(targetElement))
+            return;
+
+        var context = { box: box, styleProperty: styleProperty };
+
+        WebInspector.startEditing(targetElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+    },
+
+    editingCancelled: function(element, context)
+    {
+        this.update();
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context)
+    {
+        if (userInput === previousContent)
+            return this.editingCancelled(element, context); // nothing changed, so cancel
+
+        if (context.box !== "position" && (!userInput || userInput === "\u2012"))
+            userInput = "0px";
+        else if (context.box === "position" && (!userInput || userInput === "\u2012"))
+            userInput = "auto";
+
+        // Append a "px" unit if the user input was just a number.
+        if (/^\d+$/.test(userInput))
+            userInput += "px";
+
+        var self = this;
+        var callback = function(success) {
+            if (!success)
+                return;
+            self.dispatchEventToListeners("metrics edited");
+            self.update();
+        };
+        InjectedScriptAccess.get(this._inlineStyleInjectedScriptId).setStyleProperty(this._inlineStyleId, context.styleProperty, userInput, callback);
+    }
+}
+
+WebInspector.MetricsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* PropertiesSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PropertiesSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Properties"));
+}
+
+WebInspector.PropertiesSidebarPane.prototype = {
+    update: function(node)
+    {
+        var body = this.bodyElement;
+
+        if (!node) {
+            body.removeChildren();
+            this.sections = [];
+            return;
+        }
+
+        var self = this;
+        var callback = function(prototypes) {
+            var body = self.bodyElement;
+            body.removeChildren();
+            self.sections = [];
+
+            var path = [];
+            // Get array of prototype user-friendly names.
+            for (var i = 0; i < prototypes.length; ++i) {
+                var prototype = new WebInspector.ObjectProxy(node.injectedScriptId, node.id, path.slice());
+                var section = new WebInspector.ObjectPropertiesSection(prototype, prototypes[i], WebInspector.UIString("Prototype"));
+                self.sections.push(section);
+                body.appendChild(section.element);
+                path.push("__proto__");
+            }
+        };
+        InjectedScriptAccess.get(node.injectedScriptId).getPrototypes(node.id, callback);
+    }
+}
+
+WebInspector.PropertiesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* EventListenersSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.EventListenersSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners"));
+    this.bodyElement.addStyleClass("events-pane");
+
+    this.sections = [];
+
+    this.settingsSelectElement = document.createElement("select");
+
+    var option = document.createElement("option");
+    option.value = "all";
+    option.label = WebInspector.UIString("All Nodes");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "selected";
+    option.label = WebInspector.UIString("Selected Node Only");
+    this.settingsSelectElement.appendChild(option);
+
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
+    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
+
+    this.titleElement.appendChild(this.settingsSelectElement);
+}
+
+WebInspector.EventListenersSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        var filter = WebInspector.settings.eventListenersFilter;
+        if (filter === "all")
+            this.settingsSelectElement[0].selected = true;
+        if (filter === "selected")
+            this.settingsSelectElement[1].selected = true;
+    },
+
+    update: function(node)
+    {
+        var body = this.bodyElement;
+        body.removeChildren();
+        this.sections = [];
+
+        var self = this;
+        function callback(nodeId, eventListeners) {
+            var sectionNames = [];
+            var sectionMap = {};
+            for (var i = 0; i < eventListeners.length; ++i) {
+                var eventListener = eventListeners[i];
+                eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);
+                delete eventListener.nodeId; // no longer needed
+                if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString()))
+                    continue; // ignore event listeners generated by monitorEvent
+                var type = eventListener.type;
+                var section = sectionMap[type];
+                if (!section) {
+                    section = new WebInspector.EventListenersSection(type, nodeId);
+                    sectionMap[type] = section;
+                    sectionNames.push(type);
+                    self.sections.push(section);
+                }
+                section.addListener(eventListener);
+            }
+            
+            if (sectionNames.length === 0) {
+                var div = document.createElement("div");
+                div.className = "info";
+                div.textContent = WebInspector.UIString("No Event Listeners");
+                body.appendChild(div);
+                return;
+            }
+
+            sectionNames.sort();
+            for (var i = 0; i < sectionNames.length; ++i) {
+                var section = sectionMap[sectionNames[i]];
+                section.update();
+                body.appendChild(section.element);
+            }
+        }
+
+        WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback);
+    },
+
+    _changeSetting: function(event)
+    {
+        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
+        WebInspector.settings.eventListenersFilter = selectedOption.value;
+
+        for (var i = 0; i < this.sections.length; ++i)
+            this.sections[i].update();
+    }
+}
+
+WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.EventListenersSection = function(title, nodeId)
+{
+    this.eventListeners = [];
+    this._nodeId = nodeId;
+    WebInspector.PropertiesSection.call(this, title);
+
+    // Changed from a Properties List
+    this.propertiesElement.parentNode.removeChild(this.propertiesElement);
+    delete this.propertiesElement;
+    delete this.propertiesTreeOutline;
+
+    this.eventBars = document.createElement("div");
+    this.eventBars.className = "event-bars";
+    this.element.appendChild(this.eventBars);
+}
+
+WebInspector.EventListenersSection.prototype = {
+    update: function()
+    {
+        // A Filtered Array simplifies when to create connectors
+        var filteredEventListeners = this.eventListeners;
+        if (WebInspector.settings.eventListenersFilter === "selected") {
+            filteredEventListeners = [];
+            for (var i = 0; i < this.eventListeners.length; ++i) {
+                var eventListener = this.eventListeners[i];
+                if (eventListener.node.id === this._nodeId)
+                    filteredEventListeners.push(eventListener);
+            }
+        }
+
+        this.eventBars.removeChildren();
+        var length = filteredEventListeners.length;
+        for (var i = 0; i < length; ++i) {
+            var eventListener = filteredEventListeners[i];
+            var eventListenerBar = new WebInspector.EventListenerBar(eventListener);
+            if (i < length - 1) {
+                var connector = document.createElement("div");
+                connector.className = "event-bar-connector";
+                eventListenerBar.element.appendChild(connector);
+            }
+
+            this.eventBars.appendChild(eventListenerBar.element);
+        }
+    },
+
+    addListener: function(eventListener)
+    {
+        this.eventListeners.push(eventListener);
+    }
+}
+
+WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.EventListenerBar = function(eventListener)
+{
+    this.eventListener = eventListener;
+    WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName());
+    this.editable = false;
+    this.element.className = "event-bar"; /* Changed from "section" */
+    this.propertiesElement.className = "event-properties"; /* Changed from "properties" */
+}
+
+WebInspector.EventListenerBar.prototype = {
+    update: function()
+    {
+        var properties = [];
+        for (var propertyName in this.eventListener) {
+            // Just build properties in place - no need to reach out for injected script.
+            var value = this.eventListener[propertyName];
+            if (value instanceof WebInspector.DOMNode)
+                value = new WebInspector.ObjectProxy(value.injectedScriptId, value.id, [], appropriateSelectorForNode(value), true);
+            else
+                value = WebInspector.ObjectProxy.wrapPrimitiveValue(value);
+            properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value));
+        }
+        this.updateProperties(properties);
+    },
+
+    _getNodeDisplayName: function()
+    {
+        var node = this.eventListener.node;
+        if (!node)
+            return "";
+
+        if (node.nodeType === Node.DOCUMENT_NODE)
+            return "document";
+
+        return appropriateSelectorForNode(node);
+    },
+
+    _getFunctionDisplayName: function()
+    {
+        // Requires that Function.toString() return at least the function's signature.
+        var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/);
+        return (match ? match[1] : WebInspector.UIString("(anonymous function)"));
+    }
+}
+
+WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
+
+/* Color.js */
+
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.Color = function(str)
+{
+    this.value = str;
+    this._parse();
+}
+
+WebInspector.Color.prototype = {
+    get shorthex()
+    {
+        if ("_short" in this)
+            return this._short;
+
+        if (!this.simple)
+            return null;
+
+        var hex = this.hex;
+        if (hex.charAt(0) === hex.charAt(1) && hex.charAt(2) === hex.charAt(3) && hex.charAt(4) === hex.charAt(5))
+            this._short = hex.charAt(0) + hex.charAt(2) + hex.charAt(4);
+        else
+            this._short = hex;
+
+        return this._short;
+    },
+
+    get hex()
+    {
+        if (!this.simple)
+            return null;
+
+        return this._hex;
+    },
+
+    set hex(x)
+    {
+        this._hex = x;
+    },
+
+    get rgb()
+    {
+        if ("_rgb" in this)
+            return this._rgb;
+
+        if (this.simple)
+            this._rgb = this._hexToRGB(this.hex);
+        else {
+            var rgba = this.rgba;
+            this._rgb = [rgba[0], rgba[1], rgba[2]];
+        }
+
+        return this._rgb;
+    },
+
+    set rgb(x)
+    {
+        this._rgb = x;
+    },
+
+    get hsl()
+    {
+        if ("_hsl" in this)
+            return this._hsl;
+
+        this._hsl = this._rgbToHSL(this.rgb);
+        return this._hsl;
+    },
+
+    set hsl(x)
+    {
+        this._hsl = x;
+    },
+
+    get nickname()
+    {
+        if (typeof this._nickname !== "undefined") // would be set on parse if there was a nickname
+            return this._nickname;
+        else
+            return null;
+    },
+
+    set nickname(x)
+    {
+        this._nickname = x;
+    },
+
+    get rgba()
+    {
+        return this._rgba;
+    },
+
+    set rgba(x)
+    {
+        this._rgba = x;
+    },
+
+    get hsla()
+    {
+        return this._hsla;
+    },
+
+    set hsla(x)
+    {
+        this._hsla = x;
+    },
+
+    hasShortHex: function()
+    {
+        var shorthex = this.shorthex;
+        return (shorthex && shorthex.length === 3);
+    },
+
+    toString: function(format)
+    {
+        if (!format)
+            format = this.format;
+
+        switch (format) {
+            case "rgb":
+                return "rgb(" + this.rgb.join(", ") + ")";
+            case "rgba":
+                return "rgba(" + this.rgba.join(", ") + ")";
+            case "hsl":
+                var hsl = this.hsl;
+                return "hsl(" + hsl[0] + ", " + hsl[1] + "%, " + hsl[2] + "%)";
+            case "hsla":
+                var hsla = this.hsla;
+                return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
+            case "hex":
+                return "#" + this.hex;
+            case "shorthex":
+                return "#" + this.shorthex;
+            case "nickname":
+                return this.nickname;
+        }
+
+        throw "invalid color format";
+    },
+
+    _rgbToHex: function(rgb)
+    {
+        var r = parseInt(rgb[0]).toString(16);
+        var g = parseInt(rgb[1]).toString(16);
+        var b = parseInt(rgb[2]).toString(16);
+        if (r.length === 1)
+            r = "0" + r;
+        if (g.length === 1)
+            g = "0" + g;
+        if (b.length === 1)
+            b = "0" + b;
+
+        return (r + g + b).toUpperCase();
+    },
+
+    _hexToRGB: function(hex)
+    {
+        var r = parseInt(hex.substring(0,2), 16);
+        var g = parseInt(hex.substring(2,4), 16);
+        var b = parseInt(hex.substring(4,6), 16);
+
+        return [r, g, b];
+    },
+
+    _rgbToHSL: function(rgb)
+    {
+        var r = parseInt(rgb[0]) / 255;
+        var g = parseInt(rgb[1]) / 255;
+        var b = parseInt(rgb[2]) / 255;
+        var max = Math.max(r, g, b);
+        var min = Math.min(r, g, b);
+        var diff = max - min;
+        var add = max + min;
+
+        if (min === max)
+            var h = 0;
+        else if (r === max)
+            var h = ((60 * (g - b) / diff) + 360) % 360;
+        else if (g === max)
+            var h = (60 * (b - r) / diff) + 120;
+        else
+            var h = (60 * (r - g) / diff) + 240;
+
+        var l = 0.5 * add;
+
+        if (l === 0)
+            var s = 0;
+        else if (l === 1)
+            var s = 1;
+        else if (l <= 0.5)
+            var s = diff / add;
+        else
+            var s = diff / (2 - add);
+
+        h = Math.round(h);
+        s = Math.round(s*100);
+        l = Math.round(l*100);
+
+        return [h, s, l];
+    },
+
+    _hslToRGB: function(hsl)
+    {
+        var h = parseFloat(hsl[0]) / 360;
+        var s = parseFloat(hsl[1]) / 100;
+        var l = parseFloat(hsl[2]) / 100;
+
+        if (l <= 0.5)
+            var q = l * (1 + s);
+        else
+            var q = l + s - (l * s);
+
+        var p = 2 * l - q;
+
+        var tr = h + (1 / 3);
+        var tg = h;
+        var tb = h - (1 / 3);
+
+        var r = Math.round(hueToRGB(p, q, tr) * 255);
+        var g = Math.round(hueToRGB(p, q, tg) * 255);
+        var b = Math.round(hueToRGB(p, q, tb) * 255);
+        return [r, g, b];
+
+        function hueToRGB(p, q, h) {
+            if (h < 0)
+                h += 1;
+            else if (h > 1)
+                h -= 1;
+
+            if ((h * 6) < 1)
+                return p + (q - p) * h * 6;
+            else if ((h * 2) < 1)
+                return q;
+            else if ((h * 3) < 2)
+                return p + (q - p) * ((2 / 3) - h) * 6;
+            else
+                return p;
+        }
+    },
+
+    _rgbaToHSLA: function(rgba)
+    {
+        var alpha = rgba[3];
+        var hsl = this._rgbToHSL(rgba)
+        hsl.push(alpha);
+        return hsl;
+    },
+
+    _hslaToRGBA: function(hsla)
+    {
+        var alpha = hsla[3];
+        var rgb = this._hslToRGB(hsla);
+        rgb.push(alpha);
+        return rgb;
+    },
+
+    _parse: function()
+    {
+        // Special Values - Advanced but Must Be Parsed First - transparent
+        var value = this.value.toLowerCase().replace(/%|\s+/g, "");
+        if (value in WebInspector.Color.AdvancedNickNames) {
+            this.format = "nickname";
+            var set = WebInspector.Color.AdvancedNickNames[value];
+            this.simple = false;
+            this.rgba = set[0];
+            this.hsla = set[1];
+            this.nickname = set[2];
+            this.alpha = set[0][3];
+            return;
+        }
+
+        // Simple - #hex, rgb(), nickname, hsl()
+        var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;
+        var match = this.value.match(simple);
+        if (match) {
+            this.simple = true;
+
+            if (match[1]) { // hex
+                var hex = match[1].toUpperCase();
+                if (hex.length === 3) {
+                    this.format = "shorthex";
+                    this.hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
+                } else {
+                    this.format = "hex";
+                    this.hex = hex;
+                }
+            } else if (match[2]) { // rgb
+                this.format = "rgb";
+                var rgb = match[2].split(/\s*,\s*/);
+                this.rgb = rgb;
+                this.hex = this._rgbToHex(rgb);
+            } else if (match[3]) { // nickname
+                var nickname = match[3].toLowerCase();
+                if (nickname in WebInspector.Color.Nicknames) {
+                    this.format = "nickname";
+                    this.hex = WebInspector.Color.Nicknames[nickname];
+                } else // unknown name
+                    throw "unknown color name";
+            } else if (match[4]) { // hsl
+                this.format = "hsl";
+                var hsl = match[4].replace(/%g/, "").split(/\s*,\s*/);
+                this.hsl = hsl;
+                this.rgb = this._hslToRGB(hsl);
+                this.hex = this._rgbToHex(this.rgb);
+            }
+
+            // Fill in the values if this is a known hex color
+            var hex = this.hex;
+            if (hex && hex in WebInspector.Color.HexTable) {
+                var set = WebInspector.Color.HexTable[hex];
+                this.rgb = set[0];
+                this.hsl = set[1];
+                this.nickname = set[2];
+            }
+
+            return;
+        }
+
+        // Advanced - rgba(), hsla()
+        var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;
+        match = this.value.match(advanced);
+        if (match) {
+            this.simple = false;
+            if (match[1]) { // rgba
+                this.format = "rgba";
+                this.rgba = match[1].split(/\s*,\s*/);
+                this.hsla = this._rgbaToHSLA(this.rgba);
+                this.alpha = this.rgba[3];
+            } else if (match[2]) { // hsla
+                this.format = "hsla";
+                this.hsla = match[2].replace(/%/g, "").split(/\s*,\s*/);
+                this.rgba = this._hslaToRGBA(this.hsla);
+                this.alpha = this.hsla[3];
+            }
+
+            return;
+        }
+
+        // Could not parse as a valid color
+        throw "could not parse color";
+    }
+}
+
+// Simple Values: [rgb, hsl, nickname]
+WebInspector.Color.HexTable = {
+    "000000": [[0, 0, 0], [0, 0, 0], "black"],
+    "000080": [[0, 0, 128], [240, 100, 25], "navy"],
+    "00008B": [[0, 0, 139], [240, 100, 27], "darkBlue"],
+    "0000CD": [[0, 0, 205], [240, 100, 40], "mediumBlue"],
+    "0000FF": [[0, 0, 255], [240, 100, 50], "blue"],
+    "006400": [[0, 100, 0], [120, 100, 20], "darkGreen"],
+    "008000": [[0, 128, 0], [120, 100, 25], "green"],
+    "008080": [[0, 128, 128], [180, 100, 25], "teal"],
+    "008B8B": [[0, 139, 139], [180, 100, 27], "darkCyan"],
+    "00BFFF": [[0, 191, 255], [195, 100, 50], "deepSkyBlue"],
+    "00CED1": [[0, 206, 209], [181, 100, 41], "darkTurquoise"],
+    "00FA9A": [[0, 250, 154], [157, 100, 49], "mediumSpringGreen"],
+    "00FF00": [[0, 255, 0], [120, 100, 50], "lime"],
+    "00FF7F": [[0, 255, 127], [150, 100, 50], "springGreen"],
+    "00FFFF": [[0, 255, 255], [180, 100, 50], "cyan"],
+    "191970": [[25, 25, 112], [240, 64, 27], "midnightBlue"],
+    "1E90FF": [[30, 144, 255], [210, 100, 56], "dodgerBlue"],
+    "20B2AA": [[32, 178, 170], [177, 70, 41], "lightSeaGreen"],
+    "228B22": [[34, 139, 34], [120, 61, 34], "forestGreen"],
+    "2E8B57": [[46, 139, 87], [146, 50, 36], "seaGreen"],
+    "2F4F4F": [[47, 79, 79], [180, 25, 25], "darkSlateGray"],
+    "32CD32": [[50, 205, 50], [120, 61, 50], "limeGreen"],
+    "3CB371": [[60, 179, 113], [147, 50, 47], "mediumSeaGreen"],
+    "40E0D0": [[64, 224, 208], [174, 72, 56], "turquoise"],
+    "4169E1": [[65, 105, 225], [225, 73, 57], "royalBlue"],
+    "4682B4": [[70, 130, 180], [207, 44, 49], "steelBlue"],
+    "483D8B": [[72, 61, 139], [248, 39, 39], "darkSlateBlue"],
+    "48D1CC": [[72, 209, 204], [178, 60, 55], "mediumTurquoise"],
+    "4B0082": [[75, 0, 130], [275, 100, 25], "indigo"],
+    "556B2F": [[85, 107, 47], [82, 39, 30], "darkOliveGreen"],
+    "5F9EA0": [[95, 158, 160], [182, 25, 50], "cadetBlue"],
+    "6495ED": [[100, 149, 237], [219, 79, 66], "cornflowerBlue"],
+    "66CDAA": [[102, 205, 170], [160, 51, 60], "mediumAquaMarine"],
+    "696969": [[105, 105, 105], [0, 0, 41], "dimGray"],
+    "6A5ACD": [[106, 90, 205], [248, 53, 58], "slateBlue"],
+    "6B8E23": [[107, 142, 35], [80, 60, 35], "oliveDrab"],
+    "708090": [[112, 128, 144], [210, 13, 50], "slateGray"],
+    "778899": [[119, 136, 153], [210, 14, 53], "lightSlateGray"],
+    "7B68EE": [[123, 104, 238], [249, 80, 67], "mediumSlateBlue"],
+    "7CFC00": [[124, 252, 0], [90, 100, 49], "lawnGreen"],
+    "7FFF00": [[127, 255, 0], [90, 100, 50], "chartreuse"],
+    "7FFFD4": [[127, 255, 212], [160, 100, 75], "aquamarine"],
+    "800000": [[128, 0, 0], [0, 100, 25], "maroon"],
+    "800080": [[128, 0, 128], [300, 100, 25], "purple"],
+    "808000": [[128, 128, 0], [60, 100, 25], "olive"],
+    "808080": [[128, 128, 128], [0, 0, 50], "gray"],
+    "87CEEB": [[135, 206, 235], [197, 71, 73], "skyBlue"],
+    "87CEFA": [[135, 206, 250], [203, 92, 75], "lightSkyBlue"],
+    "8A2BE2": [[138, 43, 226], [271, 76, 53], "blueViolet"],
+    "8B0000": [[139, 0, 0], [0, 100, 27], "darkRed"],
+    "8B008B": [[139, 0, 139], [300, 100, 27], "darkMagenta"],
+    "8B4513": [[139, 69, 19], [25, 76, 31], "saddleBrown"],
+    "8FBC8F": [[143, 188, 143], [120, 25, 65], "darkSeaGreen"],
+    "90EE90": [[144, 238, 144], [120, 73, 75], "lightGreen"],
+    "9370D8": [[147, 112, 219], [260, 60, 65], "mediumPurple"],
+    "9400D3": [[148, 0, 211], [282, 100, 41], "darkViolet"],
+    "98FB98": [[152, 251, 152], [120, 93, 79], "paleGreen"],
+    "9932CC": [[153, 50, 204], [280, 61, 50], "darkOrchid"],
+    "9ACD32": [[154, 205, 50], [80, 61, 50], "yellowGreen"],
+    "A0522D": [[160, 82, 45], [19, 56, 40], "sienna"],
+    "A52A2A": [[165, 42, 42], [0, 59, 41], "brown"],
+    "A9A9A9": [[169, 169, 169], [0, 0, 66], "darkGray"],
+    "ADD8E6": [[173, 216, 230], [195, 53, 79], "lightBlue"],
+    "ADFF2F": [[173, 255, 47], [84, 100, 59], "greenYellow"],
+    "AFEEEE": [[175, 238, 238], [180, 65, 81], "paleTurquoise"],
+    "B0C4DE": [[176, 196, 222], [214, 41, 78], "lightSteelBlue"],
+    "B0E0E6": [[176, 224, 230], [187, 52, 80], "powderBlue"],
+    "B22222": [[178, 34, 34], [0, 68, 42], "fireBrick"],
+    "B8860B": [[184, 134, 11], [43, 89, 38], "darkGoldenrod"],
+    "BA55D3": [[186, 85, 211], [288, 59, 58], "mediumOrchid"],
+    "BC8F8F": [[188, 143, 143], [0, 25, 65], "rosyBrown"],
+    "BDB76B": [[189, 183, 107], [56, 38, 58], "darkKhaki"],
+    "C0C0C0": [[192, 192, 192], [0, 0, 75], "silver"],
+    "C71585": [[199, 21, 133], [322, 81, 43], "mediumVioletRed"],
+    "CD5C5C": [[205, 92, 92], [0, 53, 58], "indianRed"],
+    "CD853F": [[205, 133, 63], [30, 59, 53], "peru"],
+    "D2691E": [[210, 105, 30], [25, 75, 47], "chocolate"],
+    "D2B48C": [[210, 180, 140], [34, 44, 69], "tan"],
+    "D3D3D3": [[211, 211, 211], [0, 0, 83], "lightGrey"],
+    "D87093": [[219, 112, 147], [340, 60, 65], "paleVioletRed"],
+    "D8BFD8": [[216, 191, 216], [300, 24, 80], "thistle"],
+    "DA70D6": [[218, 112, 214], [302, 59, 65], "orchid"],
+    "DAA520": [[218, 165, 32], [43, 74, 49], "goldenrod"],
+    "DC143C": [[237, 164, 61], [35, 83, 58], "crimson"],
+    "DCDCDC": [[220, 220, 220], [0, 0, 86], "gainsboro"],
+    "DDA0DD": [[221, 160, 221], [300, 47, 75], "plum"],
+    "DEB887": [[222, 184, 135], [34, 57, 70], "burlyWood"],
+    "E0FFFF": [[224, 255, 255], [180, 100, 94], "lightCyan"],
+    "E6E6FA": [[230, 230, 250], [240, 67, 94], "lavender"],
+    "E9967A": [[233, 150, 122], [15, 72, 70], "darkSalmon"],
+    "EE82EE": [[238, 130, 238], [300, 76, 72], "violet"],
+    "EEE8AA": [[238, 232, 170], [55, 67, 80], "paleGoldenrod"],
+    "F08080": [[240, 128, 128], [0, 79, 72], "lightCoral"],
+    "F0E68C": [[240, 230, 140], [54, 77, 75], "khaki"],
+    "F0F8FF": [[240, 248, 255], [208, 100, 97], "aliceBlue"],
+    "F0FFF0": [[240, 255, 240], [120, 100, 97], "honeyDew"],
+    "F0FFFF": [[240, 255, 255], [180, 100, 97], "azure"],
+    "F4A460": [[244, 164, 96], [28, 87, 67], "sandyBrown"],
+    "F5DEB3": [[245, 222, 179], [39, 77, 83], "wheat"],
+    "F5F5DC": [[245, 245, 220], [60, 56, 91], "beige"],
+    "F5F5F5": [[245, 245, 245], [0, 0, 96], "whiteSmoke"],
+    "F5FFFA": [[245, 255, 250], [150, 100, 98], "mintCream"],
+    "F8F8FF": [[248, 248, 255], [240, 100, 99], "ghostWhite"],
+    "FA8072": [[250, 128, 114], [6, 93, 71], "salmon"],
+    "FAEBD7": [[250, 235, 215], [34, 78, 91], "antiqueWhite"],
+    "FAF0E6": [[250, 240, 230], [30, 67, 94], "linen"],
+    "FAFAD2": [[250, 250, 210], [60, 80, 90], "lightGoldenrodYellow"],
+    "FDF5E6": [[253, 245, 230], [39, 85, 95], "oldLace"],
+    "FF0000": [[255, 0, 0], [0, 100, 50], "red"],
+    "FF00FF": [[255, 0, 255], [300, 100, 50], "magenta"],
+    "FF1493": [[255, 20, 147], [328, 100, 54], "deepPink"],
+    "FF4500": [[255, 69, 0], [16, 100, 50], "orangeRed"],
+    "FF6347": [[255, 99, 71], [9, 100, 64], "tomato"],
+    "FF69B4": [[255, 105, 180], [330, 100, 71], "hotPink"],
+    "FF7F50": [[255, 127, 80], [16, 100, 66], "coral"],
+    "FF8C00": [[255, 140, 0], [33, 100, 50], "darkOrange"],
+    "FFA07A": [[255, 160, 122], [17, 100, 74], "lightSalmon"],
+    "FFA500": [[255, 165, 0], [39, 100, 50], "orange"],
+    "FFB6C1": [[255, 182, 193], [351, 100, 86], "lightPink"],
+    "FFC0CB": [[255, 192, 203], [350, 100, 88], "pink"],
+    "FFD700": [[255, 215, 0], [51, 100, 50], "gold"],
+    "FFDAB9": [[255, 218, 185], [28, 100, 86], "peachPuff"],
+    "FFDEAD": [[255, 222, 173], [36, 100, 84], "navajoWhite"],
+    "FFE4B5": [[255, 228, 181], [38, 100, 85], "moccasin"],
+    "FFE4C4": [[255, 228, 196], [33, 100, 88], "bisque"],
+    "FFE4E1": [[255, 228, 225], [6, 100, 94], "mistyRose"],
+    "FFEBCD": [[255, 235, 205], [36, 100, 90], "blanchedAlmond"],
+    "FFEFD5": [[255, 239, 213], [37, 100, 92], "papayaWhip"],
+    "FFF0F5": [[255, 240, 245], [340, 100, 97], "lavenderBlush"],
+    "FFF5EE": [[255, 245, 238], [25, 100, 97], "seaShell"],
+    "FFF8DC": [[255, 248, 220], [48, 100, 93], "cornsilk"],
+    "FFFACD": [[255, 250, 205], [54, 100, 90], "lemonChiffon"],
+    "FFFAF0": [[255, 250, 240], [40, 100, 97], "floralWhite"],
+    "FFFAFA": [[255, 250, 250], [0, 100, 99], "snow"],
+    "FFFF00": [[255, 255, 0], [60, 100, 50], "yellow"],
+    "FFFFE0": [[255, 255, 224], [60, 100, 94], "lightYellow"],
+    "FFFFF0": [[255, 255, 240], [60, 100, 97], "ivory"],
+    "FFFFFF": [[255, 255, 255], [0, 100, 100], "white"]
+};
+
+// Simple Values
+WebInspector.Color.Nicknames = {
+    "aliceblue": "F0F8FF",
+    "antiquewhite": "FAEBD7",
+    "aqua": "00FFFF",
+    "aquamarine": "7FFFD4",
+    "azure": "F0FFFF",
+    "beige": "F5F5DC",
+    "bisque": "FFE4C4",
+    "black": "000000",
+    "blanchedalmond": "FFEBCD",
+    "blue": "0000FF",
+    "blueviolet": "8A2BE2",
+    "brown": "A52A2A",
+    "burlywood": "DEB887",
+    "cadetblue": "5F9EA0",
+    "chartreuse": "7FFF00",
+    "chocolate": "D2691E",
+    "coral": "FF7F50",
+    "cornflowerblue": "6495ED",
+    "cornsilk": "FFF8DC",
+    "crimson": "DC143C",
+    "cyan": "00FFFF",
+    "darkblue": "00008B",
+    "darkcyan": "008B8B",
+    "darkgoldenrod": "B8860B",
+    "darkgray": "A9A9A9",
+    "darkgreen": "006400",
+    "darkkhaki": "BDB76B",
+    "darkmagenta": "8B008B",
+    "darkolivegreen": "556B2F",
+    "darkorange": "FF8C00",
+    "darkorchid": "9932CC",
+    "darkred": "8B0000",
+    "darksalmon": "E9967A",
+    "darkseagreen": "8FBC8F",
+    "darkslateblue": "483D8B",
+    "darkslategray": "2F4F4F",
+    "darkturquoise": "00CED1",
+    "darkviolet": "9400D3",
+    "deeppink": "FF1493",
+    "deepskyblue": "00BFFF",
+    "dimgray": "696969",
+    "dodgerblue": "1E90FF",
+    "firebrick": "B22222",
+    "floralwhite": "FFFAF0",
+    "forestgreen": "228B22",
+    "fuchsia": "FF00FF",
+    "gainsboro": "DCDCDC",
+    "ghostwhite": "F8F8FF",
+    "gold": "FFD700",
+    "goldenrod": "DAA520",
+    "gray": "808080",
+    "green": "008000",
+    "greenyellow": "ADFF2F",
+    "honeydew": "F0FFF0",
+    "hotpink": "FF69B4",
+    "indianred": "CD5C5C",
+    "indigo": "4B0082",
+    "ivory": "FFFFF0",
+    "khaki": "F0E68C",
+    "lavender": "E6E6FA",
+    "lavenderblush": "FFF0F5",
+    "lawngreen": "7CFC00",
+    "lemonchiffon": "FFFACD",
+    "lightblue": "ADD8E6",
+    "lightcoral": "F08080",
+    "lightcyan": "E0FFFF",
+    "lightgoldenrodyellow": "FAFAD2",
+    "lightgreen": "90EE90",
+    "lightgrey": "D3D3D3",
+    "lightpink": "FFB6C1",
+    "lightsalmon": "FFA07A",
+    "lightseagreen": "20B2AA",
+    "lightskyblue": "87CEFA",
+    "lightslategray": "778899",
+    "lightsteelblue": "B0C4DE",
+    "lightyellow": "FFFFE0",
+    "lime": "00FF00",
+    "limegreen": "32CD32",
+    "linen": "FAF0E6",
+    "magenta": "FF00FF",
+    "maroon": "800000",
+    "mediumaquamarine": "66CDAA",
+    "mediumblue": "0000CD",
+    "mediumorchid": "BA55D3",
+    "mediumpurple": "9370D8",
+    "mediumseagreen": "3CB371",
+    "mediumslateblue": "7B68EE",
+    "mediumspringgreen": "00FA9A",
+    "mediumturquoise": "48D1CC",
+    "mediumvioletred": "C71585",
+    "midnightblue": "191970",
+    "mintcream": "F5FFFA",
+    "mistyrose": "FFE4E1",
+    "moccasin": "FFE4B5",
+    "navajowhite": "FFDEAD",
+    "navy": "000080",
+    "oldlace": "FDF5E6",
+    "olive": "808000",
+    "olivedrab": "6B8E23",
+    "orange": "FFA500",
+    "orangered": "FF4500",
+    "orchid": "DA70D6",
+    "palegoldenrod": "EEE8AA",
+    "palegreen": "98FB98",
+    "paleturquoise": "AFEEEE",
+    "palevioletred": "D87093",
+    "papayawhip": "FFEFD5",
+    "peachpuff": "FFDAB9",
+    "peru": "CD853F",
+    "pink": "FFC0CB",
+    "plum": "DDA0DD",
+    "powderblue": "B0E0E6",
+    "purple": "800080",
+    "red": "FF0000",
+    "rosybrown": "BC8F8F",
+    "royalblue": "4169E1",
+    "saddlebrown": "8B4513",
+    "salmon": "FA8072",
+    "sandybrown": "F4A460",
+    "seagreen": "2E8B57",
+    "seashell": "FFF5EE",
+    "sienna": "A0522D",
+    "silver": "C0C0C0",
+    "skyblue": "87CEEB",
+    "slateblue": "6A5ACD",
+    "slategray": "708090",
+    "snow": "FFFAFA",
+    "springgreen": "00FF7F",
+    "steelblue": "4682B4",
+    "tan": "D2B48C",
+    "teal": "008080",
+    "thistle": "D8BFD8",
+    "tomato": "FF6347",
+    "turquoise": "40E0D0",
+    "violet": "EE82EE",
+    "wheat": "F5DEB3",
+    "white": "FFFFFF",
+    "whitesmoke": "F5F5F5",
+    "yellow": "FFFF00",
+    "yellowgreen": "9ACD32"
+};
+
+// Advanced Values [rgba, hsla, nickname]
+WebInspector.Color.AdvancedNickNames = {
+    "transparent": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+    "rgba(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+    "hsla(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],
+};
+
+/* StylesSidebarPane.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StylesSidebarPane = function()
+{
+    WebInspector.SidebarPane.call(this, WebInspector.UIString("Styles"));
+
+    this.settingsSelectElement = document.createElement("select");
+
+    var option = document.createElement("option");
+    option.value = "hex";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("Hex Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "rgb";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("RGB Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    option = document.createElement("option");
+    option.value = "hsl";
+    option.action = this._changeColorFormat.bind(this);
+    option.label = WebInspector.UIString("HSL Colors");
+    this.settingsSelectElement.appendChild(option);
+
+    this.settingsSelectElement.appendChild(document.createElement("hr"));
+
+    option = document.createElement("option");
+    option.action = this._createNewRule.bind(this);
+    option.label = WebInspector.UIString("New Style Rule");
+    this.settingsSelectElement.appendChild(option);
+
+    this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);
+    this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);
+    WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+
+    this.titleElement.appendChild(this.settingsSelectElement);
+}
+
+WebInspector.StylesSidebarPane.prototype = {
+    _settingsLoaded: function()
+    {
+        var format = WebInspector.settings.colorFormat;
+        if (format === "hex")
+            this.settingsSelectElement[0].selected = true;
+        if (format === "rgb")
+            this.settingsSelectElement[1].selected = true;
+        if (format === "hsl")
+            this.settingsSelectElement[2].selected = true;
+    },
+
+    update: function(node, editedSection, forceUpdate)
+    {
+        var refresh = false;
+
+        if (forceUpdate)
+            delete this.node;
+
+        if (!forceUpdate && (!node || node === this.node))
+            refresh = true;
+
+        if (node && node.nodeType === Node.TEXT_NODE && node.parentNode)
+            node = node.parentNode;
+
+        if (node && node.nodeType !== Node.ELEMENT_NODE)
+            node = null;
+
+        if (node)
+            this.node = node;
+        else
+            node = this.node;
+
+        var body = this.bodyElement;
+
+        if (!node) {
+            body.removeChildren();
+            this.sections = [];
+            return;
+        }
+
+        var self = this;
+        function callback(styles)
+        {
+            if (!styles)
+                return;
+            node._setStyles(styles.computedStyle, styles.inlineStyle, styles.styleAttributes, styles.matchedCSSRules);
+            self._update(refresh, body, node, editedSection, forceUpdate);
+        }
+
+        InjectedScriptAccess.get(node.injectedScriptId).getStyles(node.id, !WebInspector.settings.showUserAgentStyles, callback);
+    },
+
+    _update: function(refresh, body, node, editedSection, forceUpdate)
+    {
+        if (!refresh) {
+            body.removeChildren();
+            this.sections = [];
+        }
+
+        var styleRules = [];
+
+        if (refresh) {
+            for (var i = 0; i < this.sections.length; ++i) {
+                var section = this.sections[i];
+                if (section instanceof WebInspector.BlankStylePropertiesSection)
+                    continue;
+                if (section.computedStyle)
+                    section.styleRule.style = node.ownerDocument.defaultView.getComputedStyle(node);
+                var styleRule = { section: section, style: section.styleRule.style, computedStyle: section.computedStyle, rule: section.rule };
+                styleRules.push(styleRule);
+            }
+        } else {
+            var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);
+            styleRules.push({ computedStyle: true, selectorText: WebInspector.UIString("Computed Style"), style: computedStyle, editable: false });
+
+            var nodeName = node.nodeName.toLowerCase();
+            for (var i = 0; i < node.attributes.length; ++i) {
+                var attr = node.attributes[i];
+                if (attr.style) {
+                    var attrStyle = { style: attr.style, editable: false };
+                    attrStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", attr.name);
+                    attrStyle.selectorText = nodeName + "[" + attr.name;
+                    if (attr.value.length)
+                        attrStyle.selectorText += "=" + attr.value;
+                    attrStyle.selectorText += "]";
+                    styleRules.push(attrStyle);
+                }
+            }
+
+            // Always Show element's Style Attributes
+            if (node.nodeType === Node.ELEMENT_NODE) {
+                var inlineStyle = { selectorText: WebInspector.UIString("Style Attribute"), style: node.style, isAttribute: true };
+                inlineStyle.subtitle = WebInspector.UIString("element’s “%s” attribute", "style");
+                styleRules.push(inlineStyle);
+            }
+
+            var matchedStyleRules = node.ownerDocument.defaultView.getMatchedCSSRules(node, "", !WebInspector.settings.showUserAgentStyles);
+            if (matchedStyleRules) {
+                // Add rules in reverse order to match the cascade order.
+                for (var i = (matchedStyleRules.length - 1); i >= 0; --i) {
+                    var rule = matchedStyleRules[i];
+                    styleRules.push({ style: rule.style, selectorText: rule.selectorText, parentStyleSheet: rule.parentStyleSheet, rule: rule });
+                }
+            }
+        }
+
+        function deleteDisabledProperty(style, name)
+        {
+            if (!style || !name)
+                return;
+            if (style.__disabledPropertyValues)
+                delete style.__disabledPropertyValues[name];
+            if (style.__disabledPropertyPriorities)
+                delete style.__disabledPropertyPriorities[name];
+            if (style.__disabledProperties)
+                delete style.__disabledProperties[name];
+        }
+
+        var usedProperties = {};
+        var disabledComputedProperties = {};
+        var priorityUsed = false;
+
+        // Walk the style rules and make a list of all used and overloaded properties.
+        for (var i = 0; i < styleRules.length; ++i) {
+            var styleRule = styleRules[i];
+            if (styleRule.computedStyle)
+                continue;
+            if (styleRule.section && styleRule.section.noAffect)
+                continue;
+
+            styleRule.usedProperties = {};
+
+            var style = styleRule.style;
+            for (var j = 0; j < style.length; ++j) {
+                var name = style[j];
+
+                if (!priorityUsed && style.getPropertyPriority(name).length)
+                    priorityUsed = true;
+
+                // If the property name is already used by another rule then this rule's
+                // property is overloaded, so don't add it to the rule's usedProperties.
+                if (!(name in usedProperties))
+                    styleRule.usedProperties[name] = true;
+
+                if (name === "font") {
+                    // The font property is not reported as a shorthand. Report finding the individual
+                    // properties so they are visible in computed style.
+                    // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15598 is fixed.
+                    styleRule.usedProperties["font-family"] = true;
+                    styleRule.usedProperties["font-size"] = true;
+                    styleRule.usedProperties["font-style"] = true;
+                    styleRule.usedProperties["font-variant"] = true;
+                    styleRule.usedProperties["font-weight"] = true;
+                    styleRule.usedProperties["line-height"] = true;
+                }
+
+                // Delete any disabled properties, since the property does exist.
+                // This prevents it from showing twice.
+                deleteDisabledProperty(style, name);
+                deleteDisabledProperty(style, style.getPropertyShorthand(name));
+            }
+
+            // Add all the properties found in this style to the used properties list.
+            // Do this here so only future rules are affect by properties used in this rule.
+            for (var name in styleRules[i].usedProperties)
+                usedProperties[name] = true;
+
+            // Remember all disabled properties so they show up in computed style.
+            if (style.__disabledProperties)
+                for (var name in style.__disabledProperties)
+                    disabledComputedProperties[name] = true;
+        }
+
+        if (priorityUsed) {
+            // Walk the properties again and account for !important.
+            var foundPriorityProperties = [];
+
+            // Walk in reverse to match the order !important overrides.
+            for (var i = (styleRules.length - 1); i >= 0; --i) {
+                if (styleRules[i].computedStyle)
+                    continue;
+
+                var style = styleRules[i].style;
+                var uniqueProperties = style.uniqueStyleProperties;
+                for (var j = 0; j < uniqueProperties.length; ++j) {
+                    var name = uniqueProperties[j];
+                    if (style.getPropertyPriority(name).length) {
+                        if (!(name in foundPriorityProperties))
+                            styleRules[i].usedProperties[name] = true;
+                        else
+                            delete styleRules[i].usedProperties[name];
+                        foundPriorityProperties[name] = true;
+                    } else if (name in foundPriorityProperties)
+                        delete styleRules[i].usedProperties[name];
+                }
+            }
+        }
+
+        if (refresh) {
+            // Walk the style rules and update the sections with new overloaded and used properties.
+            for (var i = 0; i < styleRules.length; ++i) {
+                var styleRule = styleRules[i];
+                var section = styleRule.section;
+                if (styleRule.computedStyle)
+                    section.disabledComputedProperties = disabledComputedProperties;
+                section._usedProperties = (styleRule.usedProperties || usedProperties);
+                section.update((section === editedSection) || styleRule.computedStyle);
+            }
+        } else {
+            // Make a property section for each style rule.
+            for (var i = 0; i < styleRules.length; ++i) {
+                var styleRule = styleRules[i];
+                var subtitle = styleRule.subtitle;
+                delete styleRule.subtitle;
+
+                var computedStyle = styleRule.computedStyle;
+                delete styleRule.computedStyle;
+
+                var ruleUsedProperties = styleRule.usedProperties;
+                delete styleRule.usedProperties;
+
+                var editable = styleRule.editable;
+                delete styleRule.editable;
+
+                var isAttribute = styleRule.isAttribute;
+                delete styleRule.isAttribute;
+
+                // Default editable to true if it was omitted.
+                if (typeof editable === "undefined")
+                    editable = true;
+
+                var section = new WebInspector.StylePropertiesSection(styleRule, subtitle, computedStyle, (ruleUsedProperties || usedProperties), editable);
+                if (computedStyle)
+                    section.disabledComputedProperties = disabledComputedProperties;
+                section.pane = this;
+
+                if (Preferences.styleRulesExpandedState && section.identifier in Preferences.styleRulesExpandedState)
+                    section.expanded = Preferences.styleRulesExpandedState[section.identifier];
+                else if (computedStyle)
+                    section.collapse(true);
+                else if (isAttribute && styleRule.style.length === 0)
+                    section.collapse(true);
+                else
+                    section.expand(true);
+
+                body.appendChild(section.element);
+                this.sections.push(section);
+            }
+        }
+    },
+
+    _changeSetting: function(event)
+    {
+        var options = this.settingsSelectElement.options;
+        var selectedOption = options[this.settingsSelectElement.selectedIndex];
+        selectedOption.action(event);
+
+        // Select the correct color format setting again, since it needs to be selected.
+        var selectedIndex = 0;
+        for (var i = 0; i < options.length; ++i) {
+            if (options[i].value === WebInspector.settings.colorFormat) {
+                selectedIndex = i;
+                break;
+            }
+        }
+
+        this.settingsSelectElement.selectedIndex = selectedIndex;
+    },
+
+    _changeColorFormat: function(event)
+    {
+        var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];
+        WebInspector.settings.colorFormat = selectedOption.value;
+
+        for (var i = 0; i < this.sections.length; ++i)
+            this.sections[i].update(true);
+    },
+
+    _createNewRule: function(event)
+    {
+        this.addBlankSection().startEditingSelector();
+    },
+
+    addBlankSection: function()
+    {
+        var blankSection = new WebInspector.BlankStylePropertiesSection(appropriateSelectorForNode(this.node, true));
+        blankSection.pane = this;
+
+        var elementStyleSection = this.sections[1];
+        this.bodyElement.insertBefore(blankSection.element, elementStyleSection.element.nextSibling);
+
+        this.sections.splice(2, 0, blankSection);
+
+        return blankSection;
+    },
+
+    removeSection: function(section)
+    {
+        var index = this.sections.indexOf(section);
+        if (index === -1)
+            return;
+        this.sections.splice(index, 1);
+        if (section.element.parentNode)
+            section.element.parentNode.removeChild(section.element);
+    }
+}
+
+WebInspector.StylesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+WebInspector.StylePropertiesSection = function(styleRule, subtitle, computedStyle, usedProperties, editable)
+{
+    WebInspector.PropertiesSection.call(this, styleRule.selectorText);
+
+    this.titleElement.addEventListener("click", this._clickSelector.bind(this), false);
+    this.titleElement.addEventListener("dblclick", this._dblclickSelector.bind(this), false);
+    this.element.addEventListener("dblclick", this._dblclickEmptySpace.bind(this), false);
+
+    this.styleRule = styleRule;
+    this.rule = this.styleRule.rule;
+    this.computedStyle = computedStyle;
+    this.editable = (editable && !computedStyle);
+
+    // Prevent editing the user agent and user rules.
+    var isUserAgent = this.rule && this.rule.isUserAgent;
+    var isUser = this.rule && this.rule.isUser;
+    var isViaInspector = this.rule && this.rule.isViaInspector;
+
+    if (isUserAgent || isUser)
+        this.editable = false;
+
+    this._usedProperties = usedProperties;
+
+    if (computedStyle) {
+        this.element.addStyleClass("computed-style");
+
+        if (WebInspector.settings.showInheritedComputedStyleProperties)
+            this.element.addStyleClass("show-inherited");
+
+        var showInheritedLabel = document.createElement("label");
+        var showInheritedInput = document.createElement("input");
+        showInheritedInput.type = "checkbox";
+        showInheritedInput.checked = WebInspector.settings.showInheritedComputedStyleProperties;
+
+        var computedStyleSection = this;
+        var showInheritedToggleFunction = function(event) {
+            WebInspector.settings.showInheritedComputedStyleProperties = showInheritedInput.checked;
+            if (WebInspector.settings.showInheritedComputedStyleProperties)
+                computedStyleSection.element.addStyleClass("show-inherited");
+            else
+                computedStyleSection.element.removeStyleClass("show-inherited");
+            event.stopPropagation();
+        };
+
+        showInheritedLabel.addEventListener("click", showInheritedToggleFunction, false);
+
+        showInheritedLabel.appendChild(showInheritedInput);
+        showInheritedLabel.appendChild(document.createTextNode(WebInspector.UIString("Show inherited")));
+        this.subtitleElement.appendChild(showInheritedLabel);
+    } else {
+        if (!subtitle) {
+            if (this.styleRule.parentStyleSheet && this.styleRule.parentStyleSheet.href) {
+                var url = this.styleRule.parentStyleSheet.href;
+                subtitle = WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));
+                this.subtitleElement.addStyleClass("file");
+            } else if (isUserAgent)
+                subtitle = WebInspector.UIString("user agent stylesheet");
+            else if (isUser)
+                subtitle = WebInspector.UIString("user stylesheet");
+            else if (isViaInspector)
+                subtitle = WebInspector.UIString("via inspector");
+            else
+                subtitle = WebInspector.UIString("inline stylesheet");
+        }
+
+        this.subtitle = subtitle;
+    }
+
+    this.identifier = styleRule.selectorText;
+    if (this.subtitle)
+        this.identifier += ":" + this.subtitleElement.textContent;
+}
+
+WebInspector.StylePropertiesSection.prototype = {
+    get usedProperties()
+    {
+        return this._usedProperties || {};
+    },
+
+    set usedProperties(x)
+    {
+        this._usedProperties = x;
+        this.update();
+    },
+
+    expand: function(dontRememberState)
+    {
+        WebInspector.PropertiesSection.prototype.expand.call(this);
+        if (dontRememberState)
+            return;
+
+        if (!Preferences.styleRulesExpandedState)
+            Preferences.styleRulesExpandedState = {};
+        Preferences.styleRulesExpandedState[this.identifier] = true;
+    },
+
+    collapse: function(dontRememberState)
+    {
+        WebInspector.PropertiesSection.prototype.collapse.call(this);
+        if (dontRememberState)
+            return;
+
+        if (!Preferences.styleRulesExpandedState)
+            Preferences.styleRulesExpandedState = {};
+        Preferences.styleRulesExpandedState[this.identifier] = false;
+    },
+
+    isPropertyInherited: function(property)
+    {
+        if (!this.computedStyle || !this._usedProperties || this.noAffect)
+            return false;
+        // These properties should always show for Computed Style.
+        var alwaysShowComputedProperties = { "display": true, "height": true, "width": true };
+        return !(property in this.usedProperties) && !(property in alwaysShowComputedProperties) && !(property in this.disabledComputedProperties);
+    },
+
+    isPropertyOverloaded: function(property, shorthand)
+    {
+        if (this.computedStyle || !this._usedProperties || this.noAffect)
+            return false;
+
+        var used = (property in this.usedProperties);
+        if (used || !shorthand)
+            return !used;
+
+        // Find out if any of the individual longhand properties of the shorthand
+        // are used, if none are then the shorthand is overloaded too.
+        var longhandProperties = this.styleRule.style.getLonghandProperties(property);
+        for (var j = 0; j < longhandProperties.length; ++j) {
+            var individualProperty = longhandProperties[j];
+            if (individualProperty in this.usedProperties)
+                return false;
+        }
+
+        return true;
+    },
+
+    isInspectorStylesheet: function()
+    {
+        return (this.styleRule.parentStyleSheet === WebInspector.panels.elements.stylesheet);
+    },
+
+    update: function(full)
+    {
+        if (full || this.computedStyle) {
+            this.propertiesTreeOutline.removeChildren();
+            this.populated = false;
+        } else {
+            var child = this.propertiesTreeOutline.children[0];
+            while (child) {
+                child.overloaded = this.isPropertyOverloaded(child.name, child.shorthand);
+                child = child.traverseNextTreeElement(false, null, true);
+            }
+        }
+
+        this.afterUpdate();
+    },
+
+    afterUpdate: function()
+    {
+        if (this._afterUpdate) {
+            this._afterUpdate(this);
+            delete this._afterUpdate;
+        }
+    },
+
+    onpopulate: function()
+    {
+        var style = this.styleRule.style;
+
+        var foundShorthands = {};
+        var uniqueProperties = style.uniqueStyleProperties;
+        var disabledProperties = style.__disabledPropertyValues || {};
+
+        for (var name in disabledProperties)
+            uniqueProperties.push(name);
+
+        uniqueProperties.sort();
+
+        for (var i = 0; i < uniqueProperties.length; ++i) {
+            var name = uniqueProperties[i];
+            var disabled = name in disabledProperties;
+            if (!disabled && this.disabledComputedProperties && !(name in this.usedProperties) && name in this.disabledComputedProperties)
+                disabled = true;
+
+            var shorthand = !disabled ? style.getPropertyShorthand(name) : null;
+
+            if (shorthand && shorthand in foundShorthands)
+                continue;
+
+            if (shorthand) {
+                foundShorthands[shorthand] = true;
+                name = shorthand;
+            }
+
+            var isShorthand = (shorthand ? true : false);
+            var inherited = this.isPropertyInherited(name);
+            var overloaded = this.isPropertyOverloaded(name, isShorthand);
+
+            var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, name, isShorthand, inherited, overloaded, disabled);
+            this.propertiesTreeOutline.appendChild(item);
+        }
+    },
+
+    findTreeElementWithName: function(name)
+    {
+        var treeElement = this.propertiesTreeOutline.children[0];
+        while (treeElement) {
+            if (treeElement.name === name)
+                return treeElement;
+            treeElement = treeElement.traverseNextTreeElement(true, null, true);
+        }
+        return null;
+    },
+
+    addNewBlankProperty: function()
+    {
+        var item = new WebInspector.StylePropertyTreeElement(this.styleRule, this.styleRule.style, "", false, false, false, false);
+        this.propertiesTreeOutline.appendChild(item);
+        item.listItemElement.textContent = "";
+        item._newProperty = true;
+        return item;
+    },
+
+    _clickSelector: function(event)
+    {
+        event.stopPropagation();
+
+        // Don't search "Computed Styles", "Style Attribute", or Mapped Attributes.
+        if (this.computedStyle || !this.rule || this.rule.isUser)
+            return;
+
+        var searchElement = document.getElementById("search");
+        searchElement.value = this.styleRule.selectorText;
+        WebInspector.performSearch({ target: searchElement });
+    },
+
+    _dblclickEmptySpace: function(event)
+    {
+        this.expand();
+        this.addNewBlankProperty().startEditing();
+    },
+
+    _dblclickSelector: function(event)
+    {
+        if (!this.editable)
+            return;
+
+        if (!this.rule && this.propertiesTreeOutline.children.length === 0) {
+            this.expand();
+            this.addNewBlankProperty().startEditing();
+            return;
+        }
+
+        if (!this.rule)
+            return;
+
+        this.startEditingSelector();
+        event.stopPropagation();
+    },
+
+    startEditingSelector: function()
+    {
+        var element = this.titleElement;
+        if (WebInspector.isBeingEdited(element))
+            return;
+
+        WebInspector.startEditing(this.titleElement, this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this), null);
+        window.getSelection().setBaseAndExtent(element, 0, element, 1);
+    },
+
+    editingSelectorCommitted: function(element, newContent, oldContent, context, moveDirection)
+    {
+        function moveToNextIfNeeded() {
+            if (!moveDirection || moveDirection !== "forward")
+                return;
+
+            this.expand();
+            if (this.propertiesTreeOutline.children.length === 0)
+                this.addNewBlankProperty().startEditing();
+            else {
+                var item = this.propertiesTreeOutline.children[0]
+                item.startEditing(item.valueElement);
+            }
+        }
+
+        if (newContent === oldContent)
+            return moveToNextIfNeeded.call(this);
+
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // Invalid Syntax for a Selector
+                moveToNextIfNeeded.call(self);
+                return;
+            }
+
+            var newRulePayload = result[0];
+            var doesAffectSelectedNode = result[1];
+            if (!doesAffectSelectedNode) {
+                self.noAffect = true;
+                self.element.addStyleClass("no-affect");
+            } else {
+                delete self.noAffect;
+                self.element.removeStyleClass("no-affect");
+            }
+
+            var newRule = WebInspector.CSSStyleDeclaration.parseRule(newRulePayload);
+            self.rule = newRule;
+            self.styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, parentStyleSheet: newRule.parentStyleSheet, rule: newRule };
+
+            var oldIdentifier = this.identifier;
+            self.identifier = newRule.selectorText + ":" + self.subtitleElement.textContent;
+
+            self.pane.update();
+
+            WebInspector.panels.elements.renameSelector(oldIdentifier, this.identifier, oldContent, newContent);
+
+            moveToNextIfNeeded.call(self);
+        }
+
+        InjectedScriptAccess.get(this.rule.injectedScriptId).applyStyleRuleText(this.rule.id, newContent, this.pane.node.id, callback);
+    },
+
+    editingSelectorCancelled: function()
+    {
+        // Do nothing, this is overridden by BlankStylePropertiesSection.
+    }
+}
+
+WebInspector.StylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
+
+WebInspector.BlankStylePropertiesSection = function(defaultSelectorText)
+{
+    WebInspector.StylePropertiesSection.call(this, {selectorText: defaultSelectorText, rule: {isViaInspector: true}}, "", false, {}, false);
+
+    this.element.addStyleClass("blank-section");
+}
+
+WebInspector.BlankStylePropertiesSection.prototype = {
+    expand: function()
+    {
+        // Do nothing, blank sections are not expandable.
+    },
+
+    editingSelectorCommitted: function(element, newContent, oldContent, context)
+    {
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // Invalid Syntax for a Selector
+                self.editingSelectorCancelled();
+                return;
+            }
+
+            var rule = result[0];
+            var doesSelectorAffectSelectedNode = result[1];
+
+            var styleRule = WebInspector.CSSStyleDeclaration.parseRule(rule);
+            styleRule.rule = rule;
+
+            self.makeNormal(styleRule);
+
+            if (!doesSelectorAffectSelectedNode) {
+                self.noAffect = true;
+                self.element.addStyleClass("no-affect");
+            }
+
+            self.subtitleElement.textContent = WebInspector.UIString("via inspector");
+            self.expand();
+
+            self.addNewBlankProperty().startEditing();
+        }
+
+        InjectedScriptAccess.get(this.pane.node.injectedScriptId).addStyleSelector(newContent, this.pane.node.id, callback);
+    },
+
+    editingSelectorCancelled: function()
+    {
+        this.pane.removeSection(this);
+    },
+
+    makeNormal: function(styleRule)
+    {
+        this.element.removeStyleClass("blank-section");
+
+        this.styleRule = styleRule;
+        this.rule = styleRule.rule;
+        this.computedStyle = false;
+        this.editable = true;
+        this.identifier = styleRule.selectorText + ":via inspector";
+
+        this.__proto__ = WebInspector.StylePropertiesSection.prototype;
+    }
+}
+
+WebInspector.BlankStylePropertiesSection.prototype.__proto__ = WebInspector.StylePropertiesSection.prototype;
+
+WebInspector.StylePropertyTreeElement = function(styleRule, style, name, shorthand, inherited, overloaded, disabled)
+{
+    this._styleRule = styleRule;
+    this.style = style;
+    this.name = name;
+    this.shorthand = shorthand;
+    this._inherited = inherited;
+    this._overloaded = overloaded;
+    this._disabled = disabled;
+
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, shorthand);
+}
+
+WebInspector.StylePropertyTreeElement.prototype = {
+    get inherited()
+    {
+        return this._inherited;
+    },
+
+    set inherited(x)
+    {
+        if (x === this._inherited)
+            return;
+        this._inherited = x;
+        this.updateState();
+    },
+
+    get overloaded()
+    {
+        return this._overloaded;
+    },
+
+    set overloaded(x)
+    {
+        if (x === this._overloaded)
+            return;
+        this._overloaded = x;
+        this.updateState();
+    },
+
+    get disabled()
+    {
+        return this._disabled;
+    },
+
+    set disabled(x)
+    {
+        if (x === this._disabled)
+            return;
+        this._disabled = x;
+        this.updateState();
+    },
+
+    get priority()
+    {
+        if (this.disabled && this.style.__disabledPropertyPriorities && this.name in this.style.__disabledPropertyPriorities)
+            return this.style.__disabledPropertyPriorities[this.name];
+        return (this.shorthand ? this.style.getShorthandPriority(this.name) : this.style.getPropertyPriority(this.name));
+    },
+
+    get value()
+    {
+        if (this.disabled && this.style.__disabledPropertyValues && this.name in this.style.__disabledPropertyValues)
+            return this.style.__disabledPropertyValues[this.name];
+        return (this.shorthand ? this.style.getShorthandValue(this.name) : this.style.getPropertyValue(this.name));
+    },
+
+    onattach: function()
+    {
+        this.updateTitle();
+    },
+
+    updateTitle: function()
+    {
+        var priority = this.priority;
+        var value = this.value;
+
+        if (priority && !priority.length)
+            delete priority;
+        if (priority)
+            priority = "!" + priority;
+
+        this.updateState();
+
+        var enabledCheckboxElement = document.createElement("input");
+        enabledCheckboxElement.className = "enabled-button";
+        enabledCheckboxElement.type = "checkbox";
+        enabledCheckboxElement.checked = !this.disabled;
+        enabledCheckboxElement.addEventListener("change", this.toggleEnabled.bind(this), false);
+
+        var nameElement = document.createElement("span");
+        nameElement.className = "name";
+        nameElement.textContent = this.name;
+        this.nameElement = nameElement;
+
+        var valueElement = document.createElement("span");
+        valueElement.className = "value";
+        this.valueElement = valueElement;
+
+        if (value) {
+            function processValue(regex, processor, nextProcessor, valueText)
+            {
+                var container = document.createDocumentFragment();
+
+                var items = valueText.replace(regex, "\0$1\0").split("\0");
+                for (var i = 0; i < items.length; ++i) {
+                    if ((i % 2) === 0) {
+                        if (nextProcessor)
+                            container.appendChild(nextProcessor(items[i]));
+                        else
+                            container.appendChild(document.createTextNode(items[i]));
+                    } else {
+                        var processedNode = processor(items[i]);
+                        if (processedNode)
+                            container.appendChild(processedNode);
+                    }
+                }
+
+                return container;
+            }
+
+            function linkifyURL(url)
+            {
+                var container = document.createDocumentFragment();
+                container.appendChild(document.createTextNode("url("));
+                container.appendChild(WebInspector.linkifyURLAsNode(url, url, null, (url in WebInspector.resourceURLMap)));
+                container.appendChild(document.createTextNode(")"));
+                return container;
+            }
+
+            function processColor(text)
+            {
+                try {
+                    var color = new WebInspector.Color(text);
+                } catch (e) {
+                    return document.createTextNode(text);
+                }
+
+                var swatchElement = document.createElement("span");
+                swatchElement.title = WebInspector.UIString("Click to change color format");
+                swatchElement.className = "swatch";
+                swatchElement.style.setProperty("background-color", text);
+
+                swatchElement.addEventListener("click", changeColorDisplay, false);
+                swatchElement.addEventListener("dblclick", function(event) { event.stopPropagation() }, false);
+
+                var format;
+                if (Preferences.showColorNicknames && color.nickname)
+                    format = "nickname";
+                else if (WebInspector.settings.colorFormat === "rgb")
+                    format = (color.simple ? "rgb" : "rgba");
+                else if (WebInspector.settings.colorFormat === "hsl")
+                    format = (color.simple ? "hsl" : "hsla");
+                else if (color.simple)
+                    format = (color.hasShortHex() ? "shorthex" : "hex");
+                else
+                    format = "rgba";
+
+                var colorValueElement = document.createElement("span");
+                colorValueElement.textContent = color.toString(format);
+
+                function changeColorDisplay(event)
+                {
+                    switch (format) {
+                        case "rgb":
+                            format = "hsl";
+                            break;
+
+                        case "shorthex":
+                            format = "hex";
+                            break;
+
+                        case "hex":
+                            format = "rgb";
+                            break;
+
+                        case "nickname":
+                            if (color.simple) {
+                                if (color.hasShortHex())
+                                    format = "shorthex";
+                                else
+                                    format = "hex";
+                                break;
+                            }
+
+                            format = "rgba";
+                            break;
+
+                        case "hsl":
+                            if (color.nickname)
+                                format = "nickname";
+                            else if (color.hasShortHex())
+                                format = "shorthex";
+                            else
+                                format = "hex";
+                            break;
+
+                        case "rgba":
+                            format = "hsla";
+                            break;
+
+                        case "hsla":
+                            if (color.nickname)
+                                format = "nickname";
+                            else
+                                format = "rgba";
+                            break;
+                    }
+
+                    colorValueElement.textContent = color.toString(format);
+                }
+
+                var container = document.createDocumentFragment();
+                container.appendChild(swatchElement);
+                container.appendChild(colorValueElement);
+                return container;
+            }
+
+            var colorRegex = /((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b(?!-))/g;
+            var colorProcessor = processValue.bind(window, colorRegex, processColor, null);
+
+            valueElement.appendChild(processValue(/url\(([^)]+)\)/g, linkifyURL, colorProcessor, value));
+        }
+
+        if (priority) {
+            var priorityElement = document.createElement("span");
+            priorityElement.className = "priority";
+            priorityElement.textContent = priority;
+        }
+
+        this.listItemElement.removeChildren();
+
+        // Append the checkbox for root elements of an editable section.
+        if (this.treeOutline.section && this.treeOutline.section.editable && this.parent.root)
+            this.listItemElement.appendChild(enabledCheckboxElement);
+        this.listItemElement.appendChild(nameElement);
+        this.listItemElement.appendChild(document.createTextNode(": "));
+        this.listItemElement.appendChild(valueElement);
+
+        if (priorityElement) {
+            this.listItemElement.appendChild(document.createTextNode(" "));
+            this.listItemElement.appendChild(priorityElement);
+        }
+
+        this.listItemElement.appendChild(document.createTextNode(";"));
+
+        this.tooltip = this.name + ": " + valueElement.textContent + (priority ? " " + priority : "");
+    },
+
+    updateAll: function(updateAllRules)
+    {
+        if (updateAllRules && this.treeOutline.section && this.treeOutline.section.pane)
+            this.treeOutline.section.pane.update(null, this.treeOutline.section);
+        else if (this.treeOutline.section)
+            this.treeOutline.section.update(true);
+        else
+            this.updateTitle(); // FIXME: this will not show new properties. But we don't hit his case yet.
+    },
+
+    toggleEnabled: function(event)
+    {
+        var disabled = !event.target.checked;
+
+        var self = this;
+        function callback(newPayload)
+        {
+            if (!newPayload)
+                return;
+
+            self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
+            self._styleRule.style = self.style;
+
+            // Set the disabled property here, since the code above replies on it not changing
+            // until after the value and priority are retrieved.
+            self.disabled = disabled;
+
+            if (self.treeOutline.section && self.treeOutline.section.pane)
+                self.treeOutline.section.pane.dispatchEventToListeners("style property toggled");
+
+            self.updateAll(true);
+        }
+
+        InjectedScriptAccess.get(this.style.injectedScriptId).toggleStyleEnabled(this.style.id, this.name, disabled, callback);
+    },
+
+    updateState: function()
+    {
+        if (!this.listItemElement)
+            return;
+
+        if (this.style.isPropertyImplicit(this.name) || this.value === "initial")
+            this.listItemElement.addStyleClass("implicit");
+        else
+            this.listItemElement.removeStyleClass("implicit");
+
+        if (this.inherited)
+            this.listItemElement.addStyleClass("inherited");
+        else
+            this.listItemElement.removeStyleClass("inherited");
+
+        if (this.overloaded)
+            this.listItemElement.addStyleClass("overloaded");
+        else
+            this.listItemElement.removeStyleClass("overloaded");
+
+        if (this.disabled)
+            this.listItemElement.addStyleClass("disabled");
+        else
+            this.listItemElement.removeStyleClass("disabled");
+    },
+
+    onpopulate: function()
+    {
+        // Only populate once and if this property is a shorthand.
+        if (this.children.length || !this.shorthand)
+            return;
+
+        var longhandProperties = this.style.getLonghandProperties(this.name);
+        for (var i = 0; i < longhandProperties.length; ++i) {
+            var name = longhandProperties[i];
+
+            if (this.treeOutline.section) {
+                var inherited = this.treeOutline.section.isPropertyInherited(name);
+                var overloaded = this.treeOutline.section.isPropertyOverloaded(name);
+            }
+
+            var item = new WebInspector.StylePropertyTreeElement(this._styleRule, this.style, name, false, inherited, overloaded);
+            this.appendChild(item);
+        }
+    },
+
+    ondblclick: function(event)
+    {
+        this.startEditing(event.target);
+        event.stopPropagation();
+    },
+
+    startEditing: function(selectElement)
+    {
+        // FIXME: we don't allow editing of longhand properties under a shorthand right now.
+        if (this.parent.shorthand)
+            return;
+
+        if (WebInspector.isBeingEdited(this.listItemElement) || (this.treeOutline.section && !this.treeOutline.section.editable))
+            return;
+
+        var context = { expanded: this.expanded, hasChildren: this.hasChildren };
+
+        // Lie about our children to prevent expanding on double click and to collapse shorthands.
+        this.hasChildren = false;
+
+        if (!selectElement)
+            selectElement = this.listItemElement;
+
+        this.listItemElement.handleKeyEvent = this.editingKeyDown.bind(this);
+
+        WebInspector.startEditing(this.listItemElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context);
+        window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1);
+    },
+
+    editingKeyDown: function(event)
+    {
+        var arrowKeyPressed = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down");
+        var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");
+        if (!arrowKeyPressed && !pageKeyPressed)
+            return;
+
+        var selection = window.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var selectionRange = selection.getRangeAt(0);
+        if (selectionRange.commonAncestorContainer !== this.listItemElement && !selectionRange.commonAncestorContainer.isDescendant(this.listItemElement))
+            return;
+
+        const styleValueDelimeters = " \t\n\"':;,/()";
+        var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.listItemElement);
+        var wordString = wordRange.toString();
+        var replacementString = wordString;
+
+        var matches = /(.*?)(-?\d+(?:\.\d+)?)(.*)/.exec(wordString);
+        if (matches && matches.length) {
+            var prefix = matches[1];
+            var number = parseFloat(matches[2]);
+            var suffix = matches[3];
+
+            // If the number is near zero or the number is one and the direction will take it near zero.
+            var numberNearZero = (number < 1 && number > -1);
+            if (number === 1 && event.keyIdentifier === "Down")
+                numberNearZero = true;
+            else if (number === -1 && event.keyIdentifier === "Up")
+                numberNearZero = true;
+
+            if (numberNearZero && event.altKey && arrowKeyPressed) {
+                if (event.keyIdentifier === "Down")
+                    number = Math.ceil(number - 1);
+                else
+                    number = Math.floor(number + 1);
+            } else {
+                // Jump by 10 when shift is down or jump by 0.1 when near zero or Alt/Option is down.
+                // Also jump by 10 for page up and down, or by 100 if shift is held with a page key.
+                var changeAmount = 1;
+                if (event.shiftKey && pageKeyPressed)
+                    changeAmount = 100;
+                else if (event.shiftKey || pageKeyPressed)
+                    changeAmount = 10;
+                else if (event.altKey || numberNearZero)
+                    changeAmount = 0.1;
+
+                if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")
+                    changeAmount *= -1;
+
+                // Make the new number and constrain it to a precision of 6, this matches numbers the engine returns.
+                // Use the Number constructor to forget the fixed precision, so 1.100000 will print as 1.1.
+                number = Number((number + changeAmount).toFixed(6));
+            }
+
+            replacementString = prefix + number + suffix;
+        } else {
+            // FIXME: this should cycle through known keywords for the current property name.
+            return;
+        }
+
+        var replacementTextNode = document.createTextNode(replacementString);
+
+        wordRange.deleteContents();
+        wordRange.insertNode(replacementTextNode);
+
+        var finalSelectionRange = document.createRange();
+        finalSelectionRange.setStart(replacementTextNode, 0);
+        finalSelectionRange.setEnd(replacementTextNode, replacementString.length);
+
+        selection.removeAllRanges();
+        selection.addRange(finalSelectionRange);
+
+        event.preventDefault();
+        event.handled = true;
+
+        if (!this.originalCSSText) {
+            // Remember the rule's original CSS text, so it can be restored
+            // if the editing is canceled and before each apply.
+            this.originalCSSText = this.style.styleTextWithShorthands();
+        } else {
+            // Restore the original CSS text before applying user changes. This is needed to prevent
+            // new properties from sticking around if the user adds one, then removes it.
+            InjectedScriptAccess.get(this.style.injectedScriptId).setStyleText(this.style.id, this.originalCSSText);
+        }
+
+        this.applyStyleText(this.listItemElement.textContent);
+    },
+
+    editingEnded: function(context)
+    {
+        this.hasChildren = context.hasChildren;
+        if (context.expanded)
+            this.expand();
+        delete this.listItemElement.handleKeyEvent;
+        delete this.originalCSSText;
+    },
+
+    editingCancelled: function(element, context)
+    {
+        if (this._newProperty)
+            this.treeOutline.removeChild(this);
+        else if (this.originalCSSText) {
+            InjectedScriptAccess.get(this.style.injectedScriptId).setStyleText(this.style.id, this.originalCSSText);
+
+            if (this.treeOutline.section && this.treeOutline.section.pane)
+                this.treeOutline.section.pane.dispatchEventToListeners("style edited");
+
+            this.updateAll();
+        } else
+            this.updateTitle();
+
+        this.editingEnded(context);
+    },
+
+    editingCommitted: function(element, userInput, previousContent, context, moveDirection)
+    {
+        this.editingEnded(context);
+
+        // Determine where to move to before making changes
+        var newProperty, moveToPropertyName, moveToSelector;
+        var moveTo = (moveDirection === "forward" ? this.nextSibling : this.previousSibling);
+        if (moveTo)
+            moveToPropertyName = moveTo.name;
+        else if (moveDirection === "forward")
+            newProperty = true;
+        else if (moveDirection === "backward" && this.treeOutline.section.rule)
+            moveToSelector = true;
+
+        // Make the Changes and trigger the moveToNextCallback after updating
+        var blankInput = /^\s*$/.test(userInput);
+        if (userInput !== previousContent || (this._newProperty && blankInput)) { // only if something changed, or adding a new style and it was blank
+            this.treeOutline.section._afterUpdate = moveToNextCallback.bind(this, this._newProperty, !blankInput);
+            this.applyStyleText(userInput, true);
+        } else
+            moveToNextCallback(this._newProperty, false, this.treeOutline.section, false);
+
+        // The Callback to start editing the next property
+        function moveToNextCallback(alreadyNew, valueChanged, section)
+        {
+            if (!moveDirection)
+                return;
+
+            // User just tabbed through without changes
+            if (moveTo && moveTo.parent) {
+                moveTo.startEditing(moveTo.valueElement);
+                return;
+            }
+
+            // User has made a change then tabbed, wiping all the original treeElements,
+            // recalculate the new treeElement for the same property we were going to edit next
+            if (moveTo && !moveTo.parent) {
+                var treeElement = section.findTreeElementWithName(moveToPropertyName);
+                if (treeElement)
+                    treeElement.startEditing(treeElement.valueElement);
+                return;
+            }
+
+            // Create a new attribute in this section
+            if (newProperty) {
+                if (alreadyNew && !valueChanged)
+                    return;
+
+                section.addNewBlankProperty().startEditing();
+                return;
+            }
+
+            if (moveToSelector)
+                section.startEditingSelector();
+        }
+    },
+
+    applyStyleText: function(styleText, updateInterface)
+    {
+        var section = this.treeOutline.section;
+        var elementsPanel = WebInspector.panels.elements;
+        var styleTextLength = styleText.trim().length;
+        if (!styleTextLength && updateInterface) {
+            if (this._newProperty) {
+                // The user deleted everything, so remove the tree element and update.
+                this.parent.removeChild(this);
+                section.afterUpdate();
+                return;
+            } else {
+                delete section._afterUpdate;
+            }
+        }
+
+        var self = this;
+        function callback(result)
+        {
+            if (!result) {
+                // The user typed something, but it didn't parse. Just abort and restore
+                // the original title for this property.  If this was a new attribute and
+                // we couldn't parse, then just remove it.
+                if (self._newProperty) {
+                    self.parent.removeChild(self);
+                    return;
+                }
+                if (updateInterface)
+                    self.updateTitle();
+                return;
+            }
+
+            var newPayload = result[0];
+            var changedProperties = result[1];
+            elementsPanel.removeStyleChange(section.identifier, self.style, self.name);
+
+            if (!styleTextLength) {
+                // Do remove ourselves from UI when the property removal is confirmed.
+                self.parent.removeChild(self);
+            } else {
+                self.style = WebInspector.CSSStyleDeclaration.parseStyle(newPayload);
+                for (var i = 0; i < changedProperties.length; ++i)
+                    elementsPanel.addStyleChange(section.identifier, self.style, changedProperties[i]);
+                self._styleRule.style = self.style;
+            }
+
+            if (section && section.pane)
+                section.pane.dispatchEventToListeners("style edited");
+
+            if (updateInterface)
+                self.updateAll(true);
+
+            if (!section.rule)
+                WebInspector.panels.elements.treeOutline.update();
+        }
+
+        InjectedScriptAccess.get(this.style.injectedScriptId).applyStyleText(this.style.id, styleText.trim(), this.name, callback);
+    }
+}
+
+WebInspector.StylePropertyTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+/* PanelEnablerView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.PanelEnablerView = function(identifier, headingText, disclaimerText, buttonTitle)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel-enabler-view");
+    this.element.addStyleClass(identifier);
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "panel-enabler-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.imageElement = document.createElement("img");
+    this.contentElement.appendChild(this.imageElement);
+
+    this.choicesForm = document.createElement("form");
+    this.contentElement.appendChild(this.choicesForm);
+
+    this.headerElement = document.createElement("h1");
+    this.headerElement.textContent = headingText;
+    this.choicesForm.appendChild(this.headerElement);
+
+    var self = this;
+    function enableOption(text, checked) {
+        var label = document.createElement("label");
+        var option = document.createElement("input");
+        option.type = "radio";
+        option.name = "enable-option";
+        if (checked)
+            option.checked = true;
+        label.appendChild(option);
+        label.appendChild(document.createTextNode(text));
+        self.choicesForm.appendChild(label);
+        return option;
+    };
+
+    this.enabledForSession = enableOption(WebInspector.UIString("Only enable for this session"), true);
+    this.enabledAlways = enableOption(WebInspector.UIString("Always enable"));
+
+    this.disclaimerElement = document.createElement("div");
+    this.disclaimerElement.className = "panel-enabler-disclaimer";
+    this.disclaimerElement.textContent = disclaimerText;
+    this.choicesForm.appendChild(this.disclaimerElement);
+
+    this.enableButton = document.createElement("button");
+    this.enableButton.setAttribute("type", "button");
+    this.enableButton.textContent = buttonTitle;
+    this.enableButton.addEventListener("click", this._enableButtonCicked.bind(this), false);
+    this.choicesForm.appendChild(this.enableButton);
+}
+
+WebInspector.PanelEnablerView.prototype = {
+    _enableButtonCicked: function()
+    {
+        this.dispatchEventToListeners("enable clicked");
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+
+        setTimeout(this.resize.bind(this), 0);
+    },
+
+    resize: function()
+    {
+        this.imageElement.removeStyleClass("hidden");
+
+        if (this.element.offsetWidth < (this.choicesForm.offsetWidth + this.imageElement.offsetWidth))
+            this.imageElement.addStyleClass("hidden");
+    },
+
+    get alwaysEnabled() {
+        return this.enabledAlways.checked;
+    }
+}
+
+WebInspector.PanelEnablerView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* WelcomeView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.WelcomeView = function(identifier, headingText, instructionsText)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("panel-enabler-view");
+    this.element.addStyleClass(identifier);
+    this.element.addStyleClass("welcome");
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "panel-enabler-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.alignerElement = document.createElement("div");
+    this.alignerElement.className = "welcome-instructions-aligner";
+    this.contentElement.appendChild(this.alignerElement);
+
+    this.instructionsElement = document.createElement("div");
+    this.instructionsElement.className = "instructions";
+    this.contentElement.appendChild(this.instructionsElement);
+
+    this.headerElement = document.createElement("h1");
+    this.headerElement.textContent = headingText;
+    this.instructionsElement.appendChild(this.headerElement);
+
+    if (instructionsText)
+        this.addMessage(instructionsText);
+}
+
+WebInspector.WelcomeView.prototype = {
+    addMessage: function(message)
+    {
+        var messageElement = document.createElement("div");
+        messageElement.className = "message";
+        if (typeof message == "string")
+            // Message text can contain <br> tags for better text balancing, so we
+            // put it into elements using 'innerHTML', not 'textContent'.
+            messageElement.innerHTML = message;
+        else
+            messageElement.appendChild(message);
+        this.instructionsElement.appendChild(messageElement);
+    }
+}
+
+WebInspector.WelcomeView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* StatusBarButton.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StatusBarButton = function(title, className, states)
+{
+    this.element = document.createElement("button");
+    this.element.className = className + " status-bar-item";
+    this.element.addEventListener("click", this._clicked.bind(this), false);
+
+    this.glyph = document.createElement("div");
+    this.glyph.className = "glyph";
+    this.element.appendChild(this.glyph);
+
+    this.glyphShadow = document.createElement("div");
+    this.glyphShadow.className = "glyph shadow";
+    this.element.appendChild(this.glyphShadow);
+    
+    this.states = states;
+    if (!states)
+        this.states = 2;
+
+    if (states == 2)
+        this._state = false;
+    else
+        this._state = 0;
+    
+    this.title = title;
+    this.disabled = false;
+    this._visible = true;
+}
+
+WebInspector.StatusBarButton.prototype = {
+    _clicked: function()
+    {
+        this.dispatchEventToListeners("click");
+    },
+
+    get disabled()
+    {
+        return this._disabled;
+    },
+
+    set disabled(x)
+    {
+        if (this._disabled === x)
+            return;
+        this._disabled = x;
+        this.element.disabled = x;
+    },
+
+    get title()
+    {
+        return this._title;
+    },
+
+    set title(x)
+    {
+        if (this._title === x)
+            return;
+        this._title = x;
+        this.element.title = x;
+    },
+    
+    get state()
+    {
+        return this._state;
+    },
+    
+    set state(x)
+    {
+        if (this._state === x)
+            return;
+        
+        if (this.states === 2) {
+            if (x)
+                this.element.addStyleClass("toggled-on");
+            else
+                this.element.removeStyleClass("toggled-on");
+        } else {
+            if (x !== 0) {
+                this.element.removeStyleClass("toggled-" + this._state);
+                this.element.addStyleClass("toggled-" + x);
+            } else 
+                this.element.removeStyleClass("toggled-" + this._state);
+        }
+        this._state = x;
+    },
+
+    get toggled()
+    {
+        if (this.states !== 2)
+            throw("Only used toggled when there are 2 states, otherwise, use state");
+        return this.state;
+    },
+
+    set toggled(x)
+    {
+        if (this.states !== 2)
+            throw("Only used toggled when there are 2 states, otherwise, use state");
+        this.state = x;
+    },
+
+    get visible()
+    {
+        return this._visible;
+    },
+
+    set visible(x)
+    {
+        if (this._visible === x)
+            return;
+
+        if (x)
+            this.element.removeStyleClass("hidden");
+        else
+            this.element.addStyleClass("hidden");
+        this._visible = x;
+    }
+}
+
+WebInspector.StatusBarButton.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* SummaryBar.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SummaryBar = function(categories)
+{
+    this.categories = categories;
+
+    this.element = document.createElement("div");
+    this.element.className = "summary-bar";
+
+    this.graphElement = document.createElement("canvas");
+    this.graphElement.setAttribute("width", "450");
+    this.graphElement.setAttribute("height", "38");
+    this.graphElement.className = "summary-graph";
+    this.element.appendChild(this.graphElement);
+
+    this.legendElement = document.createElement("div");
+    this.legendElement.className = "summary-graph-legend";
+    this.element.appendChild(this.legendElement);
+}
+
+WebInspector.SummaryBar.prototype = {
+
+    get calculator() {
+        return this._calculator;
+    },
+
+    set calculator(x) {
+        this._calculator = x;
+    },
+
+    reset: function()
+    {
+        this.legendElement.removeChildren();
+        this._drawSummaryGraph();
+    },
+
+    update: function(data)
+    {
+        var graphInfo = this.calculator.computeSummaryValues(data);
+
+        var fillSegments = [];
+
+        this.legendElement.removeChildren();
+
+        for (var category in this.categories) {
+            var size = graphInfo.categoryValues[category];
+            if (!size)
+                continue;
+
+            var colorString = this.categories[category].color;
+
+            var fillSegment = {color: colorString, value: size};
+            fillSegments.push(fillSegment);
+
+            var legendLabel = this._makeLegendElement(this.categories[category].title, this.calculator.formatValue(size), colorString);
+            this.legendElement.appendChild(legendLabel);
+        }
+
+        if (graphInfo.total) {
+            var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));
+            totalLegendLabel.addStyleClass("total");
+            this.legendElement.appendChild(totalLegendLabel);
+        }
+
+        this._drawSummaryGraph(fillSegments);
+    },
+
+    _drawSwatch: function(canvas, color)
+    {
+        var ctx = canvas.getContext("2d");
+
+        function drawSwatchSquare() {
+            ctx.fillStyle = color;
+            ctx.fillRect(0, 0, 13, 13);
+
+            var gradient = ctx.createLinearGradient(0, 0, 13, 13);
+            gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");
+            gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
+
+            ctx.fillStyle = gradient;
+            ctx.fillRect(0, 0, 13, 13);
+
+            gradient = ctx.createLinearGradient(13, 13, 0, 0);
+            gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");
+            gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
+
+            ctx.fillStyle = gradient;
+            ctx.fillRect(0, 0, 13, 13);
+
+            ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";
+            ctx.strokeRect(0.5, 0.5, 12, 12);
+        }
+
+        ctx.clearRect(0, 0, 13, 24);
+
+        drawSwatchSquare();
+
+        ctx.save();
+
+        ctx.translate(0, 25);
+        ctx.scale(1, -1);
+
+        drawSwatchSquare();
+
+        ctx.restore();
+
+        this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);
+    },
+
+    _drawSummaryGraph: function(segments)
+    {
+        if (!segments || !segments.length) {
+            segments = [{color: "white", value: 1}];
+            this._showingEmptySummaryGraph = true;
+        } else
+            delete this._showingEmptySummaryGraph;
+
+        // Calculate the total of all segments.
+        var total = 0;
+        for (var i = 0; i < segments.length; ++i)
+            total += segments[i].value;
+
+        // Calculate the percentage of each segment, rounded to the nearest percent.
+        var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });
+
+        // Calculate the total percentage.
+        var percentTotal = 0;
+        for (var i = 0; i < percents.length; ++i)
+            percentTotal += percents[i];
+
+        // Make sure our percentage total is not greater-than 100, it can be greater
+        // if we rounded up for a few segments.
+        while (percentTotal > 100) {
+            for (var i = 0; i < percents.length && percentTotal > 100; ++i) {
+                if (percents[i] > 1) {
+                    --percents[i];
+                    --percentTotal;
+                }
+            }
+        }
+
+        // Make sure our percentage total is not less-than 100, it can be less
+        // if we rounded down for a few segments.
+        while (percentTotal < 100) {
+            for (var i = 0; i < percents.length && percentTotal < 100; ++i) {
+                ++percents[i];
+                ++percentTotal;
+            }
+        }
+
+        var ctx = this.graphElement.getContext("2d");
+
+        var x = 0;
+        var y = 0;
+        var w = 450;
+        var h = 19;
+        var r = (h / 2);
+
+        function drawPillShadow()
+        {
+            // This draws a line with a shadow that is offset away from the line. The line is stroked
+            // twice with different X shadow offsets to give more feathered edges. Later we erase the
+            // line with destination-out 100% transparent black, leaving only the shadow. This only
+            // works if nothing has been drawn into the canvas yet.
+
+            ctx.beginPath();
+            ctx.moveTo(x + 4, y + h - 3 - 0.5);
+            ctx.lineTo(x + w - 4, y + h - 3 - 0.5);
+            ctx.closePath();
+
+            ctx.save();
+
+            ctx.shadowBlur = 2;
+            ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
+            ctx.shadowOffsetX = 3;
+            ctx.shadowOffsetY = 5;
+
+            ctx.strokeStyle = "white";
+            ctx.lineWidth = 1;
+
+            ctx.stroke();
+
+            ctx.shadowOffsetX = -3;
+
+            ctx.stroke();
+
+            ctx.restore();
+
+            ctx.save();
+
+            ctx.globalCompositeOperation = "destination-out";
+            ctx.strokeStyle = "rgba(0, 0, 0, 1)";
+            ctx.lineWidth = 1;
+
+            ctx.stroke();
+
+            ctx.restore();
+        }
+
+        function drawPill()
+        {
+            // Make a rounded rect path.
+            ctx.beginPath();
+            ctx.moveTo(x, y + r);
+            ctx.lineTo(x, y + h - r);
+            ctx.quadraticCurveTo(x, y + h, x + r, y + h);
+            ctx.lineTo(x + w - r, y + h);
+            ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
+            ctx.lineTo(x + w, y + r);
+            ctx.quadraticCurveTo(x + w, y, x + w - r, y);
+            ctx.lineTo(x + r, y);
+            ctx.quadraticCurveTo(x, y, x, y + r);
+            ctx.closePath();
+
+            // Clip to the rounded rect path.
+            ctx.save();
+            ctx.clip();
+
+            // Fill the segments with the associated color.
+            var previousSegmentsWidth = 0;
+            for (var i = 0; i < segments.length; ++i) {
+                var segmentWidth = Math.round(w * percents[i] / 100);
+                ctx.fillStyle = segments[i].color;
+                ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);
+                previousSegmentsWidth += segmentWidth;
+            }
+
+            // Draw the segment divider lines.
+            ctx.lineWidth = 1;
+            for (var i = 1; i < 20; ++i) {
+                ctx.beginPath();
+                ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);
+                ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);
+                ctx.closePath();
+
+                ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";
+                ctx.stroke();
+
+                ctx.beginPath();
+                ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);
+                ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);
+                ctx.closePath();
+
+                ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";
+                ctx.stroke();
+            }
+
+            // Draw the pill shading.
+            var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));
+            lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");
+            lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");
+            lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
+
+            var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);
+            darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
+            darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");
+            darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");
+
+            ctx.fillStyle = darkGradient;
+            ctx.fillRect(x, y, w, h);
+
+            ctx.fillStyle = lightGradient;
+            ctx.fillRect(x, y, w, h);
+
+            ctx.restore();
+        }
+
+        ctx.clearRect(x, y, w, (h * 2));
+
+        drawPillShadow();
+        drawPill();
+
+        ctx.save();
+
+        ctx.translate(0, (h * 2) + 1);
+        ctx.scale(1, -1);
+
+        drawPill();
+
+        ctx.restore();
+
+        this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);
+    },
+
+    _fadeOutRect: function(ctx, x, y, w, h, a1, a2)
+    {
+        ctx.save();
+
+        var gradient = ctx.createLinearGradient(x, y, x, y + h);
+        gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");
+        gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");
+        gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");
+
+        ctx.globalCompositeOperation = "destination-out";
+
+        ctx.fillStyle = gradient;
+        ctx.fillRect(x, y, w, h);
+
+        ctx.restore();
+    },
+
+    _makeLegendElement: function(label, value, color)
+    {
+        var legendElement = document.createElement("label");
+        legendElement.className = "summary-graph-legend-item";
+
+        if (color) {
+            var swatch = document.createElement("canvas");
+            swatch.className = "summary-graph-legend-swatch";
+            swatch.setAttribute("width", "13");
+            swatch.setAttribute("height", "24");
+
+            legendElement.appendChild(swatch);
+
+            this._drawSwatch(swatch, color);
+        }
+
+        var labelElement = document.createElement("div");
+        labelElement.className = "summary-graph-legend-label";
+        legendElement.appendChild(labelElement);
+
+        var headerElement = document.createElement("div");
+        headerElement.className = "summary-graph-legend-header";
+        headerElement.textContent = label;
+        labelElement.appendChild(headerElement);
+
+        var valueElement = document.createElement("div");
+        valueElement.className = "summary-graph-legend-value";
+        valueElement.textContent = value;
+        labelElement.appendChild(valueElement);
+
+        return legendElement;
+    }
+}
+
+WebInspector.SummaryBar.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* ElementsPanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <[email protected]>
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ElementsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.element.addStyleClass("elements");
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.id = "elements-content";
+    this.contentElement.className = "outline-disclosure source-code";
+
+    this.treeOutline = new WebInspector.ElementsTreeOutline();
+    this.treeOutline.panel = this;
+    this.treeOutline.includeRootDOMNode = false;
+    this.treeOutline.selectEnabled = true;
+
+    this.treeOutline.focusedNodeChanged = function(forceUpdate)
+    {
+        if (this.panel.visible && WebInspector.currentFocusElement !== document.getElementById("search"))
+            WebInspector.currentFocusElement = this.element;
+
+        this.panel.updateBreadcrumb(forceUpdate);
+
+        for (var pane in this.panel.sidebarPanes)
+           this.panel.sidebarPanes[pane].needsUpdate = true;
+
+        this.panel.updateStyles(true);
+        this.panel.updateMetrics();
+        this.panel.updateProperties();
+        this.panel.updateEventListeners();
+
+        if (this._focusedDOMNode)
+            InjectedScriptAccess.get(this._focusedDOMNode.injectedScriptId).addInspectedNode(this._focusedDOMNode.id, function() {});
+    };
+
+    this.contentElement.appendChild(this.treeOutline.element);
+
+    this.crumbsElement = document.createElement("div");
+    this.crumbsElement.className = "crumbs";
+    this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false);
+    this.crumbsElement.addEventListener("mouseout", this._mouseMovedOutOfCrumbs.bind(this), false);
+
+    this.sidebarPanes = {};
+    this.sidebarPanes.styles = new WebInspector.StylesSidebarPane();
+    this.sidebarPanes.metrics = new WebInspector.MetricsSidebarPane();
+    this.sidebarPanes.properties = new WebInspector.PropertiesSidebarPane();
+    this.sidebarPanes.eventListeners = new WebInspector.EventListenersSidebarPane();
+
+    this.sidebarPanes.styles.onexpand = this.updateStyles.bind(this);
+    this.sidebarPanes.metrics.onexpand = this.updateMetrics.bind(this);
+    this.sidebarPanes.properties.onexpand = this.updateProperties.bind(this);
+    this.sidebarPanes.eventListeners.onexpand = this.updateEventListeners.bind(this);
+
+    this.sidebarPanes.styles.expanded = true;
+
+    this.sidebarPanes.styles.addEventListener("style edited", this._stylesPaneEdited, this);
+    this.sidebarPanes.styles.addEventListener("style property toggled", this._stylesPaneEdited, this);
+    this.sidebarPanes.metrics.addEventListener("metrics edited", this._metricsPaneEdited, this);
+
+    this.sidebarElement = document.createElement("div");
+    this.sidebarElement.id = "elements-sidebar";
+
+    this.sidebarElement.appendChild(this.sidebarPanes.styles.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.metrics.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.properties.element);
+    this.sidebarElement.appendChild(this.sidebarPanes.eventListeners.element);
+
+    this.sidebarResizeElement = document.createElement("div");
+    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+    this.sidebarResizeElement.addEventListener("mousedown", this.rightSidebarResizerDragStart.bind(this), false);
+
+    this._nodeSearchButton = new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."), "node-search-status-bar-item");
+    this._nodeSearchButton.addEventListener("click", this._nodeSearchButtonClicked.bind(this), false);
+
+    this.element.appendChild(this.contentElement);
+    this.element.appendChild(this.sidebarElement);
+    this.element.appendChild(this.sidebarResizeElement);
+
+    this._changedStyles = {};
+
+    this.reset();
+}
+
+WebInspector.ElementsPanel.prototype = {
+    toolbarItemClass: "elements",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Elements");
+    },
+
+    get statusBarItems()
+    {
+        return [this._nodeSearchButton.element, this.crumbsElement];
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.treeOutline.element;
+    },
+
+    updateStatusBarItems: function()
+    {
+        this.updateBreadcrumbSizes();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
+        this.updateBreadcrumb();
+        this.treeOutline.updateSelection();
+        if (this.recentlyModifiedNodes.length)
+            this.updateModifiedNodes();
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+
+        WebInspector.hoveredDOMNode = null;
+        InspectorBackend.disableSearchingForNode();
+    },
+
+    resize: function()
+    {
+        this.treeOutline.updateSelection();
+        this.updateBreadcrumbSizes();
+    },
+
+    reset: function()
+    {
+        if (this.focusedDOMNode) {
+            this._selectedPathOnReset = [];
+            var node = this.focusedDOMNode;
+            while ("index" in node) {
+                this._selectedPathOnReset.push(node.nodeName);
+                this._selectedPathOnReset.push(node.index);
+                node = node.parentNode;
+            }
+            this._selectedPathOnReset.reverse();
+        }
+
+        this.rootDOMNode = null;
+        this.focusedDOMNode = null;
+
+        WebInspector.hoveredDOMNode = null;
+
+        this.recentlyModifiedNodes = [];
+
+        delete this.currentQuery;
+        this.searchCanceled();
+    },
+
+    setDocument: function(inspectedRootDocument)
+    {
+        this.reset();
+
+        if (!inspectedRootDocument)
+            return;
+
+        inspectedRootDocument.addEventListener("DOMNodeInserted", this._nodeInserted.bind(this));
+        inspectedRootDocument.addEventListener("DOMNodeRemoved", this._nodeRemoved.bind(this));
+        inspectedRootDocument.addEventListener("DOMAttrModified", this._attributesUpdated.bind(this));
+
+        this.treeOutline.suppressSelectHighlight = true;
+        this.rootDOMNode = inspectedRootDocument;
+        this.treeOutline.suppressSelectHighlight = false;
+
+        function selectNode(candidateFocusNode)
+        {
+            if (!candidateFocusNode)
+                candidateFocusNode = inspectedRootDocument.body || inspectedRootDocument.documentElement;
+
+            if (!candidateFocusNode)
+                return;
+
+            this.treeOutline.suppressSelectHighlight = true;
+            this.focusedDOMNode = candidateFocusNode;
+            if (this.treeOutline.selectedTreeElement)
+                this.treeOutline.selectedTreeElement.expand();
+            this.treeOutline.suppressSelectHighlight = false;
+        }
+
+        function selectLastSelectedNode(nodeId)
+        {
+            if (this.focusedDOMNode) {
+                // Focused node has been explicitly set while reaching out for the last selected node.
+                return;
+            }
+            var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : 0;
+            selectNode.call(this, node);
+        }
+
+        if (this._selectedPathOnReset)
+            InjectedScriptAccess.getDefault().nodeByPath(this._selectedPathOnReset, selectLastSelectedNode.bind(this));
+        else
+            selectNode.call(this);
+        delete this._selectedPathOnReset;
+    },
+
+    searchCanceled: function()
+    {
+        delete this._searchQuery;
+        this._hideSearchHighlights();
+
+        WebInspector.updateSearchMatchesCount(0, this);
+
+        this._currentSearchResultIndex = 0;
+        this._searchResults = [];
+        InjectedScriptAccess.getDefault().searchCanceled(function() {});
+    },
+
+    performSearch: function(query)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        const whitespaceTrimmedQuery = query.trim();
+        if (!whitespaceTrimmedQuery.length)
+            return;
+
+        this._updatedMatchCountOnce = false;
+        this._matchesCountUpdateTimeout = null;
+        this._searchQuery = query;
+
+        InjectedScriptAccess.getDefault().performSearch(whitespaceTrimmedQuery, function() {});
+    },
+
+    searchingForNodeWasEnabled: function()
+    {
+        this._nodeSearchButton.toggled = true;
+    },
+
+    searchingForNodeWasDisabled: function()
+    {
+        this._nodeSearchButton.toggled = false;
+    },
+
+    _updateMatchesCount: function()
+    {
+        WebInspector.updateSearchMatchesCount(this._searchResults.length, this);
+        this._matchesCountUpdateTimeout = null;
+        this._updatedMatchCountOnce = true;
+    },
+
+    _updateMatchesCountSoon: function()
+    {
+        if (!this._updatedMatchCountOnce)
+            return this._updateMatchesCount();
+        if (this._matchesCountUpdateTimeout)
+            return;
+        // Update the matches count every half-second so it doesn't feel twitchy.
+        this._matchesCountUpdateTimeout = setTimeout(this._updateMatchesCount.bind(this), 500);
+    },
+
+    addNodesToSearchResult: function(nodeIds)
+    {
+        if (!nodeIds)
+            return;
+
+        var nodeIdsArray = nodeIds.split(",");
+        for (var i = 0; i < nodeIdsArray.length; ++i) {
+            var nodeId = nodeIdsArray[i];
+            var node = WebInspector.domAgent.nodeForId(nodeId);
+            if (!node)
+                continue;
+
+            this._currentSearchResultIndex = 0;
+            this._searchResults.push(node);
+        }
+        this._highlightCurrentSearchResult();
+        this._updateMatchesCountSoon();
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._highlightCurrentSearchResult();
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._highlightCurrentSearchResult();
+    },
+
+    _highlightCurrentSearchResult: function()
+    {
+        this._hideSearchHighlights();
+        var node = this._searchResults[this._currentSearchResultIndex];
+        var treeElement = this.treeOutline.findTreeElement(node);
+        if (treeElement) {
+            treeElement.highlightSearchResults(this._searchQuery);
+            treeElement.reveal();
+        }
+    },
+
+    _hideSearchHighlights: function(node)
+    {
+        for (var i = 0; this._searchResults && i < this._searchResults.length; ++i) {
+            var node = this._searchResults[i];
+            var treeElement = this.treeOutline.findTreeElement(node);
+            if (treeElement)
+                treeElement.highlightSearchResults(null);
+        }
+    },
+
+    renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)
+    {
+        // TODO: Implement Shifting the oldSelector, and its contents to a newSelector
+    },
+
+    addStyleChange: function(identifier, style, property)
+    {
+        if (!style.parentRule)
+            return;
+
+        var selector = style.parentRule.selectorText;
+        if (!this._changedStyles[identifier])
+            this._changedStyles[identifier] = {};
+
+        if (!this._changedStyles[identifier][selector])
+            this._changedStyles[identifier][selector] = {};
+
+        if (!this._changedStyles[identifier][selector][property])
+            WebInspector.styleChanges += 1;
+
+        this._changedStyles[identifier][selector][property] = style.getPropertyValue(property);
+    },
+
+    removeStyleChange: function(identifier, style, property)
+    {
+        if (!style.parentRule)
+            return;
+
+        var selector = style.parentRule.selectorText;
+        if (!this._changedStyles[identifier] || !this._changedStyles[identifier][selector])
+            return;
+
+        if (this._changedStyles[identifier][selector][property]) {
+            delete this._changedStyles[identifier][selector][property];
+            WebInspector.styleChanges -= 1;
+        }
+    },
+
+    generateStylesheet: function()
+    {
+        if (!WebInspector.styleChanges)
+            return;
+
+        // Merge Down to Just Selectors
+        var mergedSelectors = {};
+        for (var identifier in this._changedStyles) {
+            for (var selector in this._changedStyles[identifier]) {
+                if (!mergedSelectors[selector])
+                    mergedSelectors[selector] = this._changedStyles[identifier][selector];
+                else { // merge on selector
+                    var merge = {};
+                    for (var property in mergedSelectors[selector])
+                        merge[property] = mergedSelectors[selector][property];
+                    for (var property in this._changedStyles[identifier][selector]) {
+                        if (!merge[property])
+                            merge[property] = this._changedStyles[identifier][selector][property];
+                        else { // merge on property within a selector, include comment to notify user
+                            var value1 = merge[property];
+                            var value2 = this._changedStyles[identifier][selector][property];
+
+                            if (value1 === value2)
+                                merge[property] = [value1];
+                            else if (value1 instanceof Array)
+                                merge[property].push(value2);
+                            else
+                                merge[property] = [value1, value2];
+                        }
+                    }
+                    mergedSelectors[selector] = merge;
+                }
+            }
+        }
+
+        var builder = [];
+        builder.push("/**");
+        builder.push(" * Inspector Generated Stylesheet"); // UIString?
+        builder.push(" */\n");
+
+        var indent = "  ";
+        function displayProperty(property, value, comment) {
+            if (comment)
+                return indent + "/* " + property + ": " + value + "; */";
+            else
+                return indent + property + ": " + value + ";";
+        }
+
+        for (var selector in mergedSelectors) {
+            var psuedoStyle = mergedSelectors[selector];
+            var properties = Object.properties(psuedoStyle);
+            if (properties.length) {
+                builder.push(selector + " {");
+                for (var i = 0; i < properties.length; ++i) {
+                    var property = properties[i];
+                    var value = psuedoStyle[property];
+                    if (!(value instanceof Array))
+                        builder.push(displayProperty(property, value));
+                    else {
+                        if (value.length === 1)
+                            builder.push(displayProperty(property, value) + " /* merged from equivalent edits */"); // UIString?
+                        else {                        
+                            builder.push(indent + "/* There was a Conflict... There were Multiple Edits for '" + property + "' */"); // UIString?
+                            for (var j = 0; j < value.length; ++j)
+                                builder.push(displayProperty(property, value, true));
+                        }
+                    }
+                }
+                builder.push("}\n");
+            }
+        }
+
+        WebInspector.showConsole();
+        WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage(builder.join("\n")));
+    },
+
+    get rootDOMNode()
+    {
+        return this.treeOutline.rootDOMNode;
+    },
+
+    set rootDOMNode(x)
+    {
+        this.treeOutline.rootDOMNode = x;
+    },
+
+    get focusedDOMNode()
+    {
+        return this.treeOutline.focusedDOMNode;
+    },
+
+    set focusedDOMNode(x)
+    {
+        this.treeOutline.focusedDOMNode = x;
+    },
+
+    _attributesUpdated: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, updated: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _nodeInserted: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, inserted: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _nodeRemoved: function(event)
+    {
+        this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, removed: true});
+        if (this.visible)
+            this._updateModifiedNodesSoon();
+    },
+
+    _updateModifiedNodesSoon: function()
+    {
+        if ("_updateModifiedNodesTimeout" in this)
+            return;
+        this._updateModifiedNodesTimeout = setTimeout(this.updateModifiedNodes.bind(this), 0);
+    },
+
+    updateModifiedNodes: function()
+    {
+        if ("_updateModifiedNodesTimeout" in this) {
+            clearTimeout(this._updateModifiedNodesTimeout);
+            delete this._updateModifiedNodesTimeout;
+        }
+
+        var updatedParentTreeElements = [];
+        var updateBreadcrumbs = false;
+
+        for (var i = 0; i < this.recentlyModifiedNodes.length; ++i) {
+            var replaced = this.recentlyModifiedNodes[i].replaced;
+            var parent = this.recentlyModifiedNodes[i].parent;
+            var node = this.recentlyModifiedNodes[i].node;
+
+            if (this.recentlyModifiedNodes[i].updated) {
+                var nodeItem = this.treeOutline.findTreeElement(node);
+                if (nodeItem)
+                    nodeItem.updateTitle();
+                continue;
+            }
+            
+            if (!parent)
+                continue;
+
+            var parentNodeItem = this.treeOutline.findTreeElement(parent);
+            if (parentNodeItem && !parentNodeItem.alreadyUpdatedChildren) {
+                parentNodeItem.updateChildren(replaced);
+                parentNodeItem.alreadyUpdatedChildren = true;
+                updatedParentTreeElements.push(parentNodeItem);
+            }
+
+            if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))
+                updateBreadcrumbs = true;
+        }
+
+        for (var i = 0; i < updatedParentTreeElements.length; ++i)
+            delete updatedParentTreeElements[i].alreadyUpdatedChildren;
+
+        this.recentlyModifiedNodes = [];
+
+        if (updateBreadcrumbs)
+            this.updateBreadcrumb(true);
+    },
+
+    _stylesPaneEdited: function()
+    {
+        this.sidebarPanes.metrics.needsUpdate = true;
+        this.updateMetrics();
+    },
+
+    _metricsPaneEdited: function()
+    {
+        this.sidebarPanes.styles.needsUpdate = true;
+        this.updateStyles(true);
+    },
+
+    _mouseMovedInCrumbs: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");
+
+        WebInspector.hoveredDOMNode = (crumbElement ? crumbElement.representedObject : null);
+
+        if ("_mouseOutOfCrumbsTimeout" in this) {
+            clearTimeout(this._mouseOutOfCrumbsTimeout);
+            delete this._mouseOutOfCrumbsTimeout;
+        }
+    },
+
+    _mouseMovedOutOfCrumbs: function(event)
+    {
+        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);
+        if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.crumbsElement))
+            return;
+
+        WebInspector.hoveredDOMNode = null;
+
+        this._mouseOutOfCrumbsTimeout = setTimeout(this.updateBreadcrumbSizes.bind(this), 1000);
+    },
+
+    updateBreadcrumb: function(forceUpdate)
+    {
+        if (!this.visible)
+            return;
+
+        var crumbs = this.crumbsElement;
+
+        var handled = false;
+        var foundRoot = false;
+        var crumb = crumbs.firstChild;
+        while (crumb) {
+            if (crumb.representedObject === this.rootDOMNode)
+                foundRoot = true;
+
+            if (foundRoot)
+                crumb.addStyleClass("dimmed");
+            else
+                crumb.removeStyleClass("dimmed");
+
+            if (crumb.representedObject === this.focusedDOMNode) {
+                crumb.addStyleClass("selected");
+                handled = true;
+            } else {
+                crumb.removeStyleClass("selected");
+            }
+
+            crumb = crumb.nextSibling;
+        }
+
+        if (handled && !forceUpdate) {
+            // We don't need to rebuild the crumbs, but we need to adjust sizes
+            // to reflect the new focused or root node.
+            this.updateBreadcrumbSizes();
+            return;
+        }
+
+        crumbs.removeChildren();
+
+        var panel = this;
+
+        function selectCrumbFunction(event)
+        {
+            var crumb = event.currentTarget;
+            if (crumb.hasStyleClass("collapsed")) {
+                // Clicking a collapsed crumb will expose the hidden crumbs.
+                if (crumb === panel.crumbsElement.firstChild) {
+                    // If the focused crumb is the first child, pick the farthest crumb
+                    // that is still hidden. This allows the user to expose every crumb.
+                    var currentCrumb = crumb;
+                    while (currentCrumb) {
+                        var hidden = currentCrumb.hasStyleClass("hidden");
+                        var collapsed = currentCrumb.hasStyleClass("collapsed");
+                        if (!hidden && !collapsed)
+                            break;
+                        crumb = currentCrumb;
+                        currentCrumb = currentCrumb.nextSibling;
+                    }
+                }
+
+                panel.updateBreadcrumbSizes(crumb);
+            } else {
+                // Clicking a dimmed crumb or double clicking (event.detail >= 2)
+                // will change the root node in addition to the focused node.
+                if (event.detail >= 2 || crumb.hasStyleClass("dimmed"))
+                    panel.rootDOMNode = crumb.representedObject.parentNode;
+                panel.focusedDOMNode = crumb.representedObject;
+            }
+
+            event.preventDefault();
+        }
+
+        foundRoot = false;
+        for (var current = this.focusedDOMNode; current; current = current.parentNode) {
+            if (current.nodeType === Node.DOCUMENT_NODE)
+                continue;
+
+            if (current === this.rootDOMNode)
+                foundRoot = true;
+
+            var crumb = document.createElement("span");
+            crumb.className = "crumb";
+            crumb.representedObject = current;
+            crumb.addEventListener("mousedown", selectCrumbFunction, false);
+
+            var crumbTitle;
+            switch (current.nodeType) {
+                case Node.ELEMENT_NODE:
+                    crumbTitle = current.nodeName.toLowerCase();
+
+                    var nameElement = document.createElement("span");
+                    nameElement.textContent = crumbTitle;
+                    crumb.appendChild(nameElement);
+
+                    var idAttribute = current.getAttribute("id");
+                    if (idAttribute) {
+                        var idElement = document.createElement("span");
+                        crumb.appendChild(idElement);
+
+                        var part = "#" + idAttribute;
+                        crumbTitle += part;
+                        idElement.appendChild(document.createTextNode(part));
+
+                        // Mark the name as extra, since the ID is more important.
+                        nameElement.className = "extra";
+                    }
+
+                    var classAttribute = current.getAttribute("class");
+                    if (classAttribute) {
+                        var classes = classAttribute.split(/\s+/);
+                        var foundClasses = {};
+
+                        if (classes.length) {
+                            var classesElement = document.createElement("span");
+                            classesElement.className = "extra";
+                            crumb.appendChild(classesElement);
+
+                            for (var i = 0; i < classes.length; ++i) {
+                                var className = classes[i];
+                                if (className && !(className in foundClasses)) {
+                                    var part = "." + className;
+                                    crumbTitle += part;
+                                    classesElement.appendChild(document.createTextNode(part));
+                                    foundClasses[className] = true;
+                                }
+                            }
+                        }
+                    }
+
+                    break;
+
+                case Node.TEXT_NODE:
+                    if (isNodeWhitespace.call(current))
+                        crumbTitle = WebInspector.UIString("(whitespace)");
+                    else
+                        crumbTitle = WebInspector.UIString("(text)");
+                    break
+
+                case Node.COMMENT_NODE:
+                    crumbTitle = "<!-->";
+                    break;
+
+                case Node.DOCUMENT_TYPE_NODE:
+                    crumbTitle = "<!DOCTYPE>";
+                    break;
+
+                default:
+                    crumbTitle = current.nodeName.toLowerCase();
+            }
+
+            if (!crumb.childNodes.length) {
+                var nameElement = document.createElement("span");
+                nameElement.textContent = crumbTitle;
+                crumb.appendChild(nameElement);
+            }
+
+            crumb.title = crumbTitle;
+
+            if (foundRoot)
+                crumb.addStyleClass("dimmed");
+            if (current === this.focusedDOMNode)
+                crumb.addStyleClass("selected");
+            if (!crumbs.childNodes.length)
+                crumb.addStyleClass("end");
+
+            crumbs.appendChild(crumb);
+        }
+
+        if (crumbs.hasChildNodes())
+            crumbs.lastChild.addStyleClass("start");
+
+        this.updateBreadcrumbSizes();
+    },
+
+    updateBreadcrumbSizes: function(focusedCrumb)
+    {
+        if (!this.visible)
+            return;
+
+        if (document.body.offsetWidth <= 0) {
+            // The stylesheet hasn't loaded yet or the window is closed,
+            // so we can't calculate what is need. Return early.
+            return;
+        }
+
+        var crumbs = this.crumbsElement;
+        if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)
+            return; // No crumbs, do nothing.
+
+        // A Zero index is the right most child crumb in the breadcrumb.
+        var selectedIndex = 0;
+        var focusedIndex = 0;
+        var selectedCrumb;
+
+        var i = 0;
+        var crumb = crumbs.firstChild;
+        while (crumb) {
+            // Find the selected crumb and index. 
+            if (!selectedCrumb && crumb.hasStyleClass("selected")) {
+                selectedCrumb = crumb;
+                selectedIndex = i;
+            }
+
+            // Find the focused crumb index. 
+            if (crumb === focusedCrumb)
+                focusedIndex = i;
+
+            // Remove any styles that affect size before
+            // deciding to shorten any crumbs.
+            if (crumb !== crumbs.lastChild)
+                crumb.removeStyleClass("start");
+            if (crumb !== crumbs.firstChild)
+                crumb.removeStyleClass("end");
+
+            crumb.removeStyleClass("compact");
+            crumb.removeStyleClass("collapsed");
+            crumb.removeStyleClass("hidden");
+
+            crumb = crumb.nextSibling;
+            ++i;
+        }
+
+        // Restore the start and end crumb classes in case they got removed in coalesceCollapsedCrumbs().
+        // The order of the crumbs in the document is opposite of the visual order.
+        crumbs.firstChild.addStyleClass("end");
+        crumbs.lastChild.addStyleClass("start");
+
+        function crumbsAreSmallerThanContainer()
+        {
+            var rightPadding = 20;
+            var errorWarningElement = document.getElementById("error-warning-count");
+            if (!WebInspector.drawer.visible && errorWarningElement)
+                rightPadding += errorWarningElement.offsetWidth;
+            return ((crumbs.totalOffsetLeft + crumbs.offsetWidth + rightPadding) < window.innerWidth);
+        }
+
+        if (crumbsAreSmallerThanContainer())
+            return; // No need to compact the crumbs, they all fit at full size.
+
+        var BothSides = 0;
+        var AncestorSide = -1;
+        var ChildSide = 1;
+
+        function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb)
+        {
+            if (!significantCrumb)
+                significantCrumb = (focusedCrumb || selectedCrumb);
+
+            if (significantCrumb === selectedCrumb)
+                var significantIndex = selectedIndex;
+            else if (significantCrumb === focusedCrumb)
+                var significantIndex = focusedIndex;
+            else {
+                var significantIndex = 0;
+                for (var i = 0; i < crumbs.childNodes.length; ++i) {
+                    if (crumbs.childNodes[i] === significantCrumb) {
+                        significantIndex = i;
+                        break;
+                    }
+                }
+            }
+
+            function shrinkCrumbAtIndex(index)
+            {
+                var shrinkCrumb = crumbs.childNodes[index];
+                if (shrinkCrumb && shrinkCrumb !== significantCrumb)
+                    shrinkingFunction(shrinkCrumb);
+                if (crumbsAreSmallerThanContainer())
+                    return true; // No need to compact the crumbs more.
+                return false;
+            }
+
+            // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs
+            // fit in the container or we run out of crumbs to shrink.
+            if (direction) {
+                // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb.
+                var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1);
+                while (index !== significantIndex) {
+                    if (shrinkCrumbAtIndex(index))
+                        return true;
+                    index += (direction > 0 ? 1 : -1);
+                }
+            } else {
+                // Crumbs are shrunk in order of descending distance from the signifcant crumb,
+                // with a tie going to child crumbs.
+                var startIndex = 0;
+                var endIndex = crumbs.childNodes.length - 1;
+                while (startIndex != significantIndex || endIndex != significantIndex) {
+                    var startDistance = significantIndex - startIndex;
+                    var endDistance = endIndex - significantIndex;
+                    if (startDistance >= endDistance)
+                        var index = startIndex++;
+                    else
+                        var index = endIndex--;
+                    if (shrinkCrumbAtIndex(index))
+                        return true;
+                }
+            }
+
+            // We are not small enough yet, return false so the caller knows.
+            return false;
+        }
+
+        function coalesceCollapsedCrumbs()
+        {
+            var crumb = crumbs.firstChild;
+            var collapsedRun = false;
+            var newStartNeeded = false;
+            var newEndNeeded = false;
+            while (crumb) {
+                var hidden = crumb.hasStyleClass("hidden");
+                if (!hidden) {
+                    var collapsed = crumb.hasStyleClass("collapsed"); 
+                    if (collapsedRun && collapsed) {
+                        crumb.addStyleClass("hidden");
+                        crumb.removeStyleClass("compact");
+                        crumb.removeStyleClass("collapsed");
+
+                        if (crumb.hasStyleClass("start")) {
+                            crumb.removeStyleClass("start");
+                            newStartNeeded = true;
+                        }
+
+                        if (crumb.hasStyleClass("end")) {
+                            crumb.removeStyleClass("end");
+                            newEndNeeded = true;
+                        }
+
+                        continue;
+                    }
+
+                    collapsedRun = collapsed;
+
+                    if (newEndNeeded) {
+                        newEndNeeded = false;
+                        crumb.addStyleClass("end");
+                    }
+                } else
+                    collapsedRun = true;
+                crumb = crumb.nextSibling;
+            }
+
+            if (newStartNeeded) {
+                crumb = crumbs.lastChild;
+                while (crumb) {
+                    if (!crumb.hasStyleClass("hidden")) {
+                        crumb.addStyleClass("start");
+                        break;
+                    }
+                    crumb = crumb.previousSibling;
+                }
+            }
+        }
+
+        function compact(crumb)
+        {
+            if (crumb.hasStyleClass("hidden"))
+                return;
+            crumb.addStyleClass("compact");
+        }
+
+        function collapse(crumb, dontCoalesce)
+        {
+            if (crumb.hasStyleClass("hidden"))
+                return;
+            crumb.addStyleClass("collapsed");
+            crumb.removeStyleClass("compact");
+            if (!dontCoalesce)
+                coalesceCollapsedCrumbs();
+        }
+
+        function compactDimmed(crumb)
+        {
+            if (crumb.hasStyleClass("dimmed"))
+                compact(crumb);
+        }
+
+        function collapseDimmed(crumb)
+        {
+            if (crumb.hasStyleClass("dimmed"))
+                collapse(crumb);
+        }
+
+        if (!focusedCrumb) {
+            // When not focused on a crumb we can be biased and collapse less important
+            // crumbs that the user might not care much about.
+
+            // Compact child crumbs.
+            if (makeCrumbsSmaller(compact, ChildSide))
+                return;
+
+            // Collapse child crumbs.
+            if (makeCrumbsSmaller(collapse, ChildSide))
+                return;
+
+            // Compact dimmed ancestor crumbs.
+            if (makeCrumbsSmaller(compactDimmed, AncestorSide))
+                return;
+
+            // Collapse dimmed ancestor crumbs.
+            if (makeCrumbsSmaller(collapseDimmed, AncestorSide))
+                return;
+        }
+
+        // Compact ancestor crumbs, or from both sides if focused.
+        if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide)))
+            return;
+
+        // Collapse ancestor crumbs, or from both sides if focused.
+        if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide)))
+            return;
+
+        if (!selectedCrumb)
+            return;
+
+        // Compact the selected crumb.
+        compact(selectedCrumb);
+        if (crumbsAreSmallerThanContainer())
+            return;
+
+        // Collapse the selected crumb as a last resort. Pass true to prevent coalescing.
+        collapse(selectedCrumb, true);
+    },
+
+    updateStyles: function(forceUpdate)
+    {
+        var stylesSidebarPane = this.sidebarPanes.styles;
+        if (!stylesSidebarPane.expanded || !stylesSidebarPane.needsUpdate)
+            return;
+
+        stylesSidebarPane.update(this.focusedDOMNode, null, forceUpdate);
+        stylesSidebarPane.needsUpdate = false;
+    },
+
+    updateMetrics: function()
+    {
+        var metricsSidebarPane = this.sidebarPanes.metrics;
+        if (!metricsSidebarPane.expanded || !metricsSidebarPane.needsUpdate)
+            return;
+
+        metricsSidebarPane.update(this.focusedDOMNode);
+        metricsSidebarPane.needsUpdate = false;
+    },
+
+    updateProperties: function()
+    {
+        var propertiesSidebarPane = this.sidebarPanes.properties;
+        if (!propertiesSidebarPane.expanded || !propertiesSidebarPane.needsUpdate)
+            return;
+
+        propertiesSidebarPane.update(this.focusedDOMNode);
+        propertiesSidebarPane.needsUpdate = false;
+    },
+
+    updateEventListeners: function()
+    {
+        var eventListenersSidebarPane = this.sidebarPanes.eventListeners;
+        if (!eventListenersSidebarPane.expanded || !eventListenersSidebarPane.needsUpdate)
+            return;
+
+        eventListenersSidebarPane.update(this.focusedDOMNode);
+        eventListenersSidebarPane.needsUpdate = false;
+    },
+
+    handleShortcut: function(event)
+    {
+        // Cmd/Control + Shift + C should be a shortcut to clicking the Node Search Button.
+        // This shortcut matches Firebug.
+        if (event.keyIdentifier === "U+0043") {     // C key
+            if (WebInspector.isMac())
+                var isNodeSearchKey = event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey;
+            else
+                var isNodeSearchKey = event.ctrlKey && !event.metaKey && !event.altKey && event.shiftKey;
+
+            if (isNodeSearchKey) {
+                this._nodeSearchButtonClicked(event);
+                event.handled = true;
+                return;
+            }
+        }
+    },
+
+    handleCopyEvent: function(event)
+    {
+        // Don't prevent the normal copy if the user has a selection.
+        if (!window.getSelection().isCollapsed)
+            return;
+        event.clipboardData.clearData();
+        event.preventDefault();
+        InspectorBackend.copyNode(this.focusedDOMNode.id);
+    },
+
+    rightSidebarResizerDragStart: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarElement, this.rightSidebarResizerDrag.bind(this), this.rightSidebarResizerDragEnd.bind(this), event, "col-resize");
+    },
+
+    rightSidebarResizerDragEnd: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    },
+
+    rightSidebarResizerDrag: function(event)
+    {
+        var x = event.pageX;
+        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minElementsSidebarWidth, window.innerWidth * 0.66);
+
+        this.sidebarElement.style.width = newWidth + "px";
+        this.contentElement.style.right = newWidth + "px";
+        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
+
+        this.treeOutline.updateSelection();
+
+        event.preventDefault();
+    },
+
+    _nodeSearchButtonClicked: function(event)
+    {
+        if (!this._nodeSearchButton.toggled)
+            InspectorBackend.enableSearchingForNode();
+        else
+            InspectorBackend.disableSearchingForNode();
+    }
+}
+
+WebInspector.ElementsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* ResourcesPanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008, 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourcesPanel = function()
+{
+    WebInspector.AbstractTimelinePanel.call(this);
+
+    this.element.addStyleClass("resources");
+
+    this._createPanelEnabler();
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "resource-views";
+    this.element.appendChild(this.viewsContainerElement);
+
+    this.createFilterPanel();
+    this.createInterface();
+
+    this._createStatusbarButtons();
+
+    this.reset();
+    this.filter(this.filterAllElement, false);
+    this.graphsTreeElement.children[0].select();
+    this._resourceTrackingEnabled = false;
+}
+
+WebInspector.ResourcesPanel.prototype = {
+    toolbarItemClass: "resources",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Resources");
+    },
+
+    get statusBarItems()
+    {
+        return [this.enableToggleButton.element, this.largerResourcesButton.element, this.sortingSelectElement];
+    },
+
+    get categories()
+    {
+        return WebInspector.resourceCategories;
+    },
+
+    createItemTreeElement: function(item)
+    {
+        return new WebInspector.ResourceSidebarTreeElement(item);
+    },
+
+    createItemGraph: function(item)
+    {
+        return new WebInspector.ResourceGraph(item);
+    },
+
+    isCategoryVisible: function(categoryName)
+    {
+        return (this.itemsGraphsElement.hasStyleClass("filter-all") || this.itemsGraphsElement.hasStyleClass("filter-" + categoryName.toLowerCase()));
+    },
+
+    populateSidebar: function()
+    {
+        var timeGraphItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Time"));
+        timeGraphItem.onselect = this._graphSelected.bind(this);
+
+        var transferTimeCalculator = new WebInspector.ResourceTransferTimeCalculator();
+        var transferDurationCalculator = new WebInspector.ResourceTransferDurationCalculator();
+
+        timeGraphItem.sortingOptions = [
+            { name: WebInspector.UIString("Sort by Start Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by Response Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by End Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime, calculator: transferTimeCalculator },
+            { name: WebInspector.UIString("Sort by Duration"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration, calculator: transferDurationCalculator },
+            { name: WebInspector.UIString("Sort by Latency"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency, calculator: transferDurationCalculator },
+        ];
+
+        timeGraphItem.isBarOpaqueAtLeft = false;
+        timeGraphItem.selectedSortingOptionIndex = 1;
+
+        var sizeGraphItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Size"));
+        sizeGraphItem.onselect = this._graphSelected.bind(this);
+
+        var transferSizeCalculator = new WebInspector.ResourceTransferSizeCalculator();
+        sizeGraphItem.sortingOptions = [
+            { name: WebInspector.UIString("Sort by Transfer Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingTransferSize, calculator: transferSizeCalculator },
+            { name: WebInspector.UIString("Sort by Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize, calculator: transferSizeCalculator },
+        ];
+
+        sizeGraphItem.isBarOpaqueAtLeft = true;
+        sizeGraphItem.selectedSortingOptionIndex = 0;
+
+        this.graphsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("GRAPHS"), {}, true);
+        this.sidebarTree.appendChild(this.graphsTreeElement);
+
+        this.graphsTreeElement.appendChild(timeGraphItem);
+        this.graphsTreeElement.appendChild(sizeGraphItem);
+        this.graphsTreeElement.expand();
+
+        this.itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESOURCES"), {}, true);
+        this.sidebarTree.appendChild(this.itemsTreeElement);
+
+        this.itemsTreeElement.expand();
+    },
+
+    get resourceTrackingEnabled()
+    {
+        return this._resourceTrackingEnabled;
+    },
+
+    _createPanelEnabler: function()
+    {
+        var panelEnablerHeading = WebInspector.UIString("You need to enable resource tracking to use this panel.");
+        var panelEnablerDisclaimer = WebInspector.UIString("Enabling resource tracking will reload the page and make page loading slower.");
+        var panelEnablerButton = WebInspector.UIString("Enable resource tracking");
+
+        this.panelEnablerView = new WebInspector.PanelEnablerView("resources", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+        this.panelEnablerView.addEventListener("enable clicked", this._enableResourceTracking, this);
+
+        this.element.appendChild(this.panelEnablerView.element);
+
+        this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+        this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
+    },
+
+    _createStatusbarButtons: function()
+    {
+        this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
+
+        WebInspector.settings.addEventListener("loaded", this._settingsLoaded, this);
+        this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
+        this.sortingSelectElement = document.createElement("select");
+        this.sortingSelectElement.className = "status-bar-item";
+        this.sortingSelectElement.addEventListener("change", this._changeSortingFunction.bind(this), false);
+    },
+
+    _settingsLoaded: function()
+    {
+        this.largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
+        if (!WebInspector.settings.resourcesLargeRows)
+            this._setLargerResources(WebInspector.settings.resourcesLargeRows);
+    },
+
+    get mainResourceLoadTime()
+    {
+        return this._mainResourceLoadTime || -1;
+    },
+    
+    set mainResourceLoadTime(x)
+    {
+        if (this._mainResourceLoadTime === x)
+            return;
+        
+        this._mainResourceLoadTime = x;
+        
+        // Update the dividers to draw the new line
+        this.updateGraphDividersIfNeeded(true);
+    },
+    
+    get mainResourceDOMContentTime()
+    {
+        return this._mainResourceDOMContentTime || -1;
+    },
+    
+    set mainResourceDOMContentTime(x)
+    {
+        if (this._mainResourceDOMContentTime === x)
+            return;
+        
+        this._mainResourceDOMContentTime = x;
+        
+        this.updateGraphDividersIfNeeded(true);
+    },
+
+    show: function()
+    {
+        WebInspector.AbstractTimelinePanel.prototype.show.call(this);
+
+        var visibleView = this.visibleView;
+        if (this.visibleResource) {
+            this.visibleView.headersVisible = true;
+            this.visibleView.show(this.viewsContainerElement);
+        } else if (visibleView)
+            visibleView.show();
+
+        // Hide any views that are visible that are not this panel's current visible view.
+        // This can happen when a ResourceView is visible in the Scripts panel then switched
+        // to the this panel.
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            var view = resource._resourcesView;
+            if (!view || view === visibleView)
+                continue;
+            view.visible = false;
+        }
+    },
+
+    get searchableViews()
+    {
+        var views = [];
+
+        const visibleView = this.visibleView;
+        if (visibleView && visibleView.performSearch)
+            views.push(visibleView);
+
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            if (!resource._itemsTreeElement)
+                continue;
+            var resourceView = this.resourceViewForResource(resource);
+            if (!resourceView.performSearch || resourceView === visibleView)
+                continue;
+            views.push(resourceView);
+        }
+
+        return views;
+    },
+
+    get searchResultsSortFunction()
+    {
+        const resourceTreeElementSortFunction = this.sortingFunction;
+
+        function sortFuction(a, b)
+        {
+            return resourceTreeElementSortFunction(a.resource._itemsTreeElement, b.resource._itemsTreeElement);
+        }
+
+        return sortFuction;
+    },
+
+    searchMatchFound: function(view, matches)
+    {
+        view.resource._itemsTreeElement.searchMatches = matches;
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
+
+        if (startingNewSearch || !this._resources)
+            return;
+
+        for (var i = 0; i < this._resources.length; ++i) {
+            var resource = this._resources[i];
+            if (resource._itemsTreeElement)
+                resource._itemsTreeElement.updateErrorsAndWarnings();
+        }
+    },
+
+    performSearch: function(query)
+    {
+        for (var i = 0; i < this._resources.length; ++i) {
+            var resource = this._resources[i];
+            if (resource._itemsTreeElement)
+                resource._itemsTreeElement.resetBubble();
+        }
+
+        WebInspector.Panel.prototype.performSearch.call(this, query);
+    },
+
+    get visibleView()
+    {
+        if (this.visibleResource)
+            return this.visibleResource._resourcesView;
+        return this._resourceTrackingEnabled ? null : this.panelEnablerView;
+    },
+
+    get sortingFunction()
+    {
+        return this._sortingFunction;
+    },
+
+    set sortingFunction(x)
+    {
+        this._sortingFunction = x;
+        this._sortResourcesIfNeeded();
+    },
+
+    refresh: function()
+    {
+        WebInspector.AbstractTimelinePanel.prototype.refresh.call(this);
+
+        this._sortResourcesIfNeeded();
+        this._updateSummaryGraph();
+    },
+
+    _updateSummaryGraph: function()
+    {
+        this.summaryBar.update(this._resources);
+    },
+
+    resourceTrackingWasEnabled: function()
+    {
+        this._resourceTrackingEnabled = true;
+        this.reset();
+    },
+
+    resourceTrackingWasDisabled: function()
+    {
+        this._resourceTrackingEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        this.closeVisibleResource();
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        if (this._resources) {
+            var resourcesLength = this._resources.length;
+            for (var i = 0; i < resourcesLength; ++i) {
+                var resource = this._resources[i];
+
+                resource.warnings = 0;
+                resource.errors = 0;
+
+                delete resource._resourcesView;
+            }
+        }
+
+        WebInspector.AbstractTimelinePanel.prototype.reset.call(this);
+        
+        this.mainResourceLoadTime = -1;
+        this.mainResourceDOMContentTime = -1;
+ 
+        this.viewsContainerElement.removeChildren();
+
+        this.summaryBar.reset();
+
+        if (this._resourceTrackingEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Resource tracking enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            this.largerResourcesButton.visible = true;
+            this.sortingSelectElement.removeStyleClass("hidden");
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Resource tracking disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            this.largerResourcesButton.visible = false;
+            this.sortingSelectElement.addStyleClass("hidden");
+            this.panelEnablerView.visible = true;
+        }
+    },
+
+    addResource: function(resource)
+    {
+        this._resources.push(resource);
+        this.refreshResource(resource);
+    },
+
+    removeResource: function(resource)
+    {
+        if (this.visibleView === resource._resourcesView)
+            this.closeVisibleResource();
+
+        this.removeItem(resource);
+
+        resource.warnings = 0;
+        resource.errors = 0;
+
+        delete resource._resourcesView;
+    },
+
+    addMessageToResource: function(resource, msg)
+    {
+        if (!resource)
+            return;
+
+        switch (msg.level) {
+        case WebInspector.ConsoleMessage.MessageLevel.Warning:
+            resource.warnings += msg.repeatDelta;
+            break;
+        case WebInspector.ConsoleMessage.MessageLevel.Error:
+            resource.errors += msg.repeatDelta;
+            break;
+        }
+
+        if (!this.currentQuery && resource._itemsTreeElement)
+            resource._itemsTreeElement.updateErrorsAndWarnings();
+
+        var view = this.resourceViewForResource(resource);
+        if (view.addMessage)
+            view.addMessage(msg);
+    },
+
+    clearMessages: function()
+    {
+        var resourcesLength = this._resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = this._resources[i];
+            resource.warnings = 0;
+            resource.errors = 0;
+
+            if (!this.currentQuery && resource._itemsTreeElement)
+                resource._itemsTreeElement.updateErrorsAndWarnings();
+
+            var view = resource._resourcesView;
+            if (!view || !view.clearMessages)
+                continue;
+            view.clearMessages();
+        }
+    },
+
+    refreshResource: function(resource)
+    {
+        this.refreshItem(resource);
+    },
+
+    recreateViewForResourceIfNeeded: function(resource)
+    {
+        if (!resource || !resource._resourcesView)
+            return;
+
+        var newView = this._createResourceView(resource);
+        if (newView.__proto__ === resource._resourcesView.__proto__)
+            return;
+
+        resource.warnings = 0;
+        resource.errors = 0;
+
+        if (!this.currentQuery && resource._itemsTreeElement)
+            resource._itemsTreeElement.updateErrorsAndWarnings();
+
+        var oldView = resource._resourcesView;
+        var oldViewParentNode = oldView.visible ? oldView.element.parentNode : null;
+
+        resource._resourcesView.detach();
+        delete resource._resourcesView;
+
+        resource._resourcesView = newView;
+
+        newView.headersVisible = oldView.headersVisible;
+
+        if (oldViewParentNode)
+            newView.show(oldViewParentNode);
+
+        WebInspector.panels.scripts.viewRecreated(oldView, newView);
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        return this._resourceTrackingEnabled && !!WebInspector.resourceForURL(url);
+    },
+
+    showSourceLine: function(url, line)
+    {
+        this.showResource(WebInspector.resourceForURL(url), line);
+    },
+
+    showResource: function(resource, line)
+    {
+        if (!resource)
+            return;
+
+        this.containerElement.addStyleClass("viewing-resource");
+
+        if (this.visibleResource && this.visibleResource._resourcesView)
+            this.visibleResource._resourcesView.hide();
+
+        var view = this.resourceViewForResource(resource);
+        view.headersVisible = true;
+        view.selectContentTab();
+        view.show(this.viewsContainerElement);
+
+        if (line) {
+            if (view.revealLine)
+                view.revealLine(line);
+            if (view.highlightLine)
+                view.highlightLine(line);
+        }
+
+        this.revealAndSelectItem(resource);
+
+        this.visibleResource = resource;
+
+        this.updateSidebarWidth();
+    },
+
+    showView: function(view)
+    {
+        if (!view)
+            return;
+        this.showResource(view.resource);
+    },
+
+    closeVisibleResource: function()
+    {
+        this.containerElement.removeStyleClass("viewing-resource");
+        this._updateDividersLabelBarPosition();
+
+        if (this.visibleResource && this.visibleResource._resourcesView)
+            this.visibleResource._resourcesView.hide();
+        delete this.visibleResource;
+
+        if (this._lastSelectedGraphTreeElement)
+            this._lastSelectedGraphTreeElement.select(true);
+
+        this.updateSidebarWidth();
+    },
+
+    resourceViewForResource: function(resource)
+    {
+        if (!resource)
+            return null;
+        if (!resource._resourcesView)
+            resource._resourcesView = this._createResourceView(resource);
+        return resource._resourcesView;
+    },
+
+    sourceFrameForResource: function(resource)
+    {
+        var view = this.resourceViewForResource(resource);
+        if (!view)
+            return null;
+
+        if (!view.setupSourceFrameIfNeeded)
+            return null;
+
+        // Setting up the source frame requires that we be attached.
+        if (!this.element.parentNode)
+            this.attach();
+
+        view.setupSourceFrameIfNeeded();
+        return view.sourceFrame;
+    },
+
+    _sortResourcesIfNeeded: function()
+    {
+        this.sortItems(this.sortingFunction);
+    },
+
+    updateGraphDividersIfNeeded: function(force)
+    {
+        var proceed = WebInspector.AbstractTimelinePanel.prototype.updateGraphDividersIfNeeded.call(this, force);
+        
+        if (!proceed)
+            return;
+
+        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
+            // If our current sorting method starts at zero, that means it shows all
+            // resources starting at the same point, and so onLoad event and DOMContent
+            // event lines really wouldn't make much sense here, so don't render them.
+            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
+            // function defined, we are probably sorting by size, and event times aren't relevant
+            // in this case.
+            return;
+        }
+
+        if (this.mainResourceLoadTime !== -1) {
+            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceLoadTime);
+
+            var loadDivider = document.createElement("div");
+            loadDivider.className = "resources-onload-divider";
+
+            var loadDividerPadding = document.createElement("div");
+            loadDividerPadding.className = "resources-event-divider-padding";
+            loadDividerPadding.style.left = percent + "%";
+            loadDividerPadding.title = WebInspector.UIString("Load event fired");
+            loadDividerPadding.appendChild(loadDivider);
+
+            this.addEventDivider(loadDividerPadding);
+        }
+        
+        if (this.mainResourceDOMContentTime !== -1) {
+            var percent = this.calculator.computePercentageFromEventTime(this.mainResourceDOMContentTime);
+
+            var domContentDivider = document.createElement("div");
+            domContentDivider.className = "resources-ondomcontent-divider";
+            
+            var domContentDividerPadding = document.createElement("div");
+            domContentDividerPadding.className = "resources-event-divider-padding";
+            domContentDividerPadding.style.left = percent + "%";
+            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
+            domContentDividerPadding.appendChild(domContentDivider);
+
+            this.addEventDivider(domContentDividerPadding);
+        }
+    },
+
+    _graphSelected: function(treeElement)
+    {
+        if (this._lastSelectedGraphTreeElement)
+            this._lastSelectedGraphTreeElement.selectedSortingOptionIndex = this.sortingSelectElement.selectedIndex;
+
+        this._lastSelectedGraphTreeElement = treeElement;
+
+        this.sortingSelectElement.removeChildren();
+        for (var i = 0; i < treeElement.sortingOptions.length; ++i) {
+            var sortingOption = treeElement.sortingOptions[i];
+            var option = document.createElement("option");
+            option.label = sortingOption.name;
+            option.sortingFunction = sortingOption.sortingFunction;
+            option.calculator = sortingOption.calculator;
+            this.sortingSelectElement.appendChild(option);
+        }
+
+        this.sortingSelectElement.selectedIndex = treeElement.selectedSortingOptionIndex;
+        this._changeSortingFunction();
+
+        this.closeVisibleResource();
+        this.containerElement.scrollTop = 0;
+    },
+
+    _toggleLargerResources: function()
+    {
+        if (!this.itemsTreeElement._childrenListNode)
+            return;
+
+        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
+        this._setLargerResources(this.itemsTreeElement.smallChildren);
+    },
+
+    _setLargerResources: function(enabled)
+    {
+        this.largerResourcesButton.toggled = enabled;
+        this.itemsTreeElement.smallChildren = !enabled;
+        if (!enabled) {
+            this.itemsGraphsElement.addStyleClass("small");
+            this.largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
+            this.adjustScrollPosition();
+        } else {
+            this.itemsGraphsElement.removeStyleClass("small");
+            this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
+        }
+    },
+
+    _changeSortingFunction: function()
+    {
+        var selectedOption = this.sortingSelectElement[this.sortingSelectElement.selectedIndex];
+        this.sortingFunction = selectedOption.sortingFunction;
+        this.calculator = this.summaryBar.calculator = selectedOption.calculator;
+    },
+
+    _createResourceView: function(resource)
+    {
+        switch (resource.category) {
+            case WebInspector.resourceCategories.documents:
+            case WebInspector.resourceCategories.stylesheets:
+            case WebInspector.resourceCategories.scripts:
+            case WebInspector.resourceCategories.xhr:
+                return new WebInspector.SourceView(resource);
+            case WebInspector.resourceCategories.images:
+                return new WebInspector.ImageView(resource);
+            case WebInspector.resourceCategories.fonts:
+                return new WebInspector.FontView(resource);
+            default:
+                return new WebInspector.ResourceView(resource);
+        }
+    },
+
+    setSidebarWidth: function(width)
+    {
+        if (this.visibleResource) {
+            this.containerElement.style.width = width + "px";
+            this.sidebarElement.style.removeProperty("width");
+        } else {
+            this.sidebarElement.style.width = width + "px";
+            this.containerElement.style.removeProperty("width");
+        }
+
+        this.sidebarResizeElement.style.left = (width - 3) + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.viewsContainerElement.style.left = width + "px";
+
+        WebInspector.AbstractTimelinePanel.prototype.updateMainViewWidth.call(this, width);
+        this.resize();
+    },
+
+    _enableResourceTracking: function()
+    {
+        if (this._resourceTrackingEnabled)
+            return;
+        this._toggleResourceTracking(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleResourceTracking: function(optionalAlways)
+    {
+        if (this._resourceTrackingEnabled) {
+            this.largerResourcesButton.visible = false;
+            this.sortingSelectElement.visible = false;
+            WebInspector.resources = {};
+            WebInspector.resourceURLMap = {};
+            InspectorBackend.disableResourceTracking(true);
+        } else {
+            this.largerResourcesButton.visible = true;
+            this.sortingSelectElement.visible = true;
+            InspectorBackend.enableResourceTracking(!!optionalAlways);
+        }
+    },
+
+    get _resources()
+    {
+        return this.items;
+    },
+
+    searchIteratesOverViews: function()
+    {
+        return true;
+    }
+}
+
+WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.AbstractTimelinePanel.prototype;
+
+WebInspector.getResourceContent = function(identifier, callback)
+{
+    InspectorBackend.getResourceContent(WebInspector.Callback.wrap(callback), identifier);
+}
+
+WebInspector.didGetResourceContent = WebInspector.Callback.processCallback;
+
+WebInspector.ResourceTimeCalculator = function(startAtZero)
+{
+    WebInspector.AbstractTimelineCalculator.call(this);
+    this.startAtZero = startAtZero;
+}
+
+WebInspector.ResourceTimeCalculator.prototype = {
+    computeSummaryValues: function(resources)
+    {
+        var resourcesByCategory = {};
+        var resourcesLength = resources.length;
+        for (var i = 0; i < resourcesLength; ++i) {
+            var resource = resources[i];
+            if (!(resource.category.name in resourcesByCategory))
+                resourcesByCategory[resource.category.name] = [];
+            resourcesByCategory[resource.category.name].push(resource);
+        }
+
+        var earliestStart;
+        var latestEnd;
+        var categoryValues = {};
+        for (var category in resourcesByCategory) {
+            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
+            categoryValues[category] = 0;
+
+            var segment = {start: -1, end: -1};
+
+            var categoryResources = resourcesByCategory[category];
+            var resourcesLength = categoryResources.length;
+            for (var i = 0; i < resourcesLength; ++i) {
+                var resource = categoryResources[i];
+                if (resource.startTime === -1 || resource.endTime === -1)
+                    continue;
+
+                if (typeof earliestStart === "undefined")
+                    earliestStart = resource.startTime;
+                else
+                    earliestStart = Math.min(earliestStart, resource.startTime);
+
+                if (typeof latestEnd === "undefined")
+                    latestEnd = resource.endTime;
+                else
+                    latestEnd = Math.max(latestEnd, resource.endTime);
+
+                if (resource.startTime <= segment.end) {
+                    segment.end = Math.max(segment.end, resource.endTime);
+                    continue;
+                }
+
+                categoryValues[category] += segment.end - segment.start;
+
+                segment.start = resource.startTime;
+                segment.end = resource.endTime;
+            }
+
+            // Add the last segment
+            categoryValues[category] += segment.end - segment.start;
+        }
+
+        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
+    },
+
+    computeBarGraphPercentages: function(resource)
+    {
+        if (resource.startTime !== -1)
+            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var start = 0;
+
+        if (resource.responseReceivedTime !== -1)
+            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var middle = (this.startAtZero ? start : 100);
+
+        if (resource.endTime !== -1)
+            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
+        else
+            var end = (this.startAtZero ? middle : 100);
+
+        if (this.startAtZero) {
+            end -= start;
+            middle -= start;
+            start = 0;
+        }
+
+        return {start: start, middle: middle, end: end};
+    },
+    
+    computePercentageFromEventTime: function(eventTime)
+    {
+        // This function computes a percentage in terms of the total loading time
+        // of a specific event. If startAtZero is set, then this is useless, and we
+        // want to return 0.
+        if (eventTime !== -1 && !this.startAtZero)
+            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
+
+        return 0;
+    },
+
+    computeBarGraphLabels: function(resource)
+    {
+        var rightLabel = "";
+        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
+            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
+
+        var hasLatency = resource.latency > 0;
+        if (hasLatency)
+            var leftLabel = this.formatValue(resource.latency);
+        else
+            var leftLabel = rightLabel;
+
+        if (hasLatency && rightLabel) {
+            var total = this.formatValue(resource.duration);
+            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
+        } else if (hasLatency)
+            var tooltip = WebInspector.UIString("%s latency", leftLabel);
+        else if (rightLabel)
+            var tooltip = WebInspector.UIString("%s download", rightLabel);
+
+        if (resource.cached)
+            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
+
+        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
+    },
+
+    updateBoundaries: function(resource)
+    {
+        var didChange = false;
+
+        var lowerBound;
+        if (this.startAtZero)
+            lowerBound = 0;
+        else
+            lowerBound = this._lowerBound(resource);
+
+        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
+            this.minimumBoundary = lowerBound;
+            didChange = true;
+        }
+
+        var upperBound = this._upperBound(resource);
+        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
+            this.maximumBoundary = upperBound;
+            didChange = true;
+        }
+
+        return didChange;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _lowerBound: function(resource)
+    {
+        return 0;
+    },
+
+    _upperBound: function(resource)
+    {
+        return 0;
+    }
+}
+
+WebInspector.ResourceTimeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
+
+WebInspector.ResourceTransferTimeCalculator = function()
+{
+    WebInspector.ResourceTimeCalculator.call(this, false);
+}
+
+WebInspector.ResourceTransferTimeCalculator.prototype = {
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _lowerBound: function(resource)
+    {
+        return resource.startTime;
+    },
+
+    _upperBound: function(resource)
+    {
+        return resource.endTime;
+    }
+}
+
+WebInspector.ResourceTransferTimeCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
+
+WebInspector.ResourceTransferDurationCalculator = function()
+{
+    WebInspector.ResourceTimeCalculator.call(this, true);
+}
+
+WebInspector.ResourceTransferDurationCalculator.prototype = {
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
+    },
+
+    _upperBound: function(resource)
+    {
+        return resource.duration;
+    }
+}
+
+WebInspector.ResourceTransferDurationCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
+
+WebInspector.ResourceTransferSizeCalculator = function()
+{
+    WebInspector.AbstractTimelineCalculator.call(this);
+}
+
+WebInspector.ResourceTransferSizeCalculator.prototype = {
+    computeBarGraphLabels: function(resource)
+    {
+        var networkBytes = this._networkBytes(resource);
+        var resourceBytes = this._value(resource);
+        if (networkBytes && networkBytes !== resourceBytes) {
+            // Transferred size is not the same as reported resource length.
+            var networkBytesString = this.formatValue(networkBytes);
+            var left = networkBytesString;
+            var right = this.formatValue(resourceBytes);
+            var tooltip = right ? WebInspector.UIString("%s (%s transferred)", right, networkBytesString) : right;
+        } else {
+            var left = this.formatValue(resourceBytes);
+            var right = left;
+            var tooltip = left;
+        }
+        if (resource.cached)
+            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
+        return {left: left, right: right, tooltip: tooltip};
+    },
+
+    computeBarGraphPercentages: function(item)
+    {
+        const resourceBytesAsPercent = (this._value(item) / this.boundarySpan) * 100;
+        const networkBytesAsPercent = this._networkBytes(item) ? (this._networkBytes(item) / this.boundarySpan) * 100 : resourceBytesAsPercent;
+        return {start: 0, middle: networkBytesAsPercent, end: resourceBytesAsPercent};
+    },
+
+    _value: function(resource)
+    {
+        return resource.resourceSize;
+    },
+
+    _networkBytes: function(resource)
+    {
+        return resource.transferSize;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.bytesToString(value, WebInspector.UIString.bind(WebInspector));
+    }
+}
+
+WebInspector.ResourceTransferSizeCalculator.prototype.__proto__ = WebInspector.AbstractTimelineCalculator.prototype;
+
+WebInspector.ResourceSidebarTreeElement = function(resource)
+{
+    this.resource = resource;
+
+    this.createIconElement();
+
+    WebInspector.SidebarTreeElement.call(this, "resource-sidebar-tree-item", "", "", resource);
+
+    this.refreshTitles();
+}
+
+WebInspector.ResourceSidebarTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
+
+        this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
+        this._listItemNode.draggable = true;
+        
+        // FIXME: should actually add handler to parent, to be resolved via
+        // https://bugs.webkit.org/show_bug.cgi?id=30227
+        this._listItemNode.addEventListener("dragstart", this.ondragstart.bind(this), false);
+        this.updateErrorsAndWarnings();
+    },
+
+    onselect: function()
+    {
+        WebInspector.panels.resources.showResource(this.resource);
+    },
+    
+    ondblclick: function(event)
+    {
+        InjectedScriptAccess.getDefault().openInInspectedWindow(this.resource.url, function() {});
+    },
+
+    ondragstart: function(event) {
+        event.dataTransfer.setData("text/plain", this.resource.url);
+        event.dataTransfer.setData("text/uri-list", this.resource.url + "\r\n");
+        event.dataTransfer.effectAllowed = "copy";
+        return true;
+    },
+
+    get mainTitle()
+    {
+        return this.resource.displayName;
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        var subtitle = this.resource.displayDomain;
+
+        if (this.resource.path && this.resource.lastPathComponent) {
+            var lastPathComponentIndex = this.resource.path.lastIndexOf("/" + this.resource.lastPathComponent);
+            if (lastPathComponentIndex != -1)
+                subtitle += this.resource.path.substring(0, lastPathComponentIndex);
+        }
+
+        return subtitle;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    },
+
+    get selectable()
+    {
+        return WebInspector.panels.resources.isCategoryVisible(this.resource.category.name);
+    },
+
+    createIconElement: function()
+    {
+        var previousIconElement = this.iconElement;
+
+        if (this.resource.category === WebInspector.resourceCategories.images) {
+            var previewImage = document.createElement("img");
+            previewImage.className = "image-resource-icon-preview";
+            previewImage.src = this.resource.url;
+
+            this.iconElement = document.createElement("div");
+            this.iconElement.className = "icon";
+            this.iconElement.appendChild(previewImage);
+        } else {
+            this.iconElement = document.createElement("img");
+            this.iconElement.className = "icon";
+        }
+
+        if (previousIconElement)
+            previousIconElement.parentNode.replaceChild(this.iconElement, previousIconElement);
+    },
+
+    refresh: function()
+    {
+        this.refreshTitles();
+
+        if (!this._listItemNode.hasStyleClass("resources-category-" + this.resource.category.name)) {
+            this._listItemNode.removeMatchingStyleClasses("resources-category-\\w+");
+            this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
+
+            this.createIconElement();
+        }
+
+        this.tooltip = this.resource.url;
+    },
+
+    resetBubble: function()
+    {
+        this.bubbleText = "";
+        this.bubbleElement.removeStyleClass("search-matches");
+        this.bubbleElement.removeStyleClass("warning");
+        this.bubbleElement.removeStyleClass("error");
+    },
+
+    set searchMatches(matches)
+    {
+        this.resetBubble();
+
+        if (!matches)
+            return;
+
+        this.bubbleText = matches;
+        this.bubbleElement.addStyleClass("search-matches");
+    },
+
+    updateErrorsAndWarnings: function()
+    {
+        this.resetBubble();
+
+        if (this.resource.warnings || this.resource.errors)
+            this.bubbleText = (this.resource.warnings + this.resource.errors);
+
+        if (this.resource.warnings)
+            this.bubbleElement.addStyleClass("warning");
+
+        if (this.resource.errors)
+            this.bubbleElement.addStyleClass("error");
+    }
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByEndTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime = function(a, b)
+{
+    return WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
+        || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByDuration(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByLatency(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareBySize(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.CompareByDescendingTransferSize = function(a, b)
+{
+    return -1 * WebInspector.Resource.CompareByTransferSize(a.resource, b.resource);
+}
+
+WebInspector.ResourceSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.ResourceGraph = function(resource)
+{
+    this.resource = resource;
+
+    this._graphElement = document.createElement("div");
+    this._graphElement.className = "resources-graph-side";
+    this._graphElement.addEventListener("mouseover", this.refreshLabelPositions.bind(this), false);
+
+    if (resource.cached)
+        this._graphElement.addStyleClass("resource-cached");
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "resources-graph-bar-area hidden";
+    this._graphElement.appendChild(this._barAreaElement);
+
+    this._barLeftElement = document.createElement("div");
+    this._barLeftElement.className = "resources-graph-bar waiting";
+    this._barAreaElement.appendChild(this._barLeftElement);
+
+    this._barRightElement = document.createElement("div");
+    this._barRightElement.className = "resources-graph-bar";
+    this._barAreaElement.appendChild(this._barRightElement);
+
+    this._labelLeftElement = document.createElement("div");
+    this._labelLeftElement.className = "resources-graph-label waiting";
+    this._barAreaElement.appendChild(this._labelLeftElement);
+
+    this._labelRightElement = document.createElement("div");
+    this._labelRightElement.className = "resources-graph-label";
+    this._barAreaElement.appendChild(this._labelRightElement);
+
+    this._graphElement.addStyleClass("resources-category-" + resource.category.name);
+}
+
+WebInspector.ResourceGraph.prototype = {
+    get graphElement()
+    {
+        return this._graphElement;
+    },
+
+    refreshLabelPositions: function()
+    {
+        this._labelLeftElement.style.removeProperty("left");
+        this._labelLeftElement.style.removeProperty("right");
+        this._labelLeftElement.removeStyleClass("before");
+        this._labelLeftElement.removeStyleClass("hidden");
+
+        this._labelRightElement.style.removeProperty("left");
+        this._labelRightElement.style.removeProperty("right");
+        this._labelRightElement.removeStyleClass("after");
+        this._labelRightElement.removeStyleClass("hidden");
+
+        const labelPadding = 10;
+        const barRightElementOffsetWidth = this._barRightElement.offsetWidth;
+        const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;
+
+        if (this._isBarOpaqueAtLeft) {
+            var leftBarWidth = barLeftElementOffsetWidth - labelPadding;
+            var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;
+        } else {
+            var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;
+            var rightBarWidth = barRightElementOffsetWidth - labelPadding;
+        }
+
+        const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;
+        const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;
+
+        const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);
+        const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);
+        const graphElementOffsetWidth = this._graphElement.offsetWidth;
+
+        if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))
+            var leftHidden = true;
+
+        if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))
+            var rightHidden = true;
+
+        if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {
+            // The left/right label data are the same, so a before/after label can be replaced by an on-bar label.
+            if (labelBefore && !labelAfter)
+                leftHidden = true;
+            else if (labelAfter && !labelBefore)
+                rightHidden = true;
+        }
+
+        if (labelBefore) {
+            if (leftHidden)
+                this._labelLeftElement.addStyleClass("hidden");
+            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
+            this._labelLeftElement.addStyleClass("before");
+        } else {
+            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
+            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
+        }
+
+        if (labelAfter) {
+            if (rightHidden)
+                this._labelRightElement.addStyleClass("hidden");
+            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
+            this._labelRightElement.addStyleClass("after");
+        } else {
+            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
+            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
+        }
+    },
+
+    refresh: function(calculator, isBarOpaqueAtLeft)
+    {
+        var percentages = calculator.computeBarGraphPercentages(this.resource);
+        var labels = calculator.computeBarGraphLabels(this.resource);
+
+        this._percentages = percentages;
+
+        this._barAreaElement.removeStyleClass("hidden");
+
+        if (!this._graphElement.hasStyleClass("resources-category-" + this.resource.category.name)) {
+            this._graphElement.removeMatchingStyleClasses("resources-category-\\w+");
+            this._graphElement.addStyleClass("resources-category-" + this.resource.category.name);
+        }
+
+        this._barLeftElement.style.setProperty("left", percentages.start + "%");
+        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
+
+        if (!isBarOpaqueAtLeft) {
+            this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
+            this._barRightElement.style.setProperty("left", percentages.middle + "%");
+
+            if (this._isBarOpaqueAtLeft != isBarOpaqueAtLeft) {
+                this._barLeftElement.addStyleClass("waiting");
+                this._barRightElement.removeStyleClass("waiting-right");
+                this._labelLeftElement.addStyleClass("waiting");
+                this._labelRightElement.removeStyleClass("waiting-right");
+            }
+        } else {
+            this._barLeftElement.style.setProperty("right", (100 - percentages.middle) + "%");
+            this._barRightElement.style.setProperty("left", percentages.start + "%");
+
+            if (this._isBarOpaqueAtLeft != isBarOpaqueAtLeft) {
+                this._barLeftElement.removeStyleClass("waiting");
+                this._barRightElement.addStyleClass("waiting-right");
+                this._labelLeftElement.removeStyleClass("waiting");
+                this._labelRightElement.addStyleClass("waiting-right");
+            }
+        }
+
+        this._isBarOpaqueAtLeft = isBarOpaqueAtLeft;
+
+        this._labelLeftElement.textContent = labels.left;
+        this._labelRightElement.textContent = labels.right;
+
+        var tooltip = (labels.tooltip || "");
+        this._barLeftElement.title = tooltip;
+        this._labelLeftElement.title = tooltip;
+        this._labelRightElement.title = tooltip;
+        this._barRightElement.title = tooltip;
+    }
+}
+
+/* InjectedFakeWorker.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var InjectedFakeWorker = function()
+{
+
+Worker = function(url)
+{
+    var impl = new FakeWorker(this, url);
+    if (impl === null)
+        return null;
+
+    this.isFake = true;
+    this.postMessage = bind(impl.postMessage, impl);
+    this.terminate = bind(impl.terminate, impl);
+    this.onmessage = noop;
+}
+
+function FakeWorker(worker, url)
+{
+    var scriptURL = new URL(document.baseURI).completeWith(url);
+
+    if (!scriptURL.sameOrigin(location.href))
+        throw new DOMCoreException("SECURITY_ERR",18);
+
+    this._worker = worker;
+    this._buildWorker(scriptURL);
+}
+
+FakeWorker.prototype = {
+    postMessage: function(msg)
+    {
+        if (this._frame != null)
+            this._dispatchMessage(this._frame, bind(this._onmessageWrapper, this), msg);
+    },
+
+    terminate: function()
+    {
+        if (this._frame != null) {
+            this._frame.onmessage = this._worker.onmessage = noop;
+            this._frame.frameElement.parentNode.removeChild(this._frame.frameElement);
+        }
+        this._frame = null;
+        this._worker = null; // Break reference loop.
+    },
+
+    _onmessageWrapper: function(msg)
+    {
+        // Shortcut -- if no exception handlers installed, avoid try/catch so as not to obscure line number.
+        if (!this._frame.onerror && !this._worker.onerror) {
+            this._frame.onmessage(msg);
+            return;
+        }
+
+        try {
+            this._frame.onmessage(msg);
+        } catch (e) {
+            this._handleException(e, this._frame.onerror, this._worker.onerror);
+        }
+    },
+
+    _dispatchMessage: function(targetWindow, handler, msg)
+    {
+        var event = this._document.createEvent("MessageEvent");
+        event.initMessageEvent("MessageEvent", false, false, msg);
+        targetWindow.setTimeout(handler, 0, event);
+    },
+
+    _handleException: function(e)
+    {
+        // NB: it should be an ErrorEvent, but creating it from script is not
+        // currently supported, to emulate it on top of plain vanilla Event.
+        var errorEvent = this._document.createEvent("Event");
+        errorEvent.initEvent("Event", false, false);
+        errorEvent.message = "Uncaught exception";
+
+        for (var i = 1; i < arguments.length; ++i) {
+            if (arguments[i] && arguments[i](errorEvent))
+                return;
+        }
+
+        throw e;
+    },
+
+    _buildWorker: function(url)
+    {
+        var code = this._loadScript(url.url);
+        var iframeElement = document.createElement("iframe");
+        iframeElement.style.display = "none";
+        document.body.appendChild(iframeElement);
+
+        var frame = window.frames[window.frames.length - 1];
+
+        this._document = document;
+        this._frame = frame;
+
+        this._setupWorkerContext(frame, url);
+
+        var frameContents = '(function(location, window) { ' + code + '})(__devtools.location, undefined);\n' + '//@ sourceURL=' + url.url;
+
+        frame.eval(frameContents);
+    },
+
+    _setupWorkerContext: function(workerFrame, url)
+    {
+        workerFrame.__devtools = {
+            handleException: bind(this._handleException, this),
+            location: url.mockLocation()
+        };
+        var worker = this._worker;
+
+        function handler(event) // Late binding to onmessage desired, so no bind() here.
+        {
+            worker.onmessage(event);
+        }
+
+        workerFrame.onmessage = noop;
+        workerFrame.postMessage = bind(this._dispatchMessage, this, window, handler);
+        workerFrame.importScripts = bind(this._importScripts, this, workerFrame);
+        workerFrame.close = bind(this.terminate, this);
+    },
+
+    _importScripts: function(evalTarget)
+    {
+        for (var i = 1; i < arguments.length; ++i)
+            evalTarget.eval(this._loadScript(arguments[i]));
+    },
+
+    _loadScript: function(url)
+    {
+        var xhr = new XMLHttpRequest();
+        xhr.open("GET", url, false);
+        xhr.send(null);
+
+        var text = xhr.responseText;
+        if (xhr.status != 0 && xhr.status/100 !== 2) { // We're getting status === 0 when using file://.
+            console.error("Failed to load worker: " + url + "[" + xhr.status + "]");
+            text = ""; // We've got error message, not worker code.
+        }
+        return text;
+    }
+};
+
+function URL(url)
+{
+    this.url = url;
+    this.split();
+}
+
+URL.prototype = {
+    urlRegEx: (/^(http[s]?|file):\/\/([^\/:]*)(:[\d]+)?(?:(\/[^#?]*)(\?[^#]*)?(?:#(.*))?)?$/i),
+
+    split: function()
+    {
+        function emptyIfNull(str)
+        {
+            return str == null ? "" : str;
+        }
+        var parts = this.urlRegEx.exec(this.url);
+
+        this.schema = parts[1];
+        this.host = parts[2];
+        this.port = emptyIfNull(parts[3]);
+        this.path = emptyIfNull(parts[4]);
+        this.query = emptyIfNull(parts[5]);
+        this.fragment = emptyIfNull(parts[6]);
+    },
+
+    mockLocation: function()
+    {
+        var host = this.host.replace(/^[^@]*@/, "");
+
+        return {
+            href:     this.url,
+            protocol: this.schema + ":",
+            host:     host,
+            hostname: host,
+            port:     this.port,
+            pathname: this.path,
+            search:   this.query,
+            hash:     this.fragment
+        };
+    },
+
+    completeWith: function(url)
+    {
+        if (url === "" || /^[^/]*:/.exec(url)) // If given absolute url, return as is now.
+            return new URL(url);
+
+        var relParts = /^([^#?]*)(.*)$/.exec(url); // => [ url, path, query-andor-fragment ]
+
+        var path = (relParts[1].slice(0, 1) === "/" ? "" : this.path.replace(/[^/]*$/, "")) + relParts[1];
+        path = path.replace(/(\/\.)+(\/|$)/g, "/").replace(/[^/]*\/\.\.(\/|$)/g, "");
+
+        return new URL(this.schema + "://" + this.host + this.port + path + relParts[2]);
+    },
+
+    sameOrigin: function(url)
+    {
+        function normalizePort(schema, port)
+        {
+            var portNo = port.slice(1);
+            return (schema === "https" && portNo == 443 || schema === "http" && portNo == 80) ? "" : port;
+        }
+
+        var other = new URL(url);
+
+        return this.schema === other.schema &&
+            this.host === other.host &&
+            normalizePort(this.schema, this.port) === normalizePort(other.schema, other.port);
+    }
+};
+
+function DOMCoreException(name, code)
+{
+    function formatError()
+    {
+        return "Error: " + this.message;
+    }
+
+    this.name = name;
+    this.message = name + ": DOM Exception " + code;
+    this.code = code;
+    this.toString = bind(formatError, this);
+}
+
+function bind(func, thisObject)
+{
+    var args = Array.prototype.slice.call(arguments, 2);
+    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };
+}
+
+function noop()
+{
+}
+
+}
+
+/* ScriptsPanel.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScriptsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.element.addStyleClass("scripts");
+
+    this.topStatusBar = document.createElement("div");
+    this.topStatusBar.className = "status-bar";
+    this.topStatusBar.id = "scripts-status-bar";
+    this.element.appendChild(this.topStatusBar);
+
+    this.backButton = document.createElement("button");
+    this.backButton.className = "status-bar-item";
+    this.backButton.id = "scripts-back";
+    this.backButton.title = WebInspector.UIString("Show the previous script resource.");
+    this.backButton.disabled = true;
+    this.backButton.appendChild(document.createElement("img"));
+    this.backButton.addEventListener("click", this._goBack.bind(this), false);
+    this.topStatusBar.appendChild(this.backButton);
+
+    this.forwardButton = document.createElement("button");
+    this.forwardButton.className = "status-bar-item";
+    this.forwardButton.id = "scripts-forward";
+    this.forwardButton.title = WebInspector.UIString("Show the next script resource.");
+    this.forwardButton.disabled = true;
+    this.forwardButton.appendChild(document.createElement("img"));
+    this.forwardButton.addEventListener("click", this._goForward.bind(this), false);
+    this.topStatusBar.appendChild(this.forwardButton);
+
+    this.filesSelectElement = document.createElement("select");
+    this.filesSelectElement.className = "status-bar-item";
+    this.filesSelectElement.id = "scripts-files";
+    this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false);
+    this.topStatusBar.appendChild(this.filesSelectElement);
+
+    this.functionsSelectElement = document.createElement("select");
+    this.functionsSelectElement.className = "status-bar-item";
+    this.functionsSelectElement.id = "scripts-functions";
+
+    // FIXME: append the functions select element to the top status bar when it is implemented.
+    // this.topStatusBar.appendChild(this.functionsSelectElement);
+
+    this.sidebarButtonsElement = document.createElement("div");
+    this.sidebarButtonsElement.id = "scripts-sidebar-buttons";
+    this.topStatusBar.appendChild(this.sidebarButtonsElement);
+
+    this.pauseButton = document.createElement("button");
+    this.pauseButton.className = "status-bar-item";
+    this.pauseButton.id = "scripts-pause";
+    this.pauseButton.title = WebInspector.UIString("Pause script execution.");
+    this.pauseButton.disabled = true;
+    this.pauseButton.appendChild(document.createElement("img"));
+    this.pauseButton.addEventListener("click", this._togglePause.bind(this), false);
+    this.sidebarButtonsElement.appendChild(this.pauseButton);
+
+    this.stepOverButton = document.createElement("button");
+    this.stepOverButton.className = "status-bar-item";
+    this.stepOverButton.id = "scripts-step-over";
+    this.stepOverButton.title = WebInspector.UIString("Step over next function call.");
+    this.stepOverButton.disabled = true;
+    this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false);
+    this.stepOverButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepOverButton);
+
+    this.stepIntoButton = document.createElement("button");
+    this.stepIntoButton.className = "status-bar-item";
+    this.stepIntoButton.id = "scripts-step-into";
+    this.stepIntoButton.title = WebInspector.UIString("Step into next function call.");
+    this.stepIntoButton.disabled = true;
+    this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false);
+    this.stepIntoButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepIntoButton);
+
+    this.stepOutButton = document.createElement("button");
+    this.stepOutButton.className = "status-bar-item";
+    this.stepOutButton.id = "scripts-step-out";
+    this.stepOutButton.title = WebInspector.UIString("Step out of current function.");
+    this.stepOutButton.disabled = true;
+    this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false);
+    this.stepOutButton.appendChild(document.createElement("img"));
+    this.sidebarButtonsElement.appendChild(this.stepOutButton);
+
+    this.toggleBreakpointsButton = new WebInspector.StatusBarButton("", "toggle-breakpoints");
+    this.toggleBreakpointsButton.addEventListener("click", this._toggleBreakpointsClicked.bind(this), false);
+    this.sidebarButtonsElement.appendChild(this.toggleBreakpointsButton.element);
+    // Breakpoints should be activated by default, so emulate a click to toggle on.
+    this._toggleBreakpointsClicked();
+
+    this.debuggerStatusElement = document.createElement("div");
+    this.debuggerStatusElement.id = "scripts-debugger-status";
+    this.sidebarButtonsElement.appendChild(this.debuggerStatusElement);
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "script-resource-views";
+
+    this.sidebarElement = document.createElement("div");
+    this.sidebarElement.id = "scripts-sidebar";
+
+    this.sidebarResizeElement = document.createElement("div");
+    this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+    this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
+
+    this.sidebarResizeWidgetElement = document.createElement("div");
+    this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget";
+    this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);
+    this.topStatusBar.appendChild(this.sidebarResizeWidgetElement);
+
+    this.sidebarPanes = {};
+    this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
+    this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
+    this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
+    this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane();
+
+    for (var pane in this.sidebarPanes)
+        this.sidebarElement.appendChild(this.sidebarPanes[pane].element);
+
+    this.sidebarPanes.callstack.expanded = true;
+    this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this);
+
+    this.sidebarPanes.scopechain.expanded = true;
+    this.sidebarPanes.breakpoints.expanded = true;
+
+    var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel.");
+    var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower.");
+    var panelEnablerButton = WebInspector.UIString("Enable Debugging");
+
+    this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+    this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this);
+
+    this.element.appendChild(this.panelEnablerView.element);
+    this.element.appendChild(this.viewsContainerElement);
+    this.element.appendChild(this.sidebarElement);
+    this.element.appendChild(this.sidebarResizeElement);
+
+    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+    this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false);
+
+    this._pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item", 3);
+    this._pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false);
+    this._pauseOnExceptionButton.state = WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions;
+
+    this._shortcuts = {};
+    var handler, shortcut;
+    var platformSpecificModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta : WebInspector.KeyboardShortcut.Modifiers.Ctrl;
+
+    // Continue.
+    handler = this.pauseButton.click.bind(this.pauseButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F8);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Slash, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step over.
+    handler = this.stepOverButton.click.bind(this.stepOverButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F10);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.SingleQuote, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step into.
+    handler = this.stepIntoButton.click.bind(this.stepIntoButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    // Step out.
+    handler = this.stepOutButton.click.bind(this.stepOutButton);
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.F11, WebInspector.KeyboardShortcut.Modifiers.Shift);
+    this._shortcuts[shortcut] = handler;
+    shortcut = WebInspector.KeyboardShortcut.makeKey(WebInspector.KeyboardShortcut.KeyCodes.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift, platformSpecificModifier);
+    this._shortcuts[shortcut] = handler;
+
+    this._debuggerEnabled = Preferences.debuggerAlwaysEnabled;
+    this.reset();
+}
+
+// Keep these in sync with WebCore::ScriptDebugServer
+WebInspector.ScriptsPanel.PauseOnExceptionsState = {
+    DontPauseOnExceptions : 0,
+    PauseOnAllExceptions : 1,
+    PauseOnUncaughtExceptions: 2
+};
+
+WebInspector.ScriptsPanel.prototype = {
+    toolbarItemClass: "scripts",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Scripts");
+    },
+
+    get statusBarItems()
+    {
+        return [this.enableToggleButton.element, this._pauseOnExceptionButton.element];
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.filesSelectElement;
+    },
+
+    get paused()
+    {
+        return this._paused;
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";
+
+        if (this.visibleView) {
+            if (this.visibleView instanceof WebInspector.ResourceView)
+                this.visibleView.headersVisible = false;
+            this.visibleView.show(this.viewsContainerElement);
+        }
+        if (this._attachDebuggerWhenShown) {
+            InspectorBackend.enableDebugger(false);
+            delete this._attachDebuggerWhenShown;
+        }
+    },
+
+    get searchableViews()
+    {
+        return [ this.visibleView ];
+    },
+
+    get breakpointsActivated()
+    {
+        return this.toggleBreakpointsButton.toggled;
+    },
+
+    addScript: function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
+    {
+        var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, errorLine, errorMessage);
+        this._sourceIDMap[sourceID] = script;
+
+        var resource = WebInspector.resourceURLMap[sourceURL];
+        if (resource) {
+            if (resource.finished) {
+                // Resource is finished, bind the script right away.
+                resource.addScript(script);
+                this._sourceIDMap[sourceID] = resource;
+            } else {
+                // Resource is not finished, bind the script later.
+                if (!resource._scriptsPendingResourceLoad) {
+                    resource._scriptsPendingResourceLoad = [];
+                    resource.addEventListener("finished", this._resourceLoadingFinished, this);
+                }
+                resource._scriptsPendingResourceLoad.push(script);
+            }
+        }
+        this._addScriptToFilesMenu(script);
+    },
+
+    _resourceLoadingFinished: function(e)
+    {
+        var resource = e.target;
+        for (var i = 0; i < resource._scriptsPendingResourceLoad.length; ++i) {
+            // Bind script to resource.
+            var script = resource._scriptsPendingResourceLoad[i];
+            resource.addScript(script);
+            this._sourceIDMap[script.sourceID] = resource;
+
+            // Remove script from the files list.
+            script.filesSelectOption.parentElement.removeChild(script.filesSelectOption);
+            
+            // Move breakpoints to the resource's frame.
+            if (script._scriptView) {
+                var sourceFrame = script._scriptView.sourceFrame;
+                for (var j = 0; j < sourceFrame.breakpoints; ++j) {
+                    var resourceFrame = this._sourceFrameForScriptOrResource(resource);
+                    resourceFrame.addBreakpoint(sourceFrame.breakpoints[j]);
+                }
+            }
+        }
+        // Adding first script will add resource.
+        this._addScriptToFilesMenu(resource._scriptsPendingResourceLoad[0]);
+        delete resource._scriptsPendingResourceLoad;
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        if (!this.breakpointsActivated)
+            this._toggleBreakpointsClicked();
+
+        this.sidebarPanes.breakpoints.addBreakpoint(breakpoint);
+
+        var sourceFrame;
+        if (breakpoint.url) {
+            var resource = WebInspector.resourceURLMap[breakpoint.url];
+            if (resource && resource.finished)
+                sourceFrame = this._sourceFrameForScriptOrResource(resource);
+        }
+
+        if (breakpoint.sourceID && !sourceFrame) {
+            var object = this._sourceIDMap[breakpoint.sourceID]
+            sourceFrame = this._sourceFrameForScriptOrResource(object);
+        }
+
+        if (sourceFrame)
+            sourceFrame.addBreakpoint(breakpoint);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        this.sidebarPanes.breakpoints.removeBreakpoint(breakpoint);
+
+        var sourceFrame;
+        if (breakpoint.url) {
+            var resource = WebInspector.resourceURLMap[breakpoint.url];
+            if (resource && resource.finished)
+                sourceFrame = this._sourceFrameForScriptOrResource(resource);
+        }
+
+        if (breakpoint.sourceID && !sourceFrame) {
+            var object = this._sourceIDMap[breakpoint.sourceID]
+            sourceFrame = this._sourceFrameForScriptOrResource(object);
+        }
+
+        if (sourceFrame)
+            sourceFrame.removeBreakpoint(breakpoint);
+    },
+
+    selectedCallFrameId: function()
+    {
+        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
+        if (!selectedCallFrame)
+            return null;
+        return selectedCallFrame.id;
+    },
+
+    evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)
+    {
+        var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
+        if (!this._paused || !selectedCallFrame)
+            return;
+
+        if (typeof updateInterface === "undefined")
+            updateInterface = true;
+
+        var self = this;
+        function updatingCallbackWrapper(result, exception)
+        {
+            callback(result, exception);
+            if (updateInterface)
+                self.sidebarPanes.scopechain.update(selectedCallFrame);
+        }
+        this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);
+    },
+
+    doEvalInCallFrame: function(callFrame, code, objectGroup, callback)
+    {
+        function evalCallback(result)
+        {
+            if (result)
+                callback(result.value, result.isException);
+        }
+        InjectedScriptAccess.get(callFrame.injectedScriptId).evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
+    },
+
+    debuggerPaused: function(callFrames)
+    {
+        this._paused = true;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        this._updateDebuggerButtons();
+
+        this.sidebarPanes.callstack.update(callFrames, this._sourceIDMap);
+        this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];
+
+        WebInspector.currentPanel = this;
+        window.focus();
+    },
+
+    debuggerResumed: function()
+    {
+        this._paused = false;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        this._clearInterface();
+    },
+
+    attachDebuggerWhenShown: function()
+    {
+        if (this.element.parentElement) {
+            InspectorBackend.enableDebugger(false);
+        } else {
+            this._attachDebuggerWhenShown = true;
+        }
+    },
+
+    debuggerWasEnabled: function()
+    {
+        if (this._debuggerEnabled)
+            return;
+
+        this._debuggerEnabled = true;
+        this.reset();
+    },
+
+    debuggerWasDisabled: function()
+    {
+        if (!this._debuggerEnabled)
+            return;
+
+        this._debuggerEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        this.visibleView = null;
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        if (!this._debuggerEnabled) {
+            this._paused = false;
+            this._waitingToPause = false;
+            this._stepping = false;
+        }
+
+        this._clearInterface();
+
+        this._backForwardList = [];
+        this._currentBackForwardIndex = -1;
+        this._updateBackAndForwardButtons();
+
+        this._resourceForURLInFilesSelect = {};
+        this.filesSelectElement.removeChildren();
+        this.functionsSelectElement.removeChildren();
+        this.viewsContainerElement.removeChildren();
+
+        if (this._sourceIDMap) {
+            for (var sourceID in this._sourceIDMap) {
+                var object = this._sourceIDMap[sourceID];
+                if (object instanceof WebInspector.Resource)
+                    object.removeAllScripts();
+            }
+        }
+
+        this._sourceIDMap = {};
+        
+        this.sidebarPanes.watchExpressions.refreshExpressions();
+        this.sidebarPanes.breakpoints.reset();
+    },
+
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x)
+            return;
+
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x)
+            x.show(this.viewsContainerElement);
+    },
+
+    viewRecreated: function(oldView, newView)
+    {
+        if (this._visibleView === oldView)
+            this._visibleView = newView;
+    },
+
+    canShowSourceLine: function(url, line)
+    {
+        if (!this._debuggerEnabled)
+            return false;
+        return !!this._scriptOrResourceForURLAndLine(url, line);
+    },
+
+    showSourceLine: function(url, line)
+    {
+        var scriptOrResource = this._scriptOrResourceForURLAndLine(url, line);
+        this._showScriptOrResource(scriptOrResource, {line: line, shouldHighlightLine: true});
+    },
+
+    _scriptOrResourceForURLAndLine: function(url, line) 
+    {
+        var scriptWithMatchingUrl = null;
+        for (var sourceID in this._sourceIDMap) {
+            var scriptOrResource = this._sourceIDMap[sourceID];
+            if (scriptOrResource instanceof WebInspector.Script) {
+                if (scriptOrResource.sourceURL !== url)
+                    continue;
+                scriptWithMatchingUrl = scriptOrResource;
+                if (scriptWithMatchingUrl.startingLine <= line && scriptWithMatchingUrl.startingLine + scriptWithMatchingUrl.linesCount > line)
+                    return scriptWithMatchingUrl;
+            } else {
+                var resource = scriptOrResource;
+                if (resource.url === url)
+                    return resource;
+            }
+        }
+        return scriptWithMatchingUrl;
+    },
+
+    showView: function(view)
+    {
+        if (!view)
+            return;
+        this._showScriptOrResource(view.resource || view.script);
+    },
+
+    handleShortcut: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.handled = true;
+        } else
+            this.sidebarPanes.callstack.handleShortcut(event);
+    },
+
+    scriptViewForScript: function(script)
+    {
+        if (!script)
+            return null;
+        if (!script._scriptView)
+            script._scriptView = new WebInspector.ScriptView(script);
+        return script._scriptView;
+    },
+
+    sourceFrameForScript: function(script)
+    {
+        var view = this.scriptViewForScript(script);
+        if (!view)
+            return null;
+
+        // Setting up the source frame requires that we be attached.
+        if (!this.element.parentNode)
+            this.attach();
+
+        view.setupSourceFrameIfNeeded();
+        return view.sourceFrame;
+    },
+
+    _sourceViewForScriptOrResource: function(scriptOrResource)
+    {
+        if (scriptOrResource instanceof WebInspector.Resource) {
+            if (!WebInspector.panels.resources)
+                return null;
+            return WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
+        }
+        if (scriptOrResource instanceof WebInspector.Script)
+            return this.scriptViewForScript(scriptOrResource);
+    },
+
+    _sourceFrameForScriptOrResource: function(scriptOrResource)
+    {
+        if (scriptOrResource instanceof WebInspector.Resource)
+            return WebInspector.panels.resources.sourceFrameForResource(scriptOrResource);
+        if (scriptOrResource instanceof WebInspector.Script)
+            return this.sourceFrameForScript(scriptOrResource);
+    },
+
+    _showScriptOrResource: function(scriptOrResource, options)
+    {
+        // options = {line:, shouldHighlightLine:, fromBackForwardAction:, initialLoad:}
+        if (!options) 
+            options = {};
+
+        if (!scriptOrResource)
+            return;
+
+        var view;
+        if (scriptOrResource instanceof WebInspector.Resource) {
+            if (!WebInspector.panels.resources)
+                return null;
+            view = WebInspector.panels.resources.resourceViewForResource(scriptOrResource);
+            view.headersVisible = false;
+            var breakpoints = this.sidebarPanes.breakpoints.breakpoints;
+            for (var breakpointId in breakpoints) {
+                var breakpoint = breakpoints[breakpointId];
+                if (breakpoint.url === scriptOrResource.url) {
+                    var sourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
+                    sourceFrame.addBreakpoint(breakpoint);
+                }
+            }
+        } else if (scriptOrResource instanceof WebInspector.Script)
+            view = this.scriptViewForScript(scriptOrResource);
+
+        if (!view)
+            return;
+
+        var url = scriptOrResource.url || scriptOrResource.sourceURL;
+        if (url && !options.initialLoad)
+            WebInspector.settings.lastViewedScriptFile = url;
+
+        if (!options.fromBackForwardAction) {
+            var oldIndex = this._currentBackForwardIndex;
+            if (oldIndex >= 0)
+                this._backForwardList.splice(oldIndex + 1, this._backForwardList.length - oldIndex);
+
+            // Check for a previous entry of the same object in _backForwardList.
+            // If one is found, remove it and update _currentBackForwardIndex to match.
+            var previousEntryIndex = this._backForwardList.indexOf(scriptOrResource);
+            if (previousEntryIndex !== -1) {
+                this._backForwardList.splice(previousEntryIndex, 1);
+                --this._currentBackForwardIndex;
+            }
+
+            this._backForwardList.push(scriptOrResource);
+            ++this._currentBackForwardIndex;
+
+            this._updateBackAndForwardButtons();
+        }
+
+        this.visibleView = view;
+
+        if (options.line) {
+            if (view.revealLine)
+                view.revealLine(options.line);
+            if (view.highlightLine && options.shouldHighlightLine)
+                view.highlightLine(options.line);
+        }
+
+        var option;
+        if (scriptOrResource instanceof WebInspector.Script) {
+            option = scriptOrResource.filesSelectOption;
+
+            // hasn't been added yet - happens for stepping in evals,
+            // so use the force option to force the script into the menu.
+            if (!option) {
+                this._addScriptToFilesMenu(scriptOrResource, true);
+                option = scriptOrResource.filesSelectOption;
+            }
+
+            console.assert(option);
+        } else
+            option = scriptOrResource.filesSelectOption;
+
+        if (option)
+            this.filesSelectElement.selectedIndex = option.index;
+    },
+
+    _addScriptToFilesMenu: function(script, force)
+    {
+        if (!script.sourceURL && !force)
+            return;
+
+        if (script.resource) {
+            if (this._resourceForURLInFilesSelect[script.resource.url])
+                return;
+            this._resourceForURLInFilesSelect[script.resource.url] = script.resource;
+        }
+ 
+        var displayName = script.sourceURL ? WebInspector.displayNameForURL(script.sourceURL) : WebInspector.UIString("(program)");
+
+        var select = this.filesSelectElement;
+        var option = document.createElement("option");
+        option.representedObject = script.resource || script;
+        option.url = displayName;
+        option.startingLine = script.startingLine;
+        option.text = script.resource || script.startingLine === 1 ? displayName : String.sprintf("%s:%d", displayName, script.startingLine);
+
+        function optionCompare(a, b)
+        {
+            if (a.url < b.url)
+                return -1;
+            else if (a.url > b.url)
+                return 1;
+
+            if (typeof a.startingLine !== "number")
+                return -1;
+            if (typeof b.startingLine !== "number")
+                return -1;
+            return a.startingLine - b.startingLine;
+        }
+
+        var insertionIndex = insertionIndexForObjectInListSortedByFunction(option, select.childNodes, optionCompare);
+        if (insertionIndex < 0)
+            select.appendChild(option);
+        else
+            select.insertBefore(option, select.childNodes.item(insertionIndex));
+
+        if (script.resource)
+            script.resource.filesSelectOption = option;
+        else
+            script.filesSelectOption = option;
+
+        // Call _showScriptOrResource if the option we just appended ended up being selected.
+        // This will happen for the first item added to the menu.
+        if (select.options[select.selectedIndex] === option)
+            this._showScriptOrResource(option.representedObject, {initialLoad: true});
+        else {
+            // if not first item, check to see if this was the last viewed
+            var url = option.representedObject.url || option.representedObject.sourceURL;
+            var lastURL = WebInspector.settings.lastViewedScriptFile;
+            if (url && url === lastURL)
+                this._showScriptOrResource(option.representedObject, {initialLoad: true});
+        }
+    },
+
+    _clearCurrentExecutionLine: function()
+    {
+        if (this._executionSourceFrame)
+            this._executionSourceFrame.executionLine = 0;
+        delete this._executionSourceFrame;
+    },
+
+    _callFrameSelected: function()
+    {
+        this._clearCurrentExecutionLine();
+
+        var callStackPane = this.sidebarPanes.callstack;
+        var currentFrame = callStackPane.selectedCallFrame;
+        if (!currentFrame)
+            return;
+
+        this.sidebarPanes.scopechain.update(currentFrame);
+        this.sidebarPanes.watchExpressions.refreshExpressions();
+
+        var scriptOrResource = this._sourceIDMap[currentFrame.sourceID];
+        this._showScriptOrResource(scriptOrResource, {line: currentFrame.line});
+
+        this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
+        if (this._executionSourceFrame)
+            this._executionSourceFrame.executionLine = currentFrame.line;
+    },
+
+    _changeVisibleFile: function(event)
+    {
+        var select = this.filesSelectElement;
+        this._showScriptOrResource(select.options[select.selectedIndex].representedObject);
+    },
+
+    _startSidebarResizeDrag: function(event)
+    {
+        WebInspector.elementDragStart(this.sidebarElement, this._sidebarResizeDrag.bind(this), this._endSidebarResizeDrag.bind(this), event, "col-resize");
+
+        if (event.target === this.sidebarResizeWidgetElement)
+            this._dragOffset = (event.target.offsetWidth - (event.pageX - event.target.totalOffsetLeft));
+        else
+            this._dragOffset = 0;
+    },
+
+    _endSidebarResizeDrag: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+
+        delete this._dragOffset;
+    },
+
+    _sidebarResizeDrag: function(event)
+    {
+        var x = event.pageX + this._dragOffset;
+        var newWidth = Number.constrain(window.innerWidth - x, Preferences.minScriptsSidebarWidth, window.innerWidth * 0.66);
+
+        this.sidebarElement.style.width = newWidth + "px";
+        this.sidebarButtonsElement.style.width = newWidth + "px";
+        this.viewsContainerElement.style.right = newWidth + "px";
+        this.sidebarResizeWidgetElement.style.right = newWidth + "px";
+        this.sidebarResizeElement.style.right = (newWidth - 3) + "px";
+
+        this.resize();
+        event.preventDefault();
+    },
+    
+    updatePauseOnExceptionsState: function(pauseOnExceptionsState)
+    {
+        if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.\nClick to Pause on all exceptions.");
+        else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnAllExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on all exceptions.\nClick to Pause on uncaught exceptions.");
+        else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)
+            this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on uncaught exceptions.\nClick to Not pause on exceptions.");
+
+        this._pauseOnExceptionButton.state = pauseOnExceptionsState;
+    },
+
+    _updateDebuggerButtons: function()
+    {
+        if (this._debuggerEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Debugging enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            this._pauseOnExceptionButton.visible = true;
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Debugging disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            this._pauseOnExceptionButton.visible = false;
+            this.panelEnablerView.visible = true;
+        }
+
+        if (this._paused) {
+            this.pauseButton.addStyleClass("paused");
+
+            this.pauseButton.disabled = false;
+            this.stepOverButton.disabled = false;
+            this.stepIntoButton.disabled = false;
+            this.stepOutButton.disabled = false;
+
+            this.debuggerStatusElement.textContent = WebInspector.UIString("Paused");
+        } else {
+            this.pauseButton.removeStyleClass("paused");
+
+            this.pauseButton.disabled = this._waitingToPause;
+            this.stepOverButton.disabled = true;
+            this.stepIntoButton.disabled = true;
+            this.stepOutButton.disabled = true;
+
+            if (this._waitingToPause)
+                this.debuggerStatusElement.textContent = WebInspector.UIString("Pausing");
+            else if (this._stepping)
+                this.debuggerStatusElement.textContent = WebInspector.UIString("Stepping");
+            else
+                this.debuggerStatusElement.textContent = "";
+        }
+    },
+
+    _updateBackAndForwardButtons: function()
+    {
+        this.backButton.disabled = this._currentBackForwardIndex <= 0;
+        this.forwardButton.disabled = this._currentBackForwardIndex >= (this._backForwardList.length - 1);
+    },
+
+    _clearInterface: function()
+    {
+        this.sidebarPanes.callstack.update(null);
+        this.sidebarPanes.scopechain.update(null);
+
+        this._clearCurrentExecutionLine();
+        this._updateDebuggerButtons();
+    },
+
+    _goBack: function()
+    {
+        if (this._currentBackForwardIndex <= 0) {
+            console.error("Can't go back from index " + this._currentBackForwardIndex);
+            return;
+        }
+
+        this._showScriptOrResource(this._backForwardList[--this._currentBackForwardIndex], {fromBackForwardAction: true});
+        this._updateBackAndForwardButtons();
+    },
+
+    _goForward: function()
+    {
+        if (this._currentBackForwardIndex >= this._backForwardList.length - 1) {
+            console.error("Can't go forward from index " + this._currentBackForwardIndex);
+            return;
+        }
+
+        this._showScriptOrResource(this._backForwardList[++this._currentBackForwardIndex], {fromBackForwardAction: true});
+        this._updateBackAndForwardButtons();
+    },
+
+    _enableDebugging: function()
+    {
+        if (this._debuggerEnabled)
+            return;
+        this._toggleDebugging(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleDebugging: function(optionalAlways)
+    {
+        this._paused = false;
+        this._waitingToPause = false;
+        this._stepping = false;
+
+        if (this._debuggerEnabled)
+            InspectorBackend.disableDebugger(true);
+        else
+            InspectorBackend.enableDebugger(!!optionalAlways);
+    },
+
+    _togglePauseOnExceptions: function()
+    {
+        InspectorBackend.setPauseOnExceptionsState((this._pauseOnExceptionButton.state + 1) % this._pauseOnExceptionButton.states);
+    },
+
+    _togglePause: function()
+    {
+        if (this._paused) {
+            this._paused = false;
+            this._waitingToPause = false;
+            InspectorBackend.resumeDebugger();
+        } else {
+            this._stepping = false;
+            this._waitingToPause = true;
+            InspectorBackend.pauseInDebugger();
+        }
+
+        this._clearInterface();
+    },
+
+    _stepOverClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepOverStatementInDebugger();
+    },
+
+    _stepIntoClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepIntoStatementInDebugger();
+    },
+
+    _stepOutClicked: function()
+    {
+        this._paused = false;
+        this._stepping = true;
+
+        this._clearInterface();
+
+        InspectorBackend.stepOutOfFunctionInDebugger();
+    },
+
+    _toggleBreakpointsClicked: function()
+    {
+        this.toggleBreakpointsButton.toggled = !this.toggleBreakpointsButton.toggled;
+        if (this.toggleBreakpointsButton.toggled) {
+            InspectorBackend.activateBreakpoints();
+            this.toggleBreakpointsButton.title = WebInspector.UIString("Deactivate all breakpoints.");
+            document.getElementById("main-panels").removeStyleClass("breakpoints-deactivated");
+        } else {
+            InspectorBackend.deactivateBreakpoints();
+            this.toggleBreakpointsButton.title = WebInspector.UIString("Activate all breakpoints.");
+            document.getElementById("main-panels").addStyleClass("breakpoints-deactivated");
+        }
+    }
+}
+
+WebInspector.ScriptsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* StoragePanel.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.StoragePanel = function(database)
+{
+    WebInspector.Panel.call(this);
+
+    this.createSidebar();
+
+    this.databasesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("DATABASES"), {}, true);
+    this.sidebarTree.appendChild(this.databasesListTreeElement);
+    this.databasesListTreeElement.expand();
+
+    this.localStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("LOCAL STORAGE"), {}, true);
+    this.sidebarTree.appendChild(this.localStorageListTreeElement);
+    this.localStorageListTreeElement.expand();
+
+    this.sessionStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("SESSION STORAGE"), {}, true);
+    this.sidebarTree.appendChild(this.sessionStorageListTreeElement);
+    this.sessionStorageListTreeElement.expand();
+
+    this.cookieListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("COOKIES"), {}, true);
+    this.sidebarTree.appendChild(this.cookieListTreeElement);
+    this.cookieListTreeElement.expand();
+
+    this.storageViews = document.createElement("div");
+    this.storageViews.id = "storage-views";
+    this.element.appendChild(this.storageViews);
+
+    this.storageViewStatusBarItemsContainer = document.createElement("div");
+    this.storageViewStatusBarItemsContainer.id = "storage-view-status-bar-items";
+
+    this.reset();
+}
+
+WebInspector.StoragePanel.prototype = {
+    toolbarItemClass: "storage",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Storage");
+    },
+
+    get statusBarItems()
+    {
+        return [this.storageViewStatusBarItemsContainer];
+    },
+
+    reset: function()
+    {
+        if (this._databases) {
+            var databasesLength = this._databases.length;
+            for (var i = 0; i < databasesLength; ++i) {
+                var database = this._databases[i];
+
+                delete database._tableViews;
+                delete database._queryView;
+            }
+        }
+
+        this._databases = [];
+
+        if (this._domStorage) {
+            var domStorageLength = this._domStorage.length;
+            for (var i = 0; i < domStorageLength; ++i) {
+                var domStorage = this._domStorage[i];
+
+                delete domStorage._domStorageView;
+            }
+        }
+
+        this._domStorage = [];
+
+        this._cookieViews = {};
+
+        this.databasesListTreeElement.removeChildren();
+        this.localStorageListTreeElement.removeChildren();
+        this.sessionStorageListTreeElement.removeChildren();
+        this.cookieListTreeElement.removeChildren();
+
+        this.storageViews.removeChildren();        
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        
+        if (this.sidebarTree.selectedTreeElement)
+            this.sidebarTree.selectedTreeElement.deselect();
+    },
+
+    addDatabase: function(database)
+    {
+        this._databases.push(database);
+
+        var databaseTreeElement = new WebInspector.DatabaseSidebarTreeElement(database);
+        database._databasesTreeElement = databaseTreeElement;
+        this.databasesListTreeElement.appendChild(databaseTreeElement);
+    },
+    
+    addCookieDomain: function(domain)
+    {
+        var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
+        this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
+    },
+
+    addDOMStorage: function(domStorage)
+    {
+        this._domStorage.push(domStorage);
+        var domStorageTreeElement = new WebInspector.DOMStorageSidebarTreeElement(domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage"));
+        domStorage._domStorageTreeElement = domStorageTreeElement;
+        if (domStorage.isLocalStorage)
+            this.localStorageListTreeElement.appendChild(domStorageTreeElement);
+        else
+            this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
+    },
+
+    selectDatabase: function(databaseId)
+    {
+        var database;
+        for (var i = 0, len = this._databases.length; i < len; ++i) {
+            database = this._databases[i];
+            if (database.id === databaseId) {
+                this.showDatabase(database);
+                database._databasesTreeElement.select();
+                return;
+            }
+        }
+    },
+
+    selectDOMStorage: function(storageId)
+    {
+        var domStorage = this._domStorageForId(storageId);
+        if (domStorage) {
+            this.showDOMStorage(domStorage);
+            domStorage._domStorageTreeElement.select();
+        }
+    },
+
+    showDatabase: function(database, tableName)
+    {
+        if (!database)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view;
+        if (tableName) {
+            if (!("_tableViews" in database))
+                database._tableViews = {};
+            view = database._tableViews[tableName];
+            if (!view) {
+                view = new WebInspector.DatabaseTableView(database, tableName);
+                database._tableViews[tableName] = view;
+            }
+        } else {
+            view = database._queryView;
+            if (!view) {
+                view = new WebInspector.DatabaseQueryView(database);
+                database._queryView = view;
+            }
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems || [];
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i].element);
+    },
+
+    showDOMStorage: function(domStorage)
+    {
+        if (!domStorage)
+            return;
+
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view;
+        view = domStorage._domStorageView;
+        if (!view) {
+            view = new WebInspector.DOMStorageItemsView(domStorage);
+            domStorage._domStorageView = view;
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    showCookies: function(treeElement, cookieDomain)
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+
+        var view = this._cookieViews[cookieDomain];
+        if (!view) {
+            view = new WebInspector.CookieItemsView(treeElement, cookieDomain);
+            this._cookieViews[cookieDomain] = view;
+        }
+
+        view.show(this.storageViews);
+
+        this.visibleView = view;
+
+        this.storageViewStatusBarItemsContainer.removeChildren();
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    closeVisibleView: function()
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+        delete this.visibleView;
+    },
+
+    updateDatabaseTables: function(database)
+    {
+        if (!database || !database._databasesTreeElement)
+            return;
+
+        database._databasesTreeElement.shouldRefreshChildren = true;
+
+        if (!("_tableViews" in database))
+            return;
+
+        var tableNamesHash = {};
+        var self = this;
+        function tableNamesCallback(tableNames)
+        {
+            var tableNamesLength = tableNames.length;
+            for (var i = 0; i < tableNamesLength; ++i)
+                tableNamesHash[tableNames[i]] = true;
+
+            for (var tableName in database._tableViews) {
+                if (!(tableName in tableNamesHash)) {
+                    if (self.visibleView === database._tableViews[tableName])
+                        self.closeVisibleView();
+                    delete database._tableViews[tableName];
+                }
+            }
+        }
+        database.getTableNames(tableNamesCallback);
+    },
+
+    dataGridForResult: function(rows)
+    {
+        if (!rows.length)
+            return null;
+
+        var columns = {};
+        var numColumns = 0;
+
+        for (var columnIdentifier in rows[0]) {
+            var column = {};
+            column.width = columnIdentifier.length;
+            column.title = columnIdentifier;
+
+            columns[columnIdentifier] = column;
+            ++numColumns;
+        }
+
+        var nodes = [];
+        var length = rows.length;
+        for (var i = 0; i < length; ++i) {
+            var data = {};
+
+            var row = rows[i];
+            for (var columnIdentifier in row)
+                data[columnIdentifier] = row[columnIdentifier];
+
+            var node = new WebInspector.DataGridNode(data, false);
+            node.selectable = false;
+            nodes.push(node);
+        }
+
+        var dataGrid = new WebInspector.DataGrid(columns);
+        var length = nodes.length;
+        for (var i = 0; i < length; ++i)
+            dataGrid.appendChild(nodes[i]);
+
+        return dataGrid;
+    },
+
+    updateDOMStorage: function(storageId)
+    {
+        var domStorage = this._domStorageForId(storageId);
+        if (!domStorage)
+            return;
+
+        var view = domStorage._domStorageView;
+        if (this.visibleView && view === this.visibleView)
+            domStorage._domStorageView.update();
+    },
+
+    _domStorageForId: function(storageId)
+    {
+        if (!this._domStorage)
+            return null;
+        var domStorageLength = this._domStorage.length;
+        for (var i = 0; i < domStorageLength; ++i) {
+            var domStorage = this._domStorage[i];
+            if (domStorage.id == storageId)
+                return domStorage;
+        }
+        return null;
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.storageViews.style.left = width + "px";
+        this.storageViewStatusBarItemsContainer.style.left = width + "px";
+        this.resize();
+    }
+}
+
+WebInspector.StoragePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.DatabaseSidebarTreeElement = function(database)
+{
+    this.database = database;
+
+    WebInspector.SidebarTreeElement.call(this, "database-sidebar-tree-item", "", "", database, true);
+
+    this.refreshTitles();
+}
+
+WebInspector.DatabaseSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDatabase(this.database);
+    },
+
+    oncollapse: function()
+    {
+        // Request a refresh after every collapse so the next
+        // expand will have an updated table list.
+        this.shouldRefreshChildren = true;
+    },
+
+    onpopulate: function()
+    {
+        this.removeChildren();
+
+        var self = this;
+        function tableNamesCallback(tableNames)
+        {
+            var tableNamesLength = tableNames.length;
+            for (var i = 0; i < tableNamesLength; ++i)
+                self.appendChild(new WebInspector.SidebarDatabaseTableTreeElement(self.database, tableNames[i]));
+        }
+        this.database.getTableNames(tableNamesCallback);
+    },
+
+    get mainTitle()
+    {
+        return this.database.name;
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return this.database.displayDomain;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    }
+}
+
+WebInspector.DatabaseSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.SidebarDatabaseTableTreeElement = function(database, tableName)
+{
+    this.database = database;
+    this.tableName = tableName;
+
+    WebInspector.SidebarTreeElement.call(this, "database-table-sidebar-tree-item small", tableName, "", null, false);
+}
+
+WebInspector.SidebarDatabaseTableTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDatabase(this.database, this.tableName);
+    }
+}
+
+WebInspector.SidebarDatabaseTableTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.DOMStorageSidebarTreeElement = function(domStorage, className)
+{
+
+    this.domStorage = domStorage;
+
+    WebInspector.SidebarTreeElement.call(this, "domstorage-sidebar-tree-item " + className, domStorage, "", null, false);
+
+    this.refreshTitles();
+}
+
+WebInspector.DOMStorageSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showDOMStorage(this.domStorage);
+    },
+
+    get mainTitle()
+    {
+        return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files");
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return ""; //this.database.displayDomain;
+    },
+
+    set subtitle(x)
+    {
+        // Do nothing.
+    }
+}
+
+WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.CookieSidebarTreeElement = function(cookieDomain)
+{
+    WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
+    this._cookieDomain = cookieDomain;
+    this._subtitle = "";
+
+    this.refreshTitles();
+}
+
+WebInspector.CookieSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.storage.showCookies(this, this._cookieDomain);
+    },
+
+    get mainTitle()
+    {
+        return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files");
+    },
+
+    set mainTitle(x)
+    {
+        // Do nothing.
+    },
+
+    get subtitle()
+    {
+        return this._subtitle;
+    },
+
+    set subtitle(x)
+    {
+        this._subtitle = x;
+        this.refreshTitles();
+    }
+}
+
+WebInspector.CookieSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+/* ProfilesPanel.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
+
+WebInspector.ProfileType = function(id, name)
+{
+    this._id = id;
+    this._name = name;
+}
+
+WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;
+
+WebInspector.ProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return "";
+    },
+
+    get buttonStyle()
+    {
+        return undefined;
+    },
+
+    get buttonCaption()
+    {
+        return this.name;
+    },
+
+    get id()
+    {
+        return this._id;
+    },
+
+    get name()
+    {
+        return this._name;
+    },
+
+    buttonClicked: function()
+    {
+    },
+
+    viewForProfile: function(profile)
+    {
+        if (!profile._profileView)
+            profile._profileView = this.createView(profile);
+        return profile._profileView;
+    },
+
+    get welcomeMessage()
+    {
+        return "";
+    },
+
+    // Must be implemented by subclasses.
+    createView: function(profile)
+    {
+        throw new Error("Needs implemented.");
+    },
+
+    // Must be implemented by subclasses.
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        throw new Error("Needs implemented.");
+    }
+}
+
+WebInspector.ProfilesPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this.createSidebar();
+
+    this.element.addStyleClass("profiles");
+    this._profileTypesByIdMap = {};
+    this._profileTypeButtonsByIdMap = {};
+
+    var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
+    var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
+    var panelEnablerButton = WebInspector.UIString("Enable Profiling");
+    this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+    this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);
+
+    this.element.appendChild(this.panelEnablerView.element);
+
+    this.profileViews = document.createElement("div");
+    this.profileViews.id = "profile-views";
+    this.element.appendChild(this.profileViews);
+
+    this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+    this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
+
+    this.profileViewStatusBarItemsContainer = document.createElement("div");
+    this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
+
+    this.welcomeView = new WebInspector.WelcomeView("profiles", WebInspector.UIString("Welcome to the Profiles panel"));
+    this.element.appendChild(this.welcomeView.element);
+
+    this._profiles = [];
+    this._profilerEnabled = Preferences.profilerAlwaysEnabled;
+    this.reset();
+}
+
+WebInspector.ProfilesPanel.prototype = {
+    toolbarItemClass: "profiles",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Profiles");
+    },
+
+    get statusBarItems()
+    {
+        function clickHandler(profileType, buttonElement)
+        {
+            profileType.buttonClicked.call(profileType);
+            this.updateProfileTypeButtons();
+        }
+
+        var items = [this.enableToggleButton.element];
+        // FIXME: Generate a single "combo-button".
+        for (var typeId in this._profileTypesByIdMap) {
+            var profileType = this.getProfileType(typeId);
+            if (profileType.buttonStyle) {
+                var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
+                this._profileTypeButtonsByIdMap[typeId] = button.element;
+                button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);
+                items.push(button.element);
+            }
+        }
+        items.push(this.profileViewStatusBarItemsContainer);
+        return items;
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        if (this._shouldPopulateProfiles)
+            this._populateProfiles();
+    },
+
+    populateInterface: function()
+    {
+        if (this.visible)
+            this._populateProfiles();
+        else
+            this._shouldPopulateProfiles = true;
+    },
+
+    profilerWasEnabled: function()
+    {
+        if (this._profilerEnabled)
+            return;
+
+        this._profilerEnabled = true;
+        this.reset();
+        this.populateInterface();
+    },
+
+    profilerWasDisabled: function()
+    {
+        if (!this._profilerEnabled)
+            return;
+
+        this._profilerEnabled = false;
+        this.reset();
+    },
+
+    reset: function()
+    {
+        for (var i = 0; i < this._profiles.length; ++i)
+            delete this._profiles[i]._profileView;
+        delete this.visibleView;
+
+        delete this.currentQuery;
+        this.searchCanceled();
+
+        this._profiles = [];
+        this._profilesIdMap = {};
+        this._profileGroups = {};
+        this._profileGroupsForLinks = {}
+
+        this.sidebarTreeElement.removeStyleClass("some-expandable");
+
+        for (var typeId in this._profileTypesByIdMap)
+            this.getProfileType(typeId).treeElement.removeChildren();
+
+        this.profileViews.removeChildren();
+
+        this.profileViewStatusBarItemsContainer.removeChildren();
+
+        this._updateInterface();
+        this.welcomeView.show();
+    },
+
+    registerProfileType: function(profileType)
+    {
+        this._profileTypesByIdMap[profileType.id] = profileType;
+        profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);
+        this.sidebarTree.appendChild(profileType.treeElement);
+        profileType.treeElement.expand();
+        this._addWelcomeMessage(profileType);
+    },
+
+    _addWelcomeMessage: function(profileType)
+    {
+        var message = profileType.welcomeMessage;
+        // Message text is supposed to have a '%s' substring as a placeholder
+        // for a status bar button. If it is there, we split the message in two
+        // parts, and insert the button between them.
+        var buttonPos = message.indexOf("%s");
+        if (buttonPos > -1) {
+            var container = document.createDocumentFragment();
+            var part1 = document.createElement("span");
+            part1.innerHTML = message.substr(0, buttonPos);
+            container.appendChild(part1);
+     
+            var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
+            button.element.addEventListener("click", profileType.buttonClicked.bind(profileType), false);
+            container.appendChild(button.element);
+       
+            var part2 = document.createElement("span");
+            part2.innerHTML = message.substr(buttonPos + 2);
+            container.appendChild(part2);
+            this.welcomeView.addMessage(container);
+        } else
+            this.welcomeView.addMessage(message);
+    },
+
+    _makeKey: function(text, profileTypeId)
+    {
+        return escape(text) + '/' + escape(profileTypeId);
+    },
+
+    addProfileHeader: function(profile)
+    {
+        var typeId = profile.typeId;
+        var profileType = this.getProfileType(typeId);
+        var sidebarParent = profileType.treeElement;
+        var small = false;
+        var alternateTitle;
+
+        profile.__profilesPanelProfileType = profileType;
+        this._profiles.push(profile);
+        this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;
+
+        if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
+            var profileTitleKey = this._makeKey(profile.title, typeId);
+            if (!(profileTitleKey in this._profileGroups))
+                this._profileGroups[profileTitleKey] = [];
+
+            var group = this._profileGroups[profileTitleKey];
+            group.push(profile);
+
+            if (group.length === 2) {
+                // Make a group TreeElement now that there are 2 profiles.
+                group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
+
+                // Insert at the same index for the first profile of the group.
+                var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);
+                sidebarParent.insertChild(group._profilesTreeElement, index);
+
+                // Move the first profile to the group.
+                var selected = group[0]._profilesTreeElement.selected;
+                sidebarParent.removeChild(group[0]._profilesTreeElement);
+                group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
+                if (selected) {
+                    group[0]._profilesTreeElement.select();
+                    group[0]._profilesTreeElement.reveal();
+                }
+
+                group[0]._profilesTreeElement.small = true;
+                group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);
+
+                this.sidebarTreeElement.addStyleClass("some-expandable");
+            }
+
+            if (group.length >= 2) {
+                sidebarParent = group._profilesTreeElement;
+                alternateTitle = WebInspector.UIString("Run %d", group.length);
+                small = true;
+            }
+        }
+
+        var profileTreeElement = profileType.createSidebarTreeElementForProfile(profile);
+        profileTreeElement.small = small;
+        if (alternateTitle)
+            profileTreeElement.mainTitle = alternateTitle;
+        profile._profilesTreeElement = profileTreeElement;
+
+        sidebarParent.appendChild(profileTreeElement);
+        this.welcomeView.hide();
+        if (!this.visibleView)
+            this.showProfile(profile);
+    },
+
+    showProfile: function(profile)
+    {
+        if (!profile)
+            return;
+
+        this.closeVisibleView();
+
+        var view = profile.__profilesPanelProfileType.viewForProfile(profile);
+
+        view.show(this.profileViews);
+
+        profile._profilesTreeElement.select(true);
+        profile._profilesTreeElement.reveal();
+
+        this.visibleView = view;
+
+        this.profileViewStatusBarItemsContainer.removeChildren();
+
+        var statusBarItems = view.statusBarItems;
+        for (var i = 0; i < statusBarItems.length; ++i)
+            this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+    },
+
+    showView: function(view)
+    {
+        this.showProfile(view.profile);
+    },
+
+    getProfileType: function(typeId)
+    {
+        return this._profileTypesByIdMap[typeId];
+    },
+
+    showProfileForURL: function(url)
+    {
+        var match = url.match(WebInspector.ProfileType.URLRegExp);
+        if (!match)
+            return;
+        this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);
+    },
+
+    updateProfileTypeButtons: function()
+    {
+        for (var typeId in this._profileTypeButtonsByIdMap) {
+            var buttonElement = this._profileTypeButtonsByIdMap[typeId];
+            var profileType = this.getProfileType(typeId);
+            buttonElement.className = profileType.buttonStyle;
+            buttonElement.title = profileType.buttonTooltip;
+            // FIXME: Apply profileType.buttonCaption once captions are added to button controls.
+        }
+    },
+
+    closeVisibleView: function()
+    {
+        if (this.visibleView)
+            this.visibleView.hide();
+        delete this.visibleView;
+    },
+
+    displayTitleForProfileLink: function(title, typeId)
+    {
+        title = unescape(title);
+        if (title.indexOf(UserInitiatedProfileName) === 0) {
+            title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
+        } else {
+            var titleKey = this._makeKey(title, typeId);
+            if (!(titleKey in this._profileGroupsForLinks))
+                this._profileGroupsForLinks[titleKey] = 0;
+
+            groupNumber = ++this._profileGroupsForLinks[titleKey];
+
+            if (groupNumber > 2)
+                // The title is used in the console message announcing that a profile has started so it gets
+                // incremented twice as often as it's displayed
+                title += " " + WebInspector.UIString("Run %d", groupNumber / 2);
+        }
+        
+        return title;
+    },
+
+    get searchableViews()
+    {
+        var views = [];
+
+        const visibleView = this.visibleView;
+        if (visibleView && visibleView.performSearch)
+            views.push(visibleView);
+
+        var profilesLength = this._profiles.length;
+        for (var i = 0; i < profilesLength; ++i) {
+            var profile = this._profiles[i];
+            var view = profile.__profilesPanelProfileType.viewForProfile(profile);
+            if (!view.performSearch || view === visibleView)
+                continue;
+            views.push(view);
+        }
+
+        return views;
+    },
+
+    searchMatchFound: function(view, matches)
+    {
+        view.profile._profilesTreeElement.searchMatches = matches;
+    },
+
+    searchCanceled: function(startingNewSearch)
+    {
+        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
+
+        if (!this._profiles)
+            return;
+
+        for (var i = 0; i < this._profiles.length; ++i) {
+            var profile = this._profiles[i];
+            profile._profilesTreeElement.searchMatches = 0;
+        }
+    },
+
+    _updateInterface: function()
+    {
+        // FIXME: Replace ProfileType-specific button visibility changes by a single ProfileType-agnostic "combo-button" visibility change.
+        if (this._profilerEnabled) {
+            this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
+            this.enableToggleButton.toggled = true;
+            for (var typeId in this._profileTypeButtonsByIdMap)
+                this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");
+            this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
+            this.panelEnablerView.visible = false;
+        } else {
+            this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
+            this.enableToggleButton.toggled = false;
+            for (var typeId in this._profileTypeButtonsByIdMap)
+                this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");
+            this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
+            this.panelEnablerView.visible = true;
+        }
+    },
+
+    _enableProfiling: function()
+    {
+        if (this._profilerEnabled)
+            return;
+        this._toggleProfiling(this.panelEnablerView.alwaysEnabled);
+    },
+
+    _toggleProfiling: function(optionalAlways)
+    {
+        if (this._profilerEnabled)
+            InspectorBackend.disableProfiler(true);
+        else
+            InspectorBackend.enableProfiler(!!optionalAlways);
+    },
+
+    _populateProfiles: function()
+    {
+        var sidebarTreeChildrenCount = this.sidebarTree.children.length;
+        for (var i = 0; i < sidebarTreeChildrenCount; ++i) {
+            var treeElement = this.sidebarTree.children[i];
+            if (treeElement.children.length)
+                return;
+        }
+
+        function populateCallback(profileHeaders) {
+            profileHeaders.sort(function(a, b) { return a.uid - b.uid; });
+            var profileHeadersLength = profileHeaders.length;
+            for (var i = 0; i < profileHeadersLength; ++i)
+                WebInspector.addProfileHeader(profileHeaders[i]);
+        }
+
+        var callId = WebInspector.Callback.wrap(populateCallback);
+        InspectorBackend.getProfileHeaders(callId);
+
+        delete this._shouldPopulateProfiles;
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.welcomeView.element.style.left = width + "px";
+        this.profileViews.style.left = width + "px";
+        this.profileViewStatusBarItemsContainer.style.left = width + "px";
+        this.resize();
+    }
+}
+
+WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.ProfileSidebarTreeElement = function(profile)
+{
+    this.profile = profile;
+
+    if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+        this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);
+
+    WebInspector.SidebarTreeElement.call(this, "profile-sidebar-tree-item", "", "", profile, false);
+
+    this.refreshTitles();
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.profiles.showProfile(this.profile);
+    },
+
+    get mainTitle()
+    {
+        if (this._mainTitle)
+            return this._mainTitle;
+        if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+            return WebInspector.UIString("Profile %d", this._profileNumber);
+        return this.profile.title;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    },
+
+    get subtitle()
+    {
+        // There is no subtitle.
+    },
+
+    set subtitle(x)
+    {
+        // Can't change subtitle.
+    },
+
+    set searchMatches(matches)
+    {
+        if (!matches) {
+            if (!this.bubbleElement)
+                return;
+            this.bubbleElement.removeStyleClass("search-matches");
+            this.bubbleText = "";
+            return;
+        }
+
+        this.bubbleText = matches;
+        this.bubbleElement.addStyleClass("search-matches");
+    }
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)
+{
+    WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);
+    }
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.didGetProfileHeaders = WebInspector.Callback.processCallback;
+WebInspector.didGetProfile = WebInspector.Callback.processCallback;
+
+/* ConsolePanel.js */
+
+/*
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ConsolePanel = function()
+{
+    WebInspector.Panel.call(this);
+}
+
+WebInspector.ConsolePanel.prototype = {
+    toolbarItemClass: "console",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Console");
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+
+        this._previousConsoleState = WebInspector.drawer.state;
+        WebInspector.drawer.enterPanelMode();
+        WebInspector.showConsole();
+        
+        // Move the scope bar to the top of the messages, like the resources filter.
+        var scopeBar = document.getElementById("console-filter");
+        var consoleMessages = document.getElementById("console-messages");
+
+        scopeBar.parentNode.removeChild(scopeBar);
+        document.getElementById("console-view").insertBefore(scopeBar, consoleMessages);
+        
+        // Update styles, and give console-messages a top margin so it doesn't overwrite the scope bar.
+        scopeBar.addStyleClass("console-filter-top");
+        scopeBar.removeStyleClass("status-bar-item");
+
+        consoleMessages.addStyleClass("console-filter-top");
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+
+        if (this._previousConsoleState === WebInspector.Drawer.State.Hidden)
+            WebInspector.drawer.immediatelyExitPanelMode();
+        else
+            WebInspector.drawer.exitPanelMode();
+        delete this._previousConsoleState;
+        
+        // Move the scope bar back to the bottom bar, next to Clear Console.
+        var scopeBar = document.getElementById("console-filter");
+
+        scopeBar.parentNode.removeChild(scopeBar);
+        document.getElementById("other-drawer-status-bar-items").appendChild(scopeBar);
+        
+        // Update styles, and remove the top margin on console-messages.
+        scopeBar.removeStyleClass("console-filter-top");
+        scopeBar.addStyleClass("status-bar-item");
+
+        document.getElementById("console-messages").removeStyleClass("console-filter-top");
+    }
+}
+
+WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+/* AuditsPanel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditsPanel = function()
+{
+    WebInspector.Panel.call(this);
+
+    this._constructCategories();
+
+    this.createSidebar();
+    this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);
+    this.sidebarTree.appendChild(this.auditsTreeElement);
+    this.auditsTreeElement.listItemElement.addStyleClass("hidden");
+    this.auditsTreeElement.expand();
+
+    this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();
+    this.auditsTreeElement.appendChild(this.auditsItemTreeElement);
+
+    this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);
+    this.sidebarTree.appendChild(this.auditResultsTreeElement);
+    this.auditResultsTreeElement.expand();
+
+    this.element.addStyleClass("audits");
+
+    this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-audit-results-status-bar-item");
+    this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
+
+    this.viewsContainerElement = document.createElement("div");
+    this.viewsContainerElement.id = "audit-views";
+    this.element.appendChild(this.viewsContainerElement);
+
+    this._launcherView = new WebInspector.AuditLauncherView(this.categoriesById, this.initiateAudit.bind(this));
+}
+
+WebInspector.AuditsPanel.prototype = {
+    toolbarItemClass: "audits",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Audits");
+    },
+
+    get statusBarItems()
+    {
+        return [this.clearResultsButton.element];
+    },
+
+    get mainResourceLoadTime()
+    {
+        return this._mainResourceLoadTime;
+    },
+
+    set mainResourceLoadTime(x)
+    {
+        this._mainResourceLoadTime = x;
+        this._didMainResourceLoad();
+    },
+
+    get mainResourceDOMContentTime()
+    {
+        return this._mainResourceDOMContentTime;
+    },
+
+    set mainResourceDOMContentTime(x)
+    {
+        this._mainResourceDOMContentTime = x;
+    },
+
+    get categoriesById()
+    {
+        return this._auditCategoriesById;
+    },
+
+    _constructCategories: function()
+    {
+        this._auditCategoriesById = {};
+        for (var categoryCtorID in WebInspector.AuditCategories) {
+            var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();
+            auditCategory._id = categoryCtorID;
+            this.categoriesById[categoryCtorID] = auditCategory;
+        }
+    },
+
+    _executeAudit: function(categories, resultCallback)
+    {
+        var resources = [];
+        for (var id in WebInspector.resources)
+            resources.push(WebInspector.resources[id]);
+
+        var rulesRemaining = 0;
+        for (var i = 0; i < categories.length; ++i)
+            rulesRemaining += categories[i].ruleCount;
+
+        var results = [];
+        var mainResourceURL = WebInspector.mainResource.url;
+
+        function ruleResultReadyCallback(categoryResult, ruleResult)
+        {
+            if (ruleResult && ruleResult.children)
+                categoryResult.addRuleResult(ruleResult);
+
+            --rulesRemaining;
+
+            if (!rulesRemaining && resultCallback)
+                resultCallback(mainResourceURL, results);
+        }
+
+        if (!rulesRemaining) {
+            resultCallback(mainResourceURL, results);
+            return;
+        }
+
+        for (var i = 0; i < categories.length; ++i) {
+            var category = categories[i];
+            var result = new WebInspector.AuditCategoryResult(category);
+            results.push(result);
+            category.runRules(resources, ruleResultReadyCallback.bind(null, result));
+        }
+    },
+
+    _auditFinishedCallback: function(launcherCallback, mainResourceURL, results)
+    {
+        var children = this.auditResultsTreeElement.children;
+        var ordinal = 1;
+        for (var i = 0; i < children.length; ++i) {
+            if (children[i].mainResourceURL === mainResourceURL)
+                ordinal++;
+        }
+
+        var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);
+        this.auditResultsTreeElement.appendChild(resultTreeElement);
+        resultTreeElement.reveal();
+        resultTreeElement.select();
+        if (launcherCallback)
+            launcherCallback();
+    },
+
+    initiateAudit: function(categoryIds, runImmediately, launcherCallback)
+    {
+        if (!categoryIds || !categoryIds.length)
+            return;
+
+        var categories = [];
+        for (var i = 0; i < categoryIds.length; ++i)
+            categories.push(this.categoriesById[categoryIds[i]]);
+
+        function initiateAuditCallback(categories, launcherCallback)
+        {
+            this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));
+        }
+
+        if (runImmediately)
+            initiateAuditCallback.call(this, categories, launcherCallback);
+        else
+            this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));
+    },
+
+    _reloadResources: function(callback)
+    {
+        this._resourceTrackingCallback = callback;
+
+        if (!WebInspector.panels.resources.resourceTrackingEnabled) {
+            InspectorBackend.enableResourceTracking(false);
+            this._updateLauncherViewControls(true);
+        } else
+            InspectorBackend.reloadPage();
+    },
+
+    _didMainResourceLoad: function()
+    {
+        if (this._resourceTrackingCallback) {
+            var callback = this._resourceTrackingCallback;
+            delete this._resourceTrackingCallback;
+            callback();
+        }
+    },
+
+    showResults: function(categoryResults)
+    {
+        if (!categoryResults._resultView)
+            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
+
+        this.visibleView = categoryResults._resultView;
+    },
+
+    showLauncherView: function()
+    {
+        this.visibleView = this._launcherView;
+    },
+    
+    get visibleView()
+    {
+        return this._visibleView;
+    },
+
+    set visibleView(x)
+    {
+        if (this._visibleView === x)
+            return;
+
+        if (this._visibleView)
+            this._visibleView.hide();
+
+        this._visibleView = x;
+
+        if (x)
+            x.show(this.viewsContainerElement);
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        this._updateLauncherViewControls(WebInspector.panels.resources.resourceTrackingEnabled);
+    },
+
+    attach: function()
+    {
+        WebInspector.Panel.prototype.attach.call(this);
+
+        this.auditsItemTreeElement.select();
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this.viewsContainerElement.style.left = width + "px";
+    },
+
+    _updateLauncherViewControls: function(isTracking)
+    {
+        if (this._launcherView)
+            this._launcherView.updateResourceTrackingState(isTracking);
+    },
+
+    _clearButtonClicked: function()
+    {
+        this.auditsItemTreeElement.reveal();
+        this.auditsItemTreeElement.select();
+        this.auditResultsTreeElement.removeChildren();
+    }
+}
+
+WebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+
+
+WebInspector.AuditCategory = function(displayName)
+{
+    this._displayName = displayName;
+    this._rules = [];
+}
+
+WebInspector.AuditCategory.prototype = {
+    get id()
+    {
+        // this._id value is injected at construction time.
+        return this._id;
+    },
+
+    get displayName()
+    {
+        return this._displayName;
+    },
+
+    get ruleCount()
+    {
+        this._ensureInitialized();
+        return this._rules.length;
+    },
+
+    addRule: function(rule, severity)
+    {
+        rule.severity = severity;
+        this._rules.push(rule);
+    },
+
+    runRules: function(resources, callback)
+    {
+        this._ensureInitialized();
+        for (var i = 0; i < this._rules.length; ++i)
+            this._rules[i].run(resources, callback);
+    },
+
+    _ensureInitialized: function()
+    {
+        if (!this._initialized) {
+            if ("initialize" in this)
+                this.initialize();
+            this._initialized = true;
+        }
+    }
+}
+
+
+WebInspector.AuditRule = function(id, displayName)
+{
+    this._id = id;
+    this._displayName = displayName;
+}
+
+WebInspector.AuditRule.Severity = {
+    Info: "info",
+    Warning: "warning",
+    Severe: "severe"
+}
+
+WebInspector.AuditRule.prototype = {
+    get id()
+    {
+        return this._id;
+    },
+
+    get displayName()
+    {
+        return this._displayName;
+    },
+
+    set severity(severity)
+    {
+        this._severity = severity;
+    },
+
+    run: function(resources, callback)
+    {
+        var result = new WebInspector.AuditRuleResult(this.displayName);
+        result.severity = this._severity;
+        this.doRun(resources, result, callback);
+    },
+
+    doRun: function(resources, result, callback)
+    {
+        throw new Error("doRun() not implemented");
+    }
+}
+
+WebInspector.AuditCategoryResult = function(category)
+{
+    this.title = category.displayName;
+    this.ruleResults = [];
+}
+
+WebInspector.AuditCategoryResult.prototype = {
+    addRuleResult: function(ruleResult)
+    {
+        this.ruleResults.push(ruleResult);
+    }
+}
+
+WebInspector.AuditRuleResult = function(value, expanded, className)
+{
+    this.value = value;
+    this.className = className;
+    this.expanded = expanded;
+    this.violationCount = 0;
+}
+
+WebInspector.AuditRuleResult.prototype = {
+    addChild: function(value, expanded, className)
+    {
+        if (!this.children)
+            this.children = [];
+        var entry = new WebInspector.AuditRuleResult(value, expanded, className);
+        this.children.push(entry);
+        return entry;
+    },
+
+    addURL: function(url)
+    {
+        return this.addChild(WebInspector.linkifyURL(url));
+    },
+
+    addURLs: function(urls)
+    {
+        for (var i = 0; i < urls.length; ++i)
+            this.addURL(urls[i]);
+    },
+
+    addSnippet: function(snippet)
+    {
+        return this.addChild(snippet, false, "source-code");
+    }
+}
+
+WebInspector.AuditsSidebarTreeElement = function()
+{
+    this.small = false;
+
+    WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);
+}
+
+WebInspector.AuditsSidebarTreeElement.prototype = {
+    onattach: function()
+    {
+        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
+    },
+
+    onselect: function()
+    {
+        WebInspector.panels.audits.showLauncherView();
+    },
+
+    get selectable()
+    {
+        return true;
+    },
+
+    refresh: function()
+    {
+        this.refreshTitles();
+    }
+}
+
+WebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+
+WebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)
+{
+    this.results = results;
+    this.mainResourceURL = mainResourceURL;
+
+    WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);
+}
+
+WebInspector.AuditResultSidebarTreeElement.prototype = {
+    onselect: function()
+    {
+        WebInspector.panels.audits.showResults(this.results);
+    },
+
+    get selectable()
+    {
+        return true;
+    }
+}
+
+WebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+// Contributed audit rules should go into this namespace.
+WebInspector.AuditRules = {};
+
+// Contributed audit categories should go into this namespace.
+WebInspector.AuditCategories = {};
+
+/* AuditResultView.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditResultView = function(categoryResults)
+{
+    WebInspector.View.call(this);
+    this.element.className = "audit-result-view";
+
+    for (var i = 0; i < categoryResults.length; ++i)
+        this.element.appendChild(new WebInspector.AuditCategoryResultPane(categoryResults[i]).element);
+}
+
+WebInspector.AuditResultView.prototype.__proto__ = WebInspector.View.prototype;
+
+
+WebInspector.AuditCategoryResultPane = function(categoryResult)
+{
+    WebInspector.SidebarPane.call(this, categoryResult.title);
+    var treeOutlineElement = document.createElement("ol");
+    this.bodyElement.addStyleClass("audit-result-tree");
+    this.bodyElement.appendChild(treeOutlineElement);
+
+    this._treeOutline = new TreeOutline(treeOutlineElement);
+    this._treeOutline.expandTreeElementsWhenArrowing = true;
+    for (var i = 0; i < categoryResult.ruleResults.length; ++i) {
+        var ruleResult = categoryResult.ruleResults[i];
+        var treeElement = this._appendResult(this._treeOutline, ruleResult);
+        treeElement.listItemElement.addStyleClass("audit-result");
+
+        if (ruleResult.severity) {
+            var severityElement = document.createElement("img");
+            severityElement.className = "severity-" + ruleResult.severity;
+            treeElement.listItemElement.appendChild(severityElement);
+        }
+    }
+    this.expand();
+}
+
+WebInspector.AuditCategoryResultPane.prototype = {
+    _appendResult: function(parentTreeElement, result)
+    {
+        var title = result.value;
+        if (result.violationCount)
+            title = String.sprintf("%s (%d)", title, result.violationCount);
+
+        var treeElement = new TreeElement(title, null, !!result.children);
+        parentTreeElement.appendChild(treeElement);
+
+        if (result.className)
+            treeElement.listItemElement.addStyleClass(result.className);
+        if (result.children) {
+            for (var i = 0; i < result.children.length; ++i)
+                this._appendResult(treeElement, result.children[i]);
+        }
+        if (result.expanded) {
+            treeElement.listItemElement.removeStyleClass("parent");
+            treeElement.listItemElement.addStyleClass("parent-expanded");
+            treeElement.expand();
+        }
+        return treeElement;
+    }
+}
+
+WebInspector.AuditCategoryResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
+
+/* AuditLauncherView.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditLauncherView = function(categoriesById, runnerCallback)
+{
+    WebInspector.View.call(this);
+    this._categoriesById = categoriesById;
+    this._runnerCallback = runnerCallback;
+    this._categoryIdPrefix = "audit-category-item-";
+    this._auditRunning = false;
+
+    this.element.addStyleClass("audit-launcher-view");
+
+    this._contentElement = document.createElement("div");
+    this._contentElement.className = "audit-launcher-view-content";
+    this.element.appendChild(this._contentElement);
+
+    function categorySortFunction(a, b)
+    {
+        var aTitle = a.displayName || "";
+        var bTitle = b.displayName || "";
+        return aTitle.localeCompare(bTitle);
+    }
+    var sortedCategories = [];
+    for (var id in this._categoriesById)
+        sortedCategories.push(this._categoriesById[id]);
+    sortedCategories.sort(categorySortFunction);
+
+    if (!sortedCategories.length) {
+        this._headerElement = document.createElement("h1");
+        this._headerElement.className = "no-audits";
+        this._headerElement.textContent = WebInspector.UIString("No audits to run");
+        this._contentElement.appendChild(this._headerElement);
+    } else
+        this._createLauncherUI(sortedCategories);
+}
+
+WebInspector.AuditLauncherView.prototype = {
+    updateResourceTrackingState: function(isTracking)
+    {
+        if (!this._auditPresentStateLabelElement)
+            return;
+        if (isTracking) {
+            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State");
+            this._auditPresentStateElement.disabled = false;
+            this._auditPresentStateElement.parentElement.removeStyleClass("disabled");
+        } else {
+            this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)");
+            this._auditPresentStateElement.disabled = true;
+            this._auditPresentStateElement.parentElement.addStyleClass("disabled");
+            this.auditReloadedStateElement.checked = true;
+        }
+    },
+
+    _setAuditRunning: function(auditRunning)
+    {
+        if (this._auditRunning === auditRunning)
+            return;
+        this._auditRunning = auditRunning;
+        this._updateButton();
+    },
+
+    _launchButtonClicked: function(event)
+    {
+        var catIds = [];
+        var childNodes = this._categoriesElement.childNodes;
+        for (var id in this._categoriesById) {
+            if (this._categoriesById[id]._checkboxElement.checked)
+                catIds.push(id);
+        }
+        function profilingFinishedCallback()
+        {
+            this._setAuditRunning(false);
+        }
+        this._setAuditRunning(true);
+        this._runnerCallback(catIds, this._auditPresentStateElement.checked, profilingFinishedCallback.bind(this));
+    },
+
+    _selectAllClicked: function(checkCategories)
+    {
+        var childNodes = this._categoriesElement.childNodes;
+        for (var i = 0, length = childNodes.length; i < length; ++i)
+            childNodes[i].firstChild.checked = checkCategories;
+        this._currentCategoriesCount = checkCategories ? this._totalCategoriesCount : 0;
+        this._updateButton();
+    },
+
+    _categoryClicked: function(event)
+    {
+        this._currentCategoriesCount += event.target.checked ? 1 : -1;
+        this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._totalCategoriesCount;
+        this._updateButton();
+    },
+
+    _createCategoryElement: function(title, id)
+    {
+        var element;
+        var labelElement = document.createElement("label");
+        labelElement.id = this._categoryIdPrefix + id;
+
+        element = document.createElement("input");
+        element.type = "checkbox";
+        labelElement.appendChild(element);
+        labelElement.appendChild(document.createTextNode(title));
+
+        return labelElement;
+    },
+
+    _createLauncherUI: function(sortedCategories)
+    {
+        this._headerElement = document.createElement("h1");
+        this._headerElement.textContent = WebInspector.UIString("Select audits to run");
+        this._contentElement.appendChild(this._headerElement);
+
+        function handleSelectAllClick(event)
+        {
+            this._selectAllClicked(event.target.checked);
+        }
+        var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");
+        categoryElement.id = "audit-launcher-selectall";
+        this._selectAllCheckboxElement = categoryElement.firstChild;
+        this._selectAllCheckboxElement.checked = true;
+        this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);
+        this._contentElement.appendChild(categoryElement);
+
+        this._categoriesElement = document.createElement("div");
+        this._categoriesElement.className = "audit-categories-container";
+        this._contentElement.appendChild(this._categoriesElement);
+
+        var boundCategoryClickListener = this._categoryClicked.bind(this);
+
+        for (var i = 0; i < sortedCategories.length; ++i) {
+            categoryElement = this._createCategoryElement(sortedCategories[i].displayName, sortedCategories[i].id);
+            categoryElement.firstChild.addEventListener("click", boundCategoryClickListener, false);
+            sortedCategories[i]._checkboxElement = categoryElement.firstChild;
+            this._categoriesElement.appendChild(categoryElement);
+        }
+
+        this._totalCategoriesCount = this._categoriesElement.childNodes.length;
+        this._currentCategoriesCount = 0;
+
+        this._buttonContainerElement = document.createElement("div");
+        this._buttonContainerElement.className = "button-container";
+
+        var labelElement = document.createElement("label");
+        this._auditPresentStateElement = document.createElement("input");
+        this._auditPresentStateElement.name = "audit-mode";
+        this._auditPresentStateElement.type = "radio";
+        this._auditPresentStateElement.checked = true;
+        this._auditPresentStateLabelElement = document.createTextNode("");
+        labelElement.appendChild(this._auditPresentStateElement);
+        labelElement.appendChild(this._auditPresentStateLabelElement);
+        this._buttonContainerElement.appendChild(labelElement);
+
+        labelElement = document.createElement("label");
+        this.auditReloadedStateElement = document.createElement("input");
+        this.auditReloadedStateElement.name = "audit-mode";
+        this.auditReloadedStateElement.type = "radio";
+        labelElement.appendChild(this.auditReloadedStateElement);
+        labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));
+        this._buttonContainerElement.appendChild(labelElement);
+
+        this._launchButton = document.createElement("button");
+        this._launchButton.setAttribute("type", "button");
+        this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);
+        this._buttonContainerElement.appendChild(this._launchButton);
+
+        this._contentElement.appendChild(this._buttonContainerElement);
+
+        this._selectAllClicked(this._selectAllCheckboxElement.checked);
+        this.updateResourceTrackingState();
+        this._updateButton();
+    },
+
+    _updateButton: function()
+    {
+        this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;
+        if (this._auditRunning)
+            this._launchButton.textContent = WebInspector.UIString("Running...");
+        else
+            this._launchButton.textContent = WebInspector.UIString("Run");
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        setTimeout(this.resize(), 0);
+    },
+
+    resize: function()
+    {
+        if (this._categoriesElement)
+            this._categoriesElement.style.height = (this._buttonContainerElement.totalOffsetTop - this._categoriesElement.totalOffsetTop) + "px";
+    }
+}
+
+WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* AuditRules.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditRules.IPAddressRegexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
+
+WebInspector.AuditRules.CacheableResponseCodes =
+{
+    200: true,
+    203: true,
+    206: true,
+    300: true,
+    301: true,
+    410: true,
+
+    304: true // Underlying resource is cacheable
+}
+
+WebInspector.AuditRules.getDomainToResourcesMap = function(resources, types, regexp, needFullResources)
+{
+    var domainToResourcesMap = {};
+    for (var i = 0, size = resources.length; i < size; ++i) {
+        var resource = resources[i];
+        if (types && types.indexOf(resource.type) === -1)
+            continue;
+        var match = resource.url.match(regexp);
+        if (!match)
+            continue;
+        var domain = match[2];
+        var domainResources = domainToResourcesMap[domain];
+        if (domainResources === undefined) {
+          domainResources = [];
+          domainToResourcesMap[domain] = domainResources;
+        }
+        domainResources.push(needFullResources ? resource : resource.url);
+    }
+    return domainToResourcesMap;
+}
+
+WebInspector.AuditRules.evaluateInTargetWindow = function(func, callback)
+{
+    InjectedScriptAccess.getDefault().evaluateOnSelf(func.toString(), callback);
+}
+
+
+WebInspector.AuditRules.GzipRule = function()
+{
+    WebInspector.AuditRule.call(this, "network-gzip", "Enable gzip compression");
+}
+
+WebInspector.AuditRules.GzipRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var totalSavings = 0;
+        var compressedSize = 0;
+        var candidateSize = 0;
+        var summary = result.addChild("", true);
+        for (var i = 0, length = resources.length; i < length; ++i) {
+            var resource = resources[i];
+            if (this._shouldCompress(resource)) {
+                var size = resource.resourceSize;
+                candidateSize += size;
+                if (this._isCompressed(resource)) {
+                    compressedSize += size;
+                    continue;
+                }
+                var savings = 2 * size / 3;
+                totalSavings += savings;
+                summary.addChild(String.sprintf("%s could save ~%s", WebInspector.linkifyURL(resource.url), Number.bytesToString(savings)));
+                result.violationCount++;
+            }
+        }
+        if (!totalSavings)
+            return callback(null);
+        summary.value = String.sprintf("Compressing the following resources with gzip could reduce their transfer size by about two thirds (~%s):", Number.bytesToString(totalSavings));
+        callback(result);
+    },
+
+    _isCompressed: function(resource)
+    {
+        var encoding = resource.responseHeaders["Content-Encoding"];
+        return encoding === "gzip" || encoding === "deflate";
+    },
+
+    _shouldCompress: function(resource)
+    {
+        return WebInspector.Resource.Type.isTextType(resource.type) && resource.domain && resource.resourceSize !== undefined && resource.resourceSize > 150;
+    }
+}
+
+WebInspector.AuditRules.GzipRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CombineExternalResourcesRule = function(id, name, type, resourceTypeName, allowedPerDomain)
+{
+    WebInspector.AuditRule.call(this, id, name);
+    this._type = type;
+    this._resourceTypeName = resourceTypeName;
+    this._allowedPerDomain = allowedPerDomain;
+}
+
+WebInspector.AuditRules.CombineExternalResourcesRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, [this._type], WebInspector.URLRegExp);
+        var penalizedResourceCount = 0;
+        // TODO: refactor according to the chosen i18n approach
+        var summary = result.addChild("", true);
+        for (var domain in domainToResourcesMap) {
+            var domainResources = domainToResourcesMap[domain];
+            var extraResourceCount = domainResources.length - this._allowedPerDomain;
+            if (extraResourceCount <= 0)
+                continue;
+            penalizedResourceCount += extraResourceCount - 1;
+            summary.addChild(String.sprintf("%d %s resources served from %s.", domainResources.length, this._resourceTypeName, domain));
+            result.violationCount += domainResources.length;
+        }
+        if (!penalizedResourceCount)
+            return callback(null);
+
+        summary.value = "There are multiple resources served from same domain. Consider combining them into as few files as possible.";
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.CombineExternalResourcesRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CombineJsResourcesRule = function(allowedPerDomain) {
+    WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externaljs", "Combine external JavaScript", WebInspector.Resource.Type.Script, "JavaScript", allowedPerDomain);
+}
+
+WebInspector.AuditRules.CombineJsResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;
+
+
+WebInspector.AuditRules.CombineCssResourcesRule = function(allowedPerDomain) {
+    WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externalcss", "Combine external CSS", WebInspector.Resource.Type.Stylesheet, "CSS", allowedPerDomain);
+}
+
+WebInspector.AuditRules.CombineCssResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;
+
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule = function(hostCountThreshold) {
+    WebInspector.AuditRule.call(this, "network-minimizelookups", "Minimize DNS lookups");
+    this._hostCountThreshold = hostCountThreshold;
+}
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var summary = result.addChild("");
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, undefined, WebInspector.URLRegExp);
+        for (var domain in domainToResourcesMap) {
+            if (domainToResourcesMap[domain].length > 1)
+                continue;
+            var match = domain.match(WebInspector.URLRegExp);
+            if (!match)
+                continue;
+            if (!match[2].search(WebInspector.AuditRules.IPAddressRegexp))
+                continue; // an IP address
+            summary.addSnippet(match[2]);
+            result.violationCount++;
+        }
+        if (!summary.children || summary.children.length <= this._hostCountThreshold)
+            return callback(null);
+
+        summary.value = "The following domains only serve one resource each. If possible, avoid the extra DNS lookups by serving these resources from existing domains.";
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.ParallelizeDownloadRule = function(optimalHostnameCount, minRequestThreshold, minBalanceThreshold)
+{
+    WebInspector.AuditRule.call(this, "network-parallelizehosts", "Parallelize downloads across hostnames");
+    this._optimalHostnameCount = optimalHostnameCount;
+    this._minRequestThreshold = minRequestThreshold;
+    this._minBalanceThreshold = minBalanceThreshold;
+}
+
+
+WebInspector.AuditRules.ParallelizeDownloadRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function hostSorter(a, b)
+        {
+            var aCount = domainToResourcesMap[a].length;
+            var bCount = domainToResourcesMap[b].length;
+            return (aCount < bCount) ? 1 : (aCount == bCount) ? 0 : -1;
+        }
+
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(
+            resources,
+            [WebInspector.Resource.Type.Stylesheet, WebInspector.Resource.Type.Image],
+            WebInspector.URLRegExp,
+            true);
+
+        var hosts = [];
+        for (var url in domainToResourcesMap)
+            hosts.push(url);
+
+        if (!hosts.length)
+            return callback(null); // no hosts (local file or something)
+
+        hosts.sort(hostSorter);
+
+        var optimalHostnameCount = this._optimalHostnameCount;
+        if (hosts.length > optimalHostnameCount)
+            hosts.splice(optimalHostnameCount);
+
+        var busiestHostResourceCount = domainToResourcesMap[hosts[0]].length;
+        var resourceCountAboveThreshold = busiestHostResourceCount - this._minRequestThreshold;
+        if (resourceCountAboveThreshold <= 0)
+            return callback(null);
+
+        var avgResourcesPerHost = 0;
+        for (var i = 0, size = hosts.length; i < size; ++i)
+            avgResourcesPerHost += domainToResourcesMap[hosts[i]].length;
+
+        // Assume optimal parallelization.
+        avgResourcesPerHost /= optimalHostnameCount;
+        avgResourcesPerHost = Math.max(avgResourcesPerHost, 1);
+
+        var pctAboveAvg = (resourceCountAboveThreshold / avgResourcesPerHost) - 1.0;
+        var minBalanceThreshold = this._minBalanceThreshold;
+        if (pctAboveAvg < minBalanceThreshold)
+            return callback(null);
+
+        var resourcesOnBusiestHost = domainToResourcesMap[hosts[0]];
+        var entry = result.addChild(String.sprintf("This page makes %d parallelizable requests to %s. Increase download parallelization by distributing the following requests across multiple hostnames.", busiestHostResourceCount, hosts[0]), true);
+        for (var i = 0; i < resourcesOnBusiestHost.length; ++i)
+            entry.addURL(resourcesOnBusiestHost[i].url);
+
+        result.violationCount = resourcesOnBusiestHost.length;
+        callback(result);
+    }
+}
+
+WebInspector.AuditRules.ParallelizeDownloadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+// The reported CSS rule size is incorrect (parsed != original in WebKit),
+// so use percentages instead, which gives a better approximation.
+WebInspector.AuditRules.UnusedCssRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-unusedcss", "Remove unused CSS rules");
+}
+
+WebInspector.AuditRules.UnusedCssRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var self = this;
+        function evalCallback(routineResult, isException) {
+            if (isException || !routineResult || !routineResult.styleSheets.length)
+                return callback(null);
+
+            var totalUnusedPercent = Math.round(100 * routineResult.unusedSize / routineResult.totalSize);
+            var summary = result.addChild(String.sprintf("%d%% of CSS (estimated) is not used by the current page.", totalUnusedPercent), true);
+
+            for (var i = 0; i < routineResult.styleSheets.length; ++i) {
+                var stylesheet = routineResult.styleSheets[i];
+
+                var url = stylesheet.type === "href" ? WebInspector.linkifyURL(stylesheet.location) : String.sprintf("Inline block #%s", stylesheet.location);
+                var pctUnused = Math.round(100 * stylesheet.unusedSize / stylesheet.totalSize);
+                var entry = summary.addChild(String.sprintf("%s: %d%% (estimated) is not used by the current page.", url, pctUnused));
+
+                for (var j = 0; j < stylesheet.unusedRules.length; ++j)
+                    entry.addSnippet(stylesheet.unusedRules[j]);
+
+                result.violationCount += stylesheet.unusedRules.length;
+            }
+
+            callback(result);
+        }
+
+        function routine()
+        {
+            var styleSheets = document.styleSheets;
+            if (!styleSheets)
+                return false;
+            var routineResult = { styleSheets: [] };
+            var inlineBlockOrdinal = 0;
+            var totalStylesheetSize = 0;
+            var totalUnusedStylesheetSize = 0;
+            var pseudoSelectorRegexp = /:hover|:link|:active|:visited|:focus/;
+            for (var i = 0; i < styleSheets.length; ++i) {
+                var styleSheet = styleSheets[i];
+                if (!styleSheet.cssRules)
+                    continue;
+                var stylesheetSize = 0;
+                var unusedStylesheetSize = 0;
+                var unusedRules = [];
+                for (var curRule = 0; curRule < styleSheet.cssRules.length; ++curRule) {
+                    var rule = styleSheet.cssRules[curRule];
+                    var textLength = rule.cssText ? rule.cssText.length : 0;
+                    stylesheetSize += textLength;
+                    if (rule.type !== 1 || rule.selectorText.match(pseudoSelectorRegexp))
+                        continue;
+                    var nodes = document.querySelectorAll(rule.selectorText);
+                    if (nodes && nodes.length)
+                        continue;
+                    unusedStylesheetSize += textLength;
+                    unusedRules.push(rule.selectorText);
+                }
+                totalStylesheetSize += stylesheetSize;
+                totalUnusedStylesheetSize += unusedStylesheetSize;
+
+                if (unusedRules.length) {
+                    var entry = { type: styleSheet.href ? "href" : "inline",
+                                  totalSize: stylesheetSize,
+                                  unusedSize: unusedStylesheetSize,
+                                  location: styleSheet.href ? styleSheet.href : ++inlineBlockOrdinal,
+                                  unusedRules: unusedRules };
+                    routineResult.styleSheets.push(entry);
+                }
+            }
+            routineResult.totalSize = totalStylesheetSize;
+            routineResult.unusedSize = totalUnusedStylesheetSize;
+            return routineResult;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback);
+    }
+}
+
+WebInspector.AuditRules.UnusedCssRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CacheControlRule = function(id, name)
+{
+    WebInspector.AuditRule.call(this, id, name);
+}
+
+WebInspector.AuditRules.CacheControlRule.MillisPerMonth = 1000 * 60 * 60 * 24 * 30;
+
+WebInspector.AuditRules.CacheControlRule.prototype = {
+
+    doRun: function(resources, result, callback)
+    {
+        var cacheableAndNonCacheableResources = this._cacheableAndNonCacheableResources(resources);
+        if (cacheableAndNonCacheableResources[0].length)
+            this.runChecks(cacheableAndNonCacheableResources[0], result);
+        this.handleNonCacheableResources(cacheableAndNonCacheableResources[1], result);
+
+        callback(result);
+    },
+
+    handleNonCacheableResources: function()
+    {
+    },
+
+    _cacheableAndNonCacheableResources: function(resources)
+    {
+        var processedResources = [[], []];
+        for (var i = 0; i < resources.length; ++i) {
+            var resource = resources[i];
+            if (!this.isCacheableResource(resource))
+                continue;
+            if (this._isExplicitlyNonCacheable(resource))
+                processedResources[1].push(resource);
+            else
+                processedResources[0].push(resource);
+        }
+        return processedResources;
+    },
+
+    execCheck: function(messageText, resourceCheckFunction, resources, result)
+    {
+        var resourceCount = resources.length;
+        var urls = [];
+        for (var i = 0; i < resourceCount; ++i) {
+            if (resourceCheckFunction.call(this, resources[i]))
+                urls.push(resources[i].url);
+        }
+        if (urls.length) {
+            var entry = result.addChild(messageText, true);
+            entry.addURLs(urls);
+            result.violationCount += urls.length;
+        }
+    },
+
+    freshnessLifetimeGreaterThan: function(resource, timeMs)
+    {
+        var dateHeader = this.responseHeader(resource, "Date");
+        if (!dateHeader)
+            return false;
+
+        var dateHeaderMs = Date.parse(dateHeader);
+        if (isNaN(dateHeaderMs))
+            return false;
+
+        var freshnessLifetimeMs;
+        var maxAgeMatch = this.responseHeaderMatch(resource, "Cache-Control", "max-age=(\\d+)");
+
+        if (maxAgeMatch)
+            freshnessLifetimeMs = (maxAgeMatch[1]) ? 1000 * maxAgeMatch[1] : 0;
+        else {
+            var expiresHeader = this.responseHeader(resource, "Expires");
+            if (expiresHeader) {
+                var expDate = Date.parse(expiresHeader);
+                if (!isNaN(expDate))
+                    freshnessLifetimeMs = expDate - dateHeaderMs;
+            }
+        }
+
+        return (isNaN(freshnessLifetimeMs)) ? false : freshnessLifetimeMs > timeMs;
+    },
+
+    responseHeader: function(resource, header)
+    {
+        return resource.responseHeaders[header];
+    },
+
+    hasResponseHeader: function(resource, header)
+    {
+        return resource.responseHeaders[header] !== undefined;
+    },
+
+    isCompressible: function(resource)
+    {
+        return WebInspector.Resource.Type.isTextType(resource.type);
+    },
+
+    isPubliclyCacheable: function(resource)
+    {
+        if (this._isExplicitlyNonCacheable(resource))
+            return false;
+
+        if (this.responseHeaderMatch(resource, "Cache-Control", "public"))
+            return true;
+
+        return resource.url.indexOf("?") == -1 && !this.responseHeaderMatch(resource, "Cache-Control", "private");
+    },
+
+    responseHeaderMatch: function(resource, header, regexp)
+    {
+        return resource.responseHeaders[header]
+            ? resource.responseHeaders[header].match(new RegExp(regexp, "im"))
+            : undefined;
+    },
+
+    hasExplicitExpiration: function(resource)
+    {
+        return this.hasResponseHeader(resource, "Date") &&
+            (this.hasResponseHeader(resource, "Expires") || this.responseHeaderMatch(resource, "Cache-Control", "max-age"));
+    },
+
+    _isExplicitlyNonCacheable: function(resource)
+    {
+        var hasExplicitExp = this.hasExplicitExpiration(resource);
+        return this.responseHeaderMatch(resource, "Cache-Control", "(no-cache|no-store|must-revalidate)") ||
+            this.responseHeaderMatch(resource, "Pragma", "no-cache") ||
+            (hasExplicitExp && !this.freshnessLifetimeGreaterThan(resource, 0)) ||
+            (!hasExplicitExp && resource.url && resource.url.indexOf("?") >= 0) ||
+            (!hasExplicitExp && !this.isCacheableResource(resource));
+    },
+
+    isCacheableResource: function(resource)
+    {
+        return resource.statusCode !== undefined && WebInspector.AuditRules.CacheableResponseCodes[resource.statusCode];
+    }
+}
+
+WebInspector.AuditRules.CacheControlRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.BrowserCacheControlRule = function()
+{
+    WebInspector.AuditRules.CacheControlRule.call(this, "http-browsercache", "Leverage browser caching");
+}
+
+WebInspector.AuditRules.BrowserCacheControlRule.prototype = {
+    handleNonCacheableResources: function(resources, result)
+    {
+        if (resources.length) {
+            var entry = result.addChild("The following resources are explicitly non-cacheable. Consider making them cacheable if possible:", true);
+            result.violationCount += resources.length;
+            for (var i = 0; i < resources.length; ++i)
+                entry.addURL(resources[i].url);
+        }
+    },
+
+    runChecks: function(resources, result, callback)
+    {
+        this.execCheck("The following resources are missing a cache expiration. Resources that do not specify an expiration may not be cached by browsers:",
+            this._missingExpirationCheck, resources, result);
+        this.execCheck("The following resources specify a \"Vary\" header that disables caching in most versions of Internet Explorer:",
+            this._varyCheck, resources, result);
+        this.execCheck("The following cacheable resources have a short freshness lifetime:",
+            this._oneMonthExpirationCheck, resources, result);
+
+        // Unable to implement the favicon check due to the WebKit limitations.
+        this.execCheck("To further improve cache hit rate, specify an expiration one year in the future for the following cacheable resources:",
+            this._oneYearExpirationCheck, resources, result);
+    },
+
+    _missingExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) && !this.hasResponseHeader(resource, "Set-Cookie") && !this.hasExplicitExpiration(resource);
+    },
+
+    _varyCheck: function(resource)
+    {
+        var varyHeader = this.responseHeader(resource, "Vary");
+        if (varyHeader) {
+            varyHeader = varyHeader.replace(/User-Agent/gi, "");
+            varyHeader = varyHeader.replace(/Accept-Encoding/gi, "");
+            varyHeader = varyHeader.replace(/[, ]*/g, "");
+        }
+        return varyHeader && varyHeader.length && this.isCacheableResource(resource) && this.freshnessLifetimeGreaterThan(resource, 0);
+    },
+
+    _oneMonthExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.hasResponseHeader(resource, "Set-Cookie") &&
+            !this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&
+            this.freshnessLifetimeGreaterThan(resource, 0);
+    },
+
+    _oneYearExpirationCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.hasResponseHeader(resource, "Set-Cookie") &&
+            !this.freshnessLifetimeGreaterThan(resource, 11 * WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&
+            this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth);
+    }
+}
+
+WebInspector.AuditRules.BrowserCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;
+
+
+WebInspector.AuditRules.ProxyCacheControlRule = function() {
+    WebInspector.AuditRules.CacheControlRule.call(this, "http-proxycache", "Leverage proxy caching");
+}
+
+WebInspector.AuditRules.ProxyCacheControlRule.prototype = {
+    runChecks: function(resources, result, callback)
+    {
+        this.execCheck("Resources with a \"?\" in the URL are not cached by most proxy caching servers:",
+            this._questionMarkCheck, resources, result);
+        this.execCheck("Consider adding a \"Cache-Control: public\" header to the following resources:",
+            this._publicCachingCheck, resources, result);
+        this.execCheck("The following publicly cacheable resources contain a Set-Cookie header. This security vulnerability can cause cookies to be shared by multiple users.",
+            this._setCookieCacheableCheck, resources, result);
+    },
+
+    _questionMarkCheck: function(resource)
+    {
+        return resource.url.indexOf("?") >= 0 && !this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);
+    },
+
+    _publicCachingCheck: function(resource)
+    {
+        return this.isCacheableResource(resource) &&
+            !this.isCompressible(resource) &&
+            !this.responseHeaderMatch(resource, "Cache-Control", "public") &&
+            !this.hasResponseHeader(resource, "Set-Cookie");
+    },
+
+    _setCookieCacheableCheck: function(resource)
+    {
+        return this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);
+    }
+}
+
+WebInspector.AuditRules.ProxyCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;
+
+
+WebInspector.AuditRules.ImageDimensionsRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-imagedims", "Specify image dimensions");
+}
+
+WebInspector.AuditRules.ImageDimensionsRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(evalResult, isException)
+        {
+            if (isException || !evalResult || !evalResult.totalImages)
+                return callback(null);
+
+            var entry = result.addChild("A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:", true);
+            var map = evalResult.map;
+            for (var url in map) {
+                var value = WebInspector.linkifyURL(url);
+                if (map[url] > 1)
+                    value += " (" + map[url] + " uses)";
+                entry.addChild(value);
+                result.violationCount++;
+            }
+            callback(result);
+        }
+
+        function routine()
+        {
+            var images = document.getElementsByTagName("img");
+            const widthRegExp = /width[^:;]*:/gim;
+            const heightRegExp = /height[^:;]*:/gim;
+
+            function hasDimension(element, cssText, rules, regexp, attributeName) {
+                if (element.attributes.getNamedItem(attributeName) != null || (cssText && cssText.match(regexp)))
+                    return true;
+
+                if (!rules)
+                    return false;
+                for (var i = 0; i < rules.length; ++i) {
+                    if (rules.item(i).style.cssText.match(regexp))
+                        return true;
+                }
+                return false;
+            }
+
+            function hasWidth(element, cssText, rules) {
+                return hasDimension(element, cssText, rules, widthRegExp, "width");
+            }
+
+            function hasHeight(element, cssText, rules) {
+                return hasDimension(element, cssText, rules, heightRegExp, "height");
+            }
+
+            var urlToNoDimensionCount = {};
+            var found = false;
+            for (var i = 0; i < images.length; ++i) {
+                var image = images[i];
+                if (!image.src)
+                    continue;
+                var position = document.defaultView.getComputedStyle(image).getPropertyValue("position");
+                if (position === "absolute")
+                    continue;
+                var cssText = (image.style && image.style.cssText) ? image.style.cssText : "";
+                var rules = document.defaultView.getMatchedCSSRules(image, "", true);
+                if (!hasWidth(image, cssText, rules) || !hasHeight(image, cssText, rules)) {
+                    found = true;
+                    if (urlToNoDimensionCount.hasOwnProperty(image.src))
+                        ++urlToNoDimensionCount[image.src];
+                    else
+                        urlToNoDimensionCount[image.src] = 1;
+                }
+            }
+            return found ? {totalImages: images.length, map: urlToNoDimensionCount} : null;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback.bind(this));
+    }
+}
+
+WebInspector.AuditRules.ImageDimensionsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CssInHeadRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-cssinhead", "Put CSS in the document head");
+}
+
+WebInspector.AuditRules.CssInHeadRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(evalResult, isException)
+        {
+            if (isException || !evalResult)
+                return callback(null);
+
+            var summary = result.addChild("");
+
+            var outputMessages = [];
+            for (var url in evalResult) {
+                var urlViolations = evalResult[url];
+                if (urlViolations[0])
+                    result.addChild(String.sprintf("%s style block(s) in the %s body should be moved to the document head.", urlViolations[0], WebInspector.linkifyURL(url)));
+                for (var i = 0; i < urlViolations[1].length; ++i)
+                    result.addChild(String.sprintf("Link node %s should be moved to the document head in %s", WebInspector.linkifyURL(urlViolations[1])), WebInspector.linkifyURL(url));
+                result.violationCount += urlViolations.length;
+            }
+            summary.value = String.sprintf("CSS in the document body adversely impacts rendering performance.");
+            callback(result);
+        }
+
+        function routine()
+        {
+            function allViews() {
+                var views = [document.defaultView];
+                var curView = 0;
+                while (curView < views.length) {
+                    var view = views[curView];
+                    var frames = view.frames;
+                    for (var i = 0; i < frames.length; ++i) {
+                        if (frames[i] !== view)
+                            views.push(frames[i]);
+                    }
+                    ++curView;
+                }
+                return views;
+            }
+
+            var views = allViews();
+            var urlToViolationsArray = {};
+            var found = false;
+            for (var i = 0; i < views.length; ++i) {
+                var view = views[i];
+                if (!view.document)
+                    continue;
+
+                var inlineStyles = view.document.querySelectorAll("body style");
+                var inlineStylesheets = view.document.querySelectorAll("body link[rel~='stylesheet'][href]");
+                if (!inlineStyles.length && !inlineStylesheets.length)
+                    continue;
+
+                found = true;
+                var inlineStylesheetHrefs = [];
+                for (var j = 0; j < inlineStylesheets.length; ++j)
+                    inlineStylesheetHrefs.push(inlineStylesheets[j].href);
+                urlToViolationsArray[view.location.href] = [inlineStyles.length, inlineStylesheetHrefs];
+            }
+            return found ? urlToViolationsArray : null;
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback);
+    }
+}
+
+WebInspector.AuditRules.CssInHeadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.StylesScriptsOrderRule = function()
+{
+    WebInspector.AuditRule.call(this, "page-stylescriptorder", "Optimize the order of styles and scripts");
+}
+
+WebInspector.AuditRules.StylesScriptsOrderRule.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        function evalCallback(resultValue, isException)
+        {
+            if (isException || !resultValue)
+                return callback(null);
+
+            var lateCssUrls = resultValue[0];
+            var cssBeforeInlineCount = resultValue[1];
+
+            var entry = result.addChild("The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.", true);
+            entry.addURLs(lateCssUrls);
+            result.violationCount += lateCssUrls.length;
+
+            if (cssBeforeInlineCount) {
+                result.addChild(String.sprintf(" %d inline script block%s found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.", cssBeforeInlineCount, cssBeforeInlineCount > 1 ? "s were" : " was"));
+                result.violationCount += cssBeforeInlineCount;
+            }
+            callback(result);
+        }
+
+        function routine()
+        {
+            var lateStyles = document.querySelectorAll("head script[src] ~ link[rel~='stylesheet'][href]");
+            var cssBeforeInlineCount = document.querySelectorAll("head link[rel~='stylesheet'][href] ~ script:not([src])").length;
+            if (!lateStyles.length && !cssBeforeInlineCount)
+                return null;
+
+            var lateStyleUrls = [];
+            for (var i = 0; i < lateStyles.length; ++i)
+                lateStyleUrls.push(lateStyles[i].href);
+            return [ lateStyleUrls, cssBeforeInlineCount ];
+        }
+
+        WebInspector.AuditRules.evaluateInTargetWindow(routine, evalCallback.bind(this));
+    }
+}
+
+WebInspector.AuditRules.StylesScriptsOrderRule.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CookieRuleBase = function(id, name)
+{
+    WebInspector.AuditRule.call(this, id, name);
+}
+
+WebInspector.AuditRules.CookieRuleBase.prototype = {
+    doRun: function(resources, result, callback)
+    {
+        var self = this;
+        function resultCallback(receivedCookies, isAdvanced) {
+            self.processCookies(isAdvanced ? receivedCookies : [], resources, result);
+            callback(result);
+        }
+        WebInspector.Cookies.getCookiesAsync(resultCallback);
+    },
+
+    mapResourceCookies: function(resourcesByDomain, allCookies, callback)
+    {
+        for (var i = 0; i < allCookies.length; ++i) {
+            for (var resourceDomain in resourcesByDomain) {
+                if (WebInspector.Cookies.cookieDomainMatchesResourceDomain(allCookies[i].domain, resourceDomain))
+                    this._callbackForResourceCookiePairs(resourcesByDomain[resourceDomain], allCookies[i], callback);
+            }
+        }
+    },
+
+    _callbackForResourceCookiePairs: function(resources, cookie, callback)
+    {
+        if (!resources)
+            return;
+        for (var i = 0; i < resources.length; ++i) {
+            if (WebInspector.Cookies.cookieMatchesResourceURL(cookie, resources[i].url))
+                callback(resources[i], cookie);
+        }
+    }
+}
+
+WebInspector.AuditRules.CookieRuleBase.prototype.__proto__ = WebInspector.AuditRule.prototype;
+
+
+WebInspector.AuditRules.CookieSizeRule = function(avgBytesThreshold)
+{
+    WebInspector.AuditRules.CookieRuleBase.call(this, "http-cookiesize", "Minimize cookie size");
+    this._avgBytesThreshold = avgBytesThreshold;
+    this._maxBytesThreshold = 1000;
+}
+
+WebInspector.AuditRules.CookieSizeRule.prototype = {
+    _average: function(cookieArray)
+    {
+        var total = 0;
+        for (var i = 0; i < cookieArray.length; ++i)
+            total += cookieArray[i].size;
+        return cookieArray.length ? Math.round(total / cookieArray.length) : 0;
+    },
+
+    _max: function(cookieArray)
+    {
+        var result = 0;
+        for (var i = 0; i < cookieArray.length; ++i)
+            result = Math.max(cookieArray[i].size, result);
+        return result;
+    },
+
+    processCookies: function(allCookies, resources, result)
+    {
+        function maxSizeSorter(a, b)
+        {
+            return b.maxCookieSize - a.maxCookieSize;
+        }
+
+        function avgSizeSorter(a, b)
+        {
+            return b.avgCookieSize - a.avgCookieSize;
+        }
+
+        var cookiesPerResourceDomain = {};
+
+        function collectorCallback(resource, cookie)
+        {
+            var cookies = cookiesPerResourceDomain[resource.domain];
+            if (!cookies) {
+                cookies = [];
+                cookiesPerResourceDomain[resource.domain] = cookies;
+            }
+            cookies.push(cookie);
+        }
+
+        if (!allCookies.length)
+            return;
+
+        var sortedCookieSizes = [];
+
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,
+                null,
+                WebInspector.URLRegExp,
+                true);
+        var matchingResourceData = {};
+        this.mapResourceCookies(domainToResourcesMap, allCookies, collectorCallback.bind(this));
+
+        for (var resourceDomain in cookiesPerResourceDomain) {
+            var cookies = cookiesPerResourceDomain[resourceDomain];
+            sortedCookieSizes.push({
+                domain: resourceDomain,
+                avgCookieSize: this._average(cookies),
+                maxCookieSize: this._max(cookies)
+            });
+        }
+        var avgAllCookiesSize = this._average(allCookies);
+
+        var hugeCookieDomains = [];
+        sortedCookieSizes.sort(maxSizeSorter);
+
+        for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {
+            var maxCookieSize = sortedCookieSizes[i].maxCookieSize;
+            if (maxCookieSize > this._maxBytesThreshold)
+                hugeCookieDomains.push(sortedCookieSizes[i].domain + ": " + Number.bytesToString(maxCookieSize));
+        }
+
+        var bigAvgCookieDomains = [];
+        sortedCookieSizes.sort(avgSizeSorter);
+        for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {
+            var domain = sortedCookieSizes[i].domain;
+            var avgCookieSize = sortedCookieSizes[i].avgCookieSize;
+            if (avgCookieSize > this._avgBytesThreshold && avgCookieSize < this._maxBytesThreshold)
+                bigAvgCookieDomains.push(domain + ": " + Number.bytesToString(avgCookieSize));
+        }
+        result.addChild(String.sprintf("The average cookie size for all requests on this page is %s", Number.bytesToString(avgAllCookiesSize)));
+
+        var message;
+        if (hugeCookieDomains.length) {
+            var entry = result.addChild("The following domains have a cookie size in excess of 1KB. This is harmful because requests with cookies larger than 1KB typically cannot fit into a single network packet.", true);
+            entry.addURLs(hugeCookieDomains);
+            result.violationCount += hugeCookieDomains.length;
+        }
+
+        if (bigAvgCookieDomains.length) {
+            var entry = result.addChild(String.sprintf("The following domains have an average cookie size in excess of %d bytes. Reducing the size of cookies for these domains can reduce the time it takes to send requests.", this._avgBytesThreshold), true);
+            entry.addURLs(bigAvgCookieDomains.length);
+            result.violationCount += bigAvgCookieDomains.length;
+        }
+    }
+}
+
+WebInspector.AuditRules.CookieSizeRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;
+
+
+WebInspector.AuditRules.StaticCookielessRule = function(minResources)
+{
+    WebInspector.AuditRules.CookieRuleBase.call(this, "http-staticcookieless", "Serve static content from a cookieless domain");
+    this._minResources = minResources;
+}
+
+WebInspector.AuditRules.StaticCookielessRule.prototype = {
+    processCookies: function(allCookies, resources, result)
+    {
+        var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,
+                [WebInspector.Resource.Type.Stylesheet,
+                 WebInspector.Resource.Type.Image],
+                WebInspector.URLRegExp,
+                true);
+        var totalStaticResources = 0;
+        for (var domain in domainToResourcesMap)
+            totalStaticResources += domainToResourcesMap[domain].length;
+        if (totalStaticResources < this._minResources)
+            return;
+        var matchingResourceData = {};
+        this.mapResourceCookies(domainToResourcesMap, allCookies, this._collectorCallback.bind(this, matchingResourceData));
+
+        var badUrls = [];
+        var cookieBytes = 0;
+        for (var url in matchingResourceData) {
+            badUrls.push(url);
+            cookieBytes += matchingResourceData[url]
+        }
+        if (badUrls.length < this._minResources)
+            return;
+
+        var entry = result.addChild(String.sprintf("%s of cookies were sent with the following static resources. Serve these static resources from a domain that does not set cookies:", Number.bytesToString(cookieBytes)), true);
+        entry.addURLs(badUrls);
+        result.violationCount = badUrls.length;
+    },
+
+    _collectorCallback: function(matchingResourceData, resource, cookie)
+    {
+        matchingResourceData[resource.url] = (matchingResourceData[resource.url] || 0) + cookie.size;
+    }
+}
+
+WebInspector.AuditRules.StaticCookielessRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;
+
+/* AuditCategories.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.AuditCategories.PagePerformance = function() {
+    WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.PagePerformance.AuditCategoryName);
+}
+
+WebInspector.AuditCategories.PagePerformance.AuditCategoryName = "Web Page Performance";
+
+WebInspector.AuditCategories.PagePerformance.prototype = {
+    initialize: function()
+    {
+        this.addRule(new WebInspector.AuditRules.UnusedCssRule(), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CssInHeadRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.StylesScriptsOrderRule(), WebInspector.AuditRule.Severity.Severe);
+    }
+}
+
+WebInspector.AuditCategories.PagePerformance.prototype.__proto__ = WebInspector.AuditCategory.prototype;
+
+WebInspector.AuditCategories.NetworkUtilization = function() {
+    WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName);
+}
+
+WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName = "Network Utilization";
+
+WebInspector.AuditCategories.NetworkUtilization.prototype = {
+    initialize: function()
+    {
+        this.addRule(new WebInspector.AuditRules.GzipRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.ImageDimensionsRule(), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CookieSizeRule(400), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.StaticCookielessRule(5), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.CombineJsResourcesRule(2), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.CombineCssResourcesRule(2), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.MinimizeDnsLookupsRule(4), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.ParallelizeDownloadRule(4, 10, 0.5), WebInspector.AuditRule.Severity.Warning);
+        this.addRule(new WebInspector.AuditRules.BrowserCacheControlRule(), WebInspector.AuditRule.Severity.Severe);
+        this.addRule(new WebInspector.AuditRules.ProxyCacheControlRule(), WebInspector.AuditRule.Severity.Warning);
+    }
+}
+
+WebInspector.AuditCategories.NetworkUtilization.prototype.__proto__ = WebInspector.AuditCategory.prototype;
+
+/* ResourceView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) IBM Corp. 2009  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ResourceView = function(resource)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("resource-view");
+
+    this.resource = resource;
+
+    this.tabsElement = document.createElement("div");
+    this.tabsElement.className = "scope-bar";
+    this.element.appendChild(this.tabsElement);
+
+    this.headersTabElement = document.createElement("li");
+    this.headersTabElement.textContent = WebInspector.UIString("Headers");
+    this.contentTabElement = document.createElement("li");
+    this.contentTabElement.textContent = WebInspector.UIString("Content");
+    this.tabsElement.appendChild(this.headersTabElement);
+    this.tabsElement.appendChild(this.contentTabElement);
+
+    this.headersTabElement.addEventListener("click", this._selectHeadersTab.bind(this), false);
+    this.contentTabElement.addEventListener("click", this.selectContentTab.bind(this), false);
+
+    this.headersElement = document.createElement("div");
+    this.headersElement.className = "resource-view-headers";
+    this.element.appendChild(this.headersElement);
+
+    this.contentElement = document.createElement("div");
+    this.contentElement.className = "resource-view-content";
+    this.element.appendChild(this.contentElement);
+
+    this.headersListElement = document.createElement("ol");
+    this.headersListElement.className = "outline-disclosure";
+    this.headersElement.appendChild(this.headersListElement);
+
+    this.headersTreeOutline = new TreeOutline(this.headersListElement);
+    this.headersTreeOutline.expandTreeElementsWhenArrowing = true;
+
+    this.urlTreeElement = new TreeElement("", null, false);
+    this.urlTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.urlTreeElement);
+
+    this.requestMethodTreeElement = new TreeElement("", null, false);
+    this.requestMethodTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.requestMethodTreeElement);
+
+    this.statusCodeTreeElement = new TreeElement("", null, false);
+    this.statusCodeTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.statusCodeTreeElement);
+     
+    this.requestHeadersTreeElement = new TreeElement("", null, true);
+    this.requestHeadersTreeElement.expanded = true;
+    this.requestHeadersTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.requestHeadersTreeElement);
+
+    this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
+    this._decodeRequestParameters = true;
+
+    this.queryStringTreeElement = new TreeElement("", null, true);
+    this.queryStringTreeElement.expanded = true;
+    this.queryStringTreeElement.selectable = false;
+    this.queryStringTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.queryStringTreeElement);
+
+    this.formDataTreeElement = new TreeElement("", null, true);
+    this.formDataTreeElement.expanded = true;
+    this.formDataTreeElement.selectable = false;
+    this.formDataTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.formDataTreeElement);
+
+    this.requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);
+    this.requestPayloadTreeElement.expanded = true;
+    this.requestPayloadTreeElement.selectable = false;
+    this.requestPayloadTreeElement.hidden = true;
+    this.headersTreeOutline.appendChild(this.requestPayloadTreeElement);
+
+    this.responseHeadersTreeElement = new TreeElement("", null, true);
+    this.responseHeadersTreeElement.expanded = true;
+    this.responseHeadersTreeElement.selectable = false;
+    this.headersTreeOutline.appendChild(this.responseHeadersTreeElement);
+
+    this.headersVisible = true;
+
+    resource.addEventListener("url changed", this._refreshURL, this);
+    resource.addEventListener("requestHeaders changed", this._refreshRequestHeaders, this);
+    resource.addEventListener("responseHeaders changed", this._refreshResponseHeaders, this);
+    resource.addEventListener("finished", this._refreshHTTPInformation, this);
+
+    this._refreshURL();
+    this._refreshRequestHeaders();
+    this._refreshResponseHeaders();
+    this._refreshHTTPInformation();
+    this._selectTab();
+}
+
+WebInspector.ResourceView.prototype = {
+    attach: function()
+    {
+        if (!this.element.parentNode) {
+            var parentElement = (document.getElementById("resource-views") || document.getElementById("script-resource-views"));
+            if (parentElement)
+                parentElement.appendChild(this.element);
+        }
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this._selectTab();
+    },
+
+    set headersVisible(x)
+    {
+        if (x === this._headersVisible)
+            return;
+        this._headersVisible = x;
+        if (x)
+            this.element.addStyleClass("headers-visible"); 
+        else
+            this.element.removeStyleClass("headers-visible"); 
+        this._selectTab();
+    },
+
+    _selectTab: function()
+    {
+        if (this._headersVisible) {
+            if (WebInspector.settings.resourceViewTab === "headers")
+                this._selectHeadersTab();
+            else
+                this.selectContentTab();
+        } else
+            this._innerSelectContentTab();
+    },
+
+    _selectHeadersTab: function()
+    {
+        WebInspector.settings.resourceViewTab = "headers";
+        this.headersTabElement.addStyleClass("selected");
+        this.contentTabElement.removeStyleClass("selected");
+        this.headersElement.removeStyleClass("hidden");
+        this.contentElement.addStyleClass("hidden");
+    },
+
+    selectContentTab: function()
+    {
+        WebInspector.settings.resourceViewTab = "content";
+        this._innerSelectContentTab();
+    },
+
+    _innerSelectContentTab: function()
+    {
+        this.contentTabElement.addStyleClass("selected");
+        this.headersTabElement.removeStyleClass("selected");
+        this.contentElement.removeStyleClass("hidden");
+        this.headersElement.addStyleClass("hidden");
+        if ("resize" in this)
+            this.resize();
+        if ("contentTabSelected" in this)
+            this.contentTabSelected();
+    },
+
+    _refreshURL: function()
+    {
+        this.urlTreeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request URL") + ":</div>" +
+            "<div class=\"header-value source-code\">" + this.resource.url.escapeHTML() + "</div>";
+    },
+
+    _refreshQueryString: function()
+    {
+        var url = this.resource.url;
+        var hasQueryString = url.indexOf("?") >= 0;
+
+        if (!hasQueryString) {
+            this.queryStringTreeElement.hidden = true;
+            return;
+        }
+
+        this.queryStringTreeElement.hidden = false;
+        var parmString = url.split("?", 2)[1];
+        this._refreshParms(WebInspector.UIString("Query String Parameters"), parmString, this.queryStringTreeElement);
+    },
+
+    _refreshFormData: function()
+    {
+        this.formDataTreeElement.hidden = true;
+        this.requestPayloadTreeElement.hidden = true;
+
+        var isFormData = this.resource.requestFormData;
+        if (!isFormData)
+            return;
+
+        var isFormEncoded = false;
+        var requestContentType = this._getHeaderValue(this.resource.requestHeaders, "Content-Type");
+        if (requestContentType && requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
+            isFormEncoded = true;
+
+        if (isFormEncoded) {
+            this.formDataTreeElement.hidden = false;
+            this._refreshParms(WebInspector.UIString("Form Data"), this.resource.requestFormData, this.formDataTreeElement);
+        } else {
+            this.requestPayloadTreeElement.hidden = false;
+            this._refreshRequestPayload(this.resource.requestFormData);
+        }
+    },
+
+    _refreshRequestPayload: function(formData)
+    {
+        this.requestPayloadTreeElement.removeChildren();
+
+        var title = "<div class=\"header-name\">&nbsp;</div>";
+        title += "<div class=\"raw-form-data header-value source-code\">" + formData.escapeHTML() + "</div>";
+        var parmTreeElement = new TreeElement(title, null, false);
+        parmTreeElement.selectable = false;
+        this.requestPayloadTreeElement.appendChild(parmTreeElement);
+    },
+
+    _refreshParms: function(title, parmString, parmsTreeElement)
+    {
+        var parms = parmString.split("&");
+        for (var i = 0; i < parms.length; ++i) {
+            var parm = parms[i];
+            parm = parm.split("=", 2);
+            if (parm.length == 1)
+                parm.push("");
+            parms[i] = parm;
+        }
+
+        parmsTreeElement.removeChildren();
+
+        parmsTreeElement.title = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
+
+        for (var i = 0; i < parms.length; ++i) {
+            var key = parms[i][0];
+            var value = parms[i][1];
+
+            var errorDecoding = false;
+            if (this._decodeRequestParameters) {
+                if (value.indexOf("%") >= 0) {
+                    try {
+                        value = decodeURIComponent(value);
+                    } catch(e) {
+                        errorDecoding = true;
+                    }
+                }
+                    
+                value = value.replace(/\+/g, " ");
+            }
+
+            valueEscaped = value.escapeHTML();
+            if (errorDecoding)
+                valueEscaped += " <span class=\"error-message\">" + WebInspector.UIString("(unable to decode value)").escapeHTML() + "</span>";
+
+            var title = "<div class=\"header-name\">" + key.escapeHTML() + ":</div>";
+            title += "<div class=\"header-value source-code\">" + valueEscaped + "</div>";
+
+            var parmTreeElement = new TreeElement(title, null, false);
+            parmTreeElement.selectable = false;
+            parmTreeElement.tooltip = this._decodeHover;
+            parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
+            parmsTreeElement.appendChild(parmTreeElement);
+        }
+    },
+
+    _toggleURLdecoding: function(event)
+    {
+        this._decodeRequestParameters = !this._decodeRequestParameters;
+        this._refreshQueryString();
+        this._refreshFormData();
+    },
+
+    _getHeaderValue: function(headers, key)
+    {
+        var lowerKey = key.toLowerCase();
+        for (var testKey in headers) {
+            if (testKey.toLowerCase() === lowerKey)
+                return headers[testKey];
+        }
+    },
+
+    _refreshRequestHeaders: function()
+    {
+        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
+        this._refreshFormData();
+    },
+
+    _refreshResponseHeaders: function()
+    {
+        this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement);
+    },
+
+    _refreshHTTPInformation: function()
+    {
+        var requestMethodElement = this.requestMethodTreeElement;
+        requestMethodElement.hidden = !this.resource.statusCode;
+        var statusCodeElement = this.statusCodeTreeElement;
+        statusCodeElement.hidden = !this.resource.statusCode;
+        var statusCodeImage = "";
+
+        if (this.resource.statusCode) {
+            var statusImageSource = "";
+            if (this.resource.statusCode < 300)
+                statusImageSource = "Images/successGreenDot.png";
+            else if (this.resource.statusCode < 400)
+                statusImageSource = "Images/warningOrangeDot.png";
+            else
+                statusImageSource = "Images/errorRedDot.png";
+            statusCodeImage = "<img class=\"resource-status-image\" src=\"" + statusImageSource + "\" title=\"" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "\">";
+    
+            requestMethodElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Request Method") + ":</div>" +
+                "<div class=\"header-value source-code\">" + this.resource.requestMethod + "</div>";
+
+            statusCodeElement.title = "<div class=\"header-name\">" + WebInspector.UIString("Status Code") + ":</div>" +
+                statusCodeImage + "<div class=\"header-value source-code\">" + WebInspector.Resource.StatusTextForCode(this.resource.statusCode) + "</div>";
+        }
+    },
+    
+    _refreshHeaders: function(title, headers, headersTreeElement)
+    {
+        headersTreeElement.removeChildren();
+
+        var length = headers.length;
+        headersTreeElement.title = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";
+        headersTreeElement.hidden = !length;
+
+        var length = headers.length;
+        for (var i = 0; i < length; ++i) {
+            var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";
+            title += "<div class=\"header-value source-code\">" + headers[i].value.escapeHTML() + "</div>"
+
+            var headerTreeElement = new TreeElement(title, null, false);
+            headerTreeElement.selectable = false;
+            headersTreeElement.appendChild(headerTreeElement);
+        }
+    }
+}
+
+WebInspector.ResourceView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* SourceFrame.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceFrame = function(parentElement, addBreakpointDelegate, removeBreakpointDelegate)
+{
+    this._parentElement = parentElement;
+
+    this._textModel = new WebInspector.TextEditorModel();
+    this._textModel.replaceTabsWithSpaces = true;
+
+    this._messages = [];
+    this._rowMessages = {};
+    this._messageBubbles = {};
+    this.breakpoints = [];
+    this._shortcuts = {};
+
+    this._loaded = false;
+
+    this._addBreakpointDelegate = addBreakpointDelegate;
+    this._removeBreakpointDelegate = removeBreakpointDelegate;
+    this._popoverObjectGroup = "popover";
+}
+
+WebInspector.SourceFrame.prototype = {
+
+    set visible(visible)
+    {
+        this._visible = visible;
+        this._createViewerIfNeeded();
+        if (!visible && this._textViewer)
+            this._textViewer.freeCachedElements();
+            
+    },
+
+    get executionLine()
+    {
+        return this._executionLine;
+    },
+
+    set executionLine(x)
+    {
+        if (this._executionLine === x)
+            return;
+
+        var previousLine = this._executionLine;
+        this._executionLine = x;
+
+        if (this._textViewer)
+            this._updateExecutionLine(previousLine);
+    },
+
+    revealLine: function(lineNumber)
+    {
+        if (this._textViewer)
+            this._textViewer.revealLine(lineNumber - 1, 0);
+        else
+            this._lineNumberToReveal = lineNumber;
+    },
+
+    addBreakpoint: function(breakpoint)
+    {
+        this.breakpoints.push(breakpoint);
+        breakpoint.addEventListener("enabled", this._breakpointChanged, this);
+        breakpoint.addEventListener("disabled", this._breakpointChanged, this);
+        breakpoint.addEventListener("condition-changed", this._breakpointChanged, this);
+        if (this._textViewer)
+            this._addBreakpointToSource(breakpoint);
+    },
+
+    removeBreakpoint: function(breakpoint)
+    {
+        this.breakpoints.remove(breakpoint);
+        breakpoint.removeEventListener("enabled", null, this);
+        breakpoint.removeEventListener("disabled", null, this);
+        breakpoint.removeEventListener("condition-changed", null, this);
+        if (this._textViewer)
+            this._removeBreakpointFromSource(breakpoint);
+    },
+
+    addMessage: function(msg)
+    {
+        // Don't add the message if there is no message or valid line or if the msg isn't an error or warning.
+        if (!msg.message || msg.line <= 0 || !msg.isErrorOrWarning())
+            return;
+        this._messages.push(msg)
+        if (this._textViewer)
+            this._addMessageToSource(msg);
+    },
+
+    clearMessages: function()
+    {
+        for (var line in this._messageBubbles) {
+            var bubble = this._messageBubbles[line];
+            bubble.parentNode.removeChild(bubble);
+        }
+
+        this._messages = [];
+        this._rowMessages = {};
+        this._messageBubbles = {};
+        if (this._textViewer)
+            this._textViewer.resize();
+    },
+
+    sizeToFitContentHeight: function()
+    {
+        if (this._textViewer)
+            this._textViewer.revalidateDecorationsAndPaint();
+    },
+
+    setContent: function(mimeType, content, url)
+    {
+        this._loaded = true;
+        this._textModel.setText(null, content);
+        this._mimeType = mimeType;
+        this._url = url;
+        this._createViewerIfNeeded();
+    },
+
+    highlightLine: function(line)
+    {
+        if (this._textViewer)
+            this._textViewer.highlightLine(line - 1);
+        else
+            this._lineToHighlight = line;
+    },
+
+    _createViewerIfNeeded: function()
+    {
+        if (!this._visible || !this._loaded || this._textViewer)
+            return;
+
+        this._textViewer = new WebInspector.TextViewer(this._textModel, WebInspector.platform, this._url);
+        var element = this._textViewer.element;
+        element.addEventListener("keydown", this._keyDown.bind(this), true);
+        element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
+        element.addEventListener("mousedown", this._mouseDown.bind(this), true);
+        element.addEventListener("mousemove", this._mouseMove.bind(this), true);
+        element.addEventListener("scroll", this._scroll.bind(this), true);
+        this._parentElement.appendChild(element);
+
+        this._needsProgramCounterImage = true;
+        this._needsBreakpointImages = true;
+
+        this._textViewer.beginUpdates();
+
+        this._textViewer.mimeType = this._mimeType;
+        this._addExistingMessagesToSource();
+        this._addExistingBreakpointsToSource();
+        this._updateExecutionLine();
+        this._textViewer.resize();
+
+        if (this._lineNumberToReveal) {
+            this.revealLine(this._lineNumberToReveal);
+            delete this._lineNumberToReveal;
+        }
+
+        if (this._pendingMarkRange) {
+            var range = this._pendingMarkRange;
+            this.markAndRevealRange(range);
+            delete this._pendingMarkRange;
+        }
+
+        if (this._lineToHighlight) {
+            this.highlightLine(this._lineToHighlight);
+            delete this._lineToHighlight;
+        }
+        this._textViewer.endUpdates();
+    },
+
+    findSearchMatches: function(query)
+    {
+        var ranges = [];
+
+        // First do case-insensitive search.
+        var regexObject = createSearchRegex(query);
+        this._collectRegexMatches(regexObject, ranges);
+
+        // Then try regex search if user knows the / / hint.
+        try {
+            if (/^\/.*\/$/.test(query))
+                this._collectRegexMatches(new RegExp(query.substring(1, query.length - 1)), ranges);
+        } catch (e) {
+            // Silent catch.
+        }
+        return ranges;
+    },
+
+    _collectRegexMatches: function(regexObject, ranges)
+    {
+        for (var i = 0; i < this._textModel.linesCount; ++i) {
+            var line = this._textModel.line(i);
+            var offset = 0;
+            do {
+                var match = regexObject.exec(line);
+                if (match) {
+                    ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + match.index + match[0].length));
+                    offset += match.index + 1;
+                    line = line.substring(match.index + 1);
+                }
+            } while (match)
+        }
+        return ranges;
+    },
+
+    markAndRevealRange: function(range)
+    {
+        if (this._textViewer)
+            this._textViewer.markAndRevealRange(range);
+        else
+            this._pendingMarkRange = range;
+    },
+
+    clearMarkedRange: function()
+    {
+        if (this._textViewer) {
+            this._textViewer.markAndRevealRange(null);
+        } else
+            delete this._pendingMarkRange;
+    },
+
+    _incrementMessageRepeatCount: function(msg, repeatDelta)
+    {
+        if (!msg._resourceMessageLineElement)
+            return;
+
+        if (!msg._resourceMessageRepeatCountElement) {
+            var repeatedElement = document.createElement("span");
+            msg._resourceMessageLineElement.appendChild(repeatedElement);
+            msg._resourceMessageRepeatCountElement = repeatedElement;
+        }
+
+        msg.repeatCount += repeatDelta;
+        msg._resourceMessageRepeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", msg.repeatCount);
+    },
+
+    _breakpointChanged: function(event)
+    {
+        var breakpoint = event.target;
+        var lineNumber = breakpoint.line - 1;
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        if (breakpoint.enabled)
+            this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");
+        else
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-disabled");
+
+        if (breakpoint.condition)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-conditional");
+        else
+            this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");
+    },
+
+    _updateExecutionLine: function(previousLine)
+    {
+        if (previousLine) {
+            if (previousLine - 1 < this._textModel.linesCount)
+                this._textViewer.removeDecoration(previousLine - 1, "webkit-execution-line");
+        }
+
+        if (!this._executionLine)
+            return;
+
+        if (this._executionLine < this._textModel.linesCount)
+            this._textViewer.addDecoration(this._executionLine - 1, "webkit-execution-line");
+    },
+
+    _addExistingMessagesToSource: function()
+    {
+        var length = this._messages.length;
+        for (var i = 0; i < length; ++i)
+            this._addMessageToSource(this._messages[i]);
+    },
+
+    _addMessageToSource: function(msg)
+    {
+        if (msg.line >= this._textModel.linesCount)
+            return;
+
+        var messageBubbleElement = this._messageBubbles[msg.line];
+        if (!messageBubbleElement || messageBubbleElement.nodeType !== Node.ELEMENT_NODE || !messageBubbleElement.hasStyleClass("webkit-html-message-bubble")) {
+            messageBubbleElement = document.createElement("div");
+            messageBubbleElement.className = "webkit-html-message-bubble";
+            this._messageBubbles[msg.line] = messageBubbleElement;
+            this._textViewer.addDecoration(msg.line - 1, messageBubbleElement);
+        }
+
+        var rowMessages = this._rowMessages[msg.line];
+        if (!rowMessages) {
+            rowMessages = [];
+            this._rowMessages[msg.line] = rowMessages;
+        }
+
+        for (var i = 0; i < rowMessages.length; ++i) {
+            if (rowMessages[i].isEqual(msg, true)) {
+                this._incrementMessageRepeatCount(rowMessages[i], msg.repeatDelta);
+                return;
+            }
+        }
+
+        rowMessages.push(msg);
+
+        var imageURL;
+        switch (msg.level) {
+            case WebInspector.ConsoleMessage.MessageLevel.Error:
+                messageBubbleElement.addStyleClass("webkit-html-error-message");
+                imageURL = "Images/errorIcon.png";
+                break;
+            case WebInspector.ConsoleMessage.MessageLevel.Warning:
+                messageBubbleElement.addStyleClass("webkit-html-warning-message");
+                imageURL = "Images/warningIcon.png";
+                break;
+        }
+
+        var messageLineElement = document.createElement("div");
+        messageLineElement.className = "webkit-html-message-line";
+        messageBubbleElement.appendChild(messageLineElement);
+
+        // Create the image element in the Inspector's document so we can use relative image URLs.
+        var image = document.createElement("img");
+        image.src = imageURL;
+        image.className = "webkit-html-message-icon";
+        messageLineElement.appendChild(image);
+        messageLineElement.appendChild(document.createTextNode(msg.message));
+
+        msg._resourceMessageLineElement = messageLineElement;
+    },
+
+    _addExistingBreakpointsToSource: function()
+    {
+        for (var i = 0; i < this.breakpoints.length; ++i)
+            this._addBreakpointToSource(this.breakpoints[i]);
+    },
+
+    _addBreakpointToSource: function(breakpoint)
+    {
+        var lineNumber = breakpoint.line - 1;
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        this._textModel.setAttribute(lineNumber, "breakpoint", breakpoint);
+        breakpoint.sourceText = this._textModel.line(breakpoint.line - 1);
+
+        this._textViewer.beginUpdates();
+        this._textViewer.addDecoration(lineNumber, "webkit-breakpoint");
+        if (!breakpoint.enabled)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-disabled");
+        if (breakpoint.condition)
+            this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-conditional");
+        this._textViewer.endUpdates();
+    },
+
+    _removeBreakpointFromSource: function(breakpoint)
+    {
+        var lineNumber = breakpoint.line - 1;
+        this._textViewer.beginUpdates();
+        this._textModel.removeAttribute(lineNumber, "breakpoint");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");
+        this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");
+        this._textViewer.endUpdates();
+    },
+
+    _contextMenu: function(event)
+    {
+        var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");
+        if (!target)
+            return;
+        var row = target.parentElement;
+
+        var lineNumber = row.lineNumber;
+        var contextMenu = new WebInspector.ContextMenu();
+
+        var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+        if (!breakpoint) {
+            // This row doesn't have a breakpoint: We want to show Add Breakpoint and Add and Edit Breakpoint.
+            contextMenu.appendItem(WebInspector.UIString("Add Breakpoint"), this._addBreakpointDelegate.bind(this, lineNumber + 1));
+
+            function addConditionalBreakpoint() 
+            {
+                this._addBreakpointDelegate(lineNumber + 1);
+                var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+                if (breakpoint)
+                    this._editBreakpointCondition(breakpoint);
+            }
+
+            contextMenu.appendItem(WebInspector.UIString("Add Conditional Breakpoint..."), addConditionalBreakpoint.bind(this));
+        } else {
+            // This row has a breakpoint, we want to show edit and remove breakpoint, and either disable or enable.
+            contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), WebInspector.panels.scripts.removeBreakpoint.bind(WebInspector.panels.scripts, breakpoint));
+            contextMenu.appendItem(WebInspector.UIString("Edit Breakpoint..."), this._editBreakpointCondition.bind(this, breakpoint));
+            if (breakpoint.enabled)
+                contextMenu.appendItem(WebInspector.UIString("Disable Breakpoint"), function() { breakpoint.enabled = false; });
+            else
+                contextMenu.appendItem(WebInspector.UIString("Enable Breakpoint"), function() { breakpoint.enabled = true; });
+        }
+        contextMenu.show(event);
+    },
+
+    _scroll: function(event)
+    {
+        this._hidePopup();
+    },
+
+    _mouseDown: function(event)
+    {
+        this._resetHoverTimer();
+        this._hidePopup();
+        if (event.button != 0 || event.altKey || event.ctrlKey || event.metaKey)
+            return;
+        var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");
+        if (!target)
+            return;
+        var row = target.parentElement;
+
+        var lineNumber = row.lineNumber;
+
+        var breakpoint = this._textModel.getAttribute(lineNumber, "breakpoint");
+        if (breakpoint) {
+            if (event.shiftKey)
+                breakpoint.enabled = !breakpoint.enabled;
+            else
+                this._removeBreakpointDelegate(breakpoint);
+        } else
+            this._addBreakpointDelegate(lineNumber + 1);
+        event.preventDefault();
+    },
+
+    _mouseMove: function(event)
+    {
+        // Pretend that nothing has happened.
+        if (this._hoverElement === event.target || event.target.hasStyleClass("source-frame-eval-expression"))
+            return;
+
+        this._resetHoverTimer();
+        // User has 500ms to reach the popup.
+        if (this._popup) {
+            var self = this;
+            function doHide()
+            {
+                self._hidePopup();
+                delete self._hidePopupTimer;
+            }
+            this._hidePopupTimer = setTimeout(doHide, 500);
+        }
+
+        this._hoverElement = event.target;
+
+        // Now that cleanup routines are set up above, leave this in case we are not on a break.
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        // We are interested in identifiers and "this" keyword.
+        if (this._hoverElement.hasStyleClass("webkit-javascript-keyword")) {
+            if (this._hoverElement.textContent !== "this")
+                return;
+        } else if (!this._hoverElement.hasStyleClass("webkit-javascript-ident"))
+            return;
+
+        const toolTipDelay = this._popup ? 600 : 1000;
+        this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
+    },
+
+    _resetHoverTimer: function()
+    {
+        if (this._hoverTimer) {
+            clearTimeout(this._hoverTimer);
+            delete this._hoverTimer;
+        }
+    },
+
+    _hidePopup: function()
+    {
+        if (!this._popup)
+            return;
+
+        // Replace higlight element with its contents inplace.
+        var parentElement = this._popup.highlightElement.parentElement;
+        var child = this._popup.highlightElement.firstChild;
+        while (child) {
+            var nextSibling = child.nextSibling;
+            parentElement.insertBefore(child, this._popup.highlightElement);
+            child = nextSibling;
+        }
+        parentElement.removeChild(this._popup.highlightElement);
+
+        this._popup.hide();
+        delete this._popup;
+        InspectorBackend.releaseWrapperObjectGroup(0, this._popoverObjectGroup);
+    },
+
+    _mouseHover: function(element)
+    {
+        delete this._hoverTimer;
+
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        var lineRow = element.enclosingNodeOrSelfWithNodeName("tr");
+        if (!lineRow)
+            return;
+
+        // Collect tokens belonging to evaluated exression.
+        var tokens = [ element ];
+        var token = element.previousSibling;
+        while (token && (token.className === "webkit-javascript-ident" || token.className === "webkit-javascript-keyword" || token.textContent.trim() === ".")) {
+            tokens.push(token);
+            token = token.previousSibling;
+        }
+        tokens.reverse();
+
+        // Wrap them with highlight element.
+        var parentElement = element.parentElement;
+        var nextElement = element.nextSibling;
+        var container = document.createElement("span");
+        for (var i = 0; i < tokens.length; ++i)
+            container.appendChild(tokens[i]);
+        parentElement.insertBefore(container, nextElement);
+        this._showPopup(container);
+    },
+
+    _showPopup: function(element)
+    {
+        function killHidePopupTimer()
+        {
+            if (this._hidePopupTimer) {
+                clearTimeout(this._hidePopupTimer);
+                delete this._hidePopupTimer;
+
+                // We know that we reached the popup, but we might have moved over other elements.
+                // Discard pending command.
+                this._resetHoverTimer();
+            }
+        }
+
+        function showObjectPopup(result)
+        {
+            if (!WebInspector.panels.scripts.paused)
+                return;
+
+            var popupContentElement = null;
+            if (result.type !== "object" && result.type !== "node" && result.type !== "array") {
+                popupContentElement = document.createElement("span");
+                popupContentElement.className = "monospace";
+                popupContentElement.style.whiteSpace = "pre";
+                popupContentElement.textContent = result.description;
+                this._popup = new WebInspector.Popover(popupContentElement);
+                this._popup.show(element);
+            } else {
+                var popupContentElement = document.createElement("div");
+
+                var titleElement = document.createElement("div");
+                titleElement.className = "source-frame-popover-title monospace";
+                titleElement.textContent = result.description;
+                popupContentElement.appendChild(titleElement);
+
+                var section = new WebInspector.ObjectPropertiesSection(result, "", null, false);
+                section.expanded = true;
+                section.element.addStyleClass("source-frame-popover-tree");
+                section.headerElement.addStyleClass("hidden");
+                popupContentElement.appendChild(section.element);
+
+                this._popup = new WebInspector.Popover(popupContentElement);
+                const popupWidth = 300;
+                const popupHeight = 250;
+                this._popup.show(element, popupWidth, popupHeight);
+            }
+            this._popup.highlightElement = element;
+            this._popup.highlightElement.addStyleClass("source-frame-eval-expression");
+            popupContentElement.addEventListener("mousemove", killHidePopupTimer.bind(this), true);
+        }
+
+        function evaluateCallback(result, exception)
+        {
+            if (exception)
+                return;
+            if (!WebInspector.panels.scripts.paused)
+                return;
+            showObjectPopup.call(this, result);
+        }
+        WebInspector.panels.scripts.evaluateInSelectedCallFrame(element.textContent, false, this._popoverObjectGroup, evaluateCallback.bind(this));
+    },
+
+    _editBreakpointCondition: function(breakpoint)
+    {
+        this._showBreakpointConditionPopup(breakpoint.line);
+
+        function committed(element, newText)
+        {
+            breakpoint.condition = newText;
+            dismissed.call(this);
+        }
+
+        function dismissed()
+        {
+            if (this._conditionElement)
+                this._textViewer.removeDecoration(breakpoint.line - 1, this._conditionElement);
+            delete this._conditionEditorElement;
+            delete this._conditionElement;
+        }
+
+        var dismissedHandler = dismissed.bind(this);
+        this._conditionEditorElement.addEventListener("blur", dismissedHandler, false);
+
+        WebInspector.startEditing(this._conditionEditorElement, committed.bind(this), dismissedHandler);
+        this._conditionEditorElement.value = breakpoint.condition;
+        this._conditionEditorElement.select();
+    },
+
+    _showBreakpointConditionPopup: function(lineNumber)
+    {
+        this._conditionElement = this._createConditionElement(lineNumber);
+        this._textViewer.addDecoration(lineNumber - 1, this._conditionElement);
+    },
+
+    _createConditionElement: function(lineNumber)
+    {
+        var conditionElement = document.createElement("div");
+        conditionElement.className = "source-frame-breakpoint-condition";
+
+        var labelElement = document.createElement("label");
+        labelElement.className = "source-frame-breakpoint-message";
+        labelElement.htmlFor = "source-frame-breakpoint-condition";
+        labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:", lineNumber)));
+        conditionElement.appendChild(labelElement);
+
+        var editorElement = document.createElement("input");
+        editorElement.id = "source-frame-breakpoint-condition";
+        editorElement.className = "monospace";
+        editorElement.type = "text"
+        conditionElement.appendChild(editorElement);
+        this._conditionEditorElement = editorElement;
+
+        return conditionElement;
+    },
+
+    _keyDown: function(event)
+    {
+        var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
+        var handler = this._shortcuts[shortcut];
+        if (handler) {
+            handler(event);
+            event.preventDefault();
+        } else
+            WebInspector.documentKeyDown(event);
+    },
+
+    _evalSelectionInCallFrame: function(event)
+    {
+        if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)
+            return;
+
+        var selection = this.element.contentWindow.getSelection();
+        if (!selection.rangeCount)
+            return;
+
+        var expression = selection.getRangeAt(0).toString().trimWhitespace();
+        WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result, exception) {
+            WebInspector.showConsole();
+            var commandMessage = new WebInspector.ConsoleCommand(expression);
+            WebInspector.console.addMessage(commandMessage);
+            WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+        });
+    },
+
+    resize: function()
+    {
+        if (this._textViewer)
+            this._textViewer.resize();
+    }
+}
+
+
+WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
+
+/* DOMSyntaxHighlighter.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMSyntaxHighlighter = function(mimeType)
+{
+    this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
+}
+
+WebInspector.DOMSyntaxHighlighter.prototype = {
+    createSpan: function(content, className)
+    {
+        var span = document.createElement("span");
+        span.className = "webkit-" + className;
+        span.appendChild(document.createTextNode(content));
+        return span;
+    },
+
+    syntaxHighlightNode: function(node)
+    {
+        this._tokenizer.condition = this._tokenizer.initialCondition;
+        var lines = node.textContent.split("\n");
+        node.removeChildren();
+
+        for (var i = lines[0].length ? 0 : 1; i < lines.length; ++i) {
+            var line = lines[i];
+            var plainTextStart = 0;
+            this._tokenizer.line = line;
+            var column = 0;
+            do {
+                var newColumn = this._tokenizer.nextToken(column);
+                var tokenType = this._tokenizer.tokenType;
+                if (tokenType) {
+                    if (column > plainTextStart) {
+                        var plainText = line.substring(plainTextStart, column);
+                        node.appendChild(document.createTextNode(plainText));
+                    }
+                    var token = line.substring(column, newColumn);
+                    node.appendChild(this.createSpan(token, tokenType));
+                    plainTextStart = newColumn;
+                }
+                column = newColumn;
+           } while (column < line.length)
+
+           if (plainTextStart < line.length) {
+               var plainText = line.substring(plainTextStart, line.length);
+               node.appendChild(document.createTextNode(plainText));
+           }
+           if (i < lines.length - 1)
+               node.appendChild(document.createElement("br"));
+        }
+    }
+}
+
+/* TextEditorModel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn)
+{
+    this.startLine = startLine;
+    this.startColumn = startColumn;
+    this.endLine = endLine;
+    this.endColumn = endColumn;
+}
+
+WebInspector.TextRange.prototype = {
+    isEmpty: function()
+    {
+        return this.startLine === this.endLine && this.startColumn === this.endColumn;
+    },
+
+    get linesCount()
+    {
+        return this.endLine - this.startLine;
+    },
+
+    clone: function()
+    {
+        return new WebInspector.TextRange(this.startLine, this.startColumn, this.endLine, this.endColumn); 
+    }
+}
+
+WebInspector.TextEditorModel = function()
+{
+    this._lines = [""];
+    this._attributes = [];
+    this._undoStack = [];
+    this._noPunctuationRegex = /[^ !%&()*+,-.:;<=>?\[\]\^{|}~]+/;
+}
+
+WebInspector.TextEditorModel.prototype = {
+    set changeListener(changeListener)
+    {
+        this._changeListener = changeListener;
+    },
+
+    get linesCount()
+    {
+        return this._lines.length;
+    },
+
+    line: function(lineNumber)
+    {
+        if (lineNumber >= this._lines.length)
+            throw "Out of bounds:" + lineNumber;
+        return this._lines[lineNumber];
+    },
+
+    lineLength: function(lineNumber)
+    {
+        return this._lines[lineNumber].length;
+    },
+
+    setText: function(range, text)
+    {
+        if (!range)
+            range = new WebInspector.TextRange(0, 0, this._lines.length - 1, this._lines[this._lines.length - 1].length);
+        var command = this._pushUndoableCommand(range, text);
+        var newRange = this._innerSetText(range, text);
+        command.range = newRange.clone();
+
+        if (this._changeListener)
+            this._changeListener(range, newRange, command.text, text);
+        return newRange;
+    },
+
+    set replaceTabsWithSpaces(replaceTabsWithSpaces)
+    {
+        this._replaceTabsWithSpaces = replaceTabsWithSpaces;
+    },
+
+    _innerSetText: function(range, text)
+    {
+        this._eraseRange(range);
+        if (text === "")
+            return new WebInspector.TextRange(range.startLine, range.startColumn, range.startLine, range.startColumn);
+
+        var newLines = text.split("\n");
+        this._replaceTabsIfNeeded(newLines);
+
+        var prefix = this._lines[range.startLine].substring(0, range.startColumn);
+        var prefixArguments = this._arguments
+        var suffix = this._lines[range.startLine].substring(range.startColumn);
+
+        var postCaret = prefix.length;
+        // Insert text.
+        if (newLines.length === 1) {
+            this._setLine(range.startLine, prefix + newLines[0] + suffix);
+            postCaret += newLines[0].length;
+        } else {
+            this._setLine(range.startLine, prefix + newLines[0]);
+            for (var i = 1; i < newLines.length; ++i)
+                this._insertLine(range.startLine + i, newLines[i]);
+            this._setLine(range.startLine + newLines.length - 1, newLines[newLines.length - 1] + suffix);
+            postCaret = newLines[newLines.length - 1].length;
+        }
+        return new WebInspector.TextRange(range.startLine, range.startColumn,
+                                          range.startLine + newLines.length - 1, postCaret);
+    },
+
+    _replaceTabsIfNeeded: function(lines)
+    {
+        if (!this._replaceTabsWithSpaces)
+            return;
+        var spaces = [ "    ", "   ", "  ", " "];
+        for (var i = 0; i < lines.length; ++i) {
+            var line = lines[i];
+            var index = line.indexOf("\t");
+            while (index !== -1) {
+                line = line.substring(0, index) + spaces[index % 4] + line.substring(index + 1);
+                index = line.indexOf("\t", index + 1);
+            }
+            lines[i] = line;
+        }
+    },
+
+    _eraseRange: function(range)
+    {
+        if (range.isEmpty())
+            return;
+
+        var prefix = this._lines[range.startLine].substring(0, range.startColumn);
+        var suffix = this._lines[range.endLine].substring(range.endColumn);
+
+        if (range.endLine > range.startLine)
+            this._removeLines(range.startLine + 1, range.endLine - range.startLine);
+        this._setLine(range.startLine, prefix + suffix);
+    },
+
+    _setLine: function(lineNumber, text)
+    {
+        this._lines[lineNumber] = text;
+    },
+
+    _removeLines: function(fromLine, count)
+    {
+        this._lines.splice(fromLine, count);
+        this._attributes.splice(fromLine, count);
+    },
+
+    _insertLine: function(lineNumber, text)
+    {
+        this._lines.splice(lineNumber, 0, text);
+        this._attributes.splice(lineNumber, 0, {});
+    },
+
+    wordRange: function(lineNumber, column)
+    {
+        return new WebInspector.TextRange(lineNumber, this.wordStart(lineNumber, column, true), lineNumber, this.wordEnd(lineNumber, column, true));
+    },
+
+    wordStart: function(lineNumber, column, gapless)
+    {
+        var line = this._lines[lineNumber];
+        var prefix = line.substring(0, column).split("").reverse().join("");
+        var prefixMatch = this._noPunctuationRegex.exec(prefix);
+        return prefixMatch && (!gapless || prefixMatch.index === 0) ? column - prefixMatch.index - prefixMatch[0].length : column;
+    },
+
+    wordEnd: function(lineNumber, column, gapless)
+    {
+        var line = this._lines[lineNumber];
+        var suffix = line.substring(column);
+        var suffixMatch = this._noPunctuationRegex.exec(suffix);
+        return suffixMatch && (!gapless || suffixMatch.index === 0) ? column + suffixMatch.index + suffixMatch[0].length : column;
+    },
+
+    copyRange: function(range)
+    {
+        var clip = [];
+        if (range.startLine === range.endLine) {
+            clip.push(this._lines[range.startLine].substring(range.startColumn, range.endColumn));
+            return clip.join("\n");
+        }
+        clip.push(this._lines[range.startLine].substring(range.startColumn));
+        for (var i = range.startLine + 1; i < range.endLine; ++i)
+            clip.push(this._lines[i]);
+        clip.push(this._lines[range.endLine].substring(0, range.endColumn));
+        return clip.join("\n");
+    },
+
+    setAttribute: function(line, name, value)
+    {
+        var attrs = this._attributes[line];
+        if (!attrs) {
+            attrs = {};
+            this._attributes[line] = attrs;
+        }
+        attrs[name] = value;
+    },
+
+    getAttribute: function(line, name)
+    {
+        var attrs = this._attributes[line];
+        return attrs ? attrs[name] : null;
+    },
+
+    removeAttribute: function(line, name)
+    {
+        var attrs = this._attributes[line];
+        if (attrs)
+            delete attrs[name];
+    },
+
+    _pushUndoableCommand: function(range, text)
+    {
+        var command = {
+            text: this.copyRange(range),
+            startLine: range.startLine,
+            startColumn: range.startColumn,
+            endLine: range.startLine,
+            endColumn: range.startColumn
+        };
+        if (this._inUndo)
+            this._redoStack.push(command);
+        else {
+            if (!this._inRedo)
+                this._redoStack = [];
+            this._undoStack.push(command);
+        }
+        return command;
+    },
+
+    undo: function()
+    {
+        this._markRedoableState();
+
+        this._inUndo = true;
+        var range = this._doUndo(this._undoStack);
+        delete this._inUndo;
+
+        return range;
+    },
+
+    redo: function()
+    {
+        this.markUndoableState();
+
+        this._inRedo = true;
+        var range = this._doUndo(this._redoStack);
+        delete this._inRedo;
+
+        return range;
+    },
+
+    _doUndo: function(stack)
+    {
+        var range = null;
+        for (var i = stack.length - 1; i >= 0; --i) {
+            var command = stack[i];
+            stack.length = i;
+
+            range = this.setText(command.range, command.text);
+            if (i > 0 && stack[i - 1].explicit)
+                return range;
+        }
+        return range;
+    },
+
+    markUndoableState: function()
+    {
+        if (this._undoStack.length)
+            this._undoStack[this._undoStack.length - 1].explicit = true;
+    },
+
+    _markRedoableState: function()
+    {
+        if (this._redoStack.length)
+            this._redoStack[this._redoStack.length - 1].explicit = true;
+    },
+
+    resetUndoStack: function()
+    {
+        this._undoStack = [];
+    }
+}
+
+/* TextEditorHighlighter.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextEditorHighlighter = function(textModel, damageCallback)
+{
+    this._textModel = textModel;
+    this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/html");
+    this._damageCallback = damageCallback;
+    this._lastHighlightedLine = 0;
+    this._lastHighlightedColumn = 0;
+}
+
+WebInspector.TextEditorHighlighter.prototype = {
+    set mimeType(mimeType)
+    {
+        var tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
+        if (tokenizer) {
+            this._tokenizer = tokenizer;
+            this._tokenizerCondition = this._tokenizer.initialCondition;
+        }
+    },
+
+    highlight: function(endLine)
+    {
+        // First check if we have work to do.
+        if (endLine <= this._lastHighlightedLine)
+            return;
+
+        this._requestedEndLine = endLine;
+
+        if (this._highlightTimer) {
+            // There is a timer scheduled, it will catch the new job based on the new endLine set.
+            return;
+        }
+
+        // Do small highlight synchronously. This will provide instant highlight on PageUp / PageDown, gentle scrolling.
+        this._highlightInChunks(endLine);
+
+        // Schedule tail highlight if necessary.
+        if (this._lastHighlightedLine < endLine)
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, endLine), 100);
+    },
+
+    _highlightInChunks: function(endLine)
+    {
+        delete this._highlightTimer;
+
+        // First we always check if we have work to do. Could be that user scrolled back and we can quit.
+        if (this._requestedEndLine <= this._lastHighlightedLine)
+            return;
+
+        if (this._requestedEndLine !== endLine) {
+            // User keeps updating the job in between of our timer ticks. Just reschedule self, don't eat CPU (they must be scrolling).
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 100);
+            return;
+        }
+
+        this._highlightLines(this._requestedEndLine);
+
+        // Schedule tail highlight if necessary.
+        if (this._lastHighlightedLine < this._requestedEndLine)
+            this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 10);
+    },
+
+    _highlightLines: function(endLine)
+    {
+        // Tokenizer is stateless and reused accross viewers, restore its condition before highlight and save it after.
+        this._tokenizer.condition = this._tokenizerCondition;
+        var tokensCount = 0;
+        for (var lineNumber = this._lastHighlightedLine; lineNumber < endLine; ++lineNumber) {
+            var line = this._textModel.line(lineNumber);
+            this._tokenizer.line = line;
+            var attributes = this._textModel.getAttribute(lineNumber, "highlight") || {};
+
+            // Highlight line.
+            do {
+                var newColumn = this._tokenizer.nextToken(this._lastHighlightedColumn);
+                var tokenType = this._tokenizer.tokenType;
+                if (tokenType)
+                    attributes[this._lastHighlightedColumn] = { length: newColumn - this._lastHighlightedColumn, tokenType: tokenType, subTokenizer: this._tokenizer.subTokenizer };
+                this._lastHighlightedColumn = newColumn;
+                if (++tokensCount > 1000)
+                    break;
+            } while (this._lastHighlightedColumn < line.length)
+
+            this._textModel.setAttribute(lineNumber, "highlight", attributes);
+            if (this._lastHighlightedColumn < line.length) {
+                // Too much work for single chunk - exit.
+                break;
+            } else
+                this._lastHighlightedColumn = 0;
+        }
+
+        this._damageCallback(this._lastHighlightedLine, lineNumber);
+        this._tokenizerCondition = this._tokenizer.condition;
+        this._lastHighlightedLine = lineNumber;
+    }
+}
+
+/* TextViewer.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TextViewer = function(textModel, platform, url)
+{
+    this._textModel = textModel;
+    this._textModel.changeListener = this._buildChunks.bind(this);
+    this._highlighter = new WebInspector.TextEditorHighlighter(this._textModel, this._highlightDataReady.bind(this));
+
+    this.element = document.createElement("div");
+    this.element.className = "text-editor monospace";
+    this.element.tabIndex = 0;
+
+    this.element.addEventListener("scroll", this._scroll.bind(this), false);
+    this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
+
+    this._url = url;
+
+    this._linesContainerElement = document.createElement("table");
+    this._linesContainerElement.className = "text-editor-lines";
+    this._linesContainerElement.setAttribute("cellspacing", 0);
+    this._linesContainerElement.setAttribute("cellpadding", 0);
+    this.element.appendChild(this._linesContainerElement);
+
+    this._defaultChunkSize = 50;
+    this._paintCoalescingLevel = 0;
+
+    this.freeCachedElements();
+    this._buildChunks();
+}
+
+WebInspector.TextViewer.prototype = {
+    set mimeType(mimeType)
+    {
+        this._highlighter.mimeType = mimeType;
+    },
+
+    get textModel()
+    {
+        return this._textModel;
+    },
+
+    revealLine: function(lineNumber)
+    {
+        if (lineNumber >= this._textModel.linesCount)
+            return;
+
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.element.scrollIntoViewIfNeeded();
+    },
+
+    addDecoration: function(lineNumber, decoration)
+    {
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.addDecoration(decoration);
+    },
+
+    removeDecoration: function(lineNumber, decoration)
+    {
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.removeDecoration(decoration);
+    },
+
+    markAndRevealRange: function(range)
+    {
+        if (this._rangeToMark) {
+            var markedLine = this._rangeToMark.startLine;
+            this._rangeToMark = null;
+            this._paintLines(markedLine, markedLine + 1);
+        }
+
+        if (range) {
+            this._rangeToMark = range;
+            this.revealLine(range.startLine);
+            this._paintLines(range.startLine, range.startLine + 1);
+            if (this._markedRangeElement)
+                this._markedRangeElement.scrollIntoViewIfNeeded();
+        }
+        delete this._markedRangeElement;
+    },
+
+    highlightLine: function(lineNumber)
+    {
+        if (typeof this._highlightedLine === "number") {
+            var chunk = this._makeLineAChunk(this._highlightedLine);
+            chunk.removeDecoration("webkit-highlighted-line");
+        }
+        this._highlightedLine = lineNumber;
+        this.revealLine(lineNumber);
+        var chunk = this._makeLineAChunk(lineNumber);
+        chunk.addDecoration("webkit-highlighted-line");
+    },
+
+    freeCachedElements: function()
+    {
+        this._cachedSpans = [];
+        this._cachedTextNodes = [];
+        this._cachedRows = [];
+    },
+
+    _buildChunks: function()
+    {
+        this._linesContainerElement.removeChildren();
+
+        this._textChunks = [];
+        for (var i = 0; i < this._textModel.linesCount; i += this._defaultChunkSize) {
+            var chunk = new WebInspector.TextChunk(this, i, i + this._defaultChunkSize);
+            this._textChunks.push(chunk);
+            this._linesContainerElement.appendChild(chunk.element);
+        }
+        this._indexChunks();
+        this._repaintAll();
+    },
+
+    _makeLineAChunk: function(lineNumber)
+    {
+        if (!this._textChunks)
+            this._buildChunks();
+
+        var chunkNumber = this._chunkNumberForLine(lineNumber);
+        var oldChunk = this._textChunks[chunkNumber];
+        if (oldChunk.linesCount === 1)
+            return oldChunk;
+
+        var wasExpanded = oldChunk.expanded;
+        oldChunk.expanded = false;
+
+        var insertIndex = oldChunk.chunkNumber + 1;
+
+        // Prefix chunk.
+        if (lineNumber > oldChunk.startLine) {
+            var prefixChunk = new WebInspector.TextChunk(this, oldChunk.startLine, lineNumber);
+            this._textChunks.splice(insertIndex++, 0, prefixChunk);
+            this._linesContainerElement.insertBefore(prefixChunk.element, oldChunk.element);
+        }
+
+        // Line chunk.
+        var lineChunk = new WebInspector.TextChunk(this, lineNumber, lineNumber + 1);
+        this._textChunks.splice(insertIndex++, 0, lineChunk);
+        this._linesContainerElement.insertBefore(lineChunk.element, oldChunk.element);
+
+        // Suffix chunk.
+        if (oldChunk.startLine + oldChunk.linesCount > lineNumber + 1) {
+            var suffixChunk = new WebInspector.TextChunk(this, lineNumber + 1, oldChunk.startLine + oldChunk.linesCount);
+            this._textChunks.splice(insertIndex, 0, suffixChunk);
+            this._linesContainerElement.insertBefore(suffixChunk.element, oldChunk.element);
+        }
+
+        // Remove enclosing chunk.
+        this._textChunks.splice(oldChunk.chunkNumber, 1);
+        this._linesContainerElement.removeChild(oldChunk.element);
+        this._indexChunks();
+
+        if (wasExpanded) {
+            if (prefixChunk)
+                prefixChunk.expanded = true;
+            lineChunk.expanded = true;
+            if (suffixChunk)
+                suffixChunk.expanded = true;
+        }
+
+        return lineChunk;
+    },
+
+    _indexChunks: function()
+    {
+        for (var i = 0; i < this._textChunks.length; ++i)
+            this._textChunks[i].chunkNumber = i;
+    },
+
+    _scroll: function()
+    {
+        var scrollTop = this.element.scrollTop;
+        setTimeout(function() {
+            if (scrollTop === this.element.scrollTop)
+                this._repaintAll();
+        }.bind(this), 50);
+    },
+    
+    _handleKeyDown: function()
+    {
+        if (event.metaKey || event.shiftKey || event.ctrlKey || event.altKey)
+            return;
+        
+        var scrollValue = 0;
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Up)
+            scrollValue = -1;
+        else if (event.keyCode == WebInspector.KeyboardShortcut.KeyCodes.Down)
+            scrollValue = 1;
+        
+        if (scrollValue) {
+            event.preventDefault();
+            event.stopPropagation();
+            this.element.scrollByLines(scrollValue);
+            return;
+        }
+        
+        scrollValue = 0;
+        if (event.keyCode === WebInspector.KeyboardShortcut.KeyCodes.Left)
+            scrollValue = -40;
+        else if (event.keyCode == WebInspector.KeyboardShortcut.KeyCodes.Right)
+            scrollValue = 40;
+        
+        if (scrollValue) {
+            event.preventDefault();
+            event.stopPropagation();
+            this.element.scrollLeft += scrollValue;
+        }
+    },
+
+    beginUpdates: function(enabled)
+    {
+        this._paintCoalescingLevel++;
+    },
+
+    endUpdates: function(enabled)
+    {
+        this._paintCoalescingLevel--;
+        if (!this._paintCoalescingLevel)
+            this._repaintAll();
+    },
+
+    _chunkForOffset: function(offset)
+    {
+        var currentOffset = 0;
+        var row = this._linesContainerElement.firstChild;
+        while (row) {
+            var rowHeight = row.offsetHeight;
+            if (offset >= currentOffset && offset < currentOffset + rowHeight)
+                return row.chunkNumber;
+            row = row.nextSibling;
+            currentOffset += rowHeight;
+        }
+        return this._textChunks.length - 1;
+    },
+
+    _chunkNumberForLine: function(lineNumber)
+    {
+        for (var i = 0; i < this._textChunks.length; ++i) {
+            var line = this._textChunks[i].startLine;
+            if (lineNumber >= this._textChunks[i].startLine && lineNumber < this._textChunks[i].startLine + this._textChunks[i].linesCount)
+                return i;
+        }
+        return this._textChunks.length - 1;
+    },
+
+    _chunkForLine: function(lineNumber)
+    {
+        return this._textChunks[this._chunkNumberForLine(lineNumber)];
+    },
+
+    _chunkStartLine: function(chunkNumber)
+    {
+        var lineNumber = 0;
+        for (var i = 0; i < chunkNumber && i < this._textChunks.length; ++i)
+            lineNumber += this._textChunks[i].linesCount;
+        return lineNumber;
+    },
+
+    _repaintAll: function()
+    {
+        if (this._paintCoalescingLevel)
+            return;
+
+        if (!this._textChunks)
+            this._buildChunks();
+
+        var visibleFrom = this.element.scrollTop;
+        var visibleTo = this.element.scrollTop + this.element.clientHeight;
+
+        var offset = 0;
+        var firstVisibleLine = -1;
+        var lastVisibleLine = 0;
+        var toExpand = [];
+        var toCollapse = [];
+        for (var i = 0; i < this._textChunks.length; ++i) {
+            var chunk = this._textChunks[i];
+            var chunkHeight = chunk.height;
+            if (offset + chunkHeight > visibleFrom && offset < visibleTo) {
+                toExpand.push(chunk);
+                if (firstVisibleLine === -1)
+                    firstVisibleLine = chunk.startLine;
+                lastVisibleLine = chunk.startLine + chunk.linesCount;
+            } else {
+                toCollapse.push(chunk);
+                if (offset >= visibleTo)
+                    break;
+            }
+            offset += chunkHeight;
+        }
+
+        for (var j = i; j < this._textChunks.length; ++j)
+            toCollapse.push(this._textChunks[i]);
+
+        var selection = this._getSelection();
+
+        this._muteHighlightListener = true;
+        this._highlighter.highlight(lastVisibleLine);
+        delete this._muteHighlightListener;
+
+        for (var i = 0; i < toCollapse.length; ++i)
+            toCollapse[i].expanded = false;
+        for (var i = 0; i < toExpand.length; ++i)
+            toExpand[i].expanded = true;
+
+        this._restoreSelection(selection);
+    },
+
+    _highlightDataReady: function(fromLine, toLine)
+    {
+        if (this._muteHighlightListener)
+            return;
+
+        var selection;
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (!lineRow || lineRow.highlighted)
+                continue;
+            if (!selection)
+                selection = this._getSelection();
+            this._paintLine(lineRow, i);
+        }
+        this._restoreSelection(selection);
+    },
+
+    _paintLines: function(fromLine, toLine)
+    {
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (lineRow)
+                this._paintLine(lineRow, i);
+        }
+    },
+
+    _paintLine: function(lineRow, lineNumber)
+    {
+        var element = lineRow.lastChild;
+        var highlight = this._textModel.getAttribute(lineNumber, "highlight");
+        if (!highlight) {
+            if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
+                this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
+            return;
+        }
+
+        element.removeChildren();
+        var line = this._textModel.line(lineNumber);
+
+        var plainTextStart = -1;
+        for (var j = 0; j < line.length;) {
+            if (j > 1000) {
+                // This line is too long - do not waste cycles on minified js highlighting.
+                if (plainTextStart === -1)
+                    plainTextStart = j;
+                break;
+            }
+            var attribute = highlight[j];
+            if (!attribute || !attribute.tokenType) {
+                if (plainTextStart === -1)
+                    plainTextStart = j;
+                j++;
+            } else {
+                if (plainTextStart !== -1) {
+                    this._appendTextNode(element, line.substring(plainTextStart, j));
+                    plainTextStart = -1;
+                }
+                this._appendSpan(element, line.substring(j, j + attribute.length), attribute.tokenType);
+                j += attribute.length;
+            }
+        }
+        if (plainTextStart !== -1)
+            this._appendTextNode(element, line.substring(plainTextStart, line.length));
+        if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)
+            this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);
+        if (lineRow.decorationsElement)
+            element.appendChild(lineRow.decorationsElement);
+    },
+
+    _releaseLinesHighlight: function(fromLine, toLine)
+    {
+        for (var i = fromLine; i < toLine; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            if (!lineRow)
+                continue;
+            var element = lineRow.lastChild;
+            if ("spans" in element) {
+                var spans = element.spans;
+                for (var j = 0; j < spans.length; ++j)
+                    this._cachedSpans.push(spans[j]);
+                delete element.spans;
+            }
+            if ("textNodes" in element) {
+                var textNodes = element.textNodes;
+                for (var j = 0; j < textNodes.length; ++j)
+                    this._cachedTextNodes.push(textNodes[j]);
+                delete element.textNodes;
+            }
+        }
+    },
+
+    _getSelection: function()
+    {
+        var selection = window.getSelection();
+        if (selection.isCollapsed)
+            return null;
+        var selectionRange = selection.getRangeAt(0);
+        var start = this._selectionToPosition(selectionRange.startContainer, selectionRange.startOffset);
+        var end = this._selectionToPosition(selectionRange.endContainer, selectionRange.endOffset);
+        return new WebInspector.TextRange(start.line, start.column, end.line, end.column);
+    },
+
+    _restoreSelection: function(range)
+    {
+        if (!range)
+            return;
+        var startRow = this._textModel.getAttribute(range.startLine, "line-row");
+        if (startRow)
+            var start = startRow.lastChild.rangeBoundaryForOffset(range.startColumn);
+        else {
+            var offset = range.startColumn;
+            var chunkNumber = this._chunkNumberForLine(range.startLine);
+            for (var i = this._chunkStartLine(chunkNumber); i < range.startLine; ++i)
+                offset += this._textModel.line(i).length + 1; // \n
+            var lineCell = this._textChunks[chunkNumber].element.lastChild;
+            if (lineCell.firstChild)
+                var start = { container: lineCell.firstChild, offset: offset };
+            else
+                var start = { container: lineCell, offset: 0 };
+        }
+
+        var endRow = this._textModel.getAttribute(range.endLine, "line-row");
+        if (endRow)
+            var end = endRow.lastChild.rangeBoundaryForOffset(range.endColumn);
+        else {
+            var offset = range.endColumn;
+            var chunkNumber = this._chunkNumberForLine(range.endLine);
+            for (var i = this._chunkStartLine(chunkNumber); i < range.endLine; ++i)
+                offset += this._textModel.line(i).length + 1; // \n
+            var lineCell = this._textChunks[chunkNumber].element.lastChild;
+            if (lineCell.firstChild)
+                var end = { container: lineCell.firstChild, offset: offset };
+            else
+                var end = { container: lineCell, offset: 0 };
+        }
+
+        var selectionRange = document.createRange();
+        selectionRange.setStart(start.container, start.offset);
+        selectionRange.setEnd(end.container, end.offset);
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(selectionRange);
+    },
+
+    _selectionToPosition: function(container, offset)
+    {
+        if (container === this.element && offset === 0)
+            return { line: 0, column: 0 };
+        if (container === this.element && offset === 1)
+            return { line: this._textModel.linesCount - 1, column: this._textModel.lineLength(this._textModel.linesCount - 1) };
+
+        var lineRow = container.enclosingNodeOrSelfWithNodeName("tr");
+        var lineNumber = lineRow.lineNumber;
+        if (container.nodeName === "TD" && offset === 0)
+            return { line: lineNumber, column: 0 };
+        if (container.nodeName === "TD" && offset === 1)
+            return { line: lineNumber, column: this._textModel.lineLength(lineNumber) };
+
+        var column = 0;
+        if (lineRow.chunk) {
+            // This is chunk.
+            var text = lineRow.lastChild.textContent;
+            for (var i = 0; i < offset; ++i) {
+                if (text.charAt(i) === "\n") {
+                    lineNumber++;
+                    column = 0;
+                } else
+                    column++; 
+            }
+            return { line: lineNumber, column: column };
+        }
+
+        // This is individul line.
+        var column = 0;
+        var node = lineRow.lastChild.traverseNextTextNode(lineRow.lastChild);
+        while (node && node !== container) {
+            column += node.textContent.length;
+            node = node.traverseNextTextNode(lineRow.lastChild);
+        }
+        column += offset;
+        return { line: lineRow.lineNumber, column: column };
+    },
+
+    _appendSpan: function(element, content, className)
+    {
+        if (className === "html-resource-link" || className === "html-external-link") {
+            element.appendChild(this._createLink(content, className === "html-external-link"));
+            return;
+        }
+
+        var span = this._cachedSpans.pop() || document.createElement("span");
+        span.className = "webkit-" + className;
+        span.textContent = content;
+        element.appendChild(span);
+        if (!("spans" in element))
+            element.spans = [];
+        element.spans.push(span);
+    },
+
+    _appendTextNode: function(element, text)
+    {
+        var textNode = this._cachedTextNodes.pop();
+        if (textNode) {
+            textNode.nodeValue = text;
+        } else
+            textNode = document.createTextNode(text);
+        element.appendChild(textNode);
+        if (!("textNodes" in element))
+            element.textNodes = [];
+        element.textNodes.push(textNode);
+    },
+
+    _createLink: function(content, isExternal)
+    {
+        var quote = content.charAt(0);
+        if (content.length > 1 && (quote === "\"" ||   quote === "'"))
+            content = content.substring(1, content.length - 1);
+        else
+            quote = null;
+
+        var a = WebInspector.linkifyURLAsNode(this._rewriteHref(content), content, null, isExternal);
+        var span = document.createElement("span");
+        span.className = "webkit-html-attribute-value";
+        if (quote)
+            span.appendChild(document.createTextNode(quote));
+        span.appendChild(a);
+        if (quote)
+            span.appendChild(document.createTextNode(quote));
+        return span;
+    },
+
+    _rewriteHref: function(hrefValue, isExternal)
+    {
+        if (!this._url || !hrefValue || hrefValue.indexOf("://") > 0)
+            return hrefValue;
+        return WebInspector.completeURL(this._url, hrefValue);
+    },
+
+    resize: function()
+    {
+        this._repaintAll();
+    }
+}
+
+var cachedSpans = [];
+
+WebInspector.TextChunk = function(textViewer, startLine, endLine)
+{
+    this._textViewer = textViewer;
+    this.element = document.createElement("tr");
+    this._textModel = textViewer._textModel;
+    this.element.chunk = this;
+    this.element.lineNumber = startLine;
+
+    this.startLine = startLine;
+    endLine = Math.min(this._textModel.linesCount, endLine);
+    this.linesCount = endLine - startLine;
+
+    this._lineNumberElement = document.createElement("td");
+    this._lineNumberElement.className = "webkit-line-number";
+    this.element.appendChild(this._lineNumberElement);
+
+    this._lineContentElement = document.createElement("td");
+    this._lineContentElement.className = "webkit-line-content";
+    this.element.appendChild(this._lineContentElement);
+
+    this._expanded = false;
+
+    var lineNumbers = [];
+    var lines = [];
+    for (var i = startLine; i < endLine; ++i) {
+        lineNumbers.push(i + 1);
+        lines.push(this._textModel.line(i));
+    }
+    if (this.linesCount === 1) {
+        // Single line chunks are typically created for decorations. Host line number in
+        // the sub-element in order to allow flexible border / margin management.
+        var innerSpan = document.createElement("span");
+        innerSpan.className = "webkit-line-number-inner";
+        innerSpan.textContent = startLine + 1;
+        var outerSpan = document.createElement("div");
+        outerSpan.className = "webkit-line-number-outer";
+        outerSpan.appendChild(innerSpan);
+        this._lineNumberElement.appendChild(outerSpan);
+    } else
+        this._lineNumberElement.textContent = lineNumbers.join("\n");
+    this._lineContentElement.textContent = lines.join("\n");
+}
+
+WebInspector.TextChunk.prototype = {
+    addDecoration: function(decoration)
+    {
+        if (typeof decoration === "string") {
+            this.element.addStyleClass(decoration);
+            return;
+        }
+        if (!this.element.decorationsElement) {
+            this.element.decorationsElement = document.createElement("div");
+            this._lineContentElement.appendChild(this.element.decorationsElement);
+        }
+        this.element.decorationsElement.appendChild(decoration);
+    },
+
+    removeDecoration: function(decoration)
+    {
+        if (typeof decoration === "string") {
+            this.element.removeStyleClass(decoration);
+            return;
+        }
+        if (!this.element.decorationsElement)
+            return;
+        this.element.decorationsElement.removeChild(decoration);
+    },
+
+    get expanded()
+    {
+        return this._expanded;
+    },
+
+    set expanded(expanded)
+    {
+        if (this._expanded === expanded)
+            return;
+
+        this._expanded = expanded;
+
+        if (this.linesCount === 1) {
+            this._textModel.setAttribute(this.startLine, "line-row", this.element);
+            if (expanded)
+                this._textViewer._paintLines(this.startLine, this.startLine + 1);
+            return;
+        }
+
+        if (expanded) {
+            var parentElement = this.element.parentElement;
+            for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+                var lineRow = this._createRow(i);
+                this._textModel.setAttribute(i, "line-row", lineRow);
+                parentElement.insertBefore(lineRow, this.element);
+            }
+            parentElement.removeChild(this.element);
+
+            this._textViewer._paintLines(this.startLine, this.startLine + this.linesCount);
+        } else {
+            var firstLine = this._textModel.getAttribute(this.startLine, "line-row");
+            var parentElement = firstLine.parentElement;
+            this._textViewer._releaseLinesHighlight(this.startLine, this.startLine + this.linesCount);
+
+            parentElement.insertBefore(this.element, firstLine);
+            for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+                var lineRow = this._textModel.getAttribute(i, "line-row");
+                this._textModel.removeAttribute(i, "line-row");
+                this._textViewer._cachedRows.push(lineRow);
+                parentElement.removeChild(lineRow);
+            }
+        }
+    },
+
+    get height()
+    {
+        if (!this._expanded)
+            return this.element.offsetHeight;
+        var result = 0;
+        for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
+            var lineRow = this._textModel.getAttribute(i, "line-row");
+            result += lineRow.offsetHeight;
+        }
+        return result;
+    },
+
+    _createRow: function(lineNumber)
+    {
+        var cachedRows = this._textViewer._cachedRows;
+        if (cachedRows.length) {
+            var lineRow = cachedRows[cachedRows.length - 1];
+            cachedRows.length--;
+            var lineNumberElement = lineRow.firstChild;
+            var lineContentElement = lineRow.lastChild;
+        } else {
+            var lineRow = document.createElement("tr");
+
+            var lineNumberElement = document.createElement("td");
+            lineNumberElement.className = "webkit-line-number";
+            lineRow.appendChild(lineNumberElement);
+
+            var lineContentElement = document.createElement("td");
+            lineContentElement.className = "webkit-line-content";
+            lineRow.appendChild(lineContentElement);        
+        }
+        lineRow.lineNumber = lineNumber;
+        lineNumberElement.textContent = lineNumber + 1;
+        lineContentElement.textContent = this._textModel.line(lineNumber);
+        return lineRow;
+    }
+}
+
+/* SourceTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Tue Jan 26 01:16:33 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceTokenizer = function()
+{
+}
+
+WebInspector.SourceTokenizer.prototype = {
+    set line(line) {
+        this._line = line;
+    },
+
+    set condition(condition)
+    {
+        this._condition = condition;
+    },
+
+    get condition()
+    {
+        return this._condition;
+    },
+
+    get subTokenizer()
+    {
+        return this._condition.subTokenizer;
+    },
+
+    getLexCondition: function()
+    {
+        return this.condition.lexCondition;
+    },
+
+    setLexCondition: function(lexCondition)
+    {
+        this.condition.lexCondition = lexCondition;
+    },
+
+    _charAt: function(cursor)
+    {
+        return cursor < this._line.length ? this._line.charAt(cursor) : "\n";
+    }
+}
+
+
+WebInspector.SourceTokenizer.Registry = function() {
+    this._tokenizers = {};
+    this._tokenizerConstructors = {
+        "text/css": "SourceCSSTokenizer",
+        "text/html": "SourceHTMLTokenizer",
+        "text/javascript": "SourceJavaScriptTokenizer",
+        "application/javascript": "SourceJavaScriptTokenizer",
+        "application/x-javascript": "SourceJavaScriptTokenizer"
+    };
+}
+
+WebInspector.SourceTokenizer.Registry.getInstance = function()
+{
+    if (!WebInspector.SourceTokenizer.Registry._instance)
+        WebInspector.SourceTokenizer.Registry._instance = new WebInspector.SourceTokenizer.Registry();
+    return WebInspector.SourceTokenizer.Registry._instance;
+}
+
+WebInspector.SourceTokenizer.Registry.prototype = {
+    getTokenizer: function(mimeType)
+    {
+        if (!this._tokenizerConstructors[mimeType])
+            return null;
+        var tokenizerClass = this._tokenizerConstructors[mimeType];
+        var tokenizer = this._tokenizers[tokenizerClass];
+        if (!tokenizer) {
+            tokenizer = new WebInspector[tokenizerClass]();
+            this._tokenizers[mimeType] = tokenizer;
+        }
+        return tokenizer;
+    }
+}
+
+/* SourceCSSTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceCSSTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceCSSTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    this._propertyKeywords = [
+        "background", "background-attachment", "background-clip", "background-color", "background-image",
+        "background-origin", "background-position", "background-position-x", "background-position-y",
+        "background-repeat", "background-repeat-x", "background-repeat-y", "background-size", "border",
+        "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius",
+        "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-left",
+        "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right",
+        "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style",
+        "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style",
+        "border-top-width", "border-width", "bottom", "caption-side", "clear", "clip", "color", "content",
+        "counter-increment", "counter-reset", "cursor", "direction", "display", "empty-cells", "float",
+        "font", "font-family", "font-size", "font-stretch", "font-style", "font-variant", "font-weight",
+        "height", "left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position",
+        "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "max-height",
+        "max-width", "min-height", "min-width", "opacity", "orphans", "outline", "outline-color", "outline-offset",
+        "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y", "padding", "padding-bottom",
+        "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before",
+        "page-break-inside", "pointer-events", "position", "quotes", "resize", "right", "size", "src",
+        "table-layout", "text-align", "text-decoration", "text-indent", "text-line-through", "text-line-through-color",
+        "text-line-through-mode", "text-line-through-style", "text-line-through-width", "text-overflow", "text-overline",
+        "text-overline-color", "text-overline-mode", "text-overline-style", "text-overline-width", "text-rendering",
+        "text-shadow", "text-transform", "text-underline", "text-underline-color", "text-underline-mode",
+        "text-underline-style", "text-underline-width", "top", "unicode-bidi", "unicode-range", "vertical-align",
+        "visibility", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "zoom",
+        "-webkit-animation", "-webkit-animation-delay", "-webkit-animation-direction", "-webkit-animation-duration",
+        "-webkit-animation-iteration-count", "-webkit-animation-name", "-webkit-animation-play-state",
+        "-webkit-animation-timing-function", "-webkit-appearance", "-webkit-backface-visibility",
+        "-webkit-background-clip", "-webkit-background-composite", "-webkit-background-origin", "-webkit-background-size",
+        "-webkit-binding", "-webkit-border-fit", "-webkit-border-horizontal-spacing", "-webkit-border-image",
+        "-webkit-border-radius", "-webkit-border-vertical-spacing", "-webkit-box-align", "-webkit-box-direction",
+        "-webkit-box-flex", "-webkit-box-flex-group", "-webkit-box-lines", "-webkit-box-ordinal-group",
+        "-webkit-box-orient", "-webkit-box-pack", "-webkit-box-reflect", "-webkit-box-shadow", "-webkit-box-sizing",
+        "-webkit-column-break-after", "-webkit-column-break-before", "-webkit-column-break-inside", "-webkit-column-count",
+        "-webkit-column-gap", "-webkit-column-rule", "-webkit-column-rule-color", "-webkit-column-rule-style",
+        "-webkit-column-rule-width", "-webkit-column-width", "-webkit-columns", "-webkit-font-size-delta",
+        "-webkit-font-smoothing", "-webkit-highlight", "-webkit-line-break", "-webkit-line-clamp",
+        "-webkit-margin-bottom-collapse", "-webkit-margin-collapse", "-webkit-margin-start", "-webkit-margin-top-collapse",
+        "-webkit-marquee", "-webkit-marquee-direction", "-webkit-marquee-increment", "-webkit-marquee-repetition",
+        "-webkit-marquee-speed", "-webkit-marquee-style", "-webkit-mask", "-webkit-mask-attachment",
+        "-webkit-mask-box-image", "-webkit-mask-clip", "-webkit-mask-composite", "-webkit-mask-image",
+        "-webkit-mask-origin", "-webkit-mask-position", "-webkit-mask-position-x", "-webkit-mask-position-y",
+        "-webkit-mask-repeat", "-webkit-mask-repeat-x", "-webkit-mask-repeat-y", "-webkit-mask-size",
+        "-webkit-match-nearest-mail-blockquote-color", "-webkit-nbsp-mode", "-webkit-padding-start",
+        "-webkit-perspective", "-webkit-perspective-origin", "-webkit-perspective-origin-x", "-webkit-perspective-origin-y",
+        "-webkit-rtl-ordering", "-webkit-text-decorations-in-effect", "-webkit-text-fill-color", "-webkit-text-security",
+        "-webkit-text-size-adjust", "-webkit-text-stroke", "-webkit-text-stroke-color", "-webkit-text-stroke-width",
+        "-webkit-transform", "-webkit-transform-origin", "-webkit-transform-origin-x", "-webkit-transform-origin-y",
+        "-webkit-transform-origin-z", "-webkit-transform-style", "-webkit-transition", "-webkit-transition-delay",
+        "-webkit-transition-duration", "-webkit-transition-property", "-webkit-transition-timing-function",
+        "-webkit-user-drag", "-webkit-user-modify", "-webkit-user-select", "-webkit-variable-declaration-block"
+    ].keySet();
+    
+    this._valueKeywords = [
+        "above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll",
+        "alternate", "always","amharic", "amharic-abegede", "antialiased", "appworkspace", "aqua", "arabic-indic", "armenian",
+        "auto", "avoid", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "black", "blink",
+        "block", "block-axis", "blue", "bold", "bolder", "border", "border-box", "both", "bottom", "break-all", "break-word", "button",
+        "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator",
+        "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic",
+        "clear", "clip", "close-quote", "col-resize", "collapse", "compact", "condensed", "contain", "content", "content-box", "context-menu",
+        "continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default",
+        "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document",
+        "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element",
+        "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez",
+        "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et",
+        "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et",
+        "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded",
+        "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "forwards", "from", "fuchsia", "geometricPrecision",
+        "georgian", "gray", "graytext", "green", "grey", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help",
+        "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
+        "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline",
+        "inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana",
+        "katakana-iroha", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "lime", "line-through", "linear", "lines",
+        "list-button", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-greek", "lower-hexadecimal", "lower-latin",
+        "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "maroon", "match", "media-controls-background", "media-current-time-display",
+        "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button",
+        "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display",
+        "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button",
+        "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple",
+        "myanmar", "n-resize", "narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none",
+        "normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "olive", "open-quote", "optimizeLegibility",
+        "optimizeSpeed", "orange", "oriya", "oromo", "outset", "outside", "overlay", "overline", "padding", "padding-box", "painted", "paused",
+        "persian", "plus-darker", "plus-lighter", "pointer", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "purple",
+        "push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "red", "relative", "repeat", "repeat-x",
+        "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif",
+        "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
+        "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "silver", "single",
+        "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
+        "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over",
+        "space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super",
+        "sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group",
+        "table-row", "table-row-group", "teal", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin",
+        "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede",
+        "tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-greek",
+        "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible",
+        "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider", "window", "windowframe", "windowtext",
+        "x-large", "x-small", "xor", "xx-large", "xx-small", "yellow", "-wap-marquee", "-webkit-activelink", "-webkit-auto", "-webkit-baseline-middle",
+        "-webkit-body", "-webkit-box", "-webkit-center", "-webkit-control", "-webkit-focus-ring-color", "-webkit-grab", "-webkit-grabbing",
+        "-webkit-gradient", "-webkit-inline-box", "-webkit-left", "-webkit-link", "-webkit-marquee", "-webkit-mini-control", "-webkit-nowrap", "-webkit-right",
+        "-webkit-small-control", "-webkit-text", "-webkit-xxx-large", "-webkit-zoom-in", "-webkit-zoom-out",
+    ].keySet();
+
+    this._mediaTypes = ["all", "aural", "braille", "embossed", "handheld", "import", "print", "projection", "screen", "tty", "tv"].keySet();
+
+    this._lexConditions = {
+        INITIAL: 0,
+        COMMENT: 1,
+        DSTRING: 2,
+        SSTRING: 3
+    };
+
+    this._parseConditions = {
+        INITIAL: 0,
+        PROPERTY: 1,
+        PROPERTY_VALUE: 2,
+        AT_RULE: 3
+    };
+
+    this.case_INITIAL = 1000;
+    this.case_COMMENT = 1002;
+    this.case_DSTRING = 1003;
+    this.case_SSTRING = 1004;
+
+    this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL }
+}
+
+WebInspector.SourceCSSTokenizer.prototype = {
+    _stringToken: function(cursor, stringEnds)
+    {
+        if (this._isPropertyValue())
+            this.tokenType = "css-string";
+        else
+            this.tokenType = null;
+        return cursor;
+    },
+
+    _isPropertyValue: function()
+    {
+        return this._condition.parseCondition === this._parseConditions.PROPERTY_VALUE || this._condition.parseCondition === this._parseConditions.AT_RULE;
+    },
+
+    nextToken: function(cursor)
+    {
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 2) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_INITIAL; continue; };
+                } else {
+                    { gotoCase = this.case_COMMENT; continue; };
+                }
+            } else {
+                if (this.getLexCondition() < 3) {
+                    { gotoCase = this.case_DSTRING; continue; };
+                } else {
+                    { gotoCase = this.case_SSTRING; continue; };
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '*') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "css-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 12; continue; };
+case 4:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych != '/') { gotoCase = 11; continue; };
+case 7:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "css-comment"; return cursor; }
+case 9:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych == '/') { gotoCase = 7; continue; };
+case 11:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 12:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 11; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '*') { gotoCase = 9; continue; };
+                { gotoCase = 11; continue; };
+            }
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 17; continue; };
+                if (yych <= '\f') { gotoCase = 16; continue; };
+                { gotoCase = 17; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 16; continue; };
+                    { gotoCase = 19; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 21; continue; };
+                    { gotoCase = 16; continue; };
+                }
+            }
+case 15:
+            { return this._stringToken(cursor); }
+case 16:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 23; continue; };
+case 17:
+            ++cursor;
+case 18:
+            { this.tokenType = null; return cursor; }
+case 19:
+            ++cursor;
+case 20:
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { return this._stringToken(cursor, true); }
+case 21:
+            yych = this._charAt(++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 22; continue; };
+                    if (yych <= '&') { gotoCase = 18; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 18; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 22; continue; };
+                        if (yych <= 'q') { gotoCase = 18; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 18; continue; };
+                    } else {
+                        if (yych != 'v') { gotoCase = 18; continue; };
+                    }
+                }
+            }
+case 22:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 23:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 15; continue; };
+                if (yych <= '\f') { gotoCase = 22; continue; };
+                { gotoCase = 15; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 22; continue; };
+                    { gotoCase = 26; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 22; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 22; continue; };
+                    if (yych >= '\'') { gotoCase = 22; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych >= '\\') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 22; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 22; continue; };
+                        if (yych >= 'r') { gotoCase = 22; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych >= 't') { gotoCase = 22; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 22; continue; };
+                    }
+                }
+            }
+            cursor = YYMARKER;
+            { gotoCase = 15; continue; };
+case 26:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 20; continue; };
+/* *********************************** */
+case this.case_INITIAL:
+            yych = this._charAt(cursor);
+            if (yych <= ';') {
+                if (yych <= '\'') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 29; continue; };
+                        if (yych <= '!') { gotoCase = 31; continue; };
+                        { gotoCase = 33; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 31; continue; };
+                        if (yych >= '\'') { gotoCase = 34; continue; };
+                    }
+                } else {
+                    if (yych <= '.') {
+                        if (yych <= ',') { gotoCase = 29; continue; };
+                        if (yych <= '-') { gotoCase = 35; continue; };
+                        { gotoCase = 36; continue; };
+                    } else {
+                        if (yych <= '/') { gotoCase = 37; continue; };
+                        if (yych <= '9') { gotoCase = 38; continue; };
+                        if (yych <= ':') { gotoCase = 40; continue; };
+                        { gotoCase = 42; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '^') {
+                    if (yych <= '?') {
+                        if (yych == '=') { gotoCase = 31; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 29; continue; };
+                        if (yych <= ']') { gotoCase = 31; continue; };
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych != '`') { gotoCase = 31; continue; };
+                    } else {
+                        if (yych <= '{') { gotoCase = 44; continue; };
+                        if (yych == '}') { gotoCase = 46; continue; };
+                    }
+                }
+            }
+case 29:
+            ++cursor;
+case 30:
+            { this.tokenType = null; return cursor; }
+case 31:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 49; continue; };
+case 32:
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (this._condition.parseCondition === this._parseConditions.INITIAL) {
+                        if (token === "@import" || token === "@media") {
+                            this.tokenType = "css-at-rule";
+                            this._condition.parseCondition = this._parseConditions.AT_RULE;
+                        } else if (token.indexOf("@") === 0)
+                            this.tokenType = "css-at-rule";
+                        else
+                            this.tokenType = "css-selector";
+                    }
+                    else if (this._condition.parseCondition === this._parseConditions.AT_RULE && token in this._mediaTypes)
+                        this.tokenType = "css-keyword";
+                    else if (this._condition.parseCondition === this._parseConditions.PROPERTY && token in this._propertyKeywords)
+                        this.tokenType = "css-property";
+                    else if (this._isPropertyValue() && token in this._valueKeywords)
+                        this.tokenType = "css-keyword";
+                    else if (token === "!important")
+                        this.tokenType = "css-important";
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 33:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '-') {
+                if (yych <= '!') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '$') {
+                        if (yych <= '"') { gotoCase = 114; continue; };
+                        if (yych <= '#') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '\'') { gotoCase = 122; continue; };
+                        if (yych <= ',') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 124; continue; };
+                        if (yych <= '9') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 122; continue; };
+                        if (yych <= '?') { gotoCase = 124; continue; };
+                        { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 126; continue; };
+                        if (yych <= ']') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 124; continue; };
+                        if (yych <= 'z') { gotoCase = 122; continue; };
+                        { gotoCase = 124; continue; };
+                    }
+                }
+            }
+case 34:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '-') {
+                if (yych <= '"') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '&') {
+                        if (yych == '$') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\'') { gotoCase = 114; continue; };
+                        if (yych <= ',') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 116; continue; };
+                        if (yych <= '9') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 112; continue; };
+                        if (yych <= '?') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 118; continue; };
+                        if (yych <= ']') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 116; continue; };
+                        if (yych <= 'z') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    }
+                }
+            }
+case 35:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '.') { gotoCase = 65; continue; };
+            if (yych <= '/') { gotoCase = 49; continue; };
+            if (yych <= '9') { gotoCase = 50; continue; };
+            { gotoCase = 49; continue; };
+case 36:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 30; continue; };
+            if (yych <= '9') { gotoCase = 68; continue; };
+            { gotoCase = 30; continue; };
+case 37:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 104; continue; };
+            { gotoCase = 49; continue; };
+case 38:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            switch (yych) {
+            case '!':
+            case '"':
+            case '$':
+            case '\'':
+            case '-':
+            case '/':
+            case '=':
+            case '@':
+            case 'A':
+            case 'B':
+            case 'C':
+            case 'D':
+            case 'E':
+            case 'F':
+            case 'G':
+            case 'I':
+            case 'J':
+            case 'K':
+            case 'L':
+            case 'M':
+            case 'N':
+            case 'O':
+            case 'P':
+            case 'Q':
+            case 'R':
+            case 'S':
+            case 'T':
+            case 'U':
+            case 'V':
+            case 'W':
+            case 'X':
+            case 'Y':
+            case 'Z':
+            case '[':
+            case ']':
+            case 'a':
+            case 'b':
+            case 'f':
+            case 'h':
+            case 'j':
+            case 'l':
+            case 'n':
+            case 'o':
+            case 'q':
+            case 'u':
+            case 'v':
+            case 'w':
+            case 'x':
+            case 'y':
+            case 'z':    { gotoCase = 48; continue; };
+            case '%':    { gotoCase = 67; continue; };
+            case '.':    { gotoCase = 65; continue; };
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':    { gotoCase = 50; continue; };
+            case 'H':    { gotoCase = 52; continue; };
+            case '_':    { gotoCase = 53; continue; };
+            case 'c':    { gotoCase = 54; continue; };
+            case 'd':    { gotoCase = 55; continue; };
+            case 'e':    { gotoCase = 56; continue; };
+            case 'g':    { gotoCase = 57; continue; };
+            case 'i':    { gotoCase = 58; continue; };
+            case 'k':    { gotoCase = 59; continue; };
+            case 'm':    { gotoCase = 60; continue; };
+            case 'p':    { gotoCase = 61; continue; };
+            case 'r':    { gotoCase = 62; continue; };
+            case 's':    { gotoCase = 63; continue; };
+            case 't':    { gotoCase = 64; continue; };
+            default:    { gotoCase = 39; continue; };
+            }
+case 39:
+            {
+                    if (this._isPropertyValue())
+                        this.tokenType = "css-number";
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 40:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.PROPERTY)
+                        this._condition.parseCondition = this._parseConditions.PROPERTY_VALUE;
+                    return cursor;
+                }
+case 42:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.AT_RULE)
+                        this._condition.parseCondition = this._parseConditions.INITIAL;
+                    else
+                        this._condition.parseCondition = this._parseConditions.PROPERTY;
+                    return cursor;
+                }
+case 44:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    if (this._condition.parseCondition === this._parseConditions.AT_RULE)
+                        this._condition.parseCondition = this._parseConditions.INITIAL;
+                    else
+                        this._condition.parseCondition = this._parseConditions.PROPERTY;
+                    return cursor;
+                }
+case 46:
+            ++cursor;
+            {
+                    this.tokenType = null;
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+case 48:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 49:
+            if (yych <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    } else {
+                        if (yych == '.') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych <= '<') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 32; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych == '^') { gotoCase = 32; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 32; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                        { gotoCase = 32; continue; };
+                    }
+                }
+            }
+case 50:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            switch (yych) {
+            case '!':
+            case '"':
+            case '$':
+            case '\'':
+            case '-':
+            case '/':
+            case '=':
+            case '@':
+            case 'A':
+            case 'B':
+            case 'C':
+            case 'D':
+            case 'E':
+            case 'F':
+            case 'G':
+            case 'I':
+            case 'J':
+            case 'K':
+            case 'L':
+            case 'M':
+            case 'N':
+            case 'O':
+            case 'P':
+            case 'Q':
+            case 'R':
+            case 'S':
+            case 'T':
+            case 'U':
+            case 'V':
+            case 'W':
+            case 'X':
+            case 'Y':
+            case 'Z':
+            case '[':
+            case ']':
+            case 'a':
+            case 'b':
+            case 'f':
+            case 'h':
+            case 'j':
+            case 'l':
+            case 'n':
+            case 'o':
+            case 'q':
+            case 'u':
+            case 'v':
+            case 'w':
+            case 'x':
+            case 'y':
+            case 'z':    { gotoCase = 48; continue; };
+            case '%':    { gotoCase = 67; continue; };
+            case '.':    { gotoCase = 65; continue; };
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':    { gotoCase = 50; continue; };
+            case 'H':    { gotoCase = 52; continue; };
+            case '_':    { gotoCase = 53; continue; };
+            case 'c':    { gotoCase = 54; continue; };
+            case 'd':    { gotoCase = 55; continue; };
+            case 'e':    { gotoCase = 56; continue; };
+            case 'g':    { gotoCase = 57; continue; };
+            case 'i':    { gotoCase = 58; continue; };
+            case 'k':    { gotoCase = 59; continue; };
+            case 'm':    { gotoCase = 60; continue; };
+            case 'p':    { gotoCase = 61; continue; };
+            case 'r':    { gotoCase = 62; continue; };
+            case 's':    { gotoCase = 63; continue; };
+            case 't':    { gotoCase = 64; continue; };
+            default:    { gotoCase = 39; continue; };
+            }
+case 52:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 53:
+            yych = this._charAt(++cursor);
+            if (yych == '_') { gotoCase = 101; continue; };
+            { gotoCase = 49; continue; };
+case 54:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 55:
+            yych = this._charAt(++cursor);
+            if (yych == 'e') { gotoCase = 100; continue; };
+            { gotoCase = 49; continue; };
+case 56:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            if (yych == 'x') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 57:
+            yych = this._charAt(++cursor);
+            if (yych == 'r') { gotoCase = 98; continue; };
+            { gotoCase = 49; continue; };
+case 58:
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 59:
+            yych = this._charAt(++cursor);
+            if (yych == 'H') { gotoCase = 97; continue; };
+            { gotoCase = 49; continue; };
+case 60:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            if (yych == 's') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 61:
+            yych = this._charAt(++cursor);
+            if (yych <= 's') {
+                if (yych == 'c') { gotoCase = 63; continue; };
+                { gotoCase = 49; continue; };
+            } else {
+                if (yych <= 't') { gotoCase = 63; continue; };
+                if (yych == 'x') { gotoCase = 63; continue; };
+                { gotoCase = 49; continue; };
+            }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych == 'a') { gotoCase = 95; continue; };
+            if (yych == 'e') { gotoCase = 96; continue; };
+            { gotoCase = 49; continue; };
+case 63:
+            yych = this._charAt(++cursor);
+            if (yych <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych <= ' ') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych == '.') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych <= '<') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 39; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych == '^') { gotoCase = 39; continue; };
+                        { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 39; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                }
+            }
+case 64:
+            yych = this._charAt(++cursor);
+            if (yych == 'u') { gotoCase = 93; continue; };
+            { gotoCase = 49; continue; };
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 66; continue; };
+            if (yych <= '9') { gotoCase = 68; continue; };
+case 66:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 32; continue; };
+            } else {
+                { gotoCase = 39; continue; };
+            }
+case 67:
+            yych = this._charAt(++cursor);
+            { gotoCase = 39; continue; };
+case 68:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'f') {
+                if (yych <= 'H') {
+                    if (yych <= '/') {
+                        if (yych == '%') { gotoCase = 67; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= '9') { gotoCase = 68; continue; };
+                        if (yych <= 'G') { gotoCase = 39; continue; };
+                        { gotoCase = 80; continue; };
+                    }
+                } else {
+                    if (yych <= 'b') {
+                        if (yych == '_') { gotoCase = 72; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= 'c') { gotoCase = 74; continue; };
+                        if (yych <= 'd') { gotoCase = 77; continue; };
+                        if (yych >= 'f') { gotoCase = 39; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'm') {
+                    if (yych <= 'i') {
+                        if (yych <= 'g') { gotoCase = 78; continue; };
+                        if (yych <= 'h') { gotoCase = 39; continue; };
+                        { gotoCase = 76; continue; };
+                    } else {
+                        if (yych == 'k') { gotoCase = 81; continue; };
+                        if (yych <= 'l') { gotoCase = 39; continue; };
+                        { gotoCase = 75; continue; };
+                    }
+                } else {
+                    if (yych <= 'q') {
+                        if (yych == 'p') { gotoCase = 73; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= 'r') { gotoCase = 71; continue; };
+                        if (yych <= 's') { gotoCase = 67; continue; };
+                        if (yych <= 't') { gotoCase = 79; continue; };
+                        { gotoCase = 39; continue; };
+                    }
+                }
+            }
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            if (yych == 'x') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 71:
+            yych = this._charAt(++cursor);
+            if (yych == 'a') { gotoCase = 91; continue; };
+            if (yych == 'e') { gotoCase = 92; continue; };
+            { gotoCase = 66; continue; };
+case 72:
+            yych = this._charAt(++cursor);
+            if (yych == '_') { gotoCase = 88; continue; };
+            { gotoCase = 66; continue; };
+case 73:
+            yych = this._charAt(++cursor);
+            if (yych <= 's') {
+                if (yych == 'c') { gotoCase = 67; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= 't') { gotoCase = 67; continue; };
+                if (yych == 'x') { gotoCase = 67; continue; };
+                { gotoCase = 66; continue; };
+            }
+case 74:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 75:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            if (yych == 's') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 76:
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 77:
+            yych = this._charAt(++cursor);
+            if (yych == 'e') { gotoCase = 87; continue; };
+            { gotoCase = 66; continue; };
+case 78:
+            yych = this._charAt(++cursor);
+            if (yych == 'r') { gotoCase = 85; continue; };
+            { gotoCase = 66; continue; };
+case 79:
+            yych = this._charAt(++cursor);
+            if (yych == 'u') { gotoCase = 83; continue; };
+            { gotoCase = 66; continue; };
+case 80:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 81:
+            yych = this._charAt(++cursor);
+            if (yych != 'H') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 83:
+            yych = this._charAt(++cursor);
+            if (yych != 'r') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 85:
+            yych = this._charAt(++cursor);
+            if (yych != 'a') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 87:
+            yych = this._charAt(++cursor);
+            if (yych == 'g') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 88:
+            yych = this._charAt(++cursor);
+            if (yych != 'q') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych != 'e') { gotoCase = 66; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 91:
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 92:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 67; continue; };
+            { gotoCase = 66; continue; };
+case 93:
+            yych = this._charAt(++cursor);
+            if (yych != 'r') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'n') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 95:
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 96:
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 97:
+            yych = this._charAt(++cursor);
+            if (yych == 'z') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 98:
+            yych = this._charAt(++cursor);
+            if (yych != 'a') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'd') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 100:
+            yych = this._charAt(++cursor);
+            if (yych == 'g') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 101:
+            yych = this._charAt(++cursor);
+            if (yych != 'q') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych != 'e') { gotoCase = 49; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == 'm') { gotoCase = 63; continue; };
+            { gotoCase = 49; continue; };
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 108; continue; };
+                { gotoCase = 104; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 108; continue; };
+                if (yych != '*') { gotoCase = 104; continue; };
+            }
+case 106:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 106; continue; };
+            if (yych == '/') { gotoCase = 110; continue; };
+            { gotoCase = 104; continue; };
+case 108:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "css-comment"; return cursor; }
+case 110:
+            ++cursor;
+            { this.tokenType = "css-comment"; return cursor; }
+case 112:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '-') {
+                if (yych <= '"') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych <= ' ') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '&') {
+                        if (yych == '$') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '\'') { gotoCase = 114; continue; };
+                        if (yych <= ',') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 116; continue; };
+                        if (yych <= '9') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 112; continue; };
+                        if (yych <= '?') { gotoCase = 116; continue; };
+                        { gotoCase = 112; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 118; continue; };
+                        if (yych <= ']') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 116; continue; };
+                        if (yych <= 'z') { gotoCase = 112; continue; };
+                        { gotoCase = 116; continue; };
+                    }
+                }
+            }
+case 114:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) <= '9') {
+                if (yych <= '&') {
+                    if (yych <= '"') {
+                        if (yych >= '!') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych == '$') { gotoCase = 48; continue; };
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= '\'') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych != '.') { gotoCase = 48; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '=') {
+                        if (yych >= '=') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '?') { gotoCase = 115; continue; };
+                        if (yych <= '[') { gotoCase = 48; continue; };
+                    }
+                } else {
+                    if (yych <= '_') {
+                        if (yych != '^') { gotoCase = 48; continue; };
+                    } else {
+                        if (yych <= '`') { gotoCase = 115; continue; };
+                        if (yych <= 'z') { gotoCase = 48; continue; };
+                    }
+                }
+            }
+case 115:
+            { return this._stringToken(cursor, true); }
+case 116:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 66; continue; };
+                if (yych <= '\f') { gotoCase = 116; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 116; continue; };
+                    { gotoCase = 121; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 116; continue; };
+                }
+            }
+case 118:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 66; continue; };
+                    } else {
+                        if (yych != '\r') { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 116; continue; };
+                        if (yych <= '&') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 116; continue; };
+                        if (yych <= 'e') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 66; continue; };
+                        { gotoCase = 116; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 116; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { return this._stringToken(cursor); }
+case 121:
+            yych = this._charAt(++cursor);
+            { gotoCase = 115; continue; };
+case 122:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '-') {
+                if (yych <= '!') {
+                    if (yych <= '\f') {
+                        if (yych == '\n') { gotoCase = 32; continue; };
+                    } else {
+                        if (yych <= '\r') { gotoCase = 32; continue; };
+                        if (yych >= '!') { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '$') {
+                        if (yych <= '"') { gotoCase = 114; continue; };
+                        if (yych >= '$') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '\'') { gotoCase = 122; continue; };
+                        if (yych >= '-') { gotoCase = 122; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '<') {
+                        if (yych <= '.') { gotoCase = 124; continue; };
+                        if (yych <= '9') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych <= '=') { gotoCase = 122; continue; };
+                        if (yych >= '@') { gotoCase = 122; continue; };
+                    }
+                } else {
+                    if (yych <= '^') {
+                        if (yych <= '\\') { gotoCase = 126; continue; };
+                        if (yych <= ']') { gotoCase = 122; continue; };
+                    } else {
+                        if (yych == '`') { gotoCase = 124; continue; };
+                        if (yych <= 'z') { gotoCase = 122; continue; };
+                    }
+                }
+            }
+case 124:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 66; continue; };
+                if (yych <= '\f') { gotoCase = 124; continue; };
+                { gotoCase = 66; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 124; continue; };
+                    { gotoCase = 121; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 124; continue; };
+                }
+            }
+case 126:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 66; continue; };
+                    } else {
+                        if (yych != '\r') { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 124; continue; };
+                        if (yych <= '&') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 124; continue; };
+                        if (yych <= 'e') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 66; continue; };
+                        { gotoCase = 124; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 124; continue; };
+                        { gotoCase = 66; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { return this._stringToken(cursor); }
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 133; continue; };
+                if (yych <= '\f') { gotoCase = 132; continue; };
+                { gotoCase = 133; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 132; continue; };
+                    { gotoCase = 135; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 137; continue; };
+                    { gotoCase = 132; continue; };
+                }
+            }
+case 131:
+            { return this._stringToken(cursor); }
+case 132:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 139; continue; };
+case 133:
+            ++cursor;
+case 134:
+            { this.tokenType = null; return cursor; }
+case 135:
+            ++cursor;
+case 136:
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { return this._stringToken(cursor, true); }
+case 137:
+            yych = this._charAt(++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 138; continue; };
+                    if (yych <= '&') { gotoCase = 134; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 134; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 138; continue; };
+                        if (yych <= 'q') { gotoCase = 134; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 134; continue; };
+                    } else {
+                        if (yych != 'v') { gotoCase = 134; continue; };
+                    }
+                }
+            }
+case 138:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 139:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 131; continue; };
+                if (yych <= '\f') { gotoCase = 138; continue; };
+                { gotoCase = 131; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 138; continue; };
+                    { gotoCase = 142; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 138; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 138; continue; };
+                    if (yych >= '\'') { gotoCase = 138; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych >= '\\') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 138; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 138; continue; };
+                        if (yych >= 'r') { gotoCase = 138; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych >= 't') { gotoCase = 138; continue; };
+                    } else {
+                        if (yych == 'v') { gotoCase = 138; continue; };
+                    }
+                }
+            }
+            cursor = YYMARKER;
+            { gotoCase = 131; continue; };
+case 142:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 136; continue; };
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceCSSTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceHTMLTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceHTMLTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceHTMLTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    // The order is determined by the generated code.
+    this._lexConditions = {
+        INITIAL: 0,
+        COMMENT: 1,
+        DOCTYPE: 2,
+        TAG: 3,
+        DSTRING: 4,
+        SSTRING: 5
+    };
+    this.case_INITIAL = 1000;
+    this.case_COMMENT = 1001;
+    this.case_DOCTYPE = 1002;
+    this.case_TAG = 1003;
+    this.case_DSTRING = 1004;
+    this.case_SSTRING = 1005;
+
+    this._parseConditions = {
+        INITIAL: 0,
+        ATTRIBUTE: 1,
+        ATTRIBUTE_VALUE: 2,
+        LINKIFY: 4,
+        A_NODE: 8,
+        SCRIPT: 16
+    };
+
+    this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL };
+    this.condition = this.initialCondition;
+}
+
+WebInspector.SourceHTMLTokenizer.prototype = {
+    set line(line) {
+        if (this._internalJavaScriptTokenizer) {
+            var match = /<\/script/i.exec(line);
+            if (match) {
+                this._internalJavaScriptTokenizer.line = line.substring(0, match.index);
+            } else
+                this._internalJavaScriptTokenizer.line = line;
+        }
+        this._line = line;
+    },
+
+    _isExpectingAttribute: function()
+    {
+        return this._condition.parseCondition & this._parseConditions.ATTRIBUTE;
+    },
+
+    _isExpectingAttributeValue: function()
+    {
+        return this._condition.parseCondition & this._parseConditions.ATTRIBUTE_VALUE;
+    },
+
+    _setExpectingAttribute: function()
+    {
+        if (this._isExpectingAttributeValue())
+            this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE_VALUE;
+        this._condition.parseCondition |= this._parseConditions.ATTRIBUTE;
+    },
+
+    _setExpectingAttributeValue: function()
+    {
+        if (this._isExpectingAttribute())
+            this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE;
+        this._condition.parseCondition |= this._parseConditions.ATTRIBUTE_VALUE;
+    },
+
+    _stringToken: function(cursor, stringEnds)
+    {
+        if (!this._isExpectingAttributeValue()) {
+            this.tokenType = null;
+            return cursor;
+        }
+        this.tokenType = this._attrValueTokenType();
+        if (stringEnds)
+            this._setExpectingAttribute();
+        return cursor;
+    },
+
+    _attrValueTokenType: function()
+    {
+        if (this._condition.parseCondition & this._parseConditions.LINKIFY) {
+            if (this._condition.parseCondition & this._parseConditions.A_NODE)
+                return "html-external-link";
+            return "html-resource-link";
+        }
+        return "html-attribute-value";
+    },
+
+    nextToken: function(cursor)
+    {
+        if (this._internalJavaScriptTokenizer) {
+            // Re-set line to force </script> detection first.
+            this.line = this._line;
+            if (cursor !== this._internalJavaScriptTokenizer._line.length) {
+                // Tokenizer is stateless, so restore its condition before tokenizing and save it after.
+                this._internalJavaScriptTokenizer.condition = this._condition.internalJavaScriptTokenizerCondition;
+                var result = this._internalJavaScriptTokenizer.nextToken(cursor);
+                this.tokenType = this._internalJavaScriptTokenizer.tokenType;
+                this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.condition;
+                return result;
+            } else if (cursor !== this._line.length)
+                delete this._internalJavaScriptTokenizer;
+        }
+
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 3) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_INITIAL; continue; };
+                } else {
+                    if (this.getLexCondition() < 2) {
+                        { gotoCase = this.case_COMMENT; continue; };
+                    } else {
+                        { gotoCase = this.case_DOCTYPE; continue; };
+                    }
+                }
+            } else {
+                if (this.getLexCondition() < 4) {
+                    { gotoCase = this.case_TAG; continue; };
+                } else {
+                    if (this.getLexCondition() < 5) {
+                        { gotoCase = this.case_DSTRING; continue; };
+                    } else {
+                        { gotoCase = this.case_SSTRING; continue; };
+                    }
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '-') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "html-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 9; continue; };
+case 4:
+            ++cursor;
+case 5:
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych != '-') { gotoCase = 5; continue; };
+case 7:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '>') { gotoCase = 10; continue; };
+case 8:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 9:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 8; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '-') { gotoCase = 12; continue; };
+                { gotoCase = 8; continue; };
+            }
+case 10:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "html-comment"; return cursor; }
+case 12:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '-') { gotoCase = 7; continue; };
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 2; continue; };
+            } else {
+                { gotoCase = 5; continue; };
+            }
+/* *********************************** */
+case this.case_DOCTYPE:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 18; continue; };
+                { gotoCase = 17; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 18; continue; };
+                if (yych == '>') { gotoCase = 20; continue; };
+                { gotoCase = 17; continue; };
+            }
+case 16:
+            { this.tokenType = "html-doctype"; return cursor; }
+case 17:
+            yych = this._charAt(++cursor);
+            { gotoCase = 23; continue; };
+case 18:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 20:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            { this.tokenType = "html-doctype"; return cursor; }
+case 22:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 23:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 16; continue; };
+                { gotoCase = 22; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 16; continue; };
+                if (yych == '>') { gotoCase = 16; continue; };
+                { gotoCase = 22; continue; };
+            }
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 28; continue; };
+                { gotoCase = 27; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 28; continue; };
+                if (yych == '"') { gotoCase = 30; continue; };
+                { gotoCase = 27; continue; };
+            }
+case 26:
+            { return this._stringToken(cursor); }
+case 27:
+            yych = this._charAt(++cursor);
+            { gotoCase = 34; continue; };
+case 28:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 30:
+            ++cursor;
+case 31:
+            this.setLexCondition(this._lexConditions.TAG);
+            { return this._stringToken(cursor, true); }
+case 32:
+            yych = this._charAt(++cursor);
+            { gotoCase = 31; continue; };
+case 33:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 34:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 26; continue; };
+                { gotoCase = 33; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 26; continue; };
+                if (yych == '"') { gotoCase = 32; continue; };
+                { gotoCase = 33; continue; };
+            }
+/* *********************************** */
+case this.case_INITIAL:
+            yych = this._charAt(cursor);
+            if (yych == '<') { gotoCase = 39; continue; };
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 39:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '/') {
+                if (yych == '!') { gotoCase = 44; continue; };
+                if (yych >= '/') { gotoCase = 41; continue; };
+            } else {
+                if (yych <= 'S') {
+                    if (yych >= 'S') { gotoCase = 42; continue; };
+                } else {
+                    if (yych == 's') { gotoCase = 42; continue; };
+                }
+            }
+case 40:
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        // Do not tokenize script tag contents, keep lexer state although processing "<".
+                        this.setLexCondition(this._lexConditions.INITIAL);
+                        this.tokenType = null;
+                        return cursor;
+                    }
+
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    this.tokenType = "html-tag";
+                    return cursor;
+                }
+case 41:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'S') { gotoCase = 68; continue; };
+            if (yych == 's') { gotoCase = 68; continue; };
+            { gotoCase = 40; continue; };
+case 42:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 62; continue; };
+            if (yych == 'c') { gotoCase = 62; continue; };
+case 43:
+            cursor = YYMARKER;
+            { gotoCase = 40; continue; };
+case 44:
+            yych = this._charAt(++cursor);
+            if (yych <= 'C') {
+                if (yych != '-') { gotoCase = 43; continue; };
+            } else {
+                if (yych <= 'D') { gotoCase = 46; continue; };
+                if (yych == 'd') { gotoCase = 46; continue; };
+                { gotoCase = 43; continue; };
+            }
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 54; continue; };
+            { gotoCase = 43; continue; };
+case 46:
+            yych = this._charAt(++cursor);
+            if (yych == 'O') { gotoCase = 47; continue; };
+            if (yych != 'o') { gotoCase = 43; continue; };
+case 47:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 48; continue; };
+            if (yych != 'c') { gotoCase = 43; continue; };
+case 48:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 49; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 49:
+            yych = this._charAt(++cursor);
+            if (yych == 'Y') { gotoCase = 50; continue; };
+            if (yych != 'y') { gotoCase = 43; continue; };
+case 50:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 51; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 51:
+            yych = this._charAt(++cursor);
+            if (yych == 'E') { gotoCase = 52; continue; };
+            if (yych != 'e') { gotoCase = 43; continue; };
+case 52:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DOCTYPE);
+            { this.tokenType = "html-doctype"; return cursor; }
+case 54:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 57; continue; };
+                { gotoCase = 54; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 57; continue; };
+                if (yych != '-') { gotoCase = 54; continue; };
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '-') { gotoCase = 59; continue; };
+            { gotoCase = 43; continue; };
+case 57:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "html-comment"; return cursor; }
+case 59:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != '>') { gotoCase = 54; continue; };
+            ++cursor;
+            { this.tokenType = "html-comment"; return cursor; }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych == 'R') { gotoCase = 63; continue; };
+            if (yych != 'r') { gotoCase = 43; continue; };
+case 63:
+            yych = this._charAt(++cursor);
+            if (yych == 'I') { gotoCase = 64; continue; };
+            if (yych != 'i') { gotoCase = 43; continue; };
+case 64:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 65; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 66; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 66:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        // Do not tokenize script tag contents, keep lexer state although processing "<".
+                        this.setLexCondition(this._lexConditions.INITIAL);
+                        this.tokenType = null;
+                        return cursor;
+                    }
+                    this.tokenType = "html-tag";
+                    this._condition.parseCondition = this._parseConditions.SCRIPT;
+                    this._setExpectingAttribute();
+                    return cursor;
+                }
+case 68:
+            yych = this._charAt(++cursor);
+            if (yych == 'C') { gotoCase = 69; continue; };
+            if (yych != 'c') { gotoCase = 43; continue; };
+case 69:
+            yych = this._charAt(++cursor);
+            if (yych == 'R') { gotoCase = 70; continue; };
+            if (yych != 'r') { gotoCase = 43; continue; };
+case 70:
+            yych = this._charAt(++cursor);
+            if (yych == 'I') { gotoCase = 71; continue; };
+            if (yych != 'i') { gotoCase = 43; continue; };
+case 71:
+            yych = this._charAt(++cursor);
+            if (yych == 'P') { gotoCase = 72; continue; };
+            if (yych != 'p') { gotoCase = 43; continue; };
+case 72:
+            yych = this._charAt(++cursor);
+            if (yych == 'T') { gotoCase = 73; continue; };
+            if (yych != 't') { gotoCase = 43; continue; };
+case 73:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.TAG);
+            {
+                    this.tokenType = "html-tag";
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 79; continue; };
+                { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 79; continue; };
+                if (yych == '\'') { gotoCase = 81; continue; };
+                { gotoCase = 78; continue; };
+            }
+case 77:
+            { return this._stringToken(cursor); }
+case 78:
+            yych = this._charAt(++cursor);
+            { gotoCase = 85; continue; };
+case 79:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 81:
+            ++cursor;
+case 82:
+            this.setLexCondition(this._lexConditions.TAG);
+            { return this._stringToken(cursor, true); }
+case 83:
+            yych = this._charAt(++cursor);
+            { gotoCase = 82; continue; };
+case 84:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 85:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 77; continue; };
+                { gotoCase = 84; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 77; continue; };
+                if (yych == '\'') { gotoCase = 83; continue; };
+                { gotoCase = 84; continue; };
+            }
+/* *********************************** */
+case this.case_TAG:
+            yych = this._charAt(cursor);
+            if (yych <= '&') {
+                if (yych <= '\r') {
+                    if (yych == '\n') { gotoCase = 90; continue; };
+                    if (yych >= '\r') { gotoCase = 90; continue; };
+                } else {
+                    if (yych <= ' ') {
+                        if (yych >= ' ') { gotoCase = 90; continue; };
+                    } else {
+                        if (yych == '"') { gotoCase = 92; continue; };
+                    }
+                }
+            } else {
+                if (yych <= '>') {
+                    if (yych <= ';') {
+                        if (yych <= '\'') { gotoCase = 93; continue; };
+                    } else {
+                        if (yych <= '<') { gotoCase = 90; continue; };
+                        if (yych <= '=') { gotoCase = 94; continue; };
+                        { gotoCase = 96; continue; };
+                    }
+                } else {
+                    if (yych <= '[') {
+                        if (yych >= '[') { gotoCase = 90; continue; };
+                    } else {
+                        if (yych == ']') { gotoCase = 90; continue; };
+                    }
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 109; continue; };
+case 89:
+            {
+                    if (this._condition.parseCondition === this._parseConditions.SCRIPT) {
+                        // Fall through if expecting attributes.
+                        this.tokenType = null;
+                        return cursor;
+                    }
+
+                    if (this._condition.parseCondition === this._parseConditions.INITIAL) {
+                        this.tokenType = "html-tag";
+                        this._setExpectingAttribute();
+                        var token = this._line.substring(cursorOnEnter, cursor);
+                        if (token === "a")
+                            this._condition.parseCondition |= this._parseConditions.A_NODE;
+                        else if (this._condition.parseCondition & this._parseConditions.A_NODE)
+                            this._condition.parseCondition ^= this._parseConditions.A_NODE;
+                    } else if (this._isExpectingAttribute()) {
+                        var token = this._line.substring(cursorOnEnter, cursor);
+                        if (token === "href" || token === "src")
+                            this._condition.parseCondition |= this._parseConditions.LINKIFY;
+                        else if (this._condition.parseCondition |= this._parseConditions.LINKIFY)
+                            this._condition.parseCondition ^= this._parseConditions.LINKIFY;
+                        this.tokenType = "html-attribute-name";
+                    } else if (this._isExpectingAttributeValue())
+                        this.tokenType = this._attrValueTokenType();
+                    else
+                        this.tokenType = null;
+                    return cursor;
+                }
+case 90:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 92:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 105; continue; };
+case 93:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 99; continue; };
+case 94:
+            ++cursor;
+            {
+                    if (this._isExpectingAttribute())
+                        this._setExpectingAttributeValue();
+                    this.tokenType = null;
+                    return cursor;
+                }
+case 96:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.INITIAL);
+            {
+                    this.tokenType = "html-tag";
+                    if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
+                        if (!this._internalJavaScriptTokenizer) {
+                            this._internalJavaScriptTokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/javascript");
+                            this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.initialCondition;
+                        }
+                        // Do not tokenize script tag contents.
+                        return cursor;
+                    }
+
+                    this._condition.parseCondition = this._parseConditions.INITIAL;
+                    return cursor;
+                }
+case 98:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 99:
+            if (yych <= '\f') {
+                if (yych != '\n') { gotoCase = 98; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 100; continue; };
+                if (yych == '\'') { gotoCase = 102; continue; };
+                { gotoCase = 98; continue; };
+            }
+case 100:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { return this._stringToken(cursor); }
+case 102:
+            ++cursor;
+            { return this._stringToken(cursor, true); }
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 105:
+            if (yych <= '\f') {
+                if (yych != '\n') { gotoCase = 104; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 106; continue; };
+                if (yych == '"') { gotoCase = 102; continue; };
+                { gotoCase = 104; continue; };
+            }
+case 106:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { return this._stringToken(cursor); }
+case 108:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 109:
+            if (yych <= '"') {
+                if (yych <= '\r') {
+                    if (yych == '\n') { gotoCase = 89; continue; };
+                    if (yych <= '\f') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                } else {
+                    if (yych == ' ') { gotoCase = 89; continue; };
+                    if (yych <= '!') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                }
+            } else {
+                if (yych <= '>') {
+                    if (yych == '\'') { gotoCase = 89; continue; };
+                    if (yych <= ';') { gotoCase = 108; continue; };
+                    { gotoCase = 89; continue; };
+                } else {
+                    if (yych <= '[') {
+                        if (yych <= 'Z') { gotoCase = 108; continue; };
+                        { gotoCase = 89; continue; };
+                    } else {
+                        if (yych == ']') { gotoCase = 89; continue; };
+                        { gotoCase = 108; continue; };
+                    }
+                }
+            }
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceHTMLTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceJavaScriptTokenizer.js */
+
+/* Generated by re2c 0.13.5 on Thu Feb 25 21:44:55 2010 */
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Generate js file as follows:
+//
+// re2c -isc WebCore/inspector/front-end/SourceJavaScriptTokenizer.re2js \
+// | sed 's|^yy\([^:]*\)*\:|case \1:|' \
+// | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
+// | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
+// | sed 's|[*]cursor|this._charAt(cursor)|' \
+// | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
+// | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
+// | sed 's|unsigned\ int|var|' \
+// | sed 's|var\ yych|case 1: case 1: var yych|'
+
+WebInspector.SourceJavaScriptTokenizer = function()
+{
+    WebInspector.SourceTokenizer.call(this);
+
+    this._keywords = [
+        "null", "true", "false", "break", "case", "catch", "const", "default", "finally", "for",
+        "instanceof", "new", "var", "continue", "function", "return", "void", "delete", "if",
+        "this", "do", "while", "else", "in", "switch", "throw", "try", "typeof", "debugger",
+        "class", "enum", "export", "extends", "import", "super", "get", "set", "with"
+    ].keySet();
+
+    this._lexConditions = {
+        DIV: 0,
+        NODIV: 1,
+        COMMENT: 2,
+        DSTRING: 3,
+        SSTRING: 4,
+        REGEX: 5
+    };
+
+    this.case_DIV = 1000;
+    this.case_NODIV = 1001;
+    this.case_COMMENT = 1002;
+    this.case_DSTRING = 1003;
+    this.case_SSTRING = 1004;
+    this.case_REGEX = 1005;
+
+    this.initialCondition = { lexCondition: this._lexConditions.NODIV }
+    this.condition = this.initialCondition;
+}
+
+WebInspector.SourceJavaScriptTokenizer.prototype = {
+    nextToken: function(cursor)
+    {
+        var cursorOnEnter = cursor;
+        var gotoCase = 1;
+        while (1) {
+            switch (gotoCase)
+            // Following comment is replaced with generated state machine.
+            
+        {
+            case 1: var yych;
+            var yyaccept = 0;
+            if (this.getLexCondition() < 3) {
+                if (this.getLexCondition() < 1) {
+                    { gotoCase = this.case_DIV; continue; };
+                } else {
+                    if (this.getLexCondition() < 2) {
+                        { gotoCase = this.case_NODIV; continue; };
+                    } else {
+                        { gotoCase = this.case_COMMENT; continue; };
+                    }
+                }
+            } else {
+                if (this.getLexCondition() < 4) {
+                    { gotoCase = this.case_DSTRING; continue; };
+                } else {
+                    if (this.getLexCondition() < 5) {
+                        { gotoCase = this.case_SSTRING; continue; };
+                    } else {
+                        { gotoCase = this.case_REGEX; continue; };
+                    }
+                }
+            }
+/* *********************************** */
+case this.case_COMMENT:
+
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 4; continue; };
+                { gotoCase = 3; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 4; continue; };
+                if (yych == '*') { gotoCase = 6; continue; };
+                { gotoCase = 3; continue; };
+            }
+case 2:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 3:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 12; continue; };
+case 4:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 6:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych != '/') { gotoCase = 11; continue; };
+case 7:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 9:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 9; continue; };
+            if (yych == '/') { gotoCase = 7; continue; };
+case 11:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 12:
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 2; continue; };
+                { gotoCase = 11; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 2; continue; };
+                if (yych == '*') { gotoCase = 9; continue; };
+                { gotoCase = 11; continue; };
+            }
+/* *********************************** */
+case this.case_DIV:
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych <= '(') {
+                    if (yych <= '#') {
+                        if (yych <= ' ') { gotoCase = 15; continue; };
+                        if (yych <= '!') { gotoCase = 17; continue; };
+                        if (yych <= '"') { gotoCase = 19; continue; };
+                    } else {
+                        if (yych <= '%') {
+                            if (yych <= '$') { gotoCase = 20; continue; };
+                            { gotoCase = 22; continue; };
+                        } else {
+                            if (yych <= '&') { gotoCase = 23; continue; };
+                            if (yych <= '\'') { gotoCase = 24; continue; };
+                            { gotoCase = 25; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= ')') { gotoCase = 26; continue; };
+                        if (yych <= '*') { gotoCase = 28; continue; };
+                        if (yych <= '+') { gotoCase = 29; continue; };
+                        { gotoCase = 25; continue; };
+                    } else {
+                        if (yych <= '.') {
+                            if (yych <= '-') { gotoCase = 30; continue; };
+                            { gotoCase = 31; continue; };
+                        } else {
+                            if (yych <= '/') { gotoCase = 32; continue; };
+                            if (yych <= '0') { gotoCase = 34; continue; };
+                            { gotoCase = 36; continue; };
+                        }
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '>') {
+                        if (yych <= ';') { gotoCase = 25; continue; };
+                        if (yych <= '<') { gotoCase = 37; continue; };
+                        if (yych <= '=') { gotoCase = 38; continue; };
+                        { gotoCase = 39; continue; };
+                    } else {
+                        if (yych <= '@') {
+                            if (yych <= '?') { gotoCase = 25; continue; };
+                        } else {
+                            if (yych <= 'Z') { gotoCase = 20; continue; };
+                            if (yych <= '[') { gotoCase = 25; continue; };
+                            { gotoCase = 40; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych <= '^') {
+                            if (yych <= ']') { gotoCase = 25; continue; };
+                            { gotoCase = 41; continue; };
+                        } else {
+                            if (yych != '`') { gotoCase = 20; continue; };
+                        }
+                    } else {
+                        if (yych <= '|') {
+                            if (yych <= '{') { gotoCase = 25; continue; };
+                            { gotoCase = 42; continue; };
+                        } else {
+                            if (yych <= '~') { gotoCase = 25; continue; };
+                            if (yych >= 0x80) { gotoCase = 20; continue; };
+                        }
+                    }
+                }
+            }
+case 15:
+            ++cursor;
+case 16:
+            { this.tokenType = null; return cursor; }
+case 17:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 115; continue; };
+case 18:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = null; return cursor; }
+case 19:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 16; continue; };
+            if (yych == '\r') { gotoCase = 16; continue; };
+            { gotoCase = 107; continue; };
+case 20:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 50; continue; };
+case 21:
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (token in this._keywords)
+                        this.tokenType = "javascript-keyword";
+                    else
+                        this.tokenType = "javascript-ident";
+                    return cursor;
+                }
+case 22:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 23:
+            yych = this._charAt(++cursor);
+            if (yych == '&') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 24:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 16; continue; };
+            if (yych == '\r') { gotoCase = 16; continue; };
+            { gotoCase = 96; continue; };
+case 25:
+            yych = this._charAt(++cursor);
+            { gotoCase = 18; continue; };
+case 26:
+            ++cursor;
+            { this.tokenType = null; return cursor; }
+case 28:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 29:
+            yych = this._charAt(++cursor);
+            if (yych == '+') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 30:
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 43; continue; };
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 31:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 18; continue; };
+            if (yych <= '9') { gotoCase = 89; continue; };
+            { gotoCase = 18; continue; };
+case 32:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '.') {
+                if (yych == '*') { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '/') { gotoCase = 80; continue; };
+                if (yych == '=') { gotoCase = 77; continue; };
+            }
+case 33:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = null; return cursor; }
+case 34:
+            yyaccept = 3;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'E') {
+                if (yych <= '/') {
+                    if (yych == '.') { gotoCase = 63; continue; };
+                } else {
+                    if (yych <= '7') { gotoCase = 72; continue; };
+                    if (yych >= 'E') { gotoCase = 62; continue; };
+                }
+            } else {
+                if (yych <= 'd') {
+                    if (yych == 'X') { gotoCase = 74; continue; };
+                } else {
+                    if (yych <= 'e') { gotoCase = 62; continue; };
+                    if (yych == 'x') { gotoCase = 74; continue; };
+                }
+            }
+case 35:
+            { this.tokenType = "javascript-number"; return cursor; }
+case 36:
+            yyaccept = 3;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 63; continue; };
+                if (yych <= '/') { gotoCase = 35; continue; };
+                { gotoCase = 60; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 35; continue; };
+                    { gotoCase = 62; continue; };
+                } else {
+                    if (yych == 'e') { gotoCase = 62; continue; };
+                    { gotoCase = 35; continue; };
+                }
+            }
+case 37:
+            yych = this._charAt(++cursor);
+            if (yych <= ';') { gotoCase = 18; continue; };
+            if (yych <= '<') { gotoCase = 59; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 38:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 58; continue; };
+            { gotoCase = 18; continue; };
+case 39:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 18; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            if (yych <= '>') { gotoCase = 56; continue; };
+            { gotoCase = 18; continue; };
+case 40:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'u') { gotoCase = 44; continue; };
+            { gotoCase = 16; continue; };
+case 41:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 42:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            if (yych != '|') { gotoCase = 18; continue; };
+case 43:
+            yych = this._charAt(++cursor);
+            { gotoCase = 18; continue; };
+case 44:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 46; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 46; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 46; continue; };
+            }
+case 45:
+            cursor = YYMARKER;
+            if (yyaccept <= 1) {
+                if (yyaccept <= 0) {
+                    { gotoCase = 16; continue; };
+                } else {
+                    { gotoCase = 21; continue; };
+                }
+            } else {
+                if (yyaccept <= 2) {
+                    { gotoCase = 33; continue; };
+                } else {
+                    { gotoCase = 35; continue; };
+                }
+            }
+case 46:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 47; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 47:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 48; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 48:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 49; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 49:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 50:
+            if (yych <= '[') {
+                if (yych <= '/') {
+                    if (yych == '$') { gotoCase = 49; continue; };
+                    { gotoCase = 21; continue; };
+                } else {
+                    if (yych <= '9') { gotoCase = 49; continue; };
+                    if (yych <= '@') { gotoCase = 21; continue; };
+                    if (yych <= 'Z') { gotoCase = 49; continue; };
+                    { gotoCase = 21; continue; };
+                }
+            } else {
+                if (yych <= '_') {
+                    if (yych <= '\\') { gotoCase = 51; continue; };
+                    if (yych <= '^') { gotoCase = 21; continue; };
+                    { gotoCase = 49; continue; };
+                } else {
+                    if (yych <= '`') { gotoCase = 21; continue; };
+                    if (yych <= 'z') { gotoCase = 49; continue; };
+                    if (yych <= 0x7F) { gotoCase = 21; continue; };
+                    { gotoCase = 49; continue; };
+                }
+            }
+case 51:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != 'u') { gotoCase = 45; continue; };
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 53; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 53:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 54; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 54:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 55; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 55:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 49; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 49; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 49; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 56:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 18; continue; };
+            if (yych <= '=') { gotoCase = 43; continue; };
+            if (yych >= '?') { gotoCase = 18; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 58:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 59:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+case 60:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 63; continue; };
+                if (yych <= '/') { gotoCase = 35; continue; };
+                { gotoCase = 60; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 35; continue; };
+                } else {
+                    if (yych != 'e') { gotoCase = 35; continue; };
+                }
+            }
+case 62:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych == '+') { gotoCase = 69; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 69; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 70; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 63:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 63; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 65; continue; };
+                if (yych != 'e') { gotoCase = 35; continue; };
+            }
+case 65:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 66; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 67; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 66:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 67:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 67; continue; };
+            { gotoCase = 35; continue; };
+case 69:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 70:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 70; continue; };
+            { gotoCase = 35; continue; };
+case 72:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '7') { gotoCase = 72; continue; };
+            { gotoCase = 35; continue; };
+case 74:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 75; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 75:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 75; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 75; continue; };
+                if (yych <= '`') { gotoCase = 35; continue; };
+                if (yych <= 'f') { gotoCase = 75; continue; };
+                { gotoCase = 35; continue; };
+            }
+case 77:
+            yych = this._charAt(++cursor);
+            { gotoCase = 33; continue; };
+case 78:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 85; continue; };
+                { gotoCase = 78; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 85; continue; };
+                if (yych == '*') { gotoCase = 83; continue; };
+                { gotoCase = 78; continue; };
+            }
+case 80:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 82; continue; };
+            if (yych != '\r') { gotoCase = 80; continue; };
+case 82:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 83:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 83; continue; };
+            if (yych == '/') { gotoCase = 87; continue; };
+            { gotoCase = 78; continue; };
+case 85:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 87:
+            ++cursor;
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 89:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 35; continue; };
+                if (yych <= '9') { gotoCase = 89; continue; };
+                { gotoCase = 35; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 91; continue; };
+                if (yych != 'e') { gotoCase = 35; continue; };
+            }
+case 91:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 92; continue; };
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 93; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 92:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 45; continue; };
+            if (yych >= ':') { gotoCase = 45; continue; };
+case 93:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 35; continue; };
+            if (yych <= '9') { gotoCase = 93; continue; };
+            { gotoCase = 35; continue; };
+case 95:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 96:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 45; continue; };
+                if (yych <= '\f') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 95; continue; };
+                    { gotoCase = 98; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 95; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 45; continue; };
+                        { gotoCase = 101; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 101; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 95; continue; };
+                        if (yych <= '&') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 95; continue; };
+                        if (yych <= 'e') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 45; continue; };
+                        { gotoCase = 95; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 100; continue; };
+                        if (yych <= 'v') { gotoCase = 95; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            }
+case 98:
+            ++cursor;
+            { this.tokenType = "javascript-string"; return cursor; }
+case 100:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 103; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 103; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 103; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 101:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 103:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 104; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 104:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 105; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 105:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 95; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 95; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 106:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 107:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 45; continue; };
+                if (yych <= '\f') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 106; continue; };
+                    { gotoCase = 98; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 106; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 45; continue; };
+                        { gotoCase = 110; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 110; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 106; continue; };
+                        if (yych <= '&') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 106; continue; };
+                        if (yych <= 'e') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 45; continue; };
+                        { gotoCase = 106; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 109; continue; };
+                        if (yych <= 'v') { gotoCase = 106; continue; };
+                        { gotoCase = 45; continue; };
+                    }
+                }
+            }
+case 109:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 112; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 112; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 112; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 110:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 112:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 113; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 113:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych >= ':') { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 114; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych >= 'g') { gotoCase = 45; continue; };
+            }
+case 114:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 45; continue; };
+                if (yych <= '9') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 106; continue; };
+                if (yych <= '`') { gotoCase = 45; continue; };
+                if (yych <= 'f') { gotoCase = 106; continue; };
+                { gotoCase = 45; continue; };
+            }
+case 115:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 43; continue; };
+            { gotoCase = 18; continue; };
+/* *********************************** */
+case this.case_DSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 120; continue; };
+                if (yych <= '\f') { gotoCase = 119; continue; };
+                { gotoCase = 120; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 119; continue; };
+                    { gotoCase = 122; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 124; continue; };
+                    { gotoCase = 119; continue; };
+                }
+            }
+case 118:
+            { this.tokenType = "javascript-string"; return cursor; }
+case 119:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 126; continue; };
+case 120:
+            ++cursor;
+case 121:
+            { this.tokenType = null; return cursor; }
+case 122:
+            ++cursor;
+case 123:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 124:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 125; continue; };
+                    if (yych <= '&') { gotoCase = 121; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 121; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 125; continue; };
+                        if (yych <= 'q') { gotoCase = 121; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 121; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 127; continue; };
+                        if (yych >= 'w') { gotoCase = 121; continue; };
+                    }
+                }
+            }
+case 125:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 126:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 118; continue; };
+                if (yych <= '\f') { gotoCase = 125; continue; };
+                { gotoCase = 118; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 125; continue; };
+                    { gotoCase = 133; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 132; continue; };
+                    { gotoCase = 125; continue; };
+                }
+            }
+case 127:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych <= '9') { gotoCase = 129; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 129; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych <= 'f') { gotoCase = 129; continue; };
+            }
+case 128:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 118; continue; };
+            } else {
+                { gotoCase = 121; continue; };
+            }
+case 129:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych >= ':') { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 130; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych >= 'g') { gotoCase = 128; continue; };
+            }
+case 130:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych >= ':') { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 131; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych >= 'g') { gotoCase = 128; continue; };
+            }
+case 131:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 128; continue; };
+                if (yych <= '9') { gotoCase = 125; continue; };
+                { gotoCase = 128; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 125; continue; };
+                if (yych <= '`') { gotoCase = 128; continue; };
+                if (yych <= 'f') { gotoCase = 125; continue; };
+                { gotoCase = 128; continue; };
+            }
+case 132:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 125; continue; };
+                    if (yych <= '&') { gotoCase = 128; continue; };
+                    { gotoCase = 125; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 125; continue; };
+                        if (yych <= 'q') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 128; continue; };
+                        { gotoCase = 125; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 127; continue; };
+                        if (yych <= 'v') { gotoCase = 125; continue; };
+                        { gotoCase = 128; continue; };
+                    }
+                }
+            }
+case 133:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 123; continue; };
+/* *********************************** */
+case this.case_NODIV:
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych <= '(') {
+                    if (yych <= '#') {
+                        if (yych <= ' ') { gotoCase = 136; continue; };
+                        if (yych <= '!') { gotoCase = 138; continue; };
+                        if (yych <= '"') { gotoCase = 140; continue; };
+                    } else {
+                        if (yych <= '%') {
+                            if (yych <= '$') { gotoCase = 141; continue; };
+                            { gotoCase = 143; continue; };
+                        } else {
+                            if (yych <= '&') { gotoCase = 144; continue; };
+                            if (yych <= '\'') { gotoCase = 145; continue; };
+                            { gotoCase = 146; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= ',') {
+                        if (yych <= ')') { gotoCase = 147; continue; };
+                        if (yych <= '*') { gotoCase = 149; continue; };
+                        if (yych <= '+') { gotoCase = 150; continue; };
+                        { gotoCase = 146; continue; };
+                    } else {
+                        if (yych <= '.') {
+                            if (yych <= '-') { gotoCase = 151; continue; };
+                            { gotoCase = 152; continue; };
+                        } else {
+                            if (yych <= '/') { gotoCase = 153; continue; };
+                            if (yych <= '0') { gotoCase = 154; continue; };
+                            { gotoCase = 156; continue; };
+                        }
+                    }
+                }
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '>') {
+                        if (yych <= ';') { gotoCase = 146; continue; };
+                        if (yych <= '<') { gotoCase = 157; continue; };
+                        if (yych <= '=') { gotoCase = 158; continue; };
+                        { gotoCase = 159; continue; };
+                    } else {
+                        if (yych <= '@') {
+                            if (yych <= '?') { gotoCase = 146; continue; };
+                        } else {
+                            if (yych <= 'Z') { gotoCase = 141; continue; };
+                            if (yych <= '[') { gotoCase = 146; continue; };
+                            { gotoCase = 160; continue; };
+                        }
+                    }
+                } else {
+                    if (yych <= 'z') {
+                        if (yych <= '^') {
+                            if (yych <= ']') { gotoCase = 146; continue; };
+                            { gotoCase = 161; continue; };
+                        } else {
+                            if (yych != '`') { gotoCase = 141; continue; };
+                        }
+                    } else {
+                        if (yych <= '|') {
+                            if (yych <= '{') { gotoCase = 146; continue; };
+                            { gotoCase = 162; continue; };
+                        } else {
+                            if (yych <= '~') { gotoCase = 146; continue; };
+                            if (yych >= 0x80) { gotoCase = 141; continue; };
+                        }
+                    }
+                }
+            }
+case 136:
+            ++cursor;
+case 137:
+            { this.tokenType = null; return cursor; }
+case 138:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 260; continue; };
+case 139:
+            { this.tokenType = null; return cursor; }
+case 140:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 137; continue; };
+            if (yych == '\r') { gotoCase = 137; continue; };
+            { gotoCase = 252; continue; };
+case 141:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 170; continue; };
+case 142:
+            this.setLexCondition(this._lexConditions.DIV);
+            {
+                    var token = this._line.substring(cursorOnEnter, cursor);
+                    if (token in this._keywords)
+                        this.tokenType = "javascript-keyword";
+                    else
+                        this.tokenType = "javascript-ident";
+                    return cursor;
+                }
+case 143:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 144:
+            yych = this._charAt(++cursor);
+            if (yych == '&') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 145:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == '\n') { gotoCase = 137; continue; };
+            if (yych == '\r') { gotoCase = 137; continue; };
+            { gotoCase = 241; continue; };
+case 146:
+            yych = this._charAt(++cursor);
+            { gotoCase = 139; continue; };
+case 147:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DIV);
+            { this.tokenType = null; return cursor; }
+case 149:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 150:
+            yych = this._charAt(++cursor);
+            if (yych == '+') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 151:
+            yych = this._charAt(++cursor);
+            if (yych == '-') { gotoCase = 163; continue; };
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 152:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 139; continue; };
+            if (yych <= '9') { gotoCase = 234; continue; };
+            { gotoCase = 139; continue; };
+case 153:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 137; continue; };
+                    { gotoCase = 197; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 137; continue; };
+                    if (yych <= ')') { gotoCase = 197; continue; };
+                    { gotoCase = 202; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 204; continue; };
+                    { gotoCase = 197; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 200; continue; };
+                    if (yych <= '\\') { gotoCase = 199; continue; };
+                    if (yych <= ']') { gotoCase = 137; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            }
+case 154:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'E') {
+                if (yych <= '/') {
+                    if (yych == '.') { gotoCase = 183; continue; };
+                } else {
+                    if (yych <= '7') { gotoCase = 192; continue; };
+                    if (yych >= 'E') { gotoCase = 182; continue; };
+                }
+            } else {
+                if (yych <= 'd') {
+                    if (yych == 'X') { gotoCase = 194; continue; };
+                } else {
+                    if (yych <= 'e') { gotoCase = 182; continue; };
+                    if (yych == 'x') { gotoCase = 194; continue; };
+                }
+            }
+case 155:
+            this.setLexCondition(this._lexConditions.DIV);
+            { this.tokenType = "javascript-number"; return cursor; }
+case 156:
+            yyaccept = 2;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 183; continue; };
+                if (yych <= '/') { gotoCase = 155; continue; };
+                { gotoCase = 180; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 155; continue; };
+                    { gotoCase = 182; continue; };
+                } else {
+                    if (yych == 'e') { gotoCase = 182; continue; };
+                    { gotoCase = 155; continue; };
+                }
+            }
+case 157:
+            yych = this._charAt(++cursor);
+            if (yych <= ';') { gotoCase = 139; continue; };
+            if (yych <= '<') { gotoCase = 179; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 158:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 178; continue; };
+            { gotoCase = 139; continue; };
+case 159:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 139; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            if (yych <= '>') { gotoCase = 176; continue; };
+            { gotoCase = 139; continue; };
+case 160:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych == 'u') { gotoCase = 164; continue; };
+            { gotoCase = 137; continue; };
+case 161:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 162:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            if (yych != '|') { gotoCase = 139; continue; };
+case 163:
+            yych = this._charAt(++cursor);
+            { gotoCase = 139; continue; };
+case 164:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 166; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 166; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 166; continue; };
+            }
+case 165:
+            cursor = YYMARKER;
+            if (yyaccept <= 1) {
+                if (yyaccept <= 0) {
+                    { gotoCase = 137; continue; };
+                } else {
+                    { gotoCase = 142; continue; };
+                }
+            } else {
+                if (yyaccept <= 2) {
+                    { gotoCase = 155; continue; };
+                } else {
+                    { gotoCase = 217; continue; };
+                }
+            }
+case 166:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 167; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 167:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 168; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 168:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 169; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 169:
+            yyaccept = 1;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 170:
+            if (yych <= '[') {
+                if (yych <= '/') {
+                    if (yych == '$') { gotoCase = 169; continue; };
+                    { gotoCase = 142; continue; };
+                } else {
+                    if (yych <= '9') { gotoCase = 169; continue; };
+                    if (yych <= '@') { gotoCase = 142; continue; };
+                    if (yych <= 'Z') { gotoCase = 169; continue; };
+                    { gotoCase = 142; continue; };
+                }
+            } else {
+                if (yych <= '_') {
+                    if (yych <= '\\') { gotoCase = 171; continue; };
+                    if (yych <= '^') { gotoCase = 142; continue; };
+                    { gotoCase = 169; continue; };
+                } else {
+                    if (yych <= '`') { gotoCase = 142; continue; };
+                    if (yych <= 'z') { gotoCase = 169; continue; };
+                    if (yych <= 0x7F) { gotoCase = 142; continue; };
+                    { gotoCase = 169; continue; };
+                }
+            }
+case 171:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych != 'u') { gotoCase = 165; continue; };
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 173; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 173:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 174; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 174:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 175; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 175:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 169; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 169; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 169; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 176:
+            yych = this._charAt(++cursor);
+            if (yych <= '<') { gotoCase = 139; continue; };
+            if (yych <= '=') { gotoCase = 163; continue; };
+            if (yych >= '?') { gotoCase = 139; continue; };
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 178:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 179:
+            yych = this._charAt(++cursor);
+            if (yych == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+case 180:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '9') {
+                if (yych == '.') { gotoCase = 183; continue; };
+                if (yych <= '/') { gotoCase = 155; continue; };
+                { gotoCase = 180; continue; };
+            } else {
+                if (yych <= 'E') {
+                    if (yych <= 'D') { gotoCase = 155; continue; };
+                } else {
+                    if (yych != 'e') { gotoCase = 155; continue; };
+                }
+            }
+case 182:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych == '+') { gotoCase = 189; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 189; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 190; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 183:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 183; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 185; continue; };
+                if (yych != 'e') { gotoCase = 155; continue; };
+            }
+case 185:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 186; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 187; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 186:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 187:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 187; continue; };
+            { gotoCase = 155; continue; };
+case 189:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 190:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 190; continue; };
+            { gotoCase = 155; continue; };
+case 192:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '7') { gotoCase = 192; continue; };
+            { gotoCase = 155; continue; };
+case 194:
+            yych = this._charAt(++cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 195; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 195:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 195; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 195; continue; };
+                if (yych <= '`') { gotoCase = 155; continue; };
+                if (yych <= 'f') { gotoCase = 195; continue; };
+                { gotoCase = 155; continue; };
+            }
+case 197:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 197; continue; };
+                    { gotoCase = 165; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 165; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 220; continue; };
+                    if (yych <= 'Z') { gotoCase = 197; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 227; continue; };
+                    if (yych <= ']') { gotoCase = 165; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            }
+case 199:
+            yych = this._charAt(++cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 197; continue; };
+case 200:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 200; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 200; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 200; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 215; continue; };
+                    if (yych <= ']') { gotoCase = 213; continue; };
+                    { gotoCase = 200; continue; };
+                }
+            }
+case 202:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '\f') {
+                if (yych == '\n') { gotoCase = 209; continue; };
+                { gotoCase = 202; continue; };
+            } else {
+                if (yych <= '\r') { gotoCase = 209; continue; };
+                if (yych == '*') { gotoCase = 207; continue; };
+                { gotoCase = 202; continue; };
+            }
+case 204:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 206; continue; };
+            if (yych != '\r') { gotoCase = 204; continue; };
+case 206:
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 207:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '*') { gotoCase = 207; continue; };
+            if (yych == '/') { gotoCase = 211; continue; };
+            { gotoCase = 202; continue; };
+case 209:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.COMMENT);
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 211:
+            ++cursor;
+            { this.tokenType = "javascript-comment"; return cursor; }
+case 213:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 213; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 213; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 213; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 218; continue; };
+                    if (yych <= '\\') { gotoCase = 216; continue; };
+                    { gotoCase = 213; continue; };
+                }
+            }
+case 215:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 200; continue; };
+case 216:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych != '\r') { gotoCase = 213; continue; };
+case 217:
+            this.setLexCondition(this._lexConditions.REGEX);
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 218:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 218; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 218; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 218; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 225; continue; };
+                    if (yych <= ']') { gotoCase = 223; continue; };
+                    { gotoCase = 218; continue; };
+                }
+            }
+case 220:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'h') {
+                if (yych == 'g') { gotoCase = 220; continue; };
+            } else {
+                if (yych <= 'i') { gotoCase = 220; continue; };
+                if (yych == 'm') { gotoCase = 220; continue; };
+            }
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 223:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 223; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 223; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 223; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 218; continue; };
+                    if (yych <= '\\') { gotoCase = 226; continue; };
+                    { gotoCase = 223; continue; };
+                }
+            }
+case 225:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 218; continue; };
+case 226:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 223; continue; };
+case 227:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 197; continue; };
+case 228:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 228; continue; };
+                    { gotoCase = 165; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 165; continue; };
+                    { gotoCase = 228; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 232; continue; };
+                    if (yych >= '^') { gotoCase = 228; continue; };
+                }
+            }
+case 230:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 165; continue; };
+                    { gotoCase = 230; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 165; continue; };
+                    if (yych <= ')') { gotoCase = 230; continue; };
+                    { gotoCase = 197; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 220; continue; };
+                    { gotoCase = 230; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 228; continue; };
+                    if (yych <= '\\') { gotoCase = 233; continue; };
+                    { gotoCase = 230; continue; };
+                }
+            }
+case 232:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 165; continue; };
+            if (yych == '\r') { gotoCase = 165; continue; };
+            { gotoCase = 228; continue; };
+case 233:
+            yyaccept = 3;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 217; continue; };
+            if (yych == '\r') { gotoCase = 217; continue; };
+            { gotoCase = 230; continue; };
+case 234:
+            yyaccept = 2;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'D') {
+                if (yych <= '/') { gotoCase = 155; continue; };
+                if (yych <= '9') { gotoCase = 234; continue; };
+                { gotoCase = 155; continue; };
+            } else {
+                if (yych <= 'E') { gotoCase = 236; continue; };
+                if (yych != 'e') { gotoCase = 155; continue; };
+            }
+case 236:
+            yych = this._charAt(++cursor);
+            if (yych <= ',') {
+                if (yych != '+') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '-') { gotoCase = 237; continue; };
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 238; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 237:
+            yych = this._charAt(++cursor);
+            if (yych <= '/') { gotoCase = 165; continue; };
+            if (yych >= ':') { gotoCase = 165; continue; };
+case 238:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '/') { gotoCase = 155; continue; };
+            if (yych <= '9') { gotoCase = 238; continue; };
+            { gotoCase = 155; continue; };
+case 240:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 241:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 165; continue; };
+                if (yych <= '\f') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 240; continue; };
+                    { gotoCase = 243; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 240; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 165; continue; };
+                        { gotoCase = 246; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 246; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 240; continue; };
+                        if (yych <= '&') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 240; continue; };
+                        if (yych <= 'e') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 165; continue; };
+                        { gotoCase = 240; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 245; continue; };
+                        if (yych <= 'v') { gotoCase = 240; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            }
+case 243:
+            ++cursor;
+            { this.tokenType = "javascript-string"; return cursor; }
+case 245:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 248; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 248; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 248; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 246:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.SSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 248:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 249; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 249:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 250; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 250:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 240; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 240; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 251:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 252:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 165; continue; };
+                if (yych <= '\f') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= '"') {
+                    if (yych <= '!') { gotoCase = 251; continue; };
+                    { gotoCase = 243; continue; };
+                } else {
+                    if (yych != '\\') { gotoCase = 251; continue; };
+                }
+            }
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'a') {
+                if (yych <= '!') {
+                    if (yych <= '\n') {
+                        if (yych <= '\t') { gotoCase = 165; continue; };
+                        { gotoCase = 255; continue; };
+                    } else {
+                        if (yych == '\r') { gotoCase = 255; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= '\'') {
+                        if (yych <= '"') { gotoCase = 251; continue; };
+                        if (yych <= '&') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych == '\\') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'q') {
+                    if (yych <= 'f') {
+                        if (yych <= 'b') { gotoCase = 251; continue; };
+                        if (yych <= 'e') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych == 'n') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych == 's') { gotoCase = 165; continue; };
+                        { gotoCase = 251; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 254; continue; };
+                        if (yych <= 'v') { gotoCase = 251; continue; };
+                        { gotoCase = 165; continue; };
+                    }
+                }
+            }
+case 254:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 257; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 257; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 257; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 255:
+            ++cursor;
+            this.setLexCondition(this._lexConditions.DSTRING);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 257:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 258; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 258:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych >= ':') { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 259; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych >= 'g') { gotoCase = 165; continue; };
+            }
+case 259:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 165; continue; };
+                if (yych <= '9') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 251; continue; };
+                if (yych <= '`') { gotoCase = 165; continue; };
+                if (yych <= 'f') { gotoCase = 251; continue; };
+                { gotoCase = 165; continue; };
+            }
+case 260:
+            ++cursor;
+            if ((yych = this._charAt(cursor)) == '=') { gotoCase = 163; continue; };
+            { gotoCase = 139; continue; };
+/* *********************************** */
+case this.case_REGEX:
+            yych = this._charAt(cursor);
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 264; continue; };
+                    { gotoCase = 265; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 265; continue; };
+                    { gotoCase = 264; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 267; continue; };
+                    if (yych <= 'Z') { gotoCase = 264; continue; };
+                    { gotoCase = 269; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 270; continue; };
+                    if (yych <= ']') { gotoCase = 265; continue; };
+                    { gotoCase = 264; continue; };
+                }
+            }
+case 263:
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 264:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 272; continue; };
+case 265:
+            ++cursor;
+case 266:
+            { this.tokenType = null; return cursor; }
+case 267:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 278; continue; };
+case 268:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-regexp"; return cursor; }
+case 269:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 266; continue; };
+                if (yych <= '\f') { gotoCase = 276; continue; };
+                { gotoCase = 266; continue; };
+            } else {
+                if (yych <= '*') {
+                    if (yych <= ')') { gotoCase = 276; continue; };
+                    { gotoCase = 266; continue; };
+                } else {
+                    if (yych == '/') { gotoCase = 266; continue; };
+                    { gotoCase = 276; continue; };
+                }
+            }
+case 270:
+            yych = this._charAt(++cursor);
+            if (yych == '\n') { gotoCase = 266; continue; };
+            if (yych == '\r') { gotoCase = 266; continue; };
+case 271:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 272:
+            if (yych <= '.') {
+                if (yych <= '\n') {
+                    if (yych <= '\t') { gotoCase = 271; continue; };
+                    { gotoCase = 263; continue; };
+                } else {
+                    if (yych == '\r') { gotoCase = 263; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych <= '/') { gotoCase = 277; continue; };
+                    if (yych <= 'Z') { gotoCase = 271; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 273; continue; };
+                    if (yych <= ']') { gotoCase = 263; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            }
+case 273:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych != '\r') { gotoCase = 271; continue; };
+case 274:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 263; continue; };
+            } else {
+                { gotoCase = 266; continue; };
+            }
+case 275:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 276:
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 274; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 274; continue; };
+                    if (yych <= ')') { gotoCase = 275; continue; };
+                    { gotoCase = 274; continue; };
+                }
+            } else {
+                if (yych <= '[') {
+                    if (yych == '/') { gotoCase = 274; continue; };
+                    { gotoCase = 275; continue; };
+                } else {
+                    if (yych <= '\\') { gotoCase = 281; continue; };
+                    if (yych <= ']') { gotoCase = 279; continue; };
+                    { gotoCase = 275; continue; };
+                }
+            }
+case 277:
+            ++cursor;
+            yych = this._charAt(cursor);
+case 278:
+            if (yych <= 'h') {
+                if (yych == 'g') { gotoCase = 277; continue; };
+                { gotoCase = 268; continue; };
+            } else {
+                if (yych <= 'i') { gotoCase = 277; continue; };
+                if (yych == 'm') { gotoCase = 277; continue; };
+                { gotoCase = 268; continue; };
+            }
+case 279:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '*') {
+                if (yych <= '\f') {
+                    if (yych == '\n') { gotoCase = 263; continue; };
+                    { gotoCase = 279; continue; };
+                } else {
+                    if (yych <= '\r') { gotoCase = 263; continue; };
+                    if (yych <= ')') { gotoCase = 279; continue; };
+                    { gotoCase = 271; continue; };
+                }
+            } else {
+                if (yych <= 'Z') {
+                    if (yych == '/') { gotoCase = 277; continue; };
+                    { gotoCase = 279; continue; };
+                } else {
+                    if (yych <= '[') { gotoCase = 275; continue; };
+                    if (yych <= '\\') { gotoCase = 282; continue; };
+                    { gotoCase = 279; continue; };
+                }
+            }
+case 281:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych == '\r') { gotoCase = 274; continue; };
+            { gotoCase = 275; continue; };
+case 282:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych == '\n') { gotoCase = 274; continue; };
+            if (yych == '\r') { gotoCase = 274; continue; };
+            { gotoCase = 279; continue; };
+/* *********************************** */
+case this.case_SSTRING:
+            yych = this._charAt(cursor);
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 287; continue; };
+                if (yych <= '\f') { gotoCase = 286; continue; };
+                { gotoCase = 287; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 286; continue; };
+                    { gotoCase = 289; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 291; continue; };
+                    { gotoCase = 286; continue; };
+                }
+            }
+case 285:
+            { this.tokenType = "javascript-string"; return cursor; }
+case 286:
+            yyaccept = 0;
+            yych = this._charAt(YYMARKER = ++cursor);
+            { gotoCase = 293; continue; };
+case 287:
+            ++cursor;
+case 288:
+            { this.tokenType = null; return cursor; }
+case 289:
+            ++cursor;
+case 290:
+            this.setLexCondition(this._lexConditions.NODIV);
+            { this.tokenType = "javascript-string"; return cursor; }
+case 291:
+            yyaccept = 1;
+            yych = this._charAt(YYMARKER = ++cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 292; continue; };
+                    if (yych <= '&') { gotoCase = 288; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych != 'b') { gotoCase = 288; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych >= 'g') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 292; continue; };
+                        if (yych <= 'q') { gotoCase = 288; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 288; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 294; continue; };
+                        if (yych >= 'w') { gotoCase = 288; continue; };
+                    }
+                }
+            }
+case 292:
+            yyaccept = 0;
+            YYMARKER = ++cursor;
+            yych = this._charAt(cursor);
+case 293:
+            if (yych <= '\r') {
+                if (yych == '\n') { gotoCase = 285; continue; };
+                if (yych <= '\f') { gotoCase = 292; continue; };
+                { gotoCase = 285; continue; };
+            } else {
+                if (yych <= '\'') {
+                    if (yych <= '&') { gotoCase = 292; continue; };
+                    { gotoCase = 300; continue; };
+                } else {
+                    if (yych == '\\') { gotoCase = 299; continue; };
+                    { gotoCase = 292; continue; };
+                }
+            }
+case 294:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych <= '9') { gotoCase = 296; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 296; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych <= 'f') { gotoCase = 296; continue; };
+            }
+case 295:
+            cursor = YYMARKER;
+            if (yyaccept <= 0) {
+                { gotoCase = 285; continue; };
+            } else {
+                { gotoCase = 288; continue; };
+            }
+case 296:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych >= ':') { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 297; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych >= 'g') { gotoCase = 295; continue; };
+            }
+case 297:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych >= ':') { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 298; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych >= 'g') { gotoCase = 295; continue; };
+            }
+case 298:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= '@') {
+                if (yych <= '/') { gotoCase = 295; continue; };
+                if (yych <= '9') { gotoCase = 292; continue; };
+                { gotoCase = 295; continue; };
+            } else {
+                if (yych <= 'F') { gotoCase = 292; continue; };
+                if (yych <= '`') { gotoCase = 295; continue; };
+                if (yych <= 'f') { gotoCase = 292; continue; };
+                { gotoCase = 295; continue; };
+            }
+case 299:
+            ++cursor;
+            yych = this._charAt(cursor);
+            if (yych <= 'e') {
+                if (yych <= '\'') {
+                    if (yych == '"') { gotoCase = 292; continue; };
+                    if (yych <= '&') { gotoCase = 295; continue; };
+                    { gotoCase = 292; continue; };
+                } else {
+                    if (yych <= '\\') {
+                        if (yych <= '[') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    } else {
+                        if (yych == 'b') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    }
+                }
+            } else {
+                if (yych <= 'r') {
+                    if (yych <= 'm') {
+                        if (yych <= 'f') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    } else {
+                        if (yych <= 'n') { gotoCase = 292; continue; };
+                        if (yych <= 'q') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    }
+                } else {
+                    if (yych <= 't') {
+                        if (yych <= 's') { gotoCase = 295; continue; };
+                        { gotoCase = 292; continue; };
+                    } else {
+                        if (yych <= 'u') { gotoCase = 294; continue; };
+                        if (yych <= 'v') { gotoCase = 292; continue; };
+                        { gotoCase = 295; continue; };
+                    }
+                }
+            }
+case 300:
+            ++cursor;
+            yych = this._charAt(cursor);
+            { gotoCase = 290; continue; };
+        }
+
+        }
+    }
+}
+
+WebInspector.SourceJavaScriptTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
+
+/* SourceView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("source");
+
+    this.sourceFrame = new WebInspector.SourceFrame(this.contentElement, this._addBreakpoint.bind(this), this._removeBreakpoint.bind(this));
+    resource.addEventListener("finished", this._resourceLoadingFinished, this);
+    this._frameNeedsSetup = true;
+}
+
+WebInspector.SourceView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.ResourceView.prototype.show.call(this, parentElement);
+        this.sourceFrame.visible = true;
+        this.resize();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this.sourceFrame.visible = false;
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.sourceFrame)
+            this.sourceFrame.resize();
+    },
+
+    setupSourceFrameIfNeeded: function()
+    {
+        if (!this._frameNeedsSetup)
+            return;
+
+        this.attach();
+
+        delete this._frameNeedsSetup;
+        WebInspector.getResourceContent(this.resource.identifier, this._contentLoaded.bind(this));
+    },
+
+    contentTabSelected: function()
+    {
+        this.setupSourceFrameIfNeeded();
+    },
+
+    _contentLoaded: function(content)
+    {
+        this.sourceFrame.setContent(this.resource.mimeType, content, this.resource.url);
+        this._sourceFrameSetupFinished();
+    },
+
+    _resourceLoadingFinished: function(event)
+    {
+        this._frameNeedsSetup = true;
+        this._sourceFrameSetup = false;
+        if (this.visible)
+            this.setupSourceFrameIfNeeded();
+        this.resource.removeEventListener("finished", this._resourceLoadingFinished, this);
+    },
+
+    _addBreakpoint: function(line)
+    {
+        var sourceID = null;
+        var closestStartingLine = 0;
+        var scripts = this.resource.scripts;
+        for (var i = 0; i < scripts.length; ++i) {
+            var script = scripts[i];
+            if (script.startingLine <= line && script.startingLine >= closestStartingLine) {
+                closestStartingLine = script.startingLine;
+                sourceID = script.sourceID;
+            }
+        }
+
+        if (WebInspector.panels.scripts) {
+            var breakpoint = new WebInspector.Breakpoint(this.resource.url, line, sourceID);
+            WebInspector.panels.scripts.addBreakpoint(breakpoint);
+        }
+    },
+
+    _removeBreakpoint: function(breakpoint)
+    {
+        if (WebInspector.panels.scripts)
+            WebInspector.panels.scripts.removeBreakpoint(breakpoint);
+    },
+
+    // The rest of the methods in this prototype need to be generic enough to work with a ScriptView.
+    // The ScriptView prototype pulls these methods into it's prototype to avoid duplicate code.
+
+    searchCanceled: function()
+    {
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+        this.sourceFrame.clearMarkedRange();
+        delete this._delayedFindSearchMatches;
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        this._searchFinishedCallback = finishedCallback;
+
+        function findSearchMatches(query, finishedCallback)
+        {
+            this._searchResults = this.sourceFrame.findSearchMatches(query);
+            if (this._searchResults)
+                finishedCallback(this, this._searchResults.length);
+        }
+
+        if (!this._sourceFrameSetup) {
+            // The search is performed in _sourceFrameSetupFinished by calling _delayedFindSearchMatches.
+            this._delayedFindSearchMatches = findSearchMatches.bind(this, query, finishedCallback);
+            this.setupSourceFrameIfNeeded();
+            return;
+        }
+
+        findSearchMatches.call(this, query, finishedCallback);
+    },
+
+    jumpToFirstSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToLastSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    showingFirstSearchResult: function()
+    {
+        return (this._currentSearchResultIndex === 0);
+    },
+
+    showingLastSearchResult: function()
+    {
+        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
+    },
+
+    revealLine: function(lineNumber)
+    {
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.revealLine(lineNumber);
+    },
+
+    highlightLine: function(lineNumber)
+    {
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.highlightLine(lineNumber);
+    },
+
+    addMessage: function(msg)
+    {
+        this.sourceFrame.addMessage(msg);
+    },
+
+    clearMessages: function()
+    {
+        this.sourceFrame.clearMessages();
+    },
+
+    _jumpToSearchResult: function(index)
+    {
+        var foundRange = this._searchResults[index];
+        if (!foundRange)
+            return;
+
+        this.sourceFrame.markAndRevealRange(foundRange);
+    },
+
+    _sourceFrameSetupFinished: function()
+    {
+        this._sourceFrameSetup = true;
+        this.resize();
+        if (this._delayedFindSearchMatches) {
+            this._delayedFindSearchMatches();
+            delete this._delayedFindSearchMatches;
+        }
+    }
+}
+
+WebInspector.SourceView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* FontView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.FontView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("font");
+
+    var uniqueFontName = "WebInspectorFontPreview" + this.resource.identifier;
+
+    this.fontStyleElement = document.createElement("style");
+    this.fontStyleElement.textContent = "@font-face { font-family: \"" + uniqueFontName + "\"; src: url(" + this.resource.url + "); }";
+    document.head.appendChild(this.fontStyleElement);
+
+    this.fontPreviewElement = document.createElement("div");
+    this.fontPreviewElement.className = "preview";
+    this.contentElement.appendChild(this.fontPreviewElement);
+
+    this.fontPreviewElement.style.setProperty("font-family", uniqueFontName, null);
+    this.fontPreviewElement.innerHTML = "ABCDEFGHIJKLM<br>NOPQRSTUVWXYZ<br>abcdefghijklm<br>nopqrstuvwxyz<br>1234567890";
+
+    this.updateFontPreviewSize();
+}
+
+WebInspector.FontView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.ResourceView.prototype.show.call(this, parentElement);
+        this.updateFontPreviewSize();
+    },
+
+    resize: function()
+    {
+        this.updateFontPreviewSize();
+    },
+
+    updateFontPreviewSize: function ()
+    {
+        if (!this.fontPreviewElement || !this.visible)
+            return;
+
+        this.fontPreviewElement.removeStyleClass("preview");
+
+        var measureFontSize = 50;
+        this.fontPreviewElement.style.setProperty("position", "absolute", null);
+        this.fontPreviewElement.style.setProperty("font-size", measureFontSize + "px", null);
+        this.fontPreviewElement.style.removeProperty("height");
+
+        var height = this.fontPreviewElement.offsetHeight;
+        var width = this.fontPreviewElement.offsetWidth;
+
+        var containerWidth = this.contentElement.offsetWidth;
+
+        // Subtract some padding. This should match the padding in the CSS plus room for the scrollbar.
+        containerWidth -= 40;
+
+        if (!height || !width || !containerWidth) {
+            this.fontPreviewElement.style.removeProperty("font-size");
+            this.fontPreviewElement.style.removeProperty("position");
+            this.fontPreviewElement.addStyleClass("preview");
+            return;
+        }
+
+        var lineCount = this.fontPreviewElement.getElementsByTagName("br").length + 1;
+        var realLineHeight = Math.floor(height / lineCount);
+        var fontSizeLineRatio = measureFontSize / realLineHeight;
+        var widthRatio = containerWidth / width;
+        var finalFontSize = Math.floor(realLineHeight * widthRatio * fontSizeLineRatio) - 1;
+
+        this.fontPreviewElement.style.setProperty("font-size", finalFontSize + "px", null);
+        this.fontPreviewElement.style.setProperty("height", this.fontPreviewElement.offsetHeight + "px", null);
+        this.fontPreviewElement.style.removeProperty("position");
+
+        this.fontPreviewElement.addStyleClass("preview");
+    }
+}
+
+WebInspector.FontView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* ImageView.js */
+
+/*
+ * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ImageView = function(resource)
+{
+    WebInspector.ResourceView.call(this, resource);
+
+    this.element.addStyleClass("image");
+
+    var container = document.createElement("div");
+    container.className = "image";
+    this.contentElement.appendChild(container);
+
+    this.imagePreviewElement = document.createElement("img");
+    this.imagePreviewElement.addStyleClass("resource-image-view");
+    this.imagePreviewElement.setAttribute("src", this.resource.url);
+
+    container.appendChild(this.imagePreviewElement);
+
+    container = document.createElement("div");
+    container.className = "info";
+    this.contentElement.appendChild(container);
+
+    var imageNameElement = document.createElement("h1");
+    imageNameElement.className = "title";
+    imageNameElement.textContent = this.resource.displayName;
+    container.appendChild(imageNameElement);
+
+    var infoListElement = document.createElement("dl");
+    infoListElement.className = "infoList";
+
+    var imageProperties = [
+        { name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", this.imagePreviewElement.naturalWidth, this.imagePreviewElement.height) },
+        { name: WebInspector.UIString("File size"), value: Number.bytesToString(this.resource.resourceSize, WebInspector.UIString.bind(WebInspector)) },
+        { name: WebInspector.UIString("MIME type"), value: this.resource.mimeType }
+    ];
+
+    var listHTML = '';
+    for (var i = 0; i < imageProperties.length; ++i)
+        listHTML += "<dt>" + imageProperties[i].name + "</dt><dd>" + imageProperties[i].value + "</dd>";
+
+    infoListElement.innerHTML = listHTML;
+    container.appendChild(infoListElement);
+}
+
+WebInspector.ImageView.prototype = {
+    
+}
+
+WebInspector.ImageView.prototype.__proto__ = WebInspector.ResourceView.prototype;
+
+/* DatabaseTableView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DatabaseTableView = function(database, tableName)
+{
+    WebInspector.View.call(this);
+
+    this.database = database;
+    this.tableName = tableName;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("table");
+
+    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
+    this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+}
+
+WebInspector.DatabaseTableView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.update();
+    },
+
+    get statusBarItems()
+    {
+        return [this.refreshButton];
+    },
+
+    update: function()
+    {
+        this.database.executeSql("SELECT * FROM " + this.tableName, this._queryFinished.bind(this), this._queryError.bind(this));
+    },
+
+    _queryFinished: function(result)
+    {
+        this.element.removeChildren();
+
+        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
+        if (!dataGrid) {
+            var emptyMsgElement = document.createElement("div");
+            emptyMsgElement.className = "storage-table-empty";
+            emptyMsgElement.textContent = WebInspector.UIString("The “%s”\ntable is empty.", this.tableName);
+            this.element.appendChild(emptyMsgElement);
+            return;
+        }
+
+        this.element.appendChild(dataGrid.element);
+        dataGrid.autoSizeColumns(5);
+    },
+
+    _queryError: function(error)
+    {
+        this.element.removeChildren();
+
+        var errorMsgElement = document.createElement("div");
+        errorMsgElement.className = "storage-table-error";
+        errorMsgElement.textContent = WebInspector.UIString("An error occurred trying to\nread the “%s” table.", this.tableName);
+        this.element.appendChild(errorMsgElement);
+    },
+
+    _refreshButtonClicked: function(event)
+    {
+        this.update();
+    }
+}
+
+WebInspector.DatabaseTableView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* DatabaseQueryView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DatabaseQueryView = function(database)
+{
+    WebInspector.View.call(this);
+
+    this.database = database;
+
+    this.element.addStyleClass("storage-view");
+    this.element.addStyleClass("query");
+    this.element.addStyleClass("monospace");
+    this.element.tabIndex = 0;
+
+    this.element.addEventListener("selectstart", this._selectStart.bind(this), false);
+
+    this.promptElement = document.createElement("div");
+    this.promptElement.className = "database-query-prompt";
+    this.promptElement.appendChild(document.createElement("br"));
+    this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);
+    this.element.appendChild(this.promptElement);
+
+    this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " ");
+}
+
+WebInspector.DatabaseQueryView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+
+        function moveBackIfOutside()
+        {
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+        }
+
+        setTimeout(moveBackIfOutside.bind(this), 0);
+    },
+
+    completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
+    {
+        var prefix = wordRange.toString().toLowerCase();
+        if (!prefix.length)
+            return;
+
+        var results = [];
+
+        function accumulateMatches(textArray)
+        {
+            if (bestMatchOnly && results.length)
+                return;
+            for (var i = 0; i < textArray.length; ++i) {
+                var text = textArray[i].toLowerCase();
+                if (text.length < prefix.length)
+                    continue;
+                if (text.indexOf(prefix) !== 0)
+                    continue;
+                results.push(textArray[i]);
+                if (bestMatchOnly)
+                    return;
+            }
+        }
+        
+        function tableNamesCallback(tableNames)
+        {
+            accumulateMatches(tableNames.map(function(name) { return name + " " }));
+            accumulateMatches(["SELECT ", "FROM ", "WHERE ", "LIMIT ", "DELETE FROM ", "CREATE ", "DROP ", "TABLE ", "INDEX ", "UPDATE ", "INSERT INTO ", "VALUES ("]);
+
+            completionsReadyCallback(results);
+        }
+        this.database.getTableNames(tableNamesCallback);
+    },
+
+    _promptKeyDown: function(event)
+    {
+        if (isEnterKey(event)) {
+            this._enterKeyPressed(event);
+            return;
+        }
+    },
+
+    _selectStart: function(event)
+    {
+        if (this._selectionTimeout)
+            clearTimeout(this._selectionTimeout);
+
+        this.prompt.clearAutoComplete();
+
+        function moveBackIfOutside()
+        {
+            delete this._selectionTimeout;
+            if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
+                this.prompt.moveCaretToEndOfPrompt();
+            this.prompt.autoCompleteSoon();
+        }
+
+        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
+    },
+
+    _enterKeyPressed: function(event)
+    {
+        event.preventDefault();
+        event.stopPropagation();
+
+        this.prompt.clearAutoComplete(true);
+
+        var query = this.prompt.text;
+        if (!query.length)
+            return;
+
+        this.prompt.history.push(query);
+        this.prompt.historyOffset = 0;
+        this.prompt.text = "";
+
+        this.database.executeSql(query, this._queryFinished.bind(this, query), this._queryError.bind(this, query));
+    },
+
+    _queryFinished: function(query, result)
+    {
+        var dataGrid = WebInspector.panels.storage.dataGridForResult(result);
+        if (!dataGrid)
+            return;
+        dataGrid.element.addStyleClass("inline");
+        this._appendQueryResult(query, dataGrid.element);
+        dataGrid.autoSizeColumns(5);
+
+        if (query.match(/^create /i) || query.match(/^drop table /i))
+            WebInspector.panels.storage.updateDatabaseTables(this.database);
+    },
+
+    _queryError: function(query, error)
+    {
+        if (error.code == 1)
+            var message = error.message;
+        else if (error.code == 2)
+            var message = WebInspector.UIString("Database no longer has expected version.");
+        else
+            var message = WebInspector.UIString("An unexpected error %s occurred.", error.code);
+
+        this._appendQueryResult(query, message, "error");
+    },
+
+    _appendQueryResult: function(query, result, resultClassName)
+    {
+        var element = document.createElement("div");
+        element.className = "database-user-query";
+
+        var commandTextElement = document.createElement("span");
+        commandTextElement.className = "database-query-text";
+        commandTextElement.textContent = query;
+        element.appendChild(commandTextElement);
+
+        var resultElement = document.createElement("div");
+        resultElement.className = "database-query-result";
+
+        if (resultClassName)
+            resultElement.addStyleClass(resultClassName);
+
+        if (typeof result === "string" || result instanceof String)
+            resultElement.textContent = result;
+        else if (result && result.nodeName)
+            resultElement.appendChild(result);
+
+        if (resultElement.childNodes.length)
+            element.appendChild(resultElement);
+
+        this.element.insertBefore(element, this.promptElement);
+        this.promptElement.scrollIntoView(false);
+    }
+}
+
+WebInspector.DatabaseQueryView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ScriptView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ScriptView = function(script)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("script-view");
+
+    this.script = script;
+
+    this._frameNeedsSetup = true;
+    this._sourceFrameSetup = false;
+    this.sourceFrame = new WebInspector.SourceFrame(this.element, this._addBreakpoint.bind(this), this._removeBreakpoint.bind(this));
+}
+
+WebInspector.ScriptView.prototype = {
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.setupSourceFrameIfNeeded();
+        this.sourceFrame.visible = true;
+        this.resize();
+    },
+
+    setupSourceFrameIfNeeded: function()
+    {
+        if (!this._frameNeedsSetup)
+            return;
+
+        this.attach();
+
+        var prefix = "";
+        for (var i = 0; i < this.script.startingLine - 1; ++i)
+            prefix += "\n";
+
+        this.sourceFrame.setContent("text/javascript", prefix + this.script.source);
+        this._sourceFrameSetup = true;
+        delete this._frameNeedsSetup;
+    },
+
+    attach: function()
+    {
+        if (!this.element.parentNode)
+            document.getElementById("script-resource-views").appendChild(this.element);
+    },
+
+    _addBreakpoint: function(line)
+    {
+        var breakpoint = new WebInspector.Breakpoint(this.script.sourceURL, line, this.script.sourceID);
+        WebInspector.panels.scripts.addBreakpoint(breakpoint);
+    },
+
+    // The follow methods are pulled from SourceView, since they are
+    // generic and work with ScriptView just fine.
+
+    hide: WebInspector.SourceView.prototype.hide,
+    revealLine: WebInspector.SourceView.prototype.revealLine,
+    highlightLine: WebInspector.SourceView.prototype.highlightLine,
+    addMessage: WebInspector.SourceView.prototype.addMessage,
+    clearMessages: WebInspector.SourceView.prototype.clearMessages,
+    searchCanceled: WebInspector.SourceView.prototype.searchCanceled,
+    performSearch: WebInspector.SourceView.prototype.performSearch,
+    jumpToFirstSearchResult: WebInspector.SourceView.prototype.jumpToFirstSearchResult,
+    jumpToLastSearchResult: WebInspector.SourceView.prototype.jumpToLastSearchResult,
+    jumpToNextSearchResult: WebInspector.SourceView.prototype.jumpToNextSearchResult,
+    jumpToPreviousSearchResult: WebInspector.SourceView.prototype.jumpToPreviousSearchResult,
+    showingFirstSearchResult: WebInspector.SourceView.prototype.showingFirstSearchResult,
+    showingLastSearchResult: WebInspector.SourceView.prototype.showingLastSearchResult,
+    _jumpToSearchResult: WebInspector.SourceView.prototype._jumpToSearchResult,
+    _sourceFrameSetupFinished: WebInspector.SourceView.prototype._sourceFrameSetupFinished,
+    _removeBreakpoint: WebInspector.SourceView.prototype._removeBreakpoint,
+    resize: WebInspector.SourceView.prototype.resize
+}
+
+WebInspector.ScriptView.prototype.__proto__ = WebInspector.View.prototype;
+
+/* ProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.ProfileDataGridNode = function(profileView, profileNode, owningTree, hasChildren)
+{
+    this.profileView = profileView;
+    this.profileNode = profileNode;
+
+    WebInspector.DataGridNode.call(this, null, hasChildren);
+
+    this.addEventListener("populate", this._populate, this);
+
+    this.tree = owningTree;
+
+    this.childrenByCallUID = {};
+    this.lastComparator = null;
+
+    this.callUID = profileNode.callUID;
+    this.selfTime = profileNode.selfTime;
+    this.totalTime = profileNode.totalTime;
+    this.functionName = profileNode.functionName;
+    this.numberOfCalls = profileNode.numberOfCalls;
+    this.url = profileNode.url;
+}
+
+WebInspector.ProfileDataGridNode.prototype = {
+    get data()
+    {
+        function formatMilliseconds(time)
+        {
+            return Number.secondsToString(time / 1000, WebInspector.UIString.bind(WebInspector), !Preferences.samplingCPUProfiler);
+        }
+
+        var data = {};
+
+        data["function"] = this.functionName;
+        data["calls"] = this.numberOfCalls;
+
+        if (this.profileView.showSelfTimeAsPercent)
+            data["self"] = WebInspector.UIString("%.2f%%", this.selfPercent);
+        else
+            data["self"] = formatMilliseconds(this.selfTime);
+
+        if (this.profileView.showTotalTimeAsPercent)
+            data["total"] = WebInspector.UIString("%.2f%%", this.totalPercent);
+        else
+            data["total"] = formatMilliseconds(this.totalTime);
+
+        if (this.profileView.showAverageTimeAsPercent)
+            data["average"] = WebInspector.UIString("%.2f%%", this.averagePercent);
+        else
+            data["average"] = formatMilliseconds(this.averageTime);
+
+        return data;
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
+
+        if (columnIdentifier === "self" && this._searchMatchedSelfColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "total" && this._searchMatchedTotalColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "average" && this._searchMatchedAverageColumn)
+            cell.addStyleClass("highlight");
+        else if (columnIdentifier === "calls" && this._searchMatchedCallsColumn)
+            cell.addStyleClass("highlight");
+
+        if (columnIdentifier !== "function")
+            return cell;
+
+        if (this.profileNode._searchMatchedFunctionColumn)
+            cell.addStyleClass("highlight");
+
+        if (this.profileNode.url) {
+            var fileName = WebInspector.displayNameForURL(this.profileNode.url);
+
+            var urlElement = document.createElement("a");
+            urlElement.className = "profile-node-file webkit-html-resource-link";
+            urlElement.href = this.profileNode.url;
+            urlElement.lineNumber = this.profileNode.lineNumber;
+            urlElement.preferredPanel = "scripts";
+
+            if (this.profileNode.lineNumber > 0)
+                urlElement.textContent = fileName + ":" + this.profileNode.lineNumber;
+            else
+                urlElement.textContent = fileName;
+
+            cell.insertBefore(urlElement, cell.firstChild);
+        }
+
+        return cell;
+    },
+
+    select: function(supressSelectedEvent)
+    {
+        WebInspector.DataGridNode.prototype.select.call(this, supressSelectedEvent);
+        this.profileView._dataGridNodeSelected(this);
+    },
+
+    deselect: function(supressDeselectedEvent)
+    {
+        WebInspector.DataGridNode.prototype.deselect.call(this, supressDeselectedEvent);
+        this.profileView._dataGridNodeDeselected(this);
+    },
+
+    sort: function(/*Function*/ comparator, /*Boolean*/ force)
+    {
+        var gridNodeGroups = [[this]];
+
+        for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) {
+            var gridNodes = gridNodeGroups[gridNodeGroupIndex];
+            var count = gridNodes.length;
+
+            for (var index = 0; index < count; ++index) {
+                var gridNode = gridNodes[index];
+
+                // If the grid node is collapsed, then don't sort children (save operation for later).
+                // If the grid node has the same sorting as previously, then there is no point in sorting it again.
+                if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) {
+                    if (gridNode.children.length)
+                        gridNode.shouldRefreshChildren = true;
+                    continue;
+                }
+
+                gridNode.lastComparator = comparator;
+
+                var children = gridNode.children;
+                var childCount = children.length;
+
+                if (childCount) {
+                    children.sort(comparator);
+
+                    for (var childIndex = 0; childIndex < childCount; ++childIndex)
+                        children[childIndex]._recalculateSiblings(childIndex);
+
+                    gridNodeGroups.push(children);
+                }
+            }
+        }
+    },
+
+    insertChild: function(/*ProfileDataGridNode*/ profileDataGridNode, index)
+    {
+        WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index);
+
+        this.childrenByCallUID[profileDataGridNode.callUID] = profileDataGridNode;
+    },
+
+    removeChild: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode);
+
+        delete this.childrenByCallUID[profileDataGridNode.callUID];
+    },
+
+    removeChildren: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        WebInspector.DataGridNode.prototype.removeChildren.call(this);
+
+        this.childrenByCallUID = {};
+    },
+
+    findChild: function(/*Node*/ node)
+    {
+        if (!node)
+            return null;
+        return this.childrenByCallUID[node.callUID];
+    },
+
+    get averageTime()
+    {
+        return this.selfTime / Math.max(1, this.numberOfCalls);
+    },
+
+    get averagePercent()
+    {
+        return this.averageTime / this.tree.totalTime * 100.0;
+    },
+
+    get selfPercent()
+    {
+        return this.selfTime / this.tree.totalTime * 100.0;
+    },
+
+    get totalPercent()
+    {
+        return this.totalTime / this.tree.totalTime * 100.0;
+    },
+
+    get _parent()
+    {
+        return this.parent !== this.dataGrid ? this.parent : this.tree;
+    },
+
+    _populate: function(event)
+    {
+        this._sharedPopulate();
+
+        if (this._parent) {
+            var currentComparator = this._parent.lastComparator;
+
+            if (currentComparator)
+                this.sort(currentComparator, true);
+        }
+
+        if (this.removeEventListener)
+            this.removeEventListener("populate", this._populate, this);
+    },
+
+    // When focusing and collapsing we modify lots of nodes in the tree.
+    // This allows us to restore them all to their original state when we revert.
+    _save: function()
+    {
+        if (this._savedChildren)
+            return;
+
+        this._savedSelfTime = this.selfTime;
+        this._savedTotalTime = this.totalTime;
+        this._savedNumberOfCalls = this.numberOfCalls;
+
+        this._savedChildren = this.children.slice();
+    },
+
+    // When focusing and collapsing we modify lots of nodes in the tree.
+    // This allows us to restore them all to their original state when we revert.
+    _restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.selfTime = this._savedSelfTime;
+        this.totalTime = this._savedTotalTime;
+        this.numberOfCalls = this._savedNumberOfCalls;
+
+        this.removeChildren();
+
+        var children = this._savedChildren;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            children[index]._restore();
+            this.appendChild(children[index]);
+        }
+    },
+
+    _merge: function(child, shouldAbsorb)
+    {
+        this.selfTime += child.selfTime;
+
+        if (!shouldAbsorb) {
+            this.totalTime += child.totalTime;
+            this.numberOfCalls += child.numberOfCalls;
+        }
+
+        var children = this.children.slice();
+
+        this.removeChildren();
+
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            if (!shouldAbsorb || children[index] !== child)
+                this.appendChild(children[index]);
+        }
+
+        children = child.children.slice();
+        count = children.length;
+
+        for (var index = 0; index < count; ++index) {
+            var orphanedChild = children[index],
+                existingChild = this.childrenByCallUID[orphanedChild.callUID];
+
+            if (existingChild)
+                existingChild._merge(orphanedChild, false);
+            else
+                this.appendChild(orphanedChild);
+        }
+    }
+}
+
+WebInspector.ProfileDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+WebInspector.ProfileDataGridTree = function(profileView, profileNode)
+{
+    this.tree = this;
+    this.children = [];
+
+    this.profileView = profileView;
+
+    this.totalTime = profileNode.totalTime;
+    this.lastComparator = null;
+
+    this.childrenByCallUID = {};
+}
+
+WebInspector.ProfileDataGridTree.prototype = {
+    get expanded()
+    {
+        return true;
+    },
+
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        this.children.splice(index, 0, child);
+        this.childrenByCallUID[child.callUID] = child;
+    },
+
+    removeChildren: function()
+    {
+        this.children = [];
+        this.childrenByCallUID = {};
+    },
+
+    findChild: WebInspector.ProfileDataGridNode.prototype.findChild,
+    sort: WebInspector.ProfileDataGridNode.prototype.sort,
+
+    _save: function()
+    {
+        if (this._savedChildren)
+            return;
+
+        this._savedTotalTime = this.totalTime;
+        this._savedChildren = this.children.slice();
+    },
+
+    restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.children = this._savedChildren;
+        this.totalTime = this._savedTotalTime;
+
+        var children = this.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            children[index]._restore();
+
+        this._savedChildren = null;
+    }
+}
+
+WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}];
+
+WebInspector.ProfileDataGridTree.propertyComparator = function(/*String*/ property, /*Boolean*/ isAscending)
+{
+    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];
+
+    if (!comparator) {
+        if (isAscending) {
+            comparator = function(lhs, rhs)
+            {
+                if (lhs[property] < rhs[property])
+                    return -1;
+
+                if (lhs[property] > rhs[property])
+                    return 1;
+
+                return 0;
+            }
+        } else {
+            comparator = function(lhs, rhs)
+            {
+                if (lhs[property] > rhs[property])
+                    return -1;
+
+                if (lhs[property] < rhs[property])
+                    return 1;
+
+                return 0;
+            }
+        }
+
+        this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;
+    }
+
+    return comparator;
+}
+
+/* BottomUpProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Bottom Up Profiling shows the entire callstack backwards:
+// The root node is a representation of each individual function called, and each child of that node represents
+// a reverse-callstack showing how many of those calls came from it. So, unlike top-down, the statistics in
+// each child still represent the root node. We have to be particularly careful of recursion with this mode
+// because a root node can represent itself AND an ancestor.
+
+WebInspector.BottomUpProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*BottomUpProfileDataGridTree*/ owningTree)
+{
+    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, this._willHaveChildren(profileNode));
+
+    this._remainingNodeInfos = [];
+}
+
+WebInspector.BottomUpProfileDataGridNode.prototype = {
+    _takePropertiesFromProfileDataGridNode: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        this._save();
+
+        this.selfTime = profileDataGridNode.selfTime;
+        this.totalTime = profileDataGridNode.totalTime;
+        this.numberOfCalls = profileDataGridNode.numberOfCalls;
+    },
+
+    // When focusing, we keep just the members of the callstack.
+    _keepOnlyChild: function(/*ProfileDataGridNode*/ child)
+    {
+        this._save();
+
+        this.removeChildren();
+        this.appendChild(child);
+    },
+
+    _exclude: function(aCallUID)
+    {
+        if (this._remainingNodeInfos)
+            this._populate();
+
+        this._save();
+
+        var children = this.children;
+        var index = this.children.length;
+
+        while (index--)
+            children[index]._exclude(aCallUID);
+
+        var child = this.childrenByCallUID[aCallUID];
+
+        if (child)
+            this._merge(child, true);
+    },
+
+    _restore: function()
+    {
+        WebInspector.ProfileDataGridNode.prototype._restore();
+
+        if (!this.children.length)
+            this.hasChildren = this._willHaveChildren();
+    },
+
+    _merge: function(/*ProfileDataGridNode*/ child, /*Boolean*/ shouldAbsorb)
+    {
+        this.selfTime -= child.selfTime;
+
+        WebInspector.ProfileDataGridNode.prototype._merge.call(this, child, shouldAbsorb);
+    },
+
+    _sharedPopulate: function()
+    {
+        var remainingNodeInfos = this._remainingNodeInfos;
+        var count = remainingNodeInfos.length;
+
+        for (var index = 0; index < count; ++index) {
+            var nodeInfo = remainingNodeInfos[index];
+            var ancestor = nodeInfo.ancestor;
+            var focusNode = nodeInfo.focusNode;
+            var child = this.findChild(ancestor);
+
+            // If we already have this child, then merge the data together.
+            if (child) {
+                var totalTimeAccountedFor = nodeInfo.totalTimeAccountedFor;
+
+                child.selfTime += focusNode.selfTime;
+                child.numberOfCalls += focusNode.numberOfCalls;
+
+                if (!totalTimeAccountedFor)
+                    child.totalTime += focusNode.totalTime;
+            } else {
+                // If not, add it as a true ancestor.
+                // In heavy mode, we take our visual identity from ancestor node...
+                var child = new WebInspector.BottomUpProfileDataGridNode(this.profileView, ancestor, this.tree);
+
+                if (ancestor !== focusNode) {
+                    // but the actual statistics from the "root" node (bottom of the callstack).
+                    child.selfTime = focusNode.selfTime;
+                    child.totalTime = focusNode.totalTime;
+                    child.numberOfCalls = focusNode.numberOfCalls;
+                }
+
+                this.appendChild(child);
+            }
+
+            var parent = ancestor.parent;
+            if (parent && parent.parent) {
+                nodeInfo.ancestor = parent;
+                child._remainingNodeInfos.push(nodeInfo);
+            }
+        }
+
+        delete this._remainingNodeInfos;
+    },
+
+    _willHaveChildren: function(profileNode)
+    {
+        profileNode = profileNode || this.profileNode;
+        // In bottom up mode, our parents are our children since we display an inverted tree.
+        // However, we don't want to show the very top parent since it is redundant.
+        return !!(profileNode.parent && profileNode.parent.parent);
+    }
+}
+
+WebInspector.BottomUpProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
+
+WebInspector.BottomUpProfileDataGridTree = function(/*ProfileView*/ aProfileView, /*ProfileNode*/ aProfileNode)
+{
+    WebInspector.ProfileDataGridTree.call(this, aProfileView, aProfileNode);
+
+    // Iterate each node in pre-order.
+    var profileNodeUIDs = 0;
+    var profileNodeGroups = [[], [aProfileNode]];
+    var visitedProfileNodesForCallUID = {};
+
+    this._remainingNodeInfos = [];
+
+    for (var profileNodeGroupIndex = 0; profileNodeGroupIndex < profileNodeGroups.length; ++profileNodeGroupIndex) {
+        var parentProfileNodes = profileNodeGroups[profileNodeGroupIndex];
+        var profileNodes = profileNodeGroups[++profileNodeGroupIndex];
+        var count = profileNodes.length;
+
+        for (var index = 0; index < count; ++index) {
+            var profileNode = profileNodes[index];
+
+            if (!profileNode.UID)
+                profileNode.UID = ++profileNodeUIDs;
+
+            if (profileNode.head && profileNode !== profileNode.head) {
+                // The total time of this ancestor is accounted for if we're in any form of recursive cycle.
+                var visitedNodes = visitedProfileNodesForCallUID[profileNode.callUID];
+                var totalTimeAccountedFor = false;
+
+                if (!visitedNodes) {
+                    visitedNodes = {}
+                    visitedProfileNodesForCallUID[profileNode.callUID] = visitedNodes;
+                } else {
+                    // The total time for this node has already been accounted for iff one of it's parents has already been visited.
+                    // We can do this check in this style because we are traversing the tree in pre-order.
+                    var parentCount = parentProfileNodes.length;
+                    for (var parentIndex = 0; parentIndex < parentCount; ++parentIndex) {
+                        if (visitedNodes[parentProfileNodes[parentIndex].UID]) {
+                            totalTimeAccountedFor = true;
+                            break;
+                        }
+                    }
+                }
+
+                visitedNodes[profileNode.UID] = true;
+
+                this._remainingNodeInfos.push({ ancestor:profileNode, focusNode:profileNode, totalTimeAccountedFor:totalTimeAccountedFor });
+            }
+
+            var children = profileNode.children;
+            if (children.length) {
+                profileNodeGroups.push(parentProfileNodes.concat([profileNode]))
+                profileNodeGroups.push(children);
+            }
+        }
+    }
+
+    // Populate the top level nodes.
+    WebInspector.BottomUpProfileDataGridNode.prototype._populate.call(this);
+
+    return this;
+}
+
+WebInspector.BottomUpProfileDataGridTree.prototype = {
+    // When focusing, we keep the entire callstack up to this ancestor.
+    focus: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        if (!profileDataGridNode)
+            return;
+
+        this._save();
+
+        var currentNode = profileDataGridNode;
+        var focusNode = profileDataGridNode;
+
+        while (currentNode.parent && (currentNode instanceof WebInspector.ProfileDataGridNode)) {
+            currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);
+
+            focusNode = currentNode;
+            currentNode = currentNode.parent;
+
+            if (currentNode instanceof WebInspector.ProfileDataGridNode)
+                currentNode._keepOnlyChild(focusNode);
+        }
+
+        this.children = [focusNode];
+        this.totalTime = profileDataGridNode.totalTime;
+    },
+
+    exclude: function(/*ProfileDataGridNode*/ profileDataGridNode)
+    {
+        if (!profileDataGridNode)
+            return;
+
+        this._save();
+
+        var excludedCallUID = profileDataGridNode.callUID;
+        var excludedTopLevelChild = this.childrenByCallUID[excludedCallUID];
+
+        // If we have a top level node that is excluded, get rid of it completely (not keeping children),
+        // since bottom up data relies entirely on the root node.
+        if (excludedTopLevelChild)
+            this.children.remove(excludedTopLevelChild);
+
+        var children = this.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            children[index]._exclude(excludedCallUID);
+
+        if (this.lastComparator)
+            this.sort(this.lastComparator, true);
+    },
+
+    _sharedPopulate: WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate
+}
+
+WebInspector.BottomUpProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
+
+
+/* TopDownProfileDataGridTree.js */
+
+/*
+ * Copyright (C) 2009 280 North Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TopDownProfileDataGridNode = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode, /*TopDownProfileDataGridTree*/ owningTree)
+{
+    var hasChildren = (profileNode.children && profileNode.children.length);
+
+    WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, hasChildren);
+
+    this._remainingChildren = profileNode.children;
+}
+
+WebInspector.TopDownProfileDataGridNode.prototype = {
+    _sharedPopulate: function()
+    {
+        var children = this._remainingChildren;
+        var childrenLength = children.length;
+
+        for (var i = 0; i < childrenLength; ++i)
+            this.appendChild(new WebInspector.TopDownProfileDataGridNode(this.profileView, children[i], this.tree));
+
+        this._remainingChildren = null;
+    },
+
+    _exclude: function(aCallUID)
+    {
+        if (this._remainingChildren)
+            this._populate();
+
+        this._save();
+
+        var children = this.children;
+        var index = this.children.length;
+
+        while (index--)
+            children[index]._exclude(aCallUID);
+
+        var child = this.childrenByCallUID[aCallUID];
+
+        if (child)
+            this._merge(child, true);
+    }
+}
+
+WebInspector.TopDownProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;
+
+WebInspector.TopDownProfileDataGridTree = function(/*ProfileView*/ profileView, /*ProfileNode*/ profileNode)
+{
+    WebInspector.ProfileDataGridTree.call(this, profileView, profileNode);
+
+    this._remainingChildren = profileNode.children;
+
+    WebInspector.TopDownProfileDataGridNode.prototype._populate.call(this);
+}
+
+WebInspector.TopDownProfileDataGridTree.prototype = {
+    focus: function(/*ProfileDataGridNode*/ profileDataGrideNode)
+    {
+        if (!profileDataGrideNode)
+            return;
+
+        this._save();
+        profileDataGrideNode.savePosition();
+
+        this.children = [profileDataGrideNode];
+        this.totalTime = profileDataGrideNode.totalTime;
+    },
+
+    exclude: function(/*ProfileDataGridNode*/ profileDataGrideNode)
+    {
+        if (!profileDataGrideNode)
+            return;
+
+        this._save();
+
+        var excludedCallUID = profileDataGrideNode.callUID;
+
+        WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(this, excludedCallUID);
+
+        if (this.lastComparator)
+            this.sort(this.lastComparator, true);
+    },
+
+    restore: function()
+    {
+        if (!this._savedChildren)
+            return;
+
+        this.children[0].restorePosition();
+
+        WebInspector.ProfileDataGridTree.prototype.restore.call(this);
+    },
+
+    _merge: WebInspector.TopDownProfileDataGridNode.prototype._merge,
+
+    _sharedPopulate: WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate
+}
+
+WebInspector.TopDownProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;
+
+/* ProfileView.js */
+
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// FIXME: Rename the file.
+
+WebInspector.CPUProfileView = function(profile)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("profile-view");
+
+    this.showSelfTimeAsPercent = true;
+    this.showTotalTimeAsPercent = true;
+    this.showAverageTimeAsPercent = true;
+
+    var columns = { "self": { title: WebInspector.UIString("Self"), width: "72px", sort: "descending", sortable: true },
+                    "total": { title: WebInspector.UIString("Total"), width: "72px", sortable: true },
+                    "average": { title: WebInspector.UIString("Average"), width: "72px", sortable: true },
+                    "calls": { title: WebInspector.UIString("Calls"), width: "54px", sortable: true },
+                    "function": { title: WebInspector.UIString("Function"), disclosure: true, sortable: true } };
+
+    if (Preferences.samplingCPUProfiler) {
+        delete columns.average;
+        delete columns.calls;
+    }
+
+    this.dataGrid = new WebInspector.DataGrid(columns);
+    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
+    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
+    this.element.appendChild(this.dataGrid.element);
+
+    this.viewSelectElement = document.createElement("select");
+    this.viewSelectElement.className = "status-bar-item";
+    this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false);
+    this.view = "Heavy";
+
+    var heavyViewOption = document.createElement("option");
+    heavyViewOption.label = WebInspector.UIString("Heavy (Bottom Up)");
+    var treeViewOption = document.createElement("option");
+    treeViewOption.label = WebInspector.UIString("Tree (Top Down)");
+    this.viewSelectElement.appendChild(heavyViewOption);
+    this.viewSelectElement.appendChild(treeViewOption);
+
+    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item");
+    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
+
+    this.focusButton = new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."), "focus-profile-node-status-bar-item");
+    this.focusButton.disabled = true;
+    this.focusButton.addEventListener("click", this._focusClicked.bind(this), false);
+
+    this.excludeButton = new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."), "exclude-profile-node-status-bar-item");
+    this.excludeButton.disabled = true;
+    this.excludeButton.addEventListener("click", this._excludeClicked.bind(this), false);
+
+    this.resetButton = new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."), "reset-profile-status-bar-item");
+    this.resetButton.visible = false;
+    this.resetButton.addEventListener("click", this._resetClicked.bind(this), false);
+
+    this.profile = profile;
+
+    var self = this;
+    function profileCallback(profile)
+    {
+        self.profile = profile;
+        self._assignParentsInProfile();
+      
+        self.profileDataGridTree = self.bottomUpProfileDataGridTree;
+        self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
+     
+        self.refresh();
+     
+        self._updatePercentButton();
+    }
+
+    var callId = WebInspector.Callback.wrap(profileCallback);
+    InspectorBackend.getProfile(callId, this.profile.uid);
+}
+
+WebInspector.CPUProfileView.prototype = {
+    get statusBarItems()
+    {
+        return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];
+    },
+
+    get profile()
+    {
+        return this._profile;
+    },
+
+    set profile(profile)
+    {
+        this._profile = profile;
+    },
+
+    get bottomUpProfileDataGridTree()
+    {
+        if (!this._bottomUpProfileDataGridTree)
+            this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this, this.profile.head);
+        return this._bottomUpProfileDataGridTree;
+    },
+
+    get topDownProfileDataGridTree()
+    {
+        if (!this._topDownProfileDataGridTree)
+            this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this, this.profile.head);
+        return this._topDownProfileDataGridTree;
+    },
+
+    get currentTree()
+    {
+        return this._currentTree;
+    },
+
+    set currentTree(tree)
+    {
+        this._currentTree = tree;
+        this.refresh();
+    },
+
+    get topDownTree()
+    {
+        if (!this._topDownTree) {
+            this._topDownTree = WebInspector.TopDownTreeFactory.create(this.profile.head);
+            this._sortProfile(this._topDownTree);
+        }
+
+        return this._topDownTree;
+    },
+
+    get bottomUpTree()
+    {
+        if (!this._bottomUpTree) {
+            this._bottomUpTree = WebInspector.BottomUpTreeFactory.create(this.profile.head);
+            this._sortProfile(this._bottomUpTree);
+        }
+
+        return this._bottomUpTree;
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.dataGrid.updateWidths();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.dataGrid)
+            this.dataGrid.updateWidths();
+    },
+
+    refresh: function()
+    {
+        var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;
+
+        this.dataGrid.removeChildren();
+
+        var children = this.profileDataGridTree.children;
+        var count = children.length;
+
+        for (var index = 0; index < count; ++index)
+            this.dataGrid.appendChild(children[index]);
+
+        if (selectedProfileNode)
+            selectedProfileNode.selected = true;
+    },
+
+    refreshVisibleData: function()
+    {
+        var child = this.dataGrid.children[0];
+        while (child) {
+            child.refresh();
+            child = child.traverseNextNode(false, null, true);
+        }
+    },
+
+    refreshShowAsPercents: function()
+    {
+        this._updatePercentButton();
+        this.refreshVisibleData();
+    },
+
+    searchCanceled: function()
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var profileNode = this._searchResults[i].profileNode;
+
+                delete profileNode._searchMatchedSelfColumn;
+                delete profileNode._searchMatchedTotalColumn;
+                delete profileNode._searchMatchedCallsColumn;
+                delete profileNode._searchMatchedFunctionColumn;
+
+                profileNode.refresh();
+            }
+        }
+
+        delete this._searchFinishedCallback;
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        query = query.trim();
+
+        if (!query.length)
+            return;
+
+        this._searchFinishedCallback = finishedCallback;
+
+        var greaterThan = (query.indexOf(">") === 0);
+        var lessThan = (query.indexOf("<") === 0);
+        var equalTo = (query.indexOf("=") === 0 || ((greaterThan || lessThan) && query.indexOf("=") === 1));
+        var percentUnits = (query.lastIndexOf("%") === (query.length - 1));
+        var millisecondsUnits = (query.length > 2 && query.lastIndexOf("ms") === (query.length - 2));
+        var secondsUnits = (!millisecondsUnits && query.lastIndexOf("s") === (query.length - 1));
+
+        var queryNumber = parseFloat(query);
+        if (greaterThan || lessThan || equalTo) {
+            if (equalTo && (greaterThan || lessThan))
+                queryNumber = parseFloat(query.substring(2));
+            else
+                queryNumber = parseFloat(query.substring(1));
+        }
+
+        var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber);
+
+        // Make equalTo implicitly true if it wasn't specified there is no other operator.
+        if (!isNaN(queryNumber) && !(greaterThan || lessThan))
+            equalTo = true;
+
+        function matchesQuery(/*ProfileDataGridNode*/ profileDataGridNode)
+        {
+            delete profileDataGridNode._searchMatchedSelfColumn;
+            delete profileDataGridNode._searchMatchedTotalColumn;
+            delete profileDataGridNode._searchMatchedAverageColumn;
+            delete profileDataGridNode._searchMatchedCallsColumn;
+            delete profileDataGridNode._searchMatchedFunctionColumn;
+
+            if (percentUnits) {
+                if (lessThan) {
+                    if (profileDataGridNode.selfPercent < queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent < queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                } else if (greaterThan) {
+                    if (profileDataGridNode.selfPercent > queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent > queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+
+                if (equalTo) {
+                    if (profileDataGridNode.selfPercent == queryNumber)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalPercent == queryNumber)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averagePercent < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+            } else if (millisecondsUnits || secondsUnits) {
+                if (lessThan) {
+                    if (profileDataGridNode.selfTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime < queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                } else if (greaterThan) {
+                    if (profileDataGridNode.selfTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime > queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+
+                if (equalTo) {
+                    if (profileDataGridNode.selfTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedSelfColumn = true;
+                    if (profileDataGridNode.totalTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedTotalColumn = true;
+                    if (profileDataGridNode.averageTime == queryNumberMilliseconds)
+                        profileDataGridNode._searchMatchedAverageColumn = true;
+                }
+            } else {
+                if (equalTo && profileDataGridNode.numberOfCalls == queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+                if (greaterThan && profileDataGridNode.numberOfCalls > queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+                if (lessThan && profileDataGridNode.numberOfCalls < queryNumber)
+                    profileDataGridNode._searchMatchedCallsColumn = true;
+            }
+
+            if (profileDataGridNode.functionName.hasSubstring(query, true) || profileDataGridNode.url.hasSubstring(query, true))
+                profileDataGridNode._searchMatchedFunctionColumn = true;
+
+            if (profileDataGridNode._searchMatchedSelfColumn ||
+                profileDataGridNode._searchMatchedTotalColumn ||
+                profileDataGridNode._searchMatchedAverageColumn ||
+                profileDataGridNode._searchMatchedCallsColumn ||
+                profileDataGridNode._searchMatchedFunctionColumn)
+            {
+                profileDataGridNode.refresh();
+                return true;
+            }
+
+            return false;
+        }
+
+        var current = this.profileDataGridTree.children[0];
+
+        while (current) {
+            if (matchesQuery(current)) {
+                this._searchResults.push({ profileNode: current });
+            }
+
+            current = current.traverseNextNode(false, null, false);
+        }
+
+        finishedCallback(this, this._searchResults.length);
+    },
+
+    jumpToFirstSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToLastSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToNextSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (++this._currentSearchResultIndex >= this._searchResults.length)
+            this._currentSearchResultIndex = 0;
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    jumpToPreviousSearchResult: function()
+    {
+        if (!this._searchResults || !this._searchResults.length)
+            return;
+        if (--this._currentSearchResultIndex < 0)
+            this._currentSearchResultIndex = (this._searchResults.length - 1);
+        this._jumpToSearchResult(this._currentSearchResultIndex);
+    },
+
+    showingFirstSearchResult: function()
+    {
+        return (this._currentSearchResultIndex === 0);
+    },
+
+    showingLastSearchResult: function()
+    {
+        return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));
+    },
+
+    _jumpToSearchResult: function(index)
+    {
+        var searchResult = this._searchResults[index];
+        if (!searchResult)
+            return;
+
+        var profileNode = searchResult.profileNode;
+        profileNode.reveal();
+        profileNode.select();
+    },
+
+    _changeView: function(event)
+    {
+        if (!event || !this.profile)
+            return;
+
+        if (event.target.selectedIndex == 1 && this.view == "Heavy") {
+            this.profileDataGridTree = this.topDownProfileDataGridTree;
+            this._sortProfile();
+            this.view = "Tree";
+        } else if (event.target.selectedIndex == 0 && this.view == "Tree") {
+            this.profileDataGridTree = this.bottomUpProfileDataGridTree;
+            this._sortProfile();
+            this.view = "Heavy";
+        }
+
+        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
+            return;
+
+        // The current search needs to be performed again. First negate out previous match
+        // count by calling the search finished callback with a negative number of matches.
+        // Then perform the search again the with same query and callback.
+        this._searchFinishedCallback(this, -this._searchResults.length);
+        this.performSearch(this.currentQuery, this._searchFinishedCallback);
+    },
+
+    _percentClicked: function(event)
+    {
+        var currentState = this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent;
+        this.showSelfTimeAsPercent = !currentState;
+        this.showTotalTimeAsPercent = !currentState;
+        this.showAverageTimeAsPercent = !currentState;
+        this.refreshShowAsPercents();
+    },
+
+    _updatePercentButton: function()
+    {
+        if (this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent) {
+            this.percentButton.title = WebInspector.UIString("Show absolute total and self times.");
+            this.percentButton.toggled = true;
+        } else {
+            this.percentButton.title = WebInspector.UIString("Show total and self times as percentages.");
+            this.percentButton.toggled = false;
+        }
+    },
+
+    _focusClicked: function(event)
+    {
+        if (!this.dataGrid.selectedNode)
+            return;
+
+        this.resetButton.visible = true;
+        this.profileDataGridTree.focus(this.dataGrid.selectedNode);
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _excludeClicked: function(event)
+    {
+        var selectedNode = this.dataGrid.selectedNode
+
+        if (!selectedNode)
+            return;
+
+        selectedNode.deselect();
+
+        this.resetButton.visible = true;
+        this.profileDataGridTree.exclude(selectedNode);
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _resetClicked: function(event)
+    {
+        this.resetButton.visible = false;
+        this.profileDataGridTree.restore();
+        this.refresh();
+        this.refreshVisibleData();
+    },
+
+    _dataGridNodeSelected: function(node)
+    {
+        this.focusButton.disabled = false;
+        this.excludeButton.disabled = false;
+    },
+
+    _dataGridNodeDeselected: function(node)
+    {
+        this.focusButton.disabled = true;
+        this.excludeButton.disabled = true;
+    },
+
+    _sortData: function(event)
+    {
+        this._sortProfile(this.profile);
+    },
+
+    _sortProfile: function()
+    {
+        var sortAscending = this.dataGrid.sortOrder === "ascending";
+        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
+        var sortProperty = {
+                "average": "averageTime",
+                "self": "selfTime",
+                "total": "totalTime",
+                "calls": "numberOfCalls",
+                "function": "functionName"
+            }[sortColumnIdentifier];
+
+        this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));
+
+        this.refresh();
+    },
+
+    _mouseDownInDataGrid: function(event)
+    {
+        if (event.detail < 2)
+            return;
+
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell || (!cell.hasStyleClass("total-column") && !cell.hasStyleClass("self-column") && !cell.hasStyleClass("average-column")))
+            return;
+
+        if (cell.hasStyleClass("total-column"))
+            this.showTotalTimeAsPercent = !this.showTotalTimeAsPercent;
+        else if (cell.hasStyleClass("self-column"))
+            this.showSelfTimeAsPercent = !this.showSelfTimeAsPercent;
+        else if (cell.hasStyleClass("average-column"))
+            this.showAverageTimeAsPercent = !this.showAverageTimeAsPercent;
+
+        this.refreshShowAsPercents();
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    _assignParentsInProfile: function()
+    {
+        var head = this.profile.head;
+        head.parent = null;
+        head.head = null;
+        var nodesToTraverse = [ { parent: head, children: head.children } ];
+        while (nodesToTraverse.length > 0) {
+            var pair = nodesToTraverse.shift();
+            var parent = pair.parent;
+            var children = pair.children;
+            var length = children.length;
+            for (var i = 0; i < length; ++i) {
+                children[i].head = head;
+                children[i].parent = parent;
+                if (children[i].children.length > 0)
+                    nodesToTraverse.push({ parent: children[i], children: children[i].children });
+            }
+        }
+    }
+}
+
+WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.CPUProfileType = function()
+{
+    WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));
+    this._recording = false;
+}
+
+WebInspector.CPUProfileType.TypeId = "CPU";
+
+WebInspector.CPUProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");
+    },
+
+    get buttonStyle()
+    {
+        return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";
+    },
+
+    buttonClicked: function()
+    {
+        this._recording = !this._recording;
+
+        if (this._recording)
+            InspectorBackend.startProfiling();
+        else
+            InspectorBackend.stopProfiling();
+    },
+
+    get welcomeMessage()
+    {
+        return WebInspector.UIString("Start CPU profiling by pressing<br>the %s button on the status bar.");
+    },
+
+    setRecordingProfile: function(isProfiling)
+    {
+        this._recording = isProfiling;
+    },
+
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        return new WebInspector.ProfileSidebarTreeElement(profile);
+    },
+
+    createView: function(profile)
+    {
+        return new WebInspector.CPUProfileView(profile);
+    }
+}
+
+WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
+
+/* DOMAgent.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.DOMNode = function(doc, payload) {
+    this.ownerDocument = doc;
+
+    this.id = payload.id;
+    // injectedScriptId is a node is for DOM nodes which should be converted
+    // to corresponding InjectedScript by the inspector backend. We indicate
+    // this by making injectedScriptId negative.
+    this.injectedScriptId = -payload.id;
+    this.nodeType = payload.nodeType;
+    this.nodeName = payload.nodeName;
+    this.localName = payload.localName;
+    this._nodeValue = payload.nodeValue;
+    this.textContent = this.nodeValue;
+
+    this.attributes = [];
+    this._attributesMap = {};
+    if (payload.attributes)
+        this._setAttributesPayload(payload.attributes);
+
+    this._childNodeCount = payload.childNodeCount;
+    this.children = null;
+
+    this.nextSibling = null;
+    this.prevSibling = null;
+    this.firstChild = null;
+    this.lastChild = null;
+    this.parentNode = null;
+
+    if (payload.children)
+        this._setChildrenPayload(payload.children);
+
+    this._computedStyle = null;
+    this.style = null;
+    this._matchedCSSRules = [];
+
+    if (this.nodeType === Node.ELEMENT_NODE) {
+        // HTML and BODY from internal iframes should not overwrite top-level ones.
+        if (!this.ownerDocument.documentElement && this.nodeName === "HTML")
+            this.ownerDocument.documentElement = this;
+        if (!this.ownerDocument.body && this.nodeName === "BODY")
+            this.ownerDocument.body = this;
+        if (payload.documentURL)
+            this.documentURL = payload.documentURL;
+    } else if (this.nodeType === Node.DOCUMENT_TYPE_NODE) {
+        this.publicId = payload.publicId;
+        this.systemId = payload.systemId;
+        this.internalSubset = payload.internalSubset;
+    } else if (this.nodeType === Node.DOCUMENT_NODE)
+        this.documentURL = payload.documentURL;
+}
+
+WebInspector.DOMNode.prototype = {
+    hasAttributes: function()
+    {
+        return this.attributes.length > 0;
+    },
+
+    hasChildNodes: function()  {
+        return this._childNodeCount > 0;
+    },
+
+    get nodeValue() {
+        return this._nodeValue;
+    },
+
+    set nodeValue(value) {
+        if (this.nodeType != Node.TEXT_NODE)
+            return;
+        var self = this;
+        var callback = function()
+        {
+            self._nodeValue = value;
+            self.textContent = value;
+        };
+        this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, callback);
+    },
+
+    getAttribute: function(name)
+    {
+        var attr = this._attributesMap[name];
+        return attr ? attr.value : undefined;
+    },
+
+    setAttribute: function(name, value)
+    {
+        var self = this;
+        var callback = function()
+        {
+            var attr = self._attributesMap[name];
+            if (attr)
+                attr.value = value;
+            else
+                attr = self._addAttribute(name, value);
+        };
+        this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback);
+    },
+
+    removeAttribute: function(name)
+    {
+        var self = this;
+        var callback = function()
+        {
+            delete self._attributesMap[name];
+            for (var i = 0;  i < self.attributes.length; ++i) {
+                if (self.attributes[i].name == name) {
+                    self.attributes.splice(i, 1);
+                    break;
+                }
+            }
+        };
+        this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback);
+    },
+
+    _setAttributesPayload: function(attrs)
+    {
+        this.attributes = [];
+        this._attributesMap = {};
+        for (var i = 0; i < attrs.length; i += 2)
+            this._addAttribute(attrs[i], attrs[i + 1]);
+    },
+
+    _insertChild: function(prev, payload)
+    {
+        var node = new WebInspector.DOMNode(this.ownerDocument, payload);
+        if (!prev) {
+            if (!this.children) {
+                // First node
+                this.children = [ node ];
+            } else
+                this.children.unshift(node);
+        } else
+            this.children.splice(this.children.indexOf(prev) + 1, 0, node);
+        this._renumber();
+        return node;
+    },
+
+    removeChild_: function(node)
+    {
+        this.children.splice(this.children.indexOf(node), 1);
+        node.parentNode = null;
+        this._renumber();
+    },
+
+    _setChildrenPayload: function(payloads)
+    {
+        this.children = [];
+        for (var i = 0; i < payloads.length; ++i) {
+            var payload = payloads[i];
+            var node = new WebInspector.DOMNode(this.ownerDocument, payload);
+            this.children.push(node);
+        }
+        this._renumber();
+    },
+
+    _renumber: function()
+    {
+        this._childNodeCount = this.children.length;
+        if (this._childNodeCount == 0) {
+            this.firstChild = null;
+            this.lastChild = null;
+            return;
+        }
+        this.firstChild = this.children[0];
+        this.lastChild = this.children[this._childNodeCount - 1];
+        for (var i = 0; i < this._childNodeCount; ++i) {
+            var child = this.children[i];
+            child.index = i;
+            child.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null;
+            child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null;
+            child.parentNode = this;
+        }
+    },
+
+    _addAttribute: function(name, value)
+    {
+        var attr = {
+            "name": name,
+            "value": value,
+            "_node": this
+        };
+        this._attributesMap[name] = attr;
+        this.attributes.push(attr);
+    },
+
+    _setStyles: function(computedStyle, inlineStyle, styleAttributes, matchedCSSRules)
+    {
+        this._computedStyle = new WebInspector.CSSStyleDeclaration(computedStyle);
+        this.style = new WebInspector.CSSStyleDeclaration(inlineStyle);
+
+        for (var name in styleAttributes) {
+            if (this._attributesMap[name])
+                this._attributesMap[name].style = new WebInspector.CSSStyleDeclaration(styleAttributes[name]);
+        }
+
+        this._matchedCSSRules = [];
+        for (var i = 0; i < matchedCSSRules.length; i++)
+            this._matchedCSSRules.push(WebInspector.CSSStyleDeclaration.parseRule(matchedCSSRules[i]));
+    },
+
+    _clearStyles: function()
+    {
+        this.computedStyle = null;
+        this.style = null;
+        for (var name in this._attributesMap)
+            this._attributesMap[name].style = null;
+        this._matchedCSSRules = null;
+    }
+}
+
+WebInspector.DOMDocument = function(domAgent, defaultView, payload)
+{
+    WebInspector.DOMNode.call(this, this, payload);
+    this._listeners = {};
+    this._domAgent = domAgent;
+    this.defaultView = defaultView;
+}
+
+WebInspector.DOMDocument.prototype = {
+
+    addEventListener: function(name, callback)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners) {
+            listeners = [];
+            this._listeners[name] = listeners;
+        }
+        listeners.push(callback);
+    },
+
+    removeEventListener: function(name, callback)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners)
+            return;
+
+        var index = listeners.indexOf(callback);
+        if (index != -1)
+            listeners.splice(index, 1);
+    },
+
+    _fireDomEvent: function(name, event)
+    {
+        var listeners = this._listeners[name];
+        if (!listeners)
+            return;
+
+        for (var i = 0; i < listeners.length; ++i) {
+            var listener = listeners[i];
+            listener.call(this, event);
+        }
+    }
+}
+
+WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype;
+
+
+WebInspector.DOMWindow = function(domAgent)
+{
+    this._domAgent = domAgent;
+}
+
+WebInspector.DOMWindow.prototype = {
+    get document()
+    {
+        return this._domAgent.document;
+    },
+
+    get Node()
+    {
+        return WebInspector.DOMNode;
+    },
+
+    get Element()
+    {
+        return WebInspector.DOMNode;
+    },
+
+    Object: function()
+    {
+    },
+
+    getComputedStyle: function(node)
+    {
+        return node._computedStyle;
+    },
+
+    getMatchedCSSRules: function(node, pseudoElement, authorOnly)
+    {
+        return node._matchedCSSRules;
+    }
+}
+
+WebInspector.DOMAgent = function() {
+    this._window = new WebInspector.DOMWindow(this);
+    this._idToDOMNode = null;
+    this.document = null;
+}
+
+WebInspector.DOMAgent.prototype = {
+    get domWindow()
+    {
+        return this._window;
+    },
+
+    getChildNodesAsync: function(parent, callback)
+    {
+        var children = parent.children;
+        if (children) {
+            callback(children);
+            return;
+        }
+        function mycallback() {
+            callback(parent.children);
+        }
+        var callId = WebInspector.Callback.wrap(mycallback);
+        InspectorBackend.getChildNodes(callId, parent.id);
+    },
+
+    setAttributeAsync: function(node, name, value, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.setAttribute(WebInspector.Callback.wrap(mycallback), node.id, name, value);
+    },
+
+    removeAttributeAsync: function(node, name, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.removeAttribute(WebInspector.Callback.wrap(mycallback), node.id, name);
+    },
+
+    setTextNodeValueAsync: function(node, text, callback)
+    {
+        var mycallback = this._didApplyDomChange.bind(this, node, callback);
+        InspectorBackend.setTextNodeValue(WebInspector.Callback.wrap(mycallback), node.id, text);
+    },
+
+    _didApplyDomChange: function(node, callback, success)
+    {
+        if (!success)
+            return;
+        callback();
+        // TODO(pfeldman): Fix this hack.
+        var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node);
+        if (elem)
+            elem.updateTitle();
+    },
+
+    _attributesUpdated: function(nodeId, attrsArray)
+    {
+        var node = this._idToDOMNode[nodeId];
+        node._setAttributesPayload(attrsArray);
+        var event = {target: node};
+        this.document._fireDomEvent("DOMAttrModified", event);
+    },
+
+    nodeForId: function(nodeId) {
+        return this._idToDOMNode[nodeId];
+    },
+
+    _setDocument: function(payload)
+    {
+        this._idToDOMNode = {};
+        if (payload && "id" in payload) {
+            this.document = new WebInspector.DOMDocument(this, this._window, payload);
+            this._idToDOMNode[payload.id] = this.document;
+            this._bindNodes(this.document.children);
+        } else
+            this.document = null;
+        WebInspector.panels.elements.setDocument(this.document);
+    },
+
+    _setDetachedRoot: function(payload)
+    {
+        var root = new WebInspector.DOMNode(this.document, payload);
+        this._idToDOMNode[payload.id] = root;
+    },
+
+    _setChildNodes: function(parentId, payloads)
+    {
+        var parent = this._idToDOMNode[parentId];
+        parent._setChildrenPayload(payloads);
+        this._bindNodes(parent.children);
+    },
+
+    _bindNodes: function(children)
+    {
+        for (var i = 0; i < children.length; ++i) {
+            var child = children[i];
+            this._idToDOMNode[child.id] = child;
+            if (child.children)
+                this._bindNodes(child.children);
+        }
+    },
+
+    _childNodeCountUpdated: function(nodeId, newValue)
+    {
+        var node = this._idToDOMNode[nodeId];
+        node._childNodeCount = newValue;
+        var outline = WebInspector.panels.elements.treeOutline;
+        var treeElement = outline.findTreeElement(node);
+        if (treeElement)
+            treeElement.hasChildren = newValue;
+    },
+
+    _childNodeInserted: function(parentId, prevId, payload)
+    {
+        var parent = this._idToDOMNode[parentId];
+        var prev = this._idToDOMNode[prevId];
+        var node = parent._insertChild(prev, payload);
+        this._idToDOMNode[node.id] = node;
+        var event = { target : node, relatedNode : parent };
+        this.document._fireDomEvent("DOMNodeInserted", event);
+    },
+
+    _childNodeRemoved: function(parentId, nodeId)
+    {
+        var parent = this._idToDOMNode[parentId];
+        var node = this._idToDOMNode[nodeId];
+        parent.removeChild_(node);
+        var event = { target : node, relatedNode : parent };
+        this.document._fireDomEvent("DOMNodeRemoved", event);
+        delete this._idToDOMNode[nodeId];
+    }
+}
+
+WebInspector.Cookies = {}
+
+WebInspector.Cookies.getCookiesAsync = function(callback)
+{
+    function mycallback(cookies, cookiesString) {
+        if (cookiesString)
+            callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false);
+        else
+            callback(cookies, true);
+    }
+    var callId = WebInspector.Callback.wrap(mycallback);
+    InspectorBackend.getCookies(callId);
+}
+
+WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
+{
+    var rawCookies = rawCookieString.split(/;\s*/);
+    var cookies = [];
+
+    if (!(/^\s*$/.test(rawCookieString))) {
+        for (var i = 0; i < rawCookies.length; ++i) {
+            var cookie = rawCookies[i];
+            var delimIndex = cookie.indexOf("=");
+            var name = cookie.substring(0, delimIndex);
+            var value = cookie.substring(delimIndex + 1);
+            var size = name.length + value.length;
+            cookies.push({ name: name, value: value, size: size });
+        }
+    }
+
+    return cookies;
+}
+
+WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL)
+{
+    var match = resourceURL.match(WebInspector.URLRegExp);
+    if (!match)
+        return false;
+    // See WebInspector.URLRegExp for definitions of the group index constants.
+    if (!this.cookieDomainMatchesResourceDomain(cookie.domain, match[2]))
+        return false;
+    var resourcePort = match[3] ? match[3] : undefined;
+    var resourcePath = match[4] ? match[4] : '/';
+    return (resourcePath.indexOf(cookie.path) === 0
+        && (!cookie.port || resourcePort == cookie.port)
+        && (!cookie.secure || match[1].toLowerCase() === 'https'));
+}
+
+WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain)
+{
+    if (cookieDomain.charAt(0) !== '.')
+        return resourceDomain === cookieDomain;
+    return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)?" + cookieDomain.substring(1).escapeForRegExp() + "$"), "i");
+}
+
+WebInspector.EventListeners = {}
+
+WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback)
+{
+    if (!node)
+        return;
+
+    var callId = WebInspector.Callback.wrap(callback);
+    InspectorBackend.getEventListenersForNode(callId, node.id);
+}
+
+WebInspector.CSSStyleDeclaration = function(payload)
+{
+    this.id = payload.id;
+    this.injectedScriptId = payload.injectedScriptId;
+    this.width = payload.width;
+    this.height = payload.height;
+    this.__disabledProperties = payload.__disabledProperties;
+    this.__disabledPropertyValues = payload.__disabledPropertyValues;
+    this.__disabledPropertyPriorities = payload.__disabledPropertyPriorities;
+    this.uniqueStyleProperties = payload.uniqueStyleProperties;
+    this._shorthandValues = payload.shorthandValues;
+    this._propertyMap = {};
+    this._longhandProperties = {};
+    this.length = payload.properties.length;
+
+    for (var i = 0; i < this.length; ++i) {
+        var property = payload.properties[i];
+        var name = property.name;
+        this[i] = name;
+        this._propertyMap[name] = property;
+    }
+
+    // Index longhand properties.
+    for (var i = 0; i < this.uniqueStyleProperties.length; ++i) {
+        var name = this.uniqueStyleProperties[i];
+        var property = this._propertyMap[name];
+        if (property.shorthand) {
+            var longhands = this._longhandProperties[property.shorthand];
+            if (!longhands) {
+                longhands = [];
+                this._longhandProperties[property.shorthand] = longhands;
+            }
+            longhands.push(name);
+        }
+    }
+}
+
+WebInspector.CSSStyleDeclaration.parseStyle = function(payload)
+{
+    return new WebInspector.CSSStyleDeclaration(payload);
+}
+
+WebInspector.CSSStyleDeclaration.parseRule = function(payload)
+{
+    var rule = {};
+    rule.id = payload.id;
+    rule.injectedScriptId = payload.injectedScriptId;
+    rule.selectorText = payload.selectorText;
+    rule.style = new WebInspector.CSSStyleDeclaration(payload.style);
+    rule.style.parentRule = rule;
+    rule.isUserAgent = payload.isUserAgent;
+    rule.isUser = payload.isUser;
+    rule.isViaInspector = payload.isViaInspector;
+    if (payload.parentStyleSheet)
+        rule.parentStyleSheet = { href: payload.parentStyleSheet.href };
+
+    return rule;
+}
+
+WebInspector.CSSStyleDeclaration.prototype = {
+    getPropertyValue: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.value : "";
+    },
+
+    getPropertyPriority: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.priority : "";
+    },
+
+    getPropertyShorthand: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.shorthand : "";
+    },
+
+    isPropertyImplicit: function(name)
+    {
+        var property = this._propertyMap[name];
+        return property ? property.implicit : "";
+    },
+
+    styleTextWithShorthands: function()
+    {
+        var cssText = "";
+        var foundProperties = {};
+        for (var i = 0; i < this.length; ++i) {
+            var individualProperty = this[i];
+            var shorthandProperty = this.getPropertyShorthand(individualProperty);
+            var propertyName = (shorthandProperty || individualProperty);
+
+            if (propertyName in foundProperties)
+                continue;
+
+            if (shorthandProperty) {
+                var value = this.getPropertyValue(shorthandProperty);
+                var priority = this.getShorthandPriority(shorthandProperty);
+            } else {
+                var value = this.getPropertyValue(individualProperty);
+                var priority = this.getPropertyPriority(individualProperty);
+            }
+
+            foundProperties[propertyName] = true;
+
+            cssText += propertyName + ": " + value;
+            if (priority)
+                cssText += " !" + priority;
+            cssText += "; ";
+        }
+
+        return cssText;
+    },
+
+    getLonghandProperties: function(name)
+    {
+        return this._longhandProperties[name] || [];
+    },
+
+    getShorthandValue: function(shorthandProperty)
+    {
+        return this._shorthandValues[shorthandProperty];
+    },
+
+    getShorthandPriority: function(shorthandProperty)
+    {
+        var priority = this.getPropertyPriority(shorthandProperty);
+        if (priority)
+            return priority;
+
+        var longhands = this._longhandProperties[shorthandProperty];
+        return longhands ? this.getPropertyPriority(longhands[0]) : null;
+    }
+}
+
+WebInspector.attributesUpdated = function()
+{
+    this.domAgent._attributesUpdated.apply(this.domAgent, arguments);
+}
+
+WebInspector.setDocument = function()
+{
+    this.domAgent._setDocument.apply(this.domAgent, arguments);
+}
+
+WebInspector.setDetachedRoot = function()
+{
+    this.domAgent._setDetachedRoot.apply(this.domAgent, arguments);
+}
+
+WebInspector.setChildNodes = function()
+{
+    this.domAgent._setChildNodes.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeCountUpdated = function()
+{
+    this.domAgent._childNodeCountUpdated.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeInserted = function()
+{
+    this.domAgent._childNodeInserted.apply(this.domAgent, arguments);
+}
+
+WebInspector.childNodeRemoved = function()
+{
+    this.domAgent._childNodeRemoved.apply(this.domAgent, arguments);
+}
+
+WebInspector.didGetCookies = WebInspector.Callback.processCallback;
+WebInspector.didGetChildNodes = WebInspector.Callback.processCallback;
+WebInspector.didPerformSearch = WebInspector.Callback.processCallback;
+WebInspector.didApplyDomChange = WebInspector.Callback.processCallback;
+WebInspector.didRemoveAttribute = WebInspector.Callback.processCallback;
+WebInspector.didSetTextNodeValue = WebInspector.Callback.processCallback;
+WebInspector.didGetEventListenersForNode = WebInspector.Callback.processCallback;
+
+/* InjectedScript.js */
+
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var injectedScriptConstructor = (function (InjectedScriptHost, inspectedWindow, injectedScriptId) {
+
+var InjectedScript = {};
+
+InjectedScript.lastBoundObjectId = 1;
+InjectedScript.idToWrappedObject = {};
+InjectedScript.objectGroups = {};
+InjectedScript.wrapObject = function(object, objectGroupName)
+{
+    var objectId;
+    if (typeof object === "object" || typeof object === "function" ||
+        (typeof object === "undefined" && object instanceof inspectedWindow.HTMLAllCollection)) { // FIXME(33716)
+        var id = InjectedScript.lastBoundObjectId++;
+        objectId = "object#" + id;
+        InjectedScript.idToWrappedObject[objectId] = object;
+
+        var group = InjectedScript.objectGroups[objectGroupName];
+        if (!group) {
+            group = [];
+            InjectedScript.objectGroups[objectGroupName] = group;
+        }
+        group.push(objectId);
+    }
+    return InjectedScript.createProxyObject(object, objectId);
+};
+
+InjectedScript.unwrapObject = function(objectId) {
+    return InjectedScript.idToWrappedObject[objectId];
+};
+
+InjectedScript.releaseWrapperObjectGroup = function(objectGroupName) {
+    var group = InjectedScript.objectGroups[objectGroupName];
+    if (!group)
+        return;
+    for (var i = 0; i < group.length; i++)
+        delete InjectedScript.idToWrappedObject[group[i]];
+    delete InjectedScript.objectGroups[objectGroupName];
+};
+
+// Called from within InspectorController on the 'inspected page' side.
+InjectedScript.reset = function()
+{
+    InjectedScript._styles = {};
+    InjectedScript._styleRules = {};
+    InjectedScript._lastStyleId = 0;
+    InjectedScript._lastStyleRuleId = 0;
+    InjectedScript._searchResults = [];
+    InjectedScript._includedInSearchResultsPropertyName = "__includedInInspectorSearchResults";
+}
+
+InjectedScript.reset();
+
+InjectedScript.dispatch = function(methodName, args, callId)
+{
+    var argsArray = eval("(" + args + ")");
+    if (callId)
+        argsArray.splice(0, 0, callId);  // Methods that run asynchronously have a call back id parameter.
+    var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
+    if (typeof result === "undefined") {
+        InjectedScript._window().console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
+        result = null;
+    }
+    return result;
+}
+
+InjectedScript.getStyles = function(nodeId, authorOnly)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    var defaultView = node.ownerDocument.defaultView;
+    var matchedRules = defaultView.getMatchedCSSRules(node, "", authorOnly);
+    var matchedCSSRules = [];
+    for (var i = 0; matchedRules && i < matchedRules.length; ++i)
+        matchedCSSRules.push(InjectedScript._serializeRule(matchedRules[i]));
+
+    var styleAttributes = {};
+    var attributes = node.attributes;
+    for (var i = 0; attributes && i < attributes.length; ++i) {
+        if (attributes[i].style)
+            styleAttributes[attributes[i].name] = InjectedScript._serializeStyle(attributes[i].style, true);
+    }
+    var result = {};
+    result.inlineStyle = InjectedScript._serializeStyle(node.style, true);
+    result.computedStyle = InjectedScript._serializeStyle(defaultView.getComputedStyle(node));
+    result.matchedCSSRules = matchedCSSRules;
+    result.styleAttributes = styleAttributes;
+    return result;
+}
+
+InjectedScript.getComputedStyle = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    return InjectedScript._serializeStyle(node.ownerDocument.defaultView.getComputedStyle(node));
+}
+
+InjectedScript.getInlineStyle = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    return InjectedScript._serializeStyle(node.style, true);
+}
+
+InjectedScript.applyStyleText = function(styleId, styleText, propertyName)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    var styleTextLength = styleText.length;
+
+    // Create a new element to parse the user input CSS.
+    var parseElement = document.createElement("span");
+    parseElement.setAttribute("style", styleText);
+
+    var tempStyle = parseElement.style;
+    if (tempStyle.length || !styleTextLength) {
+        // The input was parsable or the user deleted everything, so remove the
+        // original property from the real style declaration. If this represents
+        // a shorthand remove all the longhand properties.
+        if (style.getPropertyShorthand(propertyName)) {
+            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
+            for (var i = 0; i < longhandProperties.length; ++i)
+                style.removeProperty(longhandProperties[i]);
+        } else
+            style.removeProperty(propertyName);
+    }
+
+    // Notify caller that the property was successfully deleted.
+    if (!styleTextLength)
+        return [null, [propertyName]];
+
+    if (!tempStyle.length)
+        return false;
+
+    // Iterate of the properties on the test element's style declaration and
+    // add them to the real style declaration. We take care to move shorthands.
+    var foundShorthands = {};
+    var changedProperties = [];
+    var uniqueProperties = InjectedScript._getUniqueStyleProperties(tempStyle);
+    for (var i = 0; i < uniqueProperties.length; ++i) {
+        var name = uniqueProperties[i];
+        var shorthand = tempStyle.getPropertyShorthand(name);
+
+        if (shorthand && shorthand in foundShorthands)
+            continue;
+
+        if (shorthand) {
+            var value = InjectedScript._getShorthandValue(tempStyle, shorthand);
+            var priority = InjectedScript._getShorthandPriority(tempStyle, shorthand);
+            foundShorthands[shorthand] = true;
+        } else {
+            var value = tempStyle.getPropertyValue(name);
+            var priority = tempStyle.getPropertyPriority(name);
+        }
+
+        // Set the property on the real style declaration.
+        style.setProperty((shorthand || name), value, priority);
+        changedProperties.push(shorthand || name);
+    }
+    return [InjectedScript._serializeStyle(style, true), changedProperties];
+}
+
+InjectedScript.setStyleText = function(style, cssText)
+{
+    style.cssText = cssText;
+    return true;
+}
+
+InjectedScript.toggleStyleEnabled = function(styleId, propertyName, disabled)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    if (disabled) {
+        if (!style.__disabledPropertyValues || !style.__disabledPropertyPriorities) {
+            style.__disabledProperties = {};
+            style.__disabledPropertyValues = {};
+            style.__disabledPropertyPriorities = {};
+        }
+
+        style.__disabledPropertyValues[propertyName] = style.getPropertyValue(propertyName);
+        style.__disabledPropertyPriorities[propertyName] = style.getPropertyPriority(propertyName);
+
+        if (style.getPropertyShorthand(propertyName)) {
+            var longhandProperties = InjectedScript._getLonghandProperties(style, propertyName);
+            for (var i = 0; i < longhandProperties.length; ++i) {
+                style.__disabledProperties[longhandProperties[i]] = true;
+                style.removeProperty(longhandProperties[i]);
+            }
+        } else {
+            style.__disabledProperties[propertyName] = true;
+            style.removeProperty(propertyName);
+        }
+    } else if (style.__disabledProperties && style.__disabledProperties[propertyName]) {
+        var value = style.__disabledPropertyValues[propertyName];
+        var priority = style.__disabledPropertyPriorities[propertyName];
+
+        style.setProperty(propertyName, value, priority);
+        delete style.__disabledProperties[propertyName];
+        delete style.__disabledPropertyValues[propertyName];
+        delete style.__disabledPropertyPriorities[propertyName];
+    }
+    return InjectedScript._serializeStyle(style, true);
+}
+
+InjectedScript.applyStyleRuleText = function(ruleId, newContent, selectedNodeId)
+{
+    var rule = InjectedScript._styleRules[ruleId];
+    if (!rule)
+        return false;
+
+    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
+
+    try {
+        var stylesheet = rule.parentStyleSheet;
+        stylesheet.addRule(newContent);
+        var newRule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
+        newRule.style.cssText = rule.style.cssText;
+
+        var parentRules = stylesheet.cssRules;
+        for (var i = 0; i < parentRules.length; ++i) {
+            if (parentRules[i] === rule) {
+                rule.parentStyleSheet.removeRule(i);
+                break;
+            }
+        }
+
+        return [InjectedScript._serializeRule(newRule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode)];
+    } catch(e) {
+        // Report invalid syntax.
+        return false;
+    }
+}
+
+InjectedScript.addStyleSelector = function(newContent, selectedNodeId)
+{
+    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
+    if (!selectedNode)
+        return false;
+    var ownerDocument = selectedNode.ownerDocument;
+
+    var stylesheet = ownerDocument.__stylesheet;
+    if (!stylesheet) {
+        var head = ownerDocument.head;
+        var styleElement = ownerDocument.createElement("style");
+        styleElement.type = "text/css";
+        head.appendChild(styleElement);
+        stylesheet = ownerDocument.styleSheets[ownerDocument.styleSheets.length - 1];
+        ownerDocument.__stylesheet = stylesheet;
+    }
+
+    try {
+        stylesheet.addRule(newContent);
+    } catch (e) {
+        // Invalid Syntax for a Selector
+        return false;
+    }
+
+    var rule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
+    rule.__isViaInspector = true;
+
+    return [ InjectedScript._serializeRule(rule), InjectedScript._doesSelectorAffectNode(newContent, selectedNode) ];
+}
+
+InjectedScript._doesSelectorAffectNode = function(selectorText, node)
+{
+    if (!node)
+        return false;
+    var nodes = node.ownerDocument.querySelectorAll(selectorText);
+    for (var i = 0; i < nodes.length; ++i) {
+        if (nodes[i] === node) {
+            return true;
+        }
+    }
+    return false;
+}
+
+InjectedScript.setStyleProperty = function(styleId, name, value)
+{
+    var style = InjectedScript._styles[styleId];
+    if (!style)
+        return false;
+
+    style.setProperty(name, value, "");
+    return true;
+}
+
+InjectedScript._serializeRule = function(rule)
+{
+    var parentStyleSheet = rule.parentStyleSheet;
+
+    var ruleValue = {};
+    ruleValue.selectorText = rule.selectorText;
+    if (parentStyleSheet) {
+        ruleValue.parentStyleSheet = {};
+        ruleValue.parentStyleSheet.href = parentStyleSheet.href;
+    }
+    ruleValue.isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode && !parentStyleSheet.href;
+    ruleValue.isUser = parentStyleSheet && parentStyleSheet.ownerNode && parentStyleSheet.ownerNode.nodeName == "#document";
+    ruleValue.isViaInspector = !!rule.__isViaInspector;
+
+    // Bind editable scripts only.
+    var doBind = !ruleValue.isUserAgent && !ruleValue.isUser;
+    ruleValue.style = InjectedScript._serializeStyle(rule.style, doBind);
+
+    if (doBind) {
+        if (!rule.id) {
+            rule.id = InjectedScript._lastStyleRuleId++;
+            InjectedScript._styleRules[rule.id] = rule;
+        }
+        ruleValue.id = rule.id;
+        ruleValue.injectedScriptId = injectedScriptId;
+    }
+    return ruleValue;
+}
+
+InjectedScript._serializeStyle = function(style, doBind)
+{
+    var result = {};
+    result.width = style.width;
+    result.height = style.height;
+    result.__disabledProperties = style.__disabledProperties;
+    result.__disabledPropertyValues = style.__disabledPropertyValues;
+    result.__disabledPropertyPriorities = style.__disabledPropertyPriorities;
+    result.properties = [];
+    result.shorthandValues = {};
+    var foundShorthands = {};
+    for (var i = 0; i < style.length; ++i) {
+        var property = {};
+        var name = style[i];
+        property.name = name;
+        property.priority = style.getPropertyPriority(name);
+        property.implicit = style.isPropertyImplicit(name);
+        var shorthand =  style.getPropertyShorthand(name);
+        property.shorthand = shorthand;
+        if (shorthand && !(shorthand in foundShorthands)) {
+            foundShorthands[shorthand] = true;
+            result.shorthandValues[shorthand] = InjectedScript._getShorthandValue(style, shorthand);
+        }
+        property.value = style.getPropertyValue(name);
+        result.properties.push(property);
+    }
+    result.uniqueStyleProperties = InjectedScript._getUniqueStyleProperties(style);
+
+    if (doBind) {
+        if (!style.id) {
+            style.id = InjectedScript._lastStyleId++;
+            InjectedScript._styles[style.id] = style;
+        }
+        result.id = style.id;
+        result.injectedScriptId = injectedScriptId;
+    }
+    return result;
+}
+
+InjectedScript._getUniqueStyleProperties = function(style)
+{
+    var properties = [];
+    var foundProperties = {};
+
+    for (var i = 0; i < style.length; ++i) {
+        var property = style[i];
+        if (property in foundProperties)
+            continue;
+        foundProperties[property] = true;
+        properties.push(property);
+    }
+
+    return properties;
+}
+
+
+InjectedScript._getLonghandProperties = function(style, shorthandProperty)
+{
+    var properties = [];
+    var foundProperties = {};
+
+    for (var i = 0; i < style.length; ++i) {
+        var individualProperty = style[i];
+        if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+            continue;
+        foundProperties[individualProperty] = true;
+        properties.push(individualProperty);
+    }
+
+    return properties;
+}
+
+InjectedScript._getShorthandValue = function(style, shorthandProperty)
+{
+    var value = style.getPropertyValue(shorthandProperty);
+    if (!value) {
+        // Some shorthands (like border) return a null value, so compute a shorthand value.
+        // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823 is fixed.
+
+        var foundProperties = {};
+        for (var i = 0; i < style.length; ++i) {
+            var individualProperty = style[i];
+            if (individualProperty in foundProperties || style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+                continue;
+
+            var individualValue = style.getPropertyValue(individualProperty);
+            if (style.isPropertyImplicit(individualProperty) || individualValue === "initial")
+                continue;
+
+            foundProperties[individualProperty] = true;
+
+            if (!value)
+                value = "";
+            else if (value.length)
+                value += " ";
+            value += individualValue;
+        }
+    }
+    return value;
+}
+
+InjectedScript._getShorthandPriority = function(style, shorthandProperty)
+{
+    var priority = style.getPropertyPriority(shorthandProperty);
+    if (!priority) {
+        for (var i = 0; i < style.length; ++i) {
+            var individualProperty = style[i];
+            if (style.getPropertyShorthand(individualProperty) !== shorthandProperty)
+                continue;
+            priority = style.getPropertyPriority(individualProperty);
+            break;
+        }
+    }
+    return priority;
+}
+
+InjectedScript.getPrototypes = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    var result = [];
+    for (var prototype = node; prototype; prototype = prototype.__proto__) {
+        var title = InjectedScript._describe(prototype, true);
+        if (title.match(/Prototype$/)) {
+            title = title.replace(/Prototype$/, "");
+        }
+        result.push(title);
+    }
+    return result;
+}
+
+InjectedScript.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!InjectedScript._isDefined(object))
+        return false;
+    var properties = [];
+    var propertyNames = ignoreHasOwnProperty ? InjectedScript._getPropertyNames(object) : Object.getOwnPropertyNames(object);
+    if (!ignoreHasOwnProperty && object.__proto__)
+        propertyNames.push("__proto__");
+
+    // Go over properties, prepare results.
+    for (var i = 0; i < propertyNames.length; ++i) {
+        var propertyName = propertyNames[i];
+
+        var property = {};
+        property.name = propertyName + "";
+        property.parentObjectProxy = objectProxy;
+        var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
+        if (!property.isGetter) {
+            try {
+                var childObject = object[propertyName];
+                var childObjectProxy = new InjectedScript.createProxyObject(childObject, objectProxy.objectId, abbreviate);
+                childObjectProxy.path = objectProxy.path ? objectProxy.path.slice() : [];
+                childObjectProxy.path.push(propertyName);
+                property.value = childObjectProxy;
+            } catch(e) {
+                property.value = { description: e.toString() };
+                property.isError = true;
+            }
+        } else {
+            // FIXME: this should show something like "getter" (bug 16734).
+            property.value = { description: "\u2014" }; // em dash
+            property.isGetter = true;
+        }
+        properties.push(property);
+    }
+    return properties;
+}
+
+InjectedScript.setPropertyValue = function(objectProxy, propertyName, expression)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!InjectedScript._isDefined(object))
+        return false;
+
+    var expressionLength = expression.length;
+    if (!expressionLength) {
+        delete object[propertyName];
+        return !(propertyName in object);
+    }
+
+    try {
+        // Surround the expression in parenthesis so the result of the eval is the result
+        // of the whole expression not the last potential sub-expression.
+
+        // There is a regression introduced here: eval is now happening against global object,
+        // not call frame while on a breakpoint.
+        // TODO: bring evaluation against call frame back.
+        var result = InjectedScript._window().eval("(" + expression + ")");
+        // Store the result in the property.
+        object[propertyName] = result;
+        return true;
+    } catch(e) {
+        try {
+            var result = InjectedScript._window().eval("\"" + InjectedScript._escapeCharacters(expression, "\"") + "\"");
+            object[propertyName] = result;
+            return true;
+        } catch(e) {
+            return false;
+        }
+    }
+}
+
+InjectedScript.getNodePropertyValue = function(nodeId, propertyName)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+    var result = node[propertyName];
+    return result !== undefined ? result : false;
+}
+
+InjectedScript.setOuterHTML = function(nodeId, value, expanded)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    var parent = node.parentNode;
+    var prevSibling = node.previousSibling;
+    node.outerHTML = value;
+    var newNode = prevSibling ? prevSibling.nextSibling : parent.firstChild;
+
+    return InjectedScriptHost.pushNodePathToFrontend(newNode, expanded, false);
+}
+
+InjectedScript._populatePropertyNames = function(object, resultSet)
+{
+    for (var o = object; o; o = o.__proto__) {
+        try {
+            var names = Object.getOwnPropertyNames(o);
+            for (var i = 0; i < names.length; ++i)
+                resultSet[names[i] + ""] = true;
+        } catch (e) {
+        }
+    }
+}
+
+InjectedScript._getPropertyNames = function(object, resultSet)
+{
+    var propertyNameSet = {};
+    InjectedScript._populatePropertyNames(object, propertyNameSet);
+    return Object.keys(propertyNameSet);
+}
+
+InjectedScript.getCompletions = function(expression, includeInspectorCommandLineAPI, callFrameId)
+{
+    var props = {};
+    try {
+        var expressionResult;
+        // Evaluate on call frame if call frame id is available.
+        if (typeof callFrameId === "number") {
+            var callFrame = InjectedScript._callFrameForId(callFrameId);
+            if (!callFrame)
+                return props;
+            if (expression)
+                expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
+            else {
+                // Evaluate into properties in scope of the selected call frame.
+                var scopeChain = callFrame.scopeChain;
+                for (var i = 0; i < scopeChain.length; ++i)
+                    InjectedScript._populatePropertyNames(scopeChain[i], props);
+            }
+        } else {
+            if (!expression)
+                expression = "this";
+            expressionResult = InjectedScript._evaluateOn(InjectedScript._window().eval, InjectedScript._window(), expression);
+        }
+        if (typeof expressionResult == "object")
+            InjectedScript._populatePropertyNames(expressionResult, props);
+        if (includeInspectorCommandLineAPI)
+            for (var prop in InjectedScript._window().console._inspectorCommandLineAPI)
+                if (prop.charAt(0) !== '_')
+                    props[prop] = true;
+    } catch(e) {
+    }
+    return props;
+}
+
+InjectedScript.evaluate = function(expression, objectGroup)
+{
+    return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression, objectGroup);
+}
+
+InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup)
+{
+    var result = {};
+    try {
+        result.value = InjectedScript.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression), objectGroup);
+
+        // Handle error that might have happened while describing result.
+        if (result.value.errorText) {
+            result.value = result.value.errorText;
+            result.isException = true;
+        }
+    } catch (e) {
+        result.value = e.toString();
+        result.isException = true;
+    }
+    return result;
+}
+
+InjectedScript._evaluateOn = function(evalFunction, object, expression)
+{
+    InjectedScript._ensureCommandLineAPIInstalled(evalFunction, object);
+    // Surround the expression in with statements to inject our command line API so that
+    // the window object properties still take more precedent than our API functions.
+    expression = "with (window.console._inspectorCommandLineAPI) { with (window) {\n" + expression + "\n} }";
+    var value = evalFunction.call(object, expression);
+
+    // When evaluating on call frame error is not thrown, but returned as a value.
+    if (InjectedScript._type(value) === "error")
+        throw value.toString();
+
+    return value;
+}
+
+InjectedScript.addInspectedNode = function(nodeId)
+{
+    var node = InjectedScript._nodeForId(nodeId);
+    if (!node)
+        return false;
+
+    InjectedScript._ensureCommandLineAPIInstalled(InjectedScript._window().eval, InjectedScript._window());
+    var inspectedNodes = InjectedScript._window().console._inspectorCommandLineAPI._inspectedNodes;
+    inspectedNodes.unshift(node);
+    if (inspectedNodes.length >= 5)
+        inspectedNodes.pop();
+    return true;
+}
+
+InjectedScript.performSearch = function(whitespaceTrimmedQuery)
+{
+    // FIXME: Few things are missing here:
+    // 1) Search works with node granularity - number of matches within node is not calculated.
+    // 2) Search does not work outside main documents' domain - we need to use specific InjectedScript instances
+    //    for other domains.
+    // 3) There is no need to push all search results to the front-end at a time, pushing next / previous result
+    //    is sufficient.
+    var tagNameQuery = whitespaceTrimmedQuery;
+    var attributeNameQuery = whitespaceTrimmedQuery;
+    var startTagFound = (tagNameQuery.indexOf("<") === 0);
+    var endTagFound = (tagNameQuery.lastIndexOf(">") === (tagNameQuery.length - 1));
+
+    if (startTagFound || endTagFound) {
+        var tagNameQueryLength = tagNameQuery.length;
+        tagNameQuery = tagNameQuery.substring((startTagFound ? 1 : 0), (endTagFound ? (tagNameQueryLength - 1) : tagNameQueryLength));
+    }
+
+    // Check the tagNameQuery is it is a possibly valid tag name.
+    if (!/^[a-zA-Z0-9\-_:]+$/.test(tagNameQuery))
+        tagNameQuery = null;
+
+    // Check the attributeNameQuery is it is a possibly valid tag name.
+    if (!/^[a-zA-Z0-9\-_:]+$/.test(attributeNameQuery))
+        attributeNameQuery = null;
+
+    const escapedQuery = InjectedScript._escapeCharacters(whitespaceTrimmedQuery, "'");
+    const escapedTagNameQuery = (tagNameQuery ?  InjectedScript._escapeCharacters(tagNameQuery, "'") : null);
+    const escapedWhitespaceTrimmedQuery = InjectedScript._escapeCharacters(whitespaceTrimmedQuery, "'");
+    const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
+
+    function addNodesToResults(nodes, length, getItem)
+    {
+        if (!length)
+            return;
+
+        var nodeIds = [];
+        for (var i = 0; i < length; ++i) {
+            var node = getItem.call(nodes, i);
+            // Skip this node if it already has the property.
+            if (searchResultsProperty in node)
+                continue;
+
+            if (!InjectedScript._searchResults.length) {
+                InjectedScript._currentSearchResultIndex = 0;
+            }
+
+            node[searchResultsProperty] = true;
+            InjectedScript._searchResults.push(node);
+            var nodeId = InjectedScriptHost.pushNodePathToFrontend(node, false, false);
+            nodeIds.push(nodeId);
+        }
+        InjectedScriptHost.addNodesToSearchResult(nodeIds.join(","));
+    }
+
+    function matchExactItems(doc)
+    {
+        matchExactId.call(this, doc);
+        matchExactClassNames.call(this, doc);
+        matchExactTagNames.call(this, doc);
+        matchExactAttributeNames.call(this, doc);
+    }
+
+    function matchExactId(doc)
+    {
+        const result = doc.__proto__.getElementById.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, (result ? 1 : 0), function() { return this });
+    }
+
+    function matchExactClassNames(doc)
+    {
+        const result = doc.__proto__.getElementsByClassName.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchExactTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.getElementsByTagName.call(doc, tagNameQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchExactAttributeNames(doc)
+    {
+        if (!attributeNameQuery)
+            return;
+        const result = doc.__proto__.querySelectorAll.call(doc, "[" + attributeNameQuery + "]");
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchPartialTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchStartOfTagNames(doc)
+    {
+        if (!tagNameQuery)
+            return;
+        const result = doc.__proto__.evaluate.call(doc, "//*[starts-with(name(), '" + escapedTagNameQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchPartialTagNamesAndAttributeValues(doc)
+    {
+        if (!tagNameQuery) {
+            matchPartialAttributeValues.call(this, doc);
+            return;
+        }
+
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(name(), '" + escapedTagNameQuery + "') or contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchPartialAttributeValues(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, "//*[contains(@*, '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchStyleSelector(doc)
+    {
+        const result = doc.__proto__.querySelectorAll.call(doc, whitespaceTrimmedQuery);
+        addNodesToResults.call(this, result, result.length, result.item);
+    }
+
+    function matchPlainText(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, "//text()[contains(., '" + escapedQuery + "')] | //comment()[contains(., '" + escapedQuery + "')]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function matchXPathQuery(doc)
+    {
+        const result = doc.__proto__.evaluate.call(doc, whitespaceTrimmedQuery, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+        addNodesToResults.call(this, result, result.snapshotLength, result.snapshotItem);
+    }
+
+    function finishedSearching()
+    {
+        // Remove the searchResultsProperty now that the search is finished.
+        for (var i = 0; i < InjectedScript._searchResults.length; ++i)
+            delete InjectedScript._searchResults[i][searchResultsProperty];
+    }
+
+    const mainFrameDocument = InjectedScript._window().document;
+    const searchDocuments = [mainFrameDocument];
+    var searchFunctions;
+    if (tagNameQuery && startTagFound && endTagFound)
+        searchFunctions = [matchExactTagNames, matchPlainText];
+    else if (tagNameQuery && startTagFound)
+        searchFunctions = [matchStartOfTagNames, matchPlainText];
+    else if (tagNameQuery && endTagFound) {
+        // FIXME: we should have a matchEndOfTagNames search function if endTagFound is true but not startTagFound.
+        // This requires ends-with() support in XPath, WebKit only supports starts-with() and contains().
+        searchFunctions = [matchPartialTagNames, matchPlainText];
+    } else if (whitespaceTrimmedQuery === "//*" || whitespaceTrimmedQuery === "*") {
+        // These queries will match every node. Matching everything isn't useful and can be slow for large pages,
+        // so limit the search functions list to plain text and attribute matching.
+        searchFunctions = [matchPartialAttributeValues, matchPlainText];
+    } else
+        searchFunctions = [matchExactItems, matchStyleSelector, matchPartialTagNamesAndAttributeValues, matchPlainText, matchXPathQuery];
+
+    // Find all frames, iframes and object elements to search their documents.
+    const querySelectorAllFunction = InjectedScript._window().Document.prototype.querySelectorAll;
+    const subdocumentResult = querySelectorAllFunction.call(mainFrameDocument, "iframe, frame, object");
+
+    for (var i = 0; i < subdocumentResult.length; ++i) {
+        var element = subdocumentResult.item(i);
+        if (element.contentDocument)
+            searchDocuments.push(element.contentDocument);
+    }
+
+    const panel = InjectedScript;
+    var documentIndex = 0;
+    var searchFunctionIndex = 0;
+    var chunkIntervalIdentifier = null;
+
+    // Split up the work into chunks so we don't block the UI thread while processing.
+
+    function processChunk()
+    {
+        var searchDocument = searchDocuments[documentIndex];
+        var searchFunction = searchFunctions[searchFunctionIndex];
+
+        if (++searchFunctionIndex > searchFunctions.length) {
+            searchFunction = searchFunctions[0];
+            searchFunctionIndex = 0;
+
+            if (++documentIndex > searchDocuments.length) {
+                if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)
+                    delete panel._currentSearchChunkIntervalIdentifier;
+                clearInterval(chunkIntervalIdentifier);
+                finishedSearching.call(panel);
+                return;
+            }
+
+            searchDocument = searchDocuments[documentIndex];
+        }
+
+        if (!searchDocument || !searchFunction)
+            return;
+
+        try {
+            searchFunction.call(panel, searchDocument);
+        } catch(err) {
+            // ignore any exceptions. the query might be malformed, but we allow that.
+        }
+    }
+
+    processChunk();
+
+    chunkIntervalIdentifier = setInterval(processChunk, 25);
+    InjectedScript._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;
+    return true;
+}
+
+InjectedScript.searchCanceled = function()
+{
+    if (InjectedScript._searchResults) {
+        const searchResultsProperty = InjectedScript._includedInSearchResultsPropertyName;
+        for (var i = 0; i < this._searchResults.length; ++i) {
+            var node = this._searchResults[i];
+
+            // Remove the searchResultsProperty since there might be an unfinished search.
+            delete node[searchResultsProperty];
+        }
+    }
+
+    if (InjectedScript._currentSearchChunkIntervalIdentifier) {
+        clearInterval(InjectedScript._currentSearchChunkIntervalIdentifier);
+        delete InjectedScript._currentSearchChunkIntervalIdentifier;
+    }
+    InjectedScript._searchResults = [];
+    return true;
+}
+
+InjectedScript.openInInspectedWindow = function(url)
+{
+    // Don't call window.open on wrapper - popup blocker mutes it.
+    // URIs should have no double quotes.
+    InjectedScript._window().eval("window.open(\"" + url + "\")");
+    return true;
+}
+
+InjectedScript.callFrames = function()
+{
+    var callFrame = InjectedScriptHost.currentCallFrame();
+    if (!callFrame)
+        return false;
+
+    var result = [];
+    var depth = 0;
+    do {
+        result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
+        callFrame = callFrame.caller;
+    } while (callFrame);
+    return result;
+}
+
+InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
+{
+    var callFrame = InjectedScript._callFrameForId(callFrameId);
+    if (!callFrame)
+        return false;
+    return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
+}
+
+InjectedScript._callFrameForId = function(id)
+{
+    var callFrame = InjectedScriptHost.currentCallFrame();
+    while (--id >= 0 && callFrame)
+        callFrame = callFrame.caller;
+    return callFrame;
+}
+
+InjectedScript.clearConsoleMessages = function()
+{
+    InjectedScriptHost.clearConsoleMessages();
+    return true;
+}
+
+InjectedScript._inspectObject = function(o)
+{
+    if (arguments.length === 0)
+        return;
+
+    inspectedWindow.console.log(o);
+    if (InjectedScript._type(o) === "node") {
+        InjectedScriptHost.pushNodePathToFrontend(o, false, true);
+    } else {
+        switch (InjectedScript._describe(o)) {
+            case "Database":
+                InjectedScriptHost.selectDatabase(o);
+                break;
+            case "Storage":
+                InjectedScriptHost.selectDOMStorage(o);
+                break;
+        }
+    }
+}
+
+InjectedScript._copy = function(o)
+{
+    if (InjectedScript._type(o) === "node") {
+        var nodeId = InjectedScriptHost.pushNodePathToFrontend(o, false, false);
+        InjectedScriptHost.copyNode(nodeId);
+    } else {
+        InjectedScriptHost.copyText(o);
+    }
+}
+
+InjectedScript._ensureCommandLineAPIInstalled = function(evalFunction, evalObject)
+{
+    if (evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI"))
+        return;
+    var inspectorCommandLineAPI = evalFunction.call(evalObject, "window.console._inspectorCommandLineAPI = { \n\
+        $: function() { return document.getElementById.apply(document, arguments) }, \n\
+        $$: function() { return document.querySelectorAll.apply(document, arguments) }, \n\
+        $x: function(xpath, context) \n\
+        { \n\
+            var nodes = []; \n\
+            try { \n\
+                var doc = context || document; \n\
+                var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); \n\
+                var node; \n\
+                while (node = results.iterateNext()) nodes.push(node); \n\
+            } catch (e) {} \n\
+            return nodes; \n\
+        }, \n\
+        dir: function() { return console.dir.apply(console, arguments) }, \n\
+        dirxml: function() { return console.dirxml.apply(console, arguments) }, \n\
+        keys: function(o) { var a = []; for (var k in o) a.push(k); return a; }, \n\
+        values: function(o) { var a = []; for (var k in o) a.push(o[k]); return a; }, \n\
+        profile: function() { return console.profile.apply(console, arguments) }, \n\
+        profileEnd: function() { return console.profileEnd.apply(console, arguments) }, \n\
+        _logEvent: function _inspectorCommandLineAPI_logEvent(e) { console.log(e.type, e); }, \n\
+        _allEventTypes: [\"mouse\", \"key\", \"load\", \"unload\", \"abort\", \"error\", \n\
+            \"select\", \"change\", \"submit\", \"reset\", \"focus\", \"blur\", \n\
+            \"resize\", \"scroll\"], \n\
+        _normalizeEventTypes: function(t) \n\
+        { \n\
+            if (typeof t === \"undefined\") \n\
+                t = console._inspectorCommandLineAPI._allEventTypes; \n\
+            else if (typeof t === \"string\") \n\
+                t = [t]; \n\
+            var i, te = []; \n\
+            for (i = 0; i < t.length; i++) { \n\
+                if (t[i] === \"mouse\") \n\
+                    te.splice(0, 0, \"mousedown\", \"mouseup\", \"click\", \"dblclick\", \n\
+                        \"mousemove\", \"mouseover\", \"mouseout\"); \n\
+                else if (t[i] === \"key\") \n\
+                    te.splice(0, 0, \"keydown\", \"keyup\", \"keypress\"); \n\
+                else \n\
+                    te.push(t[i]); \n\
+            } \n\
+            return te; \n\
+        }, \n\
+        monitorEvents: function(o, t) \n\
+        { \n\
+            if (!o || !o.addEventListener || !o.removeEventListener) \n\
+                return; \n\
+            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
+            for (i = 0; i < t.length; i++) { \n\
+                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+                o.addEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+            } \n\
+        }, \n\
+        unmonitorEvents: function(o, t) \n\
+        { \n\
+            if (!o || !o.removeEventListener) \n\
+                return; \n\
+            t = console._inspectorCommandLineAPI._normalizeEventTypes(t); \n\
+            for (i = 0; i < t.length; i++) { \n\
+                o.removeEventListener(t[i], console._inspectorCommandLineAPI._logEvent, false); \n\
+            } \n\
+        }, \n\
+        _inspectedNodes: [], \n\
+        get $0() { return console._inspectorCommandLineAPI._inspectedNodes[0] }, \n\
+        get $1() { return console._inspectorCommandLineAPI._inspectedNodes[1] }, \n\
+        get $2() { return console._inspectorCommandLineAPI._inspectedNodes[2] }, \n\
+        get $3() { return console._inspectorCommandLineAPI._inspectedNodes[3] }, \n\
+        get $4() { return console._inspectorCommandLineAPI._inspectedNodes[4] }, \n\
+    };");
+
+    inspectorCommandLineAPI.clear = InjectedScript.clearConsoleMessages;
+    inspectorCommandLineAPI.inspect = InjectedScript._inspectObject;
+    inspectorCommandLineAPI.copy = InjectedScript._copy;
+}
+
+InjectedScript._resolveObject = function(objectProxy)
+{
+    var object = InjectedScript._objectForId(objectProxy.objectId);
+    var path = objectProxy.path;
+    var protoDepth = objectProxy.protoDepth;
+
+    // Follow the property path.
+    for (var i = 0; InjectedScript._isDefined(object) && path && i < path.length; ++i)
+        object = object[path[i]];
+
+    return object;
+}
+
+InjectedScript._window = function()
+{
+    // TODO: replace with 'return window;' once this script is injected into
+    // the page's context.
+    return inspectedWindow;
+}
+
+InjectedScript._nodeForId = function(nodeId)
+{
+    if (!nodeId)
+        return null;
+    return InjectedScriptHost.nodeForId(nodeId);
+}
+
+InjectedScript._objectForId = function(objectId)
+{
+    // There are three types of object ids used:
+    // - numbers point to DOM Node via the InspectorDOMAgent mapping
+    // - strings point to console objects cached in InspectorController for lazy evaluation upon them
+    // - objects contain complex ids and are currently used for scoped objects
+    if (typeof objectId === "number") {
+        return InjectedScript._nodeForId(objectId);
+    } else if (typeof objectId === "string") {
+        return InjectedScript.unwrapObject(objectId);
+    } else if (typeof objectId === "object") {
+        var callFrame = InjectedScript._callFrameForId(objectId.callFrame);
+        if (objectId.thisObject)
+            return callFrame.thisObject;
+        else
+            return callFrame.scopeChain[objectId.chainIndex];
+    }
+    return objectId;
+}
+
+InjectedScript.pushNodeToFrontend = function(objectProxy)
+{
+    var object = InjectedScript._resolveObject(objectProxy);
+    if (!object || InjectedScript._type(object) !== "node")
+        return false;
+    return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
+}
+
+InjectedScript.nodeByPath = function(path)
+{
+    // We make this call through the injected script only to get a nice
+    // callback for it.
+    return InjectedScriptHost.pushNodeByPathToFrontend(path.join(","));
+}
+
+// Called from within InspectorController on the 'inspected page' side.
+InjectedScript.createProxyObject = function(object, objectId, abbreviate)
+{
+    var result = {};
+    result.injectedScriptId = injectedScriptId;
+    result.objectId = objectId;
+    result.type = InjectedScript._type(object);
+    if (result.type === "array")
+        result.propertyLength = object.length;
+
+    var type = typeof object;
+    
+    result.hasChildren = (type === "object" && object !== null && (Object.getOwnPropertyNames(object).length || object.__proto__)) || type === "function";
+    try {
+        result.description = InjectedScript._describe(object, abbreviate);
+    } catch (e) {
+        result.errorText = e.toString();
+    }
+    return result;
+}
+
+InjectedScript.evaluateOnSelf = function(funcBody)
+{
+    return window.eval("(" + funcBody + ")();");
+}
+
+InjectedScript.CallFrameProxy = function(id, callFrame)
+{
+    this.id = id;
+    this.type = callFrame.type;
+    this.functionName = (this.type === "function" ? callFrame.functionName : "");
+    this.sourceID = callFrame.sourceID;
+    this.line = callFrame.line;
+    this.scopeChain = this._wrapScopeChain(callFrame);
+}
+
+InjectedScript.CallFrameProxy.prototype = {
+    _wrapScopeChain: function(callFrame)
+    {
+        var foundLocalScope = false;
+        var scopeChain = callFrame.scopeChain;
+        var scopeChainProxy = [];
+        for (var i = 0; i < scopeChain.length; ++i) {
+            var scopeObject = scopeChain[i];
+            var scopeObjectProxy = InjectedScript.createProxyObject(scopeObject, { callFrame: this.id, chainIndex: i }, true);
+
+            if (InjectedScriptHost.isActivation(scopeObject)) {
+                if (!foundLocalScope)
+                    scopeObjectProxy.thisObject = InjectedScript.createProxyObject(callFrame.thisObject, { callFrame: this.id, thisObject: true }, true);
+                else
+                    scopeObjectProxy.isClosure = true;
+                foundLocalScope = true;
+                scopeObjectProxy.isLocal = true;
+            } else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Element)
+                scopeObjectProxy.isElement = true;
+            else if (foundLocalScope && scopeObject instanceof InjectedScript._window().Document)
+                scopeObjectProxy.isDocument = true;
+            else if (!foundLocalScope)
+                scopeObjectProxy.isWithBlock = true;
+            scopeChainProxy.push(scopeObjectProxy);
+        }
+        return scopeChainProxy;
+    }
+}
+
+InjectedScript.executeSql = function(callId, databaseId, query)
+{
+    function successCallback(tx, result)
+    {
+        var rows = result.rows;
+        var result = [];
+        var length = rows.length;
+        for (var i = 0; i < length; ++i) {
+            var data = {};
+            result.push(data);
+            var row = rows.item(i);
+            for (var columnIdentifier in row) {
+                // FIXME: (Bug 19439) We should specially format SQL NULL here
+                // (which is represented by JavaScript null here, and turned
+                // into the string "null" by the String() function).
+                var text = row[columnIdentifier];
+                data[columnIdentifier] = String(text);
+            }
+        }
+        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, result, false);
+    }
+
+    function errorCallback(tx, error)
+    {
+        InjectedScriptHost.reportDidDispatchOnInjectedScript(callId, error, false);
+    }
+
+    function queryTransaction(tx)
+    {
+        tx.executeSql(query, null, successCallback, errorCallback);
+    }
+
+    var database = InjectedScriptHost.databaseForId(databaseId);
+    if (!database)
+        errorCallback(null, { code : 2 });  // Return as unexpected version.
+    database.transaction(queryTransaction, errorCallback);
+    return true;
+}
+
+InjectedScript._isDefined = function(object)
+{
+    return object || object instanceof inspectedWindow.HTMLAllCollection;
+}
+
+InjectedScript._type = function(obj)
+{
+    if (obj === null)
+        return "null";
+
+    // FIXME(33716): typeof document.all is always 'undefined'.
+    if (obj instanceof inspectedWindow.HTMLAllCollection)
+        return "array";
+
+    var type = typeof obj;
+    if (type !== "object" && type !== "function")
+        return type;
+
+    var win = InjectedScript._window();
+
+    if (obj instanceof win.Node)
+        return (obj.nodeType === undefined ? type : "node");
+    if (obj instanceof win.String)
+        return "string";
+    if (obj instanceof win.Array)
+        return "array";
+    if (obj instanceof win.Boolean)
+        return "boolean";
+    if (obj instanceof win.Number)
+        return "number";
+    if (obj instanceof win.Date)
+        return "date";
+    if (obj instanceof win.RegExp)
+        return "regexp";
+    if (obj instanceof win.NodeList)
+        return "array";
+    if (obj instanceof win.HTMLCollection || obj instanceof win.HTMLAllCollection)
+        return "array";
+    if (obj instanceof win.Error)
+        return "error";
+    return type;
+}
+
+InjectedScript._describe = function(obj, abbreviated)
+{
+    var type1 = InjectedScript._type(obj);
+    var type2 = InjectedScript._className(obj);
+
+    switch (type1) {
+    case "object":
+    case "node":
+    case "array":
+        return type2;
+    case "string":
+        if (!abbreviated)
+            return obj;
+        if (obj.length > 100)
+            return "\"" + obj.substring(0, 100) + "\u2026\"";
+        return "\"" + obj + "\"";
+    case "function":
+        var objectText = String(obj);
+        if (!/^function /.test(objectText))
+            objectText = (type2 == "object") ? type1 : type2;
+        else if (abbreviated)
+            objectText = /.*/.exec(obj)[0].replace(/ +$/g, "");
+        return objectText;
+    default:
+        return String(obj);
+    }
+}
+
+InjectedScript._className = function(obj)
+{
+    return Object.prototype.toString.call(obj).replace(/^\[object (.*)\]$/i, "$1")
+}
+
+InjectedScript._escapeCharacters = function(str, chars)
+{
+    var foundChar = false;
+    for (var i = 0; i < chars.length; ++i) {
+        if (str.indexOf(chars.charAt(i)) !== -1) {
+            foundChar = true;
+            break;
+        }
+    }
+
+    if (!foundChar)
+        return str;
+
+    var result = "";
+    for (var i = 0; i < str.length; ++i) {
+        if (chars.indexOf(str.charAt(i)) !== -1)
+            result += "\\";
+        result += str.charAt(i);
+    }
+
+    return result;
+}
+
+return InjectedScript;
+});
+
+/* InjectedScriptAccess.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+function InjectedScriptAccess(injectedScriptId) {
+    this._injectedScriptId = injectedScriptId;
+}
+
+InjectedScriptAccess.get = function(injectedScriptId)
+{
+    return new InjectedScriptAccess(injectedScriptId);
+}
+
+InjectedScriptAccess.getDefault = function()
+{
+    return InjectedScriptAccess.get(0);
+}
+
+InjectedScriptAccess.prototype = {};
+
+InjectedScriptAccess._installHandler = function(methodName, async)
+{
+    InjectedScriptAccess.prototype[methodName] = function()
+    {
+        var allArgs = Array.prototype.slice.call(arguments);
+        var callback = allArgs[allArgs.length - 1];
+        var argsString = JSON.stringify(Array.prototype.slice.call(allArgs, 0, allArgs.length - 1));
+        
+        function myCallback(result, isException)
+        {
+            if (!isException)
+                callback(result);
+            else
+                WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage("Error dispatching: " + methodName));
+        }
+        var callId = WebInspector.Callback.wrap(myCallback);
+
+        InspectorBackend.dispatchOnInjectedScript(callId, this._injectedScriptId, methodName, argsString, !!async);
+    };
+}
+
+// InjectedScriptAccess message forwarding puts some constraints on the way methods are implemented and called:
+// - Make sure corresponding methods in InjectedScript return non-null and non-undefined values,
+// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
+// We keep these sorted.
+InjectedScriptAccess._installHandler("addInspectedNode");
+InjectedScriptAccess._installHandler("addStyleSelector");
+InjectedScriptAccess._installHandler("applyStyleRuleText");
+InjectedScriptAccess._installHandler("applyStyleText");
+InjectedScriptAccess._installHandler("clearConsoleMessages");
+InjectedScriptAccess._installHandler("evaluate");
+InjectedScriptAccess._installHandler("evaluateInCallFrame");
+InjectedScriptAccess._installHandler("getCompletions");
+InjectedScriptAccess._installHandler("getComputedStyle");
+InjectedScriptAccess._installHandler("getInlineStyle");
+InjectedScriptAccess._installHandler("getNodePropertyValue");
+InjectedScriptAccess._installHandler("getProperties");
+InjectedScriptAccess._installHandler("getPrototypes");
+InjectedScriptAccess._installHandler("getStyles");
+InjectedScriptAccess._installHandler("openInInspectedWindow");
+InjectedScriptAccess._installHandler("performSearch");
+InjectedScriptAccess._installHandler("pushNodeToFrontend");
+InjectedScriptAccess._installHandler("nodeByPath");
+InjectedScriptAccess._installHandler("searchCanceled");
+InjectedScriptAccess._installHandler("setOuterHTML");
+InjectedScriptAccess._installHandler("setPropertyValue");
+InjectedScriptAccess._installHandler("setStyleProperty");
+InjectedScriptAccess._installHandler("setStyleText");
+InjectedScriptAccess._installHandler("toggleStyleEnabled");
+InjectedScriptAccess._installHandler("evaluateOnSelf");
+
+// Some methods can't run synchronously even on the injected script side (such as DB transactions).
+// Mark them as asynchronous here.
+InjectedScriptAccess._installHandler("executeSql", true);
+
+WebInspector.didDispatchOnInjectedScript = WebInspector.Callback.processCallback;
+
+/* TimelineAgent.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineAgent = function() {
+    // Not implemented.
+}
+
+// Must be kept in sync with TimelineItem.h
+WebInspector.TimelineAgent.RecordType = {
+    EventDispatch : 0,
+    Layout : 1,
+    RecalculateStyles : 2,
+    Paint : 3,
+    ParseHTML : 4,
+    TimerInstall : 5,
+    TimerRemove : 6,
+    TimerFire : 7,
+    XHRReadyStateChange : 8,
+    XHRLoad : 9,
+    EvaluateScript : 10,
+    MarkTimeline : 11,
+    ResourceSendRequest : 12,
+    ResourceReceiveResponse : 13,
+    ResourceFinish : 14,
+    FunctionCall : 15
+};
+
+WebInspector.addRecordToTimeline = function(record) {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.addRecordToTimeline(record);
+}
+
+WebInspector.timelineProfilerWasStarted = function() {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.timelineWasStarted();
+}
+
+WebInspector.timelineProfilerWasStopped = function() {
+    if (WebInspector.panels.timeline)
+        WebInspector.panels.timeline.timelineWasStopped();
+}
+
+/* TimelinePanel.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelinePanel = function()
+{
+    WebInspector.Panel.call(this);
+    this.element.addStyleClass("timeline");
+
+    this._overviewPane = new WebInspector.TimelineOverviewPane(this.categories);
+    this._overviewPane.addEventListener("window changed", this._windowChanged, this);
+    this._overviewPane.addEventListener("filter changed", this._refresh, this);
+    this.element.appendChild(this._overviewPane.element);
+    this.element.tabIndex = 0;
+
+    this._sidebarBackgroundElement = document.createElement("div");
+    this._sidebarBackgroundElement.className = "sidebar timeline-sidebar-background";
+    this.element.appendChild(this._sidebarBackgroundElement);
+
+    this._containerElement = document.createElement("div");
+    this._containerElement.id = "timeline-container";
+    this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);
+    this.element.appendChild(this._containerElement);
+
+    this.createSidebar(this._containerElement, this._containerElement);
+    var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);
+    itemsTreeElement.expanded = true;
+    this.sidebarTree.appendChild(itemsTreeElement);
+
+    this._sidebarListElement = document.createElement("div");
+    this.sidebarElement.appendChild(this._sidebarListElement);
+
+    this._containerContentElement = document.createElement("div");
+    this._containerContentElement.id = "resources-container-content";
+    this._containerElement.appendChild(this._containerContentElement);
+
+    this._timelineGrid = new WebInspector.TimelineGrid();
+    this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;
+    this._itemsGraphsElement.id = "timeline-graphs";
+    this._containerContentElement.appendChild(this._timelineGrid.element);
+
+    this._topGapElement = document.createElement("div");
+    this._topGapElement.className = "timeline-gap";
+    this._itemsGraphsElement.appendChild(this._topGapElement);
+
+    this._graphRowsElement = document.createElement("div");
+    this._itemsGraphsElement.appendChild(this._graphRowsElement);
+
+    this._bottomGapElement = document.createElement("div");
+    this._bottomGapElement.className = "timeline-gap";
+    this._itemsGraphsElement.appendChild(this._bottomGapElement);
+
+    this._createStatusbarButtons();
+
+    this._records = [];
+    this._sendRequestRecords = {};
+    this._timerRecords = {};
+
+    this._calculator = new WebInspector.TimelineCalculator();
+    this._boundariesAreValid = true;
+    this._scrollTop = 0;
+
+    this._popoverHelper = new WebInspector.PopoverHelper(this._containerElement, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);
+}
+
+WebInspector.TimelinePanel.prototype = {
+    toolbarItemClass: "timeline",
+
+    get toolbarItemLabel()
+    {
+        return WebInspector.UIString("Timeline");
+    },
+
+    get statusBarItems()
+    {
+        return [this.toggleTimelineButton.element, this.clearButton.element];
+    },
+
+    get categories()
+    {
+        if (!this._categories) {
+            this._categories = {
+                loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), "rgb(47,102,236)"),
+                scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), "rgb(157,231,119)"),
+                rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), "rgb(164,60,255)")
+            };
+        }
+        return this._categories;
+    },
+
+    get defaultFocusedElement()
+    {
+        return this.element;
+    },
+
+    get _recordStyles()
+    {
+        if (!this._recordStylesArray) {
+            var recordTypes = WebInspector.TimelineAgent.RecordType;
+            var recordStyles = {};
+            recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: this.categories.scripting };
+            recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: this.categories.rendering };
+            recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: this.categories.rendering };
+            recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: this.categories.rendering };
+            recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse"), category: this.categories.loading };
+            recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: this.categories.scripting };
+            recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: this.categories.scripting };
+            recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: this.categories.scripting };
+            recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: this.categories.scripting };
+            recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: this.categories.scripting };
+            recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: this.categories.scripting };
+            recordStyles[recordTypes.MarkTimeline] = { title: WebInspector.UIString("Mark"), category: this.categories.scripting };
+            recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: this.categories.loading };
+            recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: this.categories.loading };
+            recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: this.categories.loading };
+            recordStyles[recordTypes.FunctionCall] = { title: WebInspector.UIString("Function Call"), category: this.categories.scripting };
+            this._recordStylesArray = recordStyles;
+        }
+        return this._recordStylesArray;
+    },
+
+    _createStatusbarButtons: function()
+    {
+        this.toggleTimelineButton = new WebInspector.StatusBarButton("", "record-profile-status-bar-item");
+        this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked.bind(this), false);
+
+        this.clearButton = new WebInspector.StatusBarButton("", "timeline-clear-status-bar-item");
+        this.clearButton.addEventListener("click", this.reset.bind(this), false);
+    },
+
+    _toggleTimelineButtonClicked: function()
+    {
+        if (this.toggleTimelineButton.toggled)
+            InspectorBackend.stopTimelineProfiler();
+        else
+            InspectorBackend.startTimelineProfiler();
+    },
+
+    timelineWasStarted: function()
+    {
+        this.toggleTimelineButton.toggled = true;
+    },
+
+    timelineWasStopped: function()
+    {
+        this.toggleTimelineButton.toggled = false;
+    },
+
+    addRecordToTimeline: function(record)
+    {
+        this._innerAddRecordToTimeline(record, this._records);
+        this._scheduleRefresh();
+    },
+
+    _innerAddRecordToTimeline: function(record, collection)
+    {
+        var formattedRecord = new WebInspector.TimelinePanel.FormattedRecord(record, this._recordStyles, this._sendRequestRecords, this._timerRecords);
+
+        // Glue subsequent records with same category and title together if they are closer than 100ms to each other.
+        if (this._lastRecord && (!record.children || !record.children.length) &&
+                this._lastRecord.category == formattedRecord.category &&
+                this._lastRecord.title == formattedRecord.title &&
+                this._lastRecord.details == formattedRecord.details &&
+                this._lastRecord.callerScriptName == formattedRecord.callerScriptName &&
+                this._lastRecord.callerScriptLine == formattedRecord.callerScriptLine &&
+                formattedRecord.startTime - this._lastRecord.endTime < 0.1) {
+            this._lastRecord.endTime = formattedRecord.endTime;
+            this._lastRecord.count++;
+        } else {
+            collection.push(formattedRecord);
+            for (var i = 0; record.children && i < record.children.length; ++i) {
+                if (!formattedRecord.children)
+                    formattedRecord.children = [];
+                var formattedChild = this._innerAddRecordToTimeline(record.children[i], formattedRecord.children);
+                formattedChild.parent = formattedRecord;
+            }
+            this._lastRecord = record.children && record.children.length ? null : formattedRecord;
+        }
+        return formattedRecord;
+    },
+
+    setSidebarWidth: function(width)
+    {
+        WebInspector.Panel.prototype.setSidebarWidth.call(this, width);
+        this._sidebarBackgroundElement.style.width = width + "px";
+        this._overviewPane.setSidebarWidth(width);
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._containerContentElement.style.left = width + "px";
+        this._scheduleRefresh();
+        this._overviewPane.updateMainViewWidth(width);
+    },
+
+    resize: function() {
+        this._closeRecordDetails();
+        this._scheduleRefresh();
+    },
+
+    reset: function()
+    {
+        this._lastRecord = null;
+        this._sendRequestRecords = {};
+        this._timerRecords = {};
+        this._records = [];
+        this._boundariesAreValid = false;
+        this._overviewPane.reset();
+        this._adjustScrollPosition(0);
+        this._refresh();
+        this._closeRecordDetails();
+    },
+
+    show: function()
+    {
+        WebInspector.Panel.prototype.show.call(this);
+        if (typeof this._scrollTop === "number")
+            this._containerElement.scrollTop = this._scrollTop;
+        else if (this._needsRefresh)
+            this._refresh();
+    },
+
+    hide: function()
+    {
+        WebInspector.Panel.prototype.hide.call(this);
+        this._closeRecordDetails();
+    },
+
+    _onScroll: function(event)
+    {
+        this._closeRecordDetails();
+        var scrollTop = this._containerElement.scrollTop;
+        var dividersTop = Math.max(0, scrollTop);
+        this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);
+        this._scheduleRefresh(true);
+    },
+
+    _windowChanged: function()
+    {
+        this._closeRecordDetails();
+        this._scheduleRefresh();
+    },
+
+    _scheduleRefresh: function(preserveBoundaries)
+    {
+        if (preserveBoundaries)
+            this._closeRecordDetails();
+        this._boundariesAreValid &= preserveBoundaries;
+        if (this._needsRefresh)
+            return;
+        this._needsRefresh = true;
+
+        if (this.visible && !("_refreshTimeout" in this)) {
+            if (preserveBoundaries)
+                this._refresh();
+            else
+                this._refreshTimeout = setTimeout(this._refresh.bind(this), 100);
+        }
+    },
+
+    _refresh: function()
+    {
+        this._needsRefresh = false;
+        if ("_refreshTimeout" in this) {
+            clearTimeout(this._refreshTimeout);
+            delete this._refreshTimeout;
+        }
+
+        if (!this._boundariesAreValid)
+            this._overviewPane.update(this._records);
+        this._refreshRecords(!this._boundariesAreValid);
+        this._boundariesAreValid = true;
+    },
+
+    _refreshRecords: function(updateBoundaries)
+    {
+        if (updateBoundaries) {
+            this._calculator.reset();
+            this._calculator.windowLeft = this._overviewPane.windowLeft;
+            this._calculator.windowRight = this._overviewPane.windowRight;
+
+            for (var i = 0; i < this._records.length; ++i)
+                this._calculator.updateBoundaries(this._records[i]);
+
+            this._calculator.calculateWindow();
+        }
+
+        var recordsInWindow = [];
+        for (var i = 0; i < this._records.length; ++i) {
+            var record = this._records[i];
+            var percentages = this._calculator.computeBarGraphPercentages(record);
+            if (percentages.start < 100 && percentages.end >= 0 && !record.category.hidden)
+                this._addToRecordsWindow(record, recordsInWindow);
+        }
+
+        // Calculate the visible area.
+        this._scrollTop = this._containerElement.scrollTop;
+        var visibleTop = this._scrollTop;
+        var visibleBottom = visibleTop + this._containerElement.clientHeight;
+
+        // Define row height, should be in sync with styles for timeline graphs.
+        const rowHeight = 18;
+        const expandOffset = 15;
+
+        // Convert visible area to visible indexes. Always include top-level record for a visible nested record.
+        var startIndex = Math.max(0, Math.min(Math.floor(visibleTop / rowHeight) - 1, recordsInWindow.length - 1));
+        while (startIndex > 0 && recordsInWindow[startIndex].parent)
+            startIndex--;
+        var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
+        while (endIndex < recordsInWindow.length - 1 && recordsInWindow[endIndex].parent)
+            endIndex++;
+
+        // Resize gaps first.
+        const top = (startIndex * rowHeight) + "px";
+        this._topGapElement.style.height = top;
+        this.sidebarElement.style.top = top;
+        this.sidebarResizeElement.style.top = top;
+        this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";
+
+        // Update visible rows.
+        var listRowElement = this._sidebarListElement.firstChild;
+        var width = this._graphRowsElement.offsetWidth;
+        this._itemsGraphsElement.removeChild(this._graphRowsElement);
+        var graphRowElement = this._graphRowsElement.firstChild;
+        var scheduleRefreshCallback = this._scheduleRefresh.bind(this, true);
+
+        for (var i = startIndex; i < endIndex; ++i) {
+            var record = recordsInWindow[i];
+            var isEven = !(i % 2);
+
+            if (!listRowElement) {
+                listRowElement = new WebInspector.TimelineRecordListRow().element;
+                this._sidebarListElement.appendChild(listRowElement);
+            }
+            if (!graphRowElement) {
+                graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback, rowHeight).element;
+                this._graphRowsElement.appendChild(graphRowElement);
+            }
+
+            listRowElement.row.update(record, isEven, this._calculator, visibleTop);
+            graphRowElement.row.update(record, isEven, this._calculator, width, expandOffset, i);
+
+            listRowElement = listRowElement.nextSibling;
+            graphRowElement = graphRowElement.nextSibling;
+        }
+
+        // Remove extra rows.
+        while (listRowElement) {
+            var nextElement = listRowElement.nextSibling;
+            listRowElement.row.dispose();
+            listRowElement = nextElement;
+        }
+        while (graphRowElement) {
+            var nextElement = graphRowElement.nextSibling;
+            graphRowElement.row.dispose();
+            graphRowElement = nextElement;
+        }
+
+        this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bottomGapElement);
+        // Reserve some room for expand / collapse controls to the left for records that start at 0ms.
+        var timelinePaddingLeft = this._calculator.windowLeft === 0 ? expandOffset : 0;
+        if (updateBoundaries)
+            this._timelineGrid.updateDividers(true, this._calculator, timelinePaddingLeft);
+        this._adjustScrollPosition((recordsInWindow.length + 1) * rowHeight);
+    },
+
+    _addToRecordsWindow: function(record, recordsWindow)
+    {
+        recordsWindow.push(record);
+        if (!record.collapsed) {
+            var index = recordsWindow.length;
+            for (var i = 0; record.children && i < record.children.length; ++i)
+                this._addToRecordsWindow(record.children[i], recordsWindow);
+            record.visibleChildrenCount = recordsWindow.length - index;
+        }
+    },
+
+    _adjustScrollPosition: function(totalHeight)
+    {
+        // Prevent the container from being scrolled off the end.
+        if ((this._containerElement.scrollTop + this._containerElement.offsetHeight) > totalHeight + 1)
+            this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);
+    },
+
+    _getPopoverAnchor: function(element)
+    {
+        return element.enclosingNodeOrSelfWithClass("timeline-graph-bar") || element.enclosingNodeOrSelfWithClass("timeline-tree-item");
+    },
+
+    _showPopover: function(anchor)
+    {
+        var record = anchor.row._record;
+        var popover = new WebInspector.Popover(record._generatePopupContent(this._calculator));
+        popover.show(anchor);
+        return popover;
+    },
+
+    _closeRecordDetails: function()
+    {
+        this._popoverHelper.hidePopup();
+    }
+}
+
+WebInspector.TimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.TimelineCategory = function(name, title, color)
+{
+    this.name = name;
+    this.title = title;
+    this.color = color;
+}
+
+WebInspector.TimelineCalculator = function()
+{
+    this.reset();
+    this.windowLeft = 0.0;
+    this.windowRight = 1.0;
+    this._uiString = WebInspector.UIString.bind(WebInspector);
+}
+
+WebInspector.TimelineCalculator.prototype = {
+    computeBarGraphPercentages: function(record)
+    {
+        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
+        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
+        return {start: start, end: end};
+    },
+
+    calculateWindow: function()
+    {
+        this.minimumBoundary = this._absoluteMinimumBoundary + this.windowLeft * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
+        this.maximumBoundary = this._absoluteMinimumBoundary + this.windowRight * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);
+        this.boundarySpan = this.maximumBoundary - this.minimumBoundary;
+    },
+
+    reset: function()
+    {
+        this._absoluteMinimumBoundary = -1;
+        this._absoluteMaximumBoundary = -1;
+    },
+
+    updateBoundaries: function(record)
+    {
+        var lowerBound = record.startTime;
+        if (this._absoluteMinimumBoundary === -1 || lowerBound < this._absoluteMinimumBoundary)
+            this._absoluteMinimumBoundary = lowerBound;
+
+        var upperBound = record.endTime;
+        if (this._absoluteMaximumBoundary === -1 || upperBound > this._absoluteMaximumBoundary)
+            this._absoluteMaximumBoundary = upperBound;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value + this.minimumBoundary - this._absoluteMinimumBoundary, this._uiString);
+    }
+}
+
+
+WebInspector.TimelineRecordListRow = function()
+{
+    this.element = document.createElement("div");
+    this.element.row = this;
+    this.element.style.cursor = "pointer";
+    var iconElement = document.createElement("span");
+    iconElement.className = "timeline-tree-icon";
+    this.element.appendChild(iconElement);
+
+    this._typeElement = document.createElement("span");
+    this._typeElement.className = "type";
+    this.element.appendChild(this._typeElement);
+
+    var separatorElement = document.createElement("span");
+    separatorElement.className = "separator";
+    separatorElement.textContent = " ";
+
+    this._dataElement = document.createElement("span");
+    this._dataElement.className = "data dimmed";
+
+    this._repeatCountElement = document.createElement("span");
+    this._repeatCountElement.className = "count";
+
+    this.element.appendChild(separatorElement);
+    this.element.appendChild(this._dataElement);
+    this.element.appendChild(this._repeatCountElement);
+}
+
+WebInspector.TimelineRecordListRow.prototype = {
+    update: function(record, isEven, calculator, offset)
+    {
+        this._record = record;
+        this._calculator = calculator;
+        this._offset = offset;
+
+        this.element.className = "timeline-tree-item timeline-category-" + record.category.name + (isEven ? " even" : "");
+        this._typeElement.textContent = record.title;
+
+        if (record.details)
+            this._dataElement.textContent = "(" + record.details + ")";
+        else
+            this._dataElement.textContent = "";
+
+        if (record.count > 1)
+            this._repeatCountElement.textContent = "\u2009\u00d7\u2009" + record.count;
+        else
+            this._repeatCountElement.textContent = "";
+    },
+
+    dispose: function()
+    {
+        this.element.parentElement.removeChild(this.element);
+    }
+}
+
+WebInspector.TimelineRecordGraphRow = function(graphContainer, scheduleRefresh, rowHeight)
+{
+    this.element = document.createElement("div");
+    this.element.row = this;
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "timeline-graph-bar-area";
+    this.element.appendChild(this._barAreaElement);
+
+    this._barElement = document.createElement("div");
+    this._barElement.className = "timeline-graph-bar";
+    this._barElement.row = this;
+    this._barAreaElement.appendChild(this._barElement);
+
+    this._expandElement = document.createElement("div");
+    this._expandElement.className = "timeline-expandable";
+    graphContainer.appendChild(this._expandElement);
+
+    var leftBorder = document.createElement("div");
+    leftBorder.className = "timeline-expandable-left";
+    this._expandElement.appendChild(leftBorder);
+
+    this._expandElement.addEventListener("click", this._onClick.bind(this));
+    this._rowHeight = rowHeight;
+
+    this._scheduleRefresh = scheduleRefresh;
+}
+
+WebInspector.TimelineRecordGraphRow.prototype = {
+    update: function(record, isEven, calculator, clientWidth, expandOffset, index)
+    {
+        this._record = record;
+        this.element.className = "timeline-graph-side timeline-category-" + record.category.name + (isEven ? " even" : "");
+        var percentages = calculator.computeBarGraphPercentages(record);
+        var left = percentages.start / 100 * clientWidth;
+        var width = (percentages.end - percentages.start) / 100 * clientWidth;
+        this._barElement.style.left = (left + expandOffset) + "px";
+        this._barElement.style.width = width + "px";
+
+        if (record.visibleChildrenCount) {
+            this._expandElement.style.top = index * this._rowHeight + "px";
+            this._expandElement.style.left = left + "px";
+            this._expandElement.style.width = Math.max(12, width + 25) + "px";
+            if (!record.collapsed) {
+                this._expandElement.style.height = (record.visibleChildrenCount + 1) * this._rowHeight + "px";
+                this._expandElement.addStyleClass("timeline-expandable-expanded");
+                this._expandElement.removeStyleClass("timeline-expandable-collapsed");
+            } else {
+                this._expandElement.style.height = this._rowHeight + "px";
+                this._expandElement.addStyleClass("timeline-expandable-collapsed");
+                this._expandElement.removeStyleClass("timeline-expandable-expanded");
+            }
+            this._expandElement.removeStyleClass("hidden");
+        } else {
+            this._expandElement.addStyleClass("hidden");
+        }
+    },
+
+    _onClick: function(event)
+    {
+        this._record.collapsed = !this._record.collapsed;
+        this._scheduleRefresh();
+    },
+
+    dispose: function()
+    {
+        this.element.parentElement.removeChild(this.element);
+        this._expandElement.parentElement.removeChild(this._expandElement);
+    }
+}
+
+WebInspector.TimelinePanel.FormattedRecord = function(record, recordStyles, sendRequestRecords, timerRecords)
+{
+    var recordTypes = WebInspector.TimelineAgent.RecordType;
+    var style = recordStyles[record.type];
+
+    this.category = style.category;
+    this.title = style.title;
+    this.startTime = record.startTime / 1000;
+    this.data = record.data;
+    this.count = 1;
+    this.type = record.type;
+    this.endTime = (typeof record.endTime !== "undefined") ? record.endTime / 1000 : this.startTime;
+    this.originalRecordForTests = record;
+    this.callerScriptName = record.callerScriptName;
+    this.callerScriptLine = record.callerScriptLine;
+
+    // Make resource receive record last since request was sent; make finish record last since response received.
+    if (record.type === recordTypes.ResourceSendRequest) {
+        sendRequestRecords[record.data.identifier] = this;
+    } else if (record.type === recordTypes.ResourceReceiveResponse) {
+        var sendRequestRecord = sendRequestRecords[record.data.identifier];
+        if (sendRequestRecord) { // False if we started instrumentation in the middle of request.
+            sendRequestRecord._responseReceivedFormattedTime = this.startTime;
+            record.data.url = sendRequestRecord.data.url;
+            this.startTime = sendRequestRecord.startTime;
+            this.details = this._getRecordDetails(sendRequestRecord, sendRequestRecords);
+            this.callerScriptName = sendRequestRecord.callerScriptName;
+            this.callerScriptLine = sendRequestRecord.callerScriptLine;
+        }
+    } else if (record.type === recordTypes.ResourceFinish) {
+        var sendRequestRecord = sendRequestRecords[record.data.identifier];
+        if (sendRequestRecord) {// False for main resource.
+            record.data.url = sendRequestRecord.data.url;
+            this.startTime = sendRequestRecord._responseReceivedFormattedTime;
+            this.callerScriptName = sendRequestRecord.callerScriptName;
+            this.callerScriptLine = sendRequestRecord.callerScriptLine;
+        }
+    } else if (record.type === recordTypes.TimerInstall) {
+        this.timeout = record.data.timeout;
+        this.singleShot = record.data.singleShot;
+        timerRecords[record.data.timerId] = this;
+    } else if (record.type === recordTypes.TimerFire) {
+        var timerInstalledRecord = timerRecords[record.data.timerId];
+        if (timerInstalledRecord) {
+            this.callSiteScriptName = timerInstalledRecord.callerScriptName;
+            this.callSiteScriptLine = timerInstalledRecord.callerScriptLine;
+            this.timeout = timerInstalledRecord.timeout;
+            this.singleShot = timerInstalledRecord.singleShot;
+        }
+    }
+    this.details = this._getRecordDetails(record, sendRequestRecords);
+}
+
+WebInspector.TimelinePanel.FormattedRecord.prototype = {
+    _createCell: function(content, styleName)
+    {
+        var text = document.createElement("label");
+        text.appendChild(document.createTextNode(content));
+        var cell = document.createElement("td");
+        cell.className = "timeline-details";
+        if (styleName)
+            cell.className += " " + styleName;
+        cell.textContent = content;
+        return cell;
+    },
+
+    _createRow: function(title, content)
+    {
+        var row = document.createElement("tr");
+        row.appendChild(this._createCell(title, "timeline-details-row-title"));
+        row.appendChild(this._createCell(content, "timeline-details-row-data"));
+        return row;
+    },
+
+    _createLinkRow: function(title, content)
+    {
+        var row = document.createElement("tr");
+        row.appendChild(this._createCell(title, "timeline-details-row-title"));
+        var cell = document.createElement("td");
+        cell.appendChild(content);
+        row.appendChild(cell);
+        return row;
+    },
+
+    _generatePopupContent: function(calculator)
+    {
+        var recordContentTable = document.createElement("table");
+        var titleCell = this._createCell(WebInspector.UIString("%s - Details", this.title), "timeline-details-title");
+        titleCell.colSpan = 2;
+        var titleRow = document.createElement("tr");
+        titleRow.appendChild(titleCell);
+        recordContentTable.appendChild(titleRow);
+        var text = Number.secondsToString(this.endTime - this.startTime) + " (@" +
+        calculator.formatValue(this.startTime - calculator.minimumBoundary) + ")";
+        recordContentTable.appendChild(this._createRow(WebInspector.UIString("Duration"), text));
+
+        const recordTypes = WebInspector.TimelineAgent.RecordType;
+        if (this.details) {
+            if (this.type === recordTypes.TimerInstall ||
+                this.type === recordTypes.TimerFire ||
+                this.type === recordTypes.TimerRemove) {
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Timer Id"), this.data.timerId));
+                if (this.timeout) {
+                    recordContentTable.appendChild(this._createRow(WebInspector.UIString("Timeout"), this.timeout));
+                    recordContentTable.appendChild(this._createRow(WebInspector.UIString("Repeats"), !this.singleShot));
+                }
+                if (this.callSiteScriptLine) {
+                    var link = WebInspector.linkifyResourceAsNode(this.callSiteScriptName, "scripts", this.callSiteScriptLine, "timeline-details");
+                    recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Call Site"), link));
+                }
+            } else if (this.type === recordTypes.FunctionCall) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.scriptName, "scripts", this.data.scriptLine, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Location"), link));
+            } else if (this.type === recordTypes.ResourceSendRequest || this.type === recordTypes.ResourceReceiveResponse || this.type === recordTypes.ResourceFinish) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.url, "resources", null, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Resource"), link));
+            } else if (this.type === recordTypes.EvaluateScript) {
+                var link = WebInspector.linkifyResourceAsNode(this.data.url, "scripts", null, "timeline-details");
+                recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Script"), link));
+            } else if (this.type === recordTypes.Paint) {
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Location"), this.data.x + "\u2009\u00d7\u2009" + this.data.y));
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Dimensions"), this.data.width + "\u2009\u00d7\u2009" + this.data.height));
+            } else
+                recordContentTable.appendChild(this._createRow(WebInspector.UIString("Details"), this.details));
+        }
+
+        if (this.callerScriptName) {
+            var link = WebInspector.linkifyResourceAsNode(this.callerScriptName, "scripts", this.callerScriptLine);
+            recordContentTable.appendChild(this._createLinkRow(WebInspector.UIString("Caller"), link));
+        }
+        return recordContentTable;
+    },
+
+    _getRecordDetails: function(record, sendRequestRecords)
+    {
+        switch (record.type) {
+            case WebInspector.TimelineAgent.RecordType.FunctionCall:
+                return WebInspector.displayNameForURL(record.data.scriptName + ":" + record.data.scriptLine);
+            case WebInspector.TimelineAgent.RecordType.EventDispatch:
+                return record.data ? record.data.type : "";
+            case WebInspector.TimelineAgent.RecordType.Paint:
+                return record.data.width + "\u2009\u00d7\u2009" + record.data.height;
+            case WebInspector.TimelineAgent.RecordType.TimerInstall:
+            case WebInspector.TimelineAgent.RecordType.TimerRemove:
+            case WebInspector.TimelineAgent.RecordType.TimerFire:
+                return record.data.timerId;
+            case WebInspector.TimelineAgent.RecordType.XHRReadyStateChange:
+            case WebInspector.TimelineAgent.RecordType.XHRLoad:
+            case WebInspector.TimelineAgent.RecordType.EvaluateScript:
+            case WebInspector.TimelineAgent.RecordType.ResourceSendRequest:
+            case WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse:
+            case WebInspector.TimelineAgent.RecordType.ResourceFinish:
+                return WebInspector.displayNameForURL(record.data.url);
+            case WebInspector.TimelineAgent.RecordType.MarkTimeline:
+                return record.data.message;
+            default:
+                return "";
+        }
+    }
+}
+
+
+/* TimelineOverviewPane.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TimelineOverviewPane = function(categories)
+{
+    this.element = document.createElement("div");
+    this.element.id = "timeline-overview-panel";
+
+    this._categories = categories;
+    this._overviewSidebarElement = document.createElement("div");
+    this._overviewSidebarElement.id = "timeline-overview-sidebar";
+    this.element.appendChild(this._overviewSidebarElement);
+
+    var overviewTreeElement = document.createElement("ol");
+    overviewTreeElement.className = "sidebar-tree";
+    this._overviewSidebarElement.appendChild(overviewTreeElement);
+    var sidebarTree = new TreeOutline(overviewTreeElement);
+
+    var categoriesTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("TIMELINES"), {}, true);
+    categoriesTreeElement.expanded = true;
+    sidebarTree.appendChild(categoriesTreeElement);
+    for (var categoryName in this._categories) {
+        var category = this._categories[categoryName];
+        categoriesTreeElement.appendChild(new WebInspector.TimelineCategoryTreeElement(category, this._onCheckboxClicked.bind(this, category)));
+    }
+
+    this._overviewGrid = new WebInspector.TimelineGrid();
+    this._overviewGrid.element.id = "timeline-overview-grid";
+    this._overviewGrid.itemsGraphsElement.id = "timeline-overview-graphs";
+    this.element.appendChild(this._overviewGrid.element);
+
+    this._categoryGraphs = {};
+    var i = 0;
+    for (var category in this._categories) {
+        var categoryGraph = new WebInspector.TimelineCategoryGraph(this._categories[category], i++ % 2);
+        this._categoryGraphs[category] = categoryGraph;
+        this._overviewGrid.itemsGraphsElement.appendChild(categoryGraph.graphElement);
+    }
+    this._overviewGrid.setScrollAndDividerTop(0, 0);
+
+    this._overviewWindowElement = document.createElement("div");
+    this._overviewWindowElement.id = "timeline-overview-window";
+    this._overviewWindowElement.addEventListener("mousedown", this._dragWindow.bind(this), false);
+    this._overviewGrid.element.appendChild(this._overviewWindowElement);
+
+    this._leftResizeElement = document.createElement("div");
+    this._leftResizeElement.className = "timeline-window-resizer";
+    this._leftResizeElement.style.left = 0;
+    this._overviewGrid.element.appendChild(this._leftResizeElement);
+    this._leftResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._leftResizeElement), false);
+
+    this._rightResizeElement = document.createElement("div");
+    this._rightResizeElement.className = "timeline-window-resizer timeline-window-resizer-right";
+    this._rightResizeElement.style.right = 0;
+    this._overviewGrid.element.appendChild(this._rightResizeElement);
+    this._rightResizeElement.addEventListener("mousedown", this._resizeWindow.bind(this, this._rightResizeElement), false);
+
+    this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();
+
+    var separatorElement = document.createElement("div");
+    separatorElement.id = "timeline-overview-separator";
+    this.element.appendChild(separatorElement);
+
+    this.windowLeft = 0.0;
+    this.windowRight = 1.0;
+}
+
+
+WebInspector.TimelineOverviewPane.prototype = {
+    _onCheckboxClicked: function (category, event) {
+        if (event.target.checked)
+            category.hidden = false;
+        else
+            category.hidden = true;
+        this._categoryGraphs[category.name].dimmed = !event.target.checked;
+        this.dispatchEventToListeners("filter changed");
+    },
+
+    update: function(records)
+    {
+        // Clear summary bars.
+        var timelines = {};
+        for (var category in this._categories) {
+            timelines[category] = [];
+            this._categoryGraphs[category].clearChunks();
+        }
+
+        function forAllRecords(recordsArray, callback)
+        {
+            if (!recordsArray)
+                return;
+            for (var i = 0; i < recordsArray.length; ++i) {
+                callback(recordsArray[i]);
+                forAllRecords(recordsArray[i].children, callback);
+            }
+        }
+
+        // Create sparse arrays with 101 cells each to fill with chunks for a given category.
+        this._overviewCalculator.reset();
+        forAllRecords(records, this._overviewCalculator.updateBoundaries.bind(this._overviewCalculator));
+
+        function markTimeline(record)
+        {
+            var percentages = this._overviewCalculator.computeBarGraphPercentages(record);
+
+            var end = Math.round(percentages.end);
+            var categoryName = record.category.name;
+            for (var j = Math.round(percentages.start); j <= end; ++j)
+                timelines[categoryName][j] = true;
+        }
+        forAllRecords(records, markTimeline.bind(this));
+
+        // Convert sparse arrays to continuous segments, render graphs for each.
+        for (var category in this._categories) {
+            var timeline = timelines[category];
+            window.timelineSaved = timeline;
+            var chunkStart = -1;
+            for (var j = 0; j < 101; ++j) {
+                if (timeline[j]) {
+                    if (chunkStart === -1)
+                        chunkStart = j;
+                } else {
+                    if (chunkStart !== -1) {
+                        this._categoryGraphs[category].addChunk(chunkStart, j);
+                        chunkStart = -1;
+                    }
+                }
+            }
+            if (chunkStart !== -1) {
+                this._categoryGraphs[category].addChunk(chunkStart, 100);
+                chunkStart = -1;
+            }
+        }
+        this._overviewGrid.updateDividers(true, this._overviewCalculator);
+    },
+
+    setSidebarWidth: function(width)
+    {
+        this._overviewSidebarElement.style.width = width + "px";
+    },
+
+    updateMainViewWidth: function(width)
+    {
+        this._overviewGrid.element.style.left = width + "px";
+    },
+
+    reset: function()
+    {
+        this.windowLeft = 0.0;
+        this.windowRight = 1.0;
+        this._overviewWindowElement.style.left = "0%";
+        this._overviewWindowElement.style.width = "100%";
+        this._leftResizeElement.style.left = "0%";
+        this._rightResizeElement.style.left = "100%";
+        this._overviewCalculator.reset();
+        this._overviewGrid.updateDividers(true, this._overviewCalculator);
+    },
+
+    _resizeWindow: function(resizeElement, event)
+    {
+        WebInspector.elementDragStart(resizeElement, this._windowResizeDragging.bind(this, resizeElement), this._endWindowDragging.bind(this), event, "col-resize");
+    },
+
+    _windowResizeDragging: function(resizeElement, event)
+    {
+        if (resizeElement === this._leftResizeElement)
+            this._resizeWindowLeft(event.pageX - this._overviewGrid.element.offsetLeft);
+        else
+            this._resizeWindowRight(event.pageX - this._overviewGrid.element.offsetLeft);
+        event.preventDefault();
+    },
+
+    _dragWindow: function(event)
+    {
+        WebInspector.elementDragStart(this._overviewWindowElement, this._windowDragging.bind(this, event.pageX,
+            this._leftResizeElement.offsetLeft, this._rightResizeElement.offsetLeft), this._endWindowDragging.bind(this), event, "ew-resize");
+    },
+
+    _windowDragging: function(startX, windowLeft, windowRight, event)
+    {
+        var delta = event.pageX - startX;
+        var start = windowLeft + delta;
+        var end = windowRight + delta;
+        var windowSize = windowRight - windowLeft;
+
+        if (start < 0) {
+            start = 0;
+            end = windowSize;
+        }
+
+        if (end > this._overviewGrid.element.clientWidth) {
+            end = this._overviewGrid.element.clientWidth;
+            start = end - windowSize;
+        }
+        this._setWindowPosition(start, end);
+
+        event.preventDefault();
+    },
+
+    _resizeWindowLeft: function(start)
+    {
+        // Glue to edge.
+        if (start < 10)
+            start = 0;
+        this._setWindowPosition(start, null);
+    },
+
+    _resizeWindowRight: function(end)
+    {
+        // Glue to edge.
+        if (end > this._overviewGrid.element.clientWidth - 10)
+            end = this._overviewGrid.element.clientWidth;
+        this._setWindowPosition(null, end);
+    },
+
+    _setWindowPosition: function(start, end)
+    {
+        if (typeof start === "number") {
+            if (start > this._rightResizeElement.offsetLeft - 4)
+                start = this._rightResizeElement.offsetLeft - 4;
+
+            this.windowLeft = start / this._overviewGrid.element.clientWidth;
+            this._leftResizeElement.style.left = this.windowLeft * 100 + "%";
+            this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";
+        }
+        if (typeof end === "number") {
+            if (end < this._leftResizeElement.offsetLeft + 12)
+                end = this._leftResizeElement.offsetLeft + 12;
+
+            this.windowRight = end / this._overviewGrid.element.clientWidth;
+            this._rightResizeElement.style.left = this.windowRight * 100 + "%";
+        }
+        this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";
+        this.dispatchEventToListeners("window changed");
+    },
+
+    _endWindowDragging: function(event)
+    {
+        WebInspector.elementDragEnd(event);
+    }
+}
+
+WebInspector.TimelineOverviewPane.prototype.__proto__ = WebInspector.Object.prototype;
+
+
+WebInspector.TimelineOverviewCalculator = function()
+{
+    this._uiString = WebInspector.UIString.bind(WebInspector);
+}
+
+WebInspector.TimelineOverviewCalculator.prototype = {
+    computeBarGraphPercentages: function(record)
+    {
+        var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;
+        var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;
+        return {start: start, end: end};
+    },
+
+    reset: function()
+    {
+        delete this.minimumBoundary;
+        delete this.maximumBoundary;
+    },
+
+    updateBoundaries: function(record)
+    {
+        if (typeof this.minimumBoundary === "undefined" || record.startTime < this.minimumBoundary) {
+            this.minimumBoundary = record.startTime;
+            return true;
+        }
+        if (typeof this.maximumBoundary === "undefined" || record.endTime > this.maximumBoundary) {
+            this.maximumBoundary = record.endTime;
+            return true;
+        }
+        return false;
+    },
+
+    get boundarySpan()
+    {
+        return this.maximumBoundary - this.minimumBoundary;
+    },
+
+    formatValue: function(value)
+    {
+        return Number.secondsToString(value, this._uiString);
+    }
+}
+
+
+WebInspector.TimelineCategoryTreeElement = function(category, onCheckboxClicked)
+{
+    this._category = category;
+    this._onCheckboxClicked = onCheckboxClicked;
+    // Pass an empty title, the title gets made later in onattach.
+    TreeElement.call(this, "", null, false);
+}
+
+WebInspector.TimelineCategoryTreeElement.prototype = {
+    onattach: function()
+    {
+        this.listItemElement.removeChildren();
+        this.listItemElement.addStyleClass("timeline-category-tree-item");
+        this.listItemElement.addStyleClass("timeline-category-" + this._category.name);
+
+        var label = document.createElement("label");
+
+        var checkElement = document.createElement("input");
+        checkElement.type = "checkbox";
+        checkElement.className = "timeline-category-checkbox";
+        checkElement.checked = true;
+        checkElement.addEventListener("click", this._onCheckboxClicked);
+        label.appendChild(checkElement);
+
+        var typeElement = document.createElement("span");
+        typeElement.className = "type";
+        typeElement.textContent = this._category.title;
+        label.appendChild(typeElement);
+
+        this.listItemElement.appendChild(label);
+    }
+}
+
+WebInspector.TimelineCategoryTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.TimelineCategoryGraph = function(category, isEven)
+{
+    this._category = category;
+
+    this._graphElement = document.createElement("div");
+    this._graphElement.className = "timeline-graph-side timeline-overview-graph-side" + (isEven ? " even" : "");
+
+    this._barAreaElement = document.createElement("div");
+    this._barAreaElement.className = "timeline-graph-bar-area timeline-category-" + category.name;
+    this._graphElement.appendChild(this._barAreaElement);
+}
+
+WebInspector.TimelineCategoryGraph.prototype = {
+    get graphElement()
+    {
+        return this._graphElement;
+    },
+
+    addChunk: function(start, end)
+    {
+        var chunk = document.createElement("div");
+        chunk.className = "timeline-graph-bar";
+        this._barAreaElement.appendChild(chunk);
+        chunk.style.setProperty("left", start + "%");
+        chunk.style.setProperty("width", (end - start) + "%");
+    },
+
+    clearChunks: function()
+    {
+        this._barAreaElement.removeChildren();
+    },
+
+    set dimmed(dimmed)
+    {
+        if (dimmed)
+            this._barAreaElement.removeStyleClass("timeline-category-" + this._category.name);
+        else
+            this._barAreaElement.addStyleClass("timeline-category-" + this._category.name);
+    }
+}
+
+/* TestController.js */
+
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TestController = function(callId)
+{
+    this._callId = callId;
+    this._waitUntilDone = false;
+}
+
+WebInspector.TestController.prototype = {
+    waitUntilDone: function()
+    {
+        this._waitUntilDone = true;
+    },
+
+    notifyDone: function(result)
+    {
+        var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);
+        InspectorBackend.didEvaluateForTestInFrontend(this._callId, message);
+    },
+
+    runAfterPendingDispatches: function(callback)
+    {
+        if (WebInspector.pendingDispatches === 0) {
+            callback();
+            return;
+        }
+        setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);
+    }
+}
+
+WebInspector.evaluateForTestInFrontend = function(callId, script)
+{
+    var controller = new WebInspector.TestController(callId);
+    function invokeMethod()
+    {
+        try {
+            var result;
+            if (window[script] && typeof window[script] === "function")
+                result = window[script].call(WebInspector, controller);
+            else
+                result = window.eval(script);
+
+            if (!controller._waitUntilDone)
+                controller.notifyDone(result);
+        } catch (e) {
+            controller.notifyDone(e.toString());
+        }
+    }
+    controller.runAfterPendingDispatches(invokeMethod);
+}
+
+/* codemap.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Constructs a mapper that maps addresses into code entries.
+ *
+ * @constructor
+ */
+devtools.profiler.CodeMap = function() {
+  /**
+   * Dynamic code entries. Used for JIT compiled code.
+   */
+  this.dynamics_ = new goog.structs.SplayTree();
+
+  /**
+   * Name generator for entries having duplicate names.
+   */
+  this.dynamicsNameGen_ = new devtools.profiler.CodeMap.NameGenerator();
+
+  /**
+   * Static code entries. Used for statically compiled code.
+   */
+  this.statics_ = new goog.structs.SplayTree();
+
+  /**
+   * Libraries entries. Used for the whole static code libraries.
+   */
+  this.libraries_ = new goog.structs.SplayTree();
+
+  /**
+   * Map of memory pages occupied with static code.
+   */
+  this.pages_ = [];
+};
+
+
+/**
+ * The number of alignment bits in a page address.
+ */
+devtools.profiler.CodeMap.PAGE_ALIGNMENT = 12;
+
+
+/**
+ * Page size in bytes.
+ */
+devtools.profiler.CodeMap.PAGE_SIZE =
+    1 << devtools.profiler.CodeMap.PAGE_ALIGNMENT;
+
+
+/**
+ * Adds a dynamic (i.e. moveable and discardable) code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addCode = function(start, codeEntry) {
+  this.dynamics_.insert(start, codeEntry);
+};
+
+
+/**
+ * Moves a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} from The starting address of the entry being moved.
+ * @param {number} to The destination address.
+ */
+devtools.profiler.CodeMap.prototype.moveCode = function(from, to) {
+  var removedNode = this.dynamics_.remove(from);
+  this.dynamics_.insert(to, removedNode.value);
+};
+
+
+/**
+ * Discards a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} start The starting address of the entry being deleted.
+ */
+devtools.profiler.CodeMap.prototype.deleteCode = function(start) {
+  var removedNode = this.dynamics_.remove(start);
+};
+
+
+/**
+ * Adds a library entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addLibrary = function(
+    start, codeEntry) {
+  this.markPages_(start, start + codeEntry.size);
+  this.libraries_.insert(start, codeEntry);
+};
+
+
+/**
+ * Adds a static code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {devtools.profiler.CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+devtools.profiler.CodeMap.prototype.addStaticCode = function(
+    start, codeEntry) {
+  this.statics_.insert(start, codeEntry);
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.markPages_ = function(start, end) {
+  for (var addr = start; addr <= end;
+       addr += devtools.profiler.CodeMap.PAGE_SIZE) {
+    this.pages_[addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT] = 1;
+  }
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
+  return addr >= node.key && addr < (node.key + node.value.size);
+};
+
+
+/**
+ * @private
+ */
+devtools.profiler.CodeMap.prototype.findInTree_ = function(tree, addr) {
+  var node = tree.findGreatestLessThan(addr);
+  return node && this.isAddressBelongsTo_(addr, node) ? node.value : null;
+};
+
+
+/**
+ * Finds a code entry that contains the specified address. Both static and
+ * dynamic code entries are considered.
+ *
+ * @param {number} addr Address.
+ */
+devtools.profiler.CodeMap.prototype.findEntry = function(addr) {
+  var pageAddr = addr >>> devtools.profiler.CodeMap.PAGE_ALIGNMENT;
+  if (pageAddr in this.pages_) {
+    // Static code entries can contain "holes" of unnamed code.
+    // In this case, the whole library is assigned to this address.
+    return this.findInTree_(this.statics_, addr) ||
+        this.findInTree_(this.libraries_, addr);
+  }
+  var min = this.dynamics_.findMin();
+  var max = this.dynamics_.findMax();
+  if (max != null && addr < (max.key + max.value.size) && addr >= min.key) {
+    var dynaEntry = this.findInTree_(this.dynamics_, addr);
+    if (dynaEntry == null) return null;
+    // Dedupe entry name.
+    if (!dynaEntry.nameUpdated_) {
+      dynaEntry.name = this.dynamicsNameGen_.getName(dynaEntry.name);
+      dynaEntry.nameUpdated_ = true;
+    }
+    return dynaEntry;
+  }
+  return null;
+};
+
+
+/**
+ * Returns a dynamic code entry using its starting address.
+ *
+ * @param {number} addr Address.
+ */
+devtools.profiler.CodeMap.prototype.findDynamicEntryByStartAddress =
+    function(addr) {
+  var node = this.dynamics_.find(addr);
+  return node ? node.value : null;
+};
+
+
+/**
+ * Returns an array of all dynamic code entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllDynamicEntries = function() {
+  return this.dynamics_.exportValues();
+};
+
+
+/**
+ * Returns an array of all static code entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllStaticEntries = function() {
+  return this.statics_.exportValues();
+};
+
+
+/**
+ * Returns an array of all libraries entries.
+ */
+devtools.profiler.CodeMap.prototype.getAllLibrariesEntries = function() {
+  return this.libraries_.exportValues();
+};
+
+
+/**
+ * Creates a code entry object.
+ *
+ * @param {number} size Code entry size in bytes.
+ * @param {string} opt_name Code entry name.
+ * @constructor
+ */
+devtools.profiler.CodeMap.CodeEntry = function(size, opt_name) {
+  this.size = size;
+  this.name = opt_name || '';
+  this.nameUpdated_ = false;
+};
+
+
+devtools.profiler.CodeMap.CodeEntry.prototype.getName = function() {
+  return this.name;
+};
+
+
+devtools.profiler.CodeMap.CodeEntry.prototype.toString = function() {
+  return this.name + ': ' + this.size.toString(16);
+};
+
+
+devtools.profiler.CodeMap.NameGenerator = function() {
+  this.knownNames_ = {};
+};
+
+
+devtools.profiler.CodeMap.NameGenerator.prototype.getName = function(name) {
+  if (!(name in this.knownNames_)) {
+    this.knownNames_[name] = 0;
+    return name;
+  }
+  var count = ++this.knownNames_[name];
+  return name + ' {' + count + '}';
+};
+
+/* consarray.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/**
+ * Constructs a ConsArray object. It is used mainly for tree traversal.
+ * In this use case we have lots of arrays that we need to iterate
+ * sequentally. The internal Array implementation is horribly slow
+ * when concatenating on large (10K items) arrays due to memory copying.
+ * That's why we avoid copying memory and insead build a linked list
+ * of arrays to iterate through.
+ *
+ * @constructor
+ */
+function ConsArray() {
+  this.tail_ = new ConsArray.Cell(null, null);
+  this.currCell_ = this.tail_;
+  this.currCellPos_ = 0;
+};
+
+
+/**
+ * Concatenates another array for iterating. Empty arrays are ignored.
+ * This operation can be safely performed during ongoing ConsArray
+ * iteration.
+ *
+ * @param {Array} arr Array to concatenate.
+ */
+ConsArray.prototype.concat = function(arr) {
+  if (arr.length > 0) {
+    this.tail_.data = arr;
+    this.tail_ = this.tail_.next = new ConsArray.Cell(null, null);
+  }
+};
+
+
+/**
+ * Whether the end of iteration is reached.
+ */
+ConsArray.prototype.atEnd = function() {
+  return this.currCell_ === null ||
+      this.currCell_.data === null ||
+      this.currCellPos_ >= this.currCell_.data.length;
+};
+
+
+/**
+ * Returns the current item, moves to the next one.
+ */
+ConsArray.prototype.next = function() {
+  var result = this.currCell_.data[this.currCellPos_++];
+  if (this.currCellPos_ >= this.currCell_.data.length) {
+    this.currCell_ = this.currCell_.next;
+    this.currCellPos_ = 0;
+  }
+  return result;
+};
+
+
+/**
+ * A cell object used for constructing a list in ConsArray.
+ *
+ * @constructor
+ */
+ConsArray.Cell = function(data, next) {
+  this.data = data;
+  this.next = next;
+};
+
+
+/* csvparser.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces.
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a CSV lines parser.
+ */
+devtools.profiler.CsvParser = function() {
+};
+
+
+/**
+ * A regex for matching a CSV field.
+ * @private
+ */
+devtools.profiler.CsvParser.CSV_FIELD_RE_ = /^"((?:[^"]|"")*)"|([^,]*)/;
+
+
+/**
+ * A regex for matching a double quote.
+ * @private
+ */
+devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /""/g;
+
+
+/**
+ * Parses a line of CSV-encoded values. Returns an array of fields.
+ *
+ * @param {string} line Input line.
+ */
+devtools.profiler.CsvParser.prototype.parseLine = function(line) {
+  var fieldRe = devtools.profiler.CsvParser.CSV_FIELD_RE_;
+  var doubleQuoteRe = devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_;
+  var pos = 0;
+  var endPos = line.length;
+  var fields = [];
+  if (endPos > 0) {
+    do {
+      var fieldMatch = fieldRe.exec(line.substr(pos));
+      if (typeof fieldMatch[1] === "string") {
+        var field = fieldMatch[1];
+        pos += field.length + 3;  // Skip comma and quotes.
+        fields.push(field.replace(doubleQuoteRe, '"'));
+      } else {
+        // The second field pattern will match anything, thus
+        // in the worst case the match will be an empty string.
+        var field = fieldMatch[2];
+        pos += field.length + 1;  // Skip comma.
+        fields.push(field);
+      }
+    } while (pos <= endPos);
+  }
+  return fields;
+};
+
+/* logreader.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/**
+ * @fileoverview Log Reader is used to process log file produced by V8.
+ */
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Base class for processing log files.
+ *
+ * @param {Array.<Object>} dispatchTable A table used for parsing and processing
+ *     log records.
+ * @constructor
+ */
+devtools.profiler.LogReader = function(dispatchTable) {
+  /**
+   * @type {Array.<Object>}
+   */
+  this.dispatchTable_ = dispatchTable;
+  this.dispatchTable_['alias'] =
+      { parsers: [null, null], processor: this.processAlias_ };
+  this.dispatchTable_['repeat'] =
+      { parsers: [parseInt, 'var-args'], processor: this.processRepeat_,
+        backrefs: true };
+
+  /**
+   * A key-value map for aliases. Translates short name -> full name.
+   * @type {Object}
+   */
+  this.aliases_ = {};
+
+  /**
+   * A key-value map for previous address values.
+   * @type {Object}
+   */
+  this.prevAddresses_ = {};
+
+  /**
+   * A key-value map for events than can be backreference-compressed.
+   * @type {Object}
+   */
+  this.backRefsCommands_ = {};
+  this.initBackRefsCommands_();
+
+  /**
+   * Back references for decompression.
+   * @type {Array.<string>}
+   */
+  this.backRefs_ = [];
+
+  /**
+   * Current line.
+   * @type {number}
+   */
+  this.lineNum_ = 0;
+
+  /**
+   * CSV lines parser.
+   * @type {devtools.profiler.CsvParser}
+   */
+  this.csvParser_ = new devtools.profiler.CsvParser();
+};
+
+
+/**
+ * Creates a parser for an address entry.
+ *
+ * @param {string} addressTag Address tag to perform offset decoding.
+ * @return {function(string):number} Address parser.
+ */
+devtools.profiler.LogReader.prototype.createAddressParser = function(
+    addressTag) {
+  var self = this;
+  return (function (str) {
+    var value = parseInt(str, 16);
+    var firstChar = str.charAt(0);
+    if (firstChar == '+' || firstChar == '-') {
+      var addr = self.prevAddresses_[addressTag];
+      addr += value;
+      self.prevAddresses_[addressTag] = addr;
+      return addr;
+    } else if (firstChar != '0' || str.charAt(1) != 'x') {
+      self.prevAddresses_[addressTag] = value;
+    }
+    return value;
+  });
+};
+
+
+/**
+ * Expands an alias symbol, if applicable.
+ *
+ * @param {string} symbol Symbol to expand.
+ * @return {string} Expanded symbol, or the input symbol itself.
+ */
+devtools.profiler.LogReader.prototype.expandAlias = function(symbol) {
+  return symbol in this.aliases_ ? this.aliases_[symbol] : symbol;
+};
+
+
+/**
+ * Used for printing error messages.
+ *
+ * @param {string} str Error message.
+ */
+devtools.profiler.LogReader.prototype.printError = function(str) {
+  // Do nothing.
+};
+
+
+/**
+ * Processes a portion of V8 profiler event log.
+ *
+ * @param {string} chunk A portion of log.
+ */
+devtools.profiler.LogReader.prototype.processLogChunk = function(chunk) {
+  this.processLog_(chunk.split('\n'));
+};
+
+
+/**
+ * Processes a line of V8 profiler event log.
+ *
+ * @param {string} line A line of log.
+ */
+devtools.profiler.LogReader.prototype.processLogLine = function(line) {
+  this.processLog_([line]);
+};
+
+
+/**
+ * Processes stack record.
+ *
+ * @param {number} pc Program counter.
+ * @param {number} func JS Function.
+ * @param {Array.<string>} stack String representation of a stack.
+ * @return {Array.<number>} Processed stack.
+ */
+devtools.profiler.LogReader.prototype.processStack = function(pc, func, stack) {
+  var fullStack = func ? [pc, func] : [pc];
+  var prevFrame = pc;
+  for (var i = 0, n = stack.length; i < n; ++i) {
+    var frame = stack[i];
+    var firstChar = frame.charAt(0);
+    if (firstChar == '+' || firstChar == '-') {
+      // An offset from the previous frame.
+      prevFrame += parseInt(frame, 16);
+      fullStack.push(prevFrame);
+    // Filter out possible 'overflow' string.
+    } else if (firstChar != 'o') {
+      fullStack.push(parseInt(frame, 16));
+    }
+  }
+  return fullStack;
+};
+
+
+/**
+ * Returns whether a particular dispatch must be skipped.
+ *
+ * @param {!Object} dispatch Dispatch record.
+ * @return {boolean} True if dispatch must be skipped.
+ */
+devtools.profiler.LogReader.prototype.skipDispatch = function(dispatch) {
+  return false;
+};
+
+
+/**
+ * Does a dispatch of a log record.
+ *
+ * @param {Array.<string>} fields Log record.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.dispatchLogRow_ = function(fields) {
+  // Obtain the dispatch.
+  var command = fields[0];
+  if (!(command in this.dispatchTable_)) {
+    throw new Error('unknown command: ' + command);
+  }
+  var dispatch = this.dispatchTable_[command];
+
+  if (dispatch === null || this.skipDispatch(dispatch)) {
+    return;
+  }
+
+  // Parse fields.
+  var parsedFields = [];
+  for (var i = 0; i < dispatch.parsers.length; ++i) {
+    var parser = dispatch.parsers[i];
+    if (parser === null) {
+      parsedFields.push(fields[1 + i]);
+    } else if (typeof parser == 'function') {
+      parsedFields.push(parser(fields[1 + i]));
+    } else {
+      // var-args
+      parsedFields.push(fields.slice(1 + i));
+      break;
+    }
+  }
+
+  // Run the processor.
+  dispatch.processor.apply(this, parsedFields);
+};
+
+
+/**
+ * Decompresses a line if it was backreference-compressed.
+ *
+ * @param {string} line Possibly compressed line.
+ * @return {string} Decompressed line.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.expandBackRef_ = function(line) {
+  var backRefPos;
+  // Filter out case when a regexp is created containing '#'.
+  if (line.charAt(line.length - 1) != '"'
+      && (backRefPos = line.lastIndexOf('#')) != -1) {
+    var backRef = line.substr(backRefPos + 1);
+    var backRefIdx = parseInt(backRef, 10) - 1;
+    var colonPos = backRef.indexOf(':');
+    var backRefStart =
+        colonPos != -1 ? parseInt(backRef.substr(colonPos + 1), 10) : 0;
+    line = line.substr(0, backRefPos) +
+        this.backRefs_[backRefIdx].substr(backRefStart);
+  }
+  this.backRefs_.unshift(line);
+  if (this.backRefs_.length > 10) {
+    this.backRefs_.length = 10;
+  }
+  return line;
+};
+
+
+/**
+ * Initializes the map of backward reference compressible commands.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.initBackRefsCommands_ = function() {
+  for (var event in this.dispatchTable_) {
+    var dispatch = this.dispatchTable_[event];
+    if (dispatch && dispatch.backrefs) {
+      this.backRefsCommands_[event] = true;
+    }
+  }
+};
+
+
+/**
+ * Processes alias log record. Adds an alias to a corresponding map.
+ *
+ * @param {string} symbol Short name.
+ * @param {string} expansion Long name.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processAlias_ = function(
+    symbol, expansion) {
+  if (expansion in this.dispatchTable_) {
+    this.dispatchTable_[symbol] = this.dispatchTable_[expansion];
+    if (expansion in this.backRefsCommands_) {
+      this.backRefsCommands_[symbol] = true;
+    }
+  } else {
+    this.aliases_[symbol] = expansion;
+  }
+};
+
+
+/**
+ * Processes log lines.
+ *
+ * @param {Array.<string>} lines Log lines.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processLog_ = function(lines) {
+  for (var i = 0, n = lines.length; i < n; ++i, ++this.lineNum_) {
+    var line = lines[i];
+    if (!line) {
+      continue;
+    }
+    try {
+      if (line.charAt(0) == '#' ||
+          line.substr(0, line.indexOf(',')) in this.backRefsCommands_) {
+        line = this.expandBackRef_(line);
+      }
+      var fields = this.csvParser_.parseLine(line);
+      this.dispatchLogRow_(fields);
+    } catch (e) {
+      this.printError('line ' + (this.lineNum_ + 1) + ': ' + (e.message || e));
+    }
+  }
+};
+
+
+/**
+ * Processes repeat log record. Expands it according to calls count and
+ * invokes processing.
+ *
+ * @param {number} count Count.
+ * @param {Array.<string>} cmd Parsed command.
+ * @private
+ */
+devtools.profiler.LogReader.prototype.processRepeat_ = function(count, cmd) {
+  // Replace the repeat-prefixed command from backrefs list with a non-prefixed.
+  this.backRefs_[0] = cmd.join(',');
+  for (var i = 0; i < count; ++i) {
+    this.dispatchLogRow_(cmd);
+  }
+};
+
+/* profile.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a profile object for processing profiling-related events
+ * and calculating function execution times.
+ *
+ * @constructor
+ */
+devtools.profiler.Profile = function() {
+  this.codeMap_ = new devtools.profiler.CodeMap();
+  this.topDownTree_ = new devtools.profiler.CallTree();
+  this.bottomUpTree_ = new devtools.profiler.CallTree();
+};
+
+/**
+ * Version of profiler log.
+ */
+devtools.profiler.Profile.VERSION = 2;
+
+
+/**
+ * Returns whether a function with the specified name must be skipped.
+ * Should be overriden by subclasses.
+ *
+ * @param {string} name Function name.
+ */
+devtools.profiler.Profile.prototype.skipThisFunction = function(name) {
+  return false;
+};
+
+
+/**
+ * Enum for profiler operations that involve looking up existing
+ * code entries.
+ *
+ * @enum {number}
+ */
+devtools.profiler.Profile.Operation = {
+  MOVE: 0,
+  DELETE: 1,
+  TICK: 2
+};
+
+
+/**
+ * Called whenever the specified operation has failed finding a function
+ * containing the specified address. Should be overriden by subclasses.
+ * See the devtools.profiler.Profile.Operation enum for the list of
+ * possible operations.
+ *
+ * @param {number} operation Operation.
+ * @param {number} addr Address of the unknown code.
+ * @param {number} opt_stackPos If an unknown address is encountered
+ *     during stack strace processing, specifies a position of the frame
+ *     containing the address.
+ */
+devtools.profiler.Profile.prototype.handleUnknownCode = function(
+    operation, addr, opt_stackPos) {
+};
+
+
+/**
+ * Registers a library.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+devtools.profiler.Profile.prototype.addLibrary = function(
+    name, startAddr, endAddr) {
+  var entry = new devtools.profiler.CodeMap.CodeEntry(
+      endAddr - startAddr, name);
+  this.codeMap_.addLibrary(startAddr, entry);
+  return entry;
+};
+
+
+/**
+ * Registers statically compiled code entry.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+devtools.profiler.Profile.prototype.addStaticCode = function(
+    name, startAddr, endAddr) {
+  var entry = new devtools.profiler.CodeMap.CodeEntry(
+      endAddr - startAddr, name);
+  this.codeMap_.addStaticCode(startAddr, entry);
+  return entry;
+};
+
+
+/**
+ * Registers dynamic (JIT-compiled) code entry.
+ *
+ * @param {string} type Code entry type.
+ * @param {string} name Code entry name.
+ * @param {number} start Starting address.
+ * @param {number} size Code entry size.
+ */
+devtools.profiler.Profile.prototype.addCode = function(
+    type, name, start, size) {
+  var entry = new devtools.profiler.Profile.DynamicCodeEntry(size, type, name);
+  this.codeMap_.addCode(start, entry);
+  return entry;
+};
+
+
+/**
+ * Creates an alias entry for a code entry.
+ *
+ * @param {number} aliasAddr Alias address.
+ * @param {number} addr Code entry address.
+ */
+devtools.profiler.Profile.prototype.addCodeAlias = function(
+    aliasAddr, addr) {
+  var entry = this.codeMap_.findDynamicEntryByStartAddress(addr);
+  if (entry) {
+    this.codeMap_.addCode(aliasAddr, entry);
+  }
+};
+
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+devtools.profiler.Profile.prototype.moveCode = function(from, to) {
+  try {
+    this.codeMap_.moveCode(from, to);
+  } catch (e) {
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.MOVE, from);
+  }
+};
+
+
+/**
+ * Reports about deletion of a dynamic code entry.
+ *
+ * @param {number} start Starting address.
+ */
+devtools.profiler.Profile.prototype.deleteCode = function(start) {
+  try {
+    this.codeMap_.deleteCode(start);
+  } catch (e) {
+    this.handleUnknownCode(devtools.profiler.Profile.Operation.DELETE, start);
+  }
+};
+
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+devtools.profiler.Profile.prototype.safeMoveDynamicCode = function(from, to) {
+  if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
+    this.codeMap_.moveCode(from, to);
+  }
+};
+
+
+/**
+ * Reports about deletion of a dynamic code entry.
+ *
+ * @param {number} start Starting address.
+ */
+devtools.profiler.Profile.prototype.safeDeleteDynamicCode = function(start) {
+  if (this.codeMap_.findDynamicEntryByStartAddress(start)) {
+    this.codeMap_.deleteCode(start);
+  }
+};
+
+
+/**
+ * Retrieves a code entry by an address.
+ *
+ * @param {number} addr Entry address.
+ */
+devtools.profiler.Profile.prototype.findEntry = function(addr) {
+  return this.codeMap_.findEntry(addr);
+};
+
+
+/**
+ * Records a tick event. Stack must contain a sequence of
+ * addresses starting with the program counter value.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+devtools.profiler.Profile.prototype.recordTick = function(stack) {
+  var processedStack = this.resolveAndFilterFuncs_(stack);
+  this.bottomUpTree_.addPath(processedStack);
+  processedStack.reverse();
+  this.topDownTree_.addPath(processedStack);
+};
+
+
+/**
+ * Translates addresses into function names and filters unneeded
+ * functions.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+devtools.profiler.Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
+  var result = [];
+  for (var i = 0; i < stack.length; ++i) {
+    var entry = this.codeMap_.findEntry(stack[i]);
+    if (entry) {
+      var name = entry.getName();
+      if (!this.skipThisFunction(name)) {
+        result.push(name);
+      }
+    } else {
+      this.handleUnknownCode(
+          devtools.profiler.Profile.Operation.TICK, stack[i], i);
+    }
+  }
+  return result;
+};
+
+
+/**
+ * Performs a BF traversal of the top down call graph.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.Profile.prototype.traverseTopDownTree = function(f) {
+  this.topDownTree_.traverse(f);
+};
+
+
+/**
+ * Performs a BF traversal of the bottom up call graph.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.Profile.prototype.traverseBottomUpTree = function(f) {
+  this.bottomUpTree_.traverse(f);
+};
+
+
+/**
+ * Calculates a top down profile for a node with the specified label.
+ * If no name specified, returns the whole top down calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getTopDownProfile = function(opt_label) {
+  return this.getTreeProfile_(this.topDownTree_, opt_label);
+};
+
+
+/**
+ * Calculates a bottom up profile for a node with the specified label.
+ * If no name specified, returns the whole bottom up calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getBottomUpProfile = function(opt_label) {
+  return this.getTreeProfile_(this.bottomUpTree_, opt_label);
+};
+
+
+/**
+ * Helper function for calculating a tree profile.
+ *
+ * @param {devtools.profiler.Profile.CallTree} tree Call tree.
+ * @param {string} opt_label Node label.
+ */
+devtools.profiler.Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
+  if (!opt_label) {
+    tree.computeTotalWeights();
+    return tree;
+  } else {
+    var subTree = tree.cloneSubtree(opt_label);
+    subTree.computeTotalWeights();
+    return subTree;
+  }
+};
+
+
+/**
+ * Calculates a flat profile of callees starting from a node with
+ * the specified label. If no name specified, starts from the root.
+ *
+ * @param {string} opt_label Starting node label.
+ */
+devtools.profiler.Profile.prototype.getFlatProfile = function(opt_label) {
+  var counters = new devtools.profiler.CallTree();
+  var rootLabel = opt_label || devtools.profiler.CallTree.ROOT_NODE_LABEL;
+  var precs = {};
+  precs[rootLabel] = 0;
+  var root = counters.findOrAddChild(rootLabel);
+
+  this.topDownTree_.computeTotalWeights();
+  this.topDownTree_.traverseInDepth(
+    function onEnter(node) {
+      if (!(node.label in precs)) {
+        precs[node.label] = 0;
+      }
+      var nodeLabelIsRootLabel = node.label == rootLabel;
+      if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
+        if (precs[rootLabel] == 0) {
+          root.selfWeight += node.selfWeight;
+          root.totalWeight += node.totalWeight;
+        } else {
+          var rec = root.findOrAddChild(node.label);
+          rec.selfWeight += node.selfWeight;
+          if (nodeLabelIsRootLabel || precs[node.label] == 0) {
+            rec.totalWeight += node.totalWeight;
+          }
+        }
+        precs[node.label]++;
+      }
+    },
+    function onExit(node) {
+      if (node.label == rootLabel || precs[rootLabel] > 0) {
+        precs[node.label]--;
+      }
+    },
+    null);
+
+  if (!opt_label) {
+    // If we have created a flat profile for the whole program, we don't
+    // need an explicit root in it. Thus, replace the counters tree
+    // root with the node corresponding to the whole program.
+    counters.root_ = root;
+  } else {
+    // Propagate weights so percents can be calculated correctly.
+    counters.getRoot().selfWeight = root.selfWeight;
+    counters.getRoot().totalWeight = root.totalWeight;
+  }
+  return counters;
+};
+
+
+/**
+ * Creates a dynamic code entry.
+ *
+ * @param {number} size Code size.
+ * @param {string} type Code type.
+ * @param {string} name Function name.
+ * @constructor
+ */
+devtools.profiler.Profile.DynamicCodeEntry = function(size, type, name) {
+  devtools.profiler.CodeMap.CodeEntry.call(this, size, name);
+  this.type = type;
+};
+
+
+/**
+ * Returns node name.
+ */
+devtools.profiler.Profile.DynamicCodeEntry.prototype.getName = function() {
+  var name = this.name;
+  if (name.length == 0) {
+    name = '<anonymous>';
+  } else if (name.charAt(0) == ' ') {
+    // An anonymous function with location: " aaa.js:10".
+    name = '<anonymous>' + name;
+  }
+  return this.type + ': ' + name;
+};
+
+
+/**
+ * Returns raw node name (without type decoration).
+ */
+devtools.profiler.Profile.DynamicCodeEntry.prototype.getRawName = function() {
+  return this.name;
+};
+
+
+devtools.profiler.Profile.DynamicCodeEntry.prototype.isJSFunction = function() {
+  return this.type == "Function" ||
+    this.type == "LazyCompile" ||
+    this.type == "Script";
+};
+
+
+/**
+ * Constructs a call graph.
+ *
+ * @constructor
+ */
+devtools.profiler.CallTree = function() {
+  this.root_ = new devtools.profiler.CallTree.Node(
+      devtools.profiler.CallTree.ROOT_NODE_LABEL);
+};
+
+
+/**
+ * The label of the root node.
+ */
+devtools.profiler.CallTree.ROOT_NODE_LABEL = '';
+
+
+/**
+ * @private
+ */
+devtools.profiler.CallTree.prototype.totalsComputed_ = false;
+
+
+/**
+ * Returns the tree root.
+ */
+devtools.profiler.CallTree.prototype.getRoot = function() {
+  return this.root_;
+};
+
+
+/**
+ * Adds the specified call path, constructing nodes as necessary.
+ *
+ * @param {Array<string>} path Call path.
+ */
+devtools.profiler.CallTree.prototype.addPath = function(path) {
+  if (path.length == 0) {
+    return;
+  }
+  var curr = this.root_;
+  for (var i = 0; i < path.length; ++i) {
+    curr = curr.findOrAddChild(path[i]);
+  }
+  curr.selfWeight++;
+  this.totalsComputed_ = false;
+};
+
+
+/**
+ * Finds an immediate child of the specified parent with the specified
+ * label, creates a child node if necessary. If a parent node isn't
+ * specified, uses tree root.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.prototype.findOrAddChild = function(label) {
+  return this.root_.findOrAddChild(label);
+};
+
+
+/**
+ * Creates a subtree by cloning and merging all subtrees rooted at nodes
+ * with a given label. E.g. cloning the following call tree on label 'A'
+ * will give the following result:
+ *
+ *           <A>--<B>                                     <B>
+ *          /                                            /
+ *     <root>             == clone on 'A' ==>  <root>--<A>
+ *          \                                            \
+ *           <C>--<A>--<D>                                <D>
+ *
+ * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
+ * source call tree.
+ *
+ * @param {string} label The label of the new root node.
+ */
+devtools.profiler.CallTree.prototype.cloneSubtree = function(label) {
+  var subTree = new devtools.profiler.CallTree();
+  this.traverse(function(node, parent) {
+    if (!parent && node.label != label) {
+      return null;
+    }
+    var child = (parent ? parent : subTree).findOrAddChild(node.label);
+    child.selfWeight += node.selfWeight;
+    return child;
+  });
+  return subTree;
+};
+
+
+/**
+ * Computes total weights in the call graph.
+ */
+devtools.profiler.CallTree.prototype.computeTotalWeights = function() {
+  if (this.totalsComputed_) {
+    return;
+  }
+  this.root_.computeTotalWeight();
+  this.totalsComputed_ = true;
+};
+
+
+/**
+ * Traverses the call graph in preorder. This function can be used for
+ * building optionally modified tree clones. This is the boilerplate code
+ * for this scenario:
+ *
+ * callTree.traverse(function(node, parentClone) {
+ *   var nodeClone = cloneNode(node);
+ *   if (parentClone)
+ *     parentClone.addChild(nodeClone);
+ *   return nodeClone;
+ * });
+ *
+ * @param {function(devtools.profiler.CallTree.Node, *)} f Visitor function.
+ *    The second parameter is the result of calling 'f' on the parent node.
+ */
+devtools.profiler.CallTree.prototype.traverse = function(f) {
+  var pairsToProcess = new ConsArray();
+  pairsToProcess.concat([{node: this.root_, param: null}]);
+  while (!pairsToProcess.atEnd()) {
+    var pair = pairsToProcess.next();
+    var node = pair.node;
+    var newParam = f(node, pair.param);
+    var morePairsToProcess = [];
+    node.forEachChild(function (child) {
+        morePairsToProcess.push({node: child, param: newParam}); });
+    pairsToProcess.concat(morePairsToProcess);
+  }
+};
+
+
+/**
+ * Performs an indepth call graph traversal.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} enter A function called
+ *     prior to visiting node's children.
+ * @param {function(devtools.profiler.CallTree.Node)} exit A function called
+ *     after visiting node's children.
+ */
+devtools.profiler.CallTree.prototype.traverseInDepth = function(enter, exit) {
+  function traverse(node) {
+    enter(node);
+    node.forEachChild(traverse);
+    exit(node);
+  }
+  traverse(this.root_);
+};
+
+
+/**
+ * Constructs a call graph node.
+ *
+ * @param {string} label Node label.
+ * @param {devtools.profiler.CallTree.Node} opt_parent Node parent.
+ */
+devtools.profiler.CallTree.Node = function(label, opt_parent) {
+  this.label = label;
+  this.parent = opt_parent;
+  this.children = {};
+};
+
+
+/**
+ * Node self weight (how many times this node was the last node in
+ * a call path).
+ * @type {number}
+ */
+devtools.profiler.CallTree.Node.prototype.selfWeight = 0;
+
+
+/**
+ * Node total weight (includes weights of all children).
+ * @type {number}
+ */
+devtools.profiler.CallTree.Node.prototype.totalWeight = 0;
+
+
+/**
+ * Adds a child node.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.addChild = function(label) {
+  var child = new devtools.profiler.CallTree.Node(label, this);
+  this.children[label] = child;
+  return child;
+};
+
+
+/**
+ * Computes node's total weight.
+ */
+devtools.profiler.CallTree.Node.prototype.computeTotalWeight =
+    function() {
+  var totalWeight = this.selfWeight;
+  this.forEachChild(function(child) {
+      totalWeight += child.computeTotalWeight(); });
+  return this.totalWeight = totalWeight;
+};
+
+
+/**
+ * Returns all node's children as an array.
+ */
+devtools.profiler.CallTree.Node.prototype.exportChildren = function() {
+  var result = [];
+  this.forEachChild(function (node) { result.push(node); });
+  return result;
+};
+
+
+/**
+ * Finds an immediate child with the specified label.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.findChild = function(label) {
+  return this.children[label] || null;
+};
+
+
+/**
+ * Finds an immediate child with the specified label, creates a child
+ * node if necessary.
+ *
+ * @param {string} label Child node label.
+ */
+devtools.profiler.CallTree.Node.prototype.findOrAddChild = function(label) {
+  return this.findChild(label) || this.addChild(label);
+};
+
+
+/**
+ * Calls the specified function for every child.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.forEachChild = function(f) {
+  for (var c in this.children) {
+    f(this.children[c]);
+  }
+};
+
+
+/**
+ * Walks up from the current node up to the call tree root.
+ *
+ * @param {function(devtools.profiler.CallTree.Node)} f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.walkUpToRoot = function(f) {
+  for (var curr = this; curr != null; curr = curr.parent) {
+    f(curr);
+  }
+};
+
+
+/**
+ * Tries to find a node with the specified path.
+ *
+ * @param {Array<string>} labels The path.
+ * @param {function(devtools.profiler.CallTree.Node)} opt_f Visitor function.
+ */
+devtools.profiler.CallTree.Node.prototype.descendToChild = function(
+    labels, opt_f) {
+  for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
+    var child = curr.findChild(labels[pos]);
+    if (opt_f) {
+      opt_f(child, pos);
+    }
+    curr = child;
+  }
+  return curr;
+};
+
+/* profile_view.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Initlialize namespaces
+var devtools = devtools || {};
+devtools.profiler = devtools.profiler || {};
+
+
+/**
+ * Creates a Profile View builder object.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+devtools.profiler.ViewBuilder = function(samplingRate) {
+  this.samplingRate = samplingRate;
+};
+
+
+/**
+ * Builds a profile view for the specified call tree.
+ *
+ * @param {devtools.profiler.CallTree} callTree A call tree.
+ * @param {boolean} opt_bottomUpViewWeights Whether remapping
+ *     of self weights for a bottom up view is needed.
+ */
+devtools.profiler.ViewBuilder.prototype.buildView = function(
+    callTree, opt_bottomUpViewWeights) {
+  var head;
+  var samplingRate = this.samplingRate;
+  var createViewNode = this.createViewNode;
+  callTree.traverse(function(node, viewParent) {
+    var totalWeight = node.totalWeight * samplingRate;
+    var selfWeight = node.selfWeight * samplingRate;
+    if (opt_bottomUpViewWeights === true) {
+      if (viewParent === head) {
+        selfWeight = totalWeight;
+      } else {
+        selfWeight = 0;
+      }
+    }
+    var viewNode = createViewNode(node.label, totalWeight, selfWeight, head);
+    if (viewParent) {
+      viewParent.addChild(viewNode);
+    } else {
+      head = viewNode;
+    }
+    return viewNode;
+  });
+  var view = this.createView(head);
+  return view;
+};
+
+
+/**
+ * Factory method for a profile view.
+ *
+ * @param {devtools.profiler.ProfileView.Node} head View head node.
+ * @return {devtools.profiler.ProfileView} Profile view.
+ */
+devtools.profiler.ViewBuilder.prototype.createView = function(head) {
+  return new devtools.profiler.ProfileView(head);
+};
+
+
+/**
+ * Factory method for a profile view node.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @return {devtools.profiler.ProfileView.Node} Profile view node.
+ */
+devtools.profiler.ViewBuilder.prototype.createViewNode = function(
+    funcName, totalTime, selfTime, head) {
+  return new devtools.profiler.ProfileView.Node(
+      funcName, totalTime, selfTime, head);
+};
+
+
+/**
+ * Creates a Profile View object. It allows to perform sorting
+ * and filtering actions on the profile.
+ *
+ * @param {devtools.profiler.ProfileView.Node} head Head (root) node.
+ * @constructor
+ */
+devtools.profiler.ProfileView = function(head) {
+  this.head = head;
+};
+
+
+/**
+ * Sorts the profile view using the specified sort function.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.prototype.sort = function(sortFunc) {
+  this.traverse(function (node) {
+    node.sortChildren(sortFunc);
+  });
+};
+
+
+/**
+ * Traverses profile view nodes in preorder.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function.
+ */
+devtools.profiler.ProfileView.prototype.traverse = function(f) {
+  var nodesToTraverse = new ConsArray();
+  nodesToTraverse.concat([this.head]);
+  while (!nodesToTraverse.atEnd()) {
+    var node = nodesToTraverse.next();
+    f(node);
+    nodesToTraverse.concat(node.children);
+  }
+};
+
+
+/**
+ * Constructs a Profile View node object. Each node object corresponds to
+ * a function call.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+devtools.profiler.ProfileView.Node = function(
+    internalFuncName, totalTime, selfTime, head) {
+  this.internalFuncName = internalFuncName;
+  this.totalTime = totalTime;
+  this.selfTime = selfTime;
+  this.head = head;
+  this.parent = null;
+  this.children = [];
+};
+
+
+/**
+ * Returns a share of the function's total time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'totalPercent',
+    function() { return this.totalTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's self time in application's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'selfPercent',
+    function() { return this.selfTime /
+      (this.head ? this.head.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Returns a share of the function's total time in its parent's total time.
+ */
+devtools.profiler.ProfileView.Node.prototype.__defineGetter__(
+    'parentTotalPercent',
+    function() { return this.totalTime /
+      (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Adds a child to the node.
+ *
+ * @param {devtools.profiler.ProfileView.Node} node Child node.
+ */
+devtools.profiler.ProfileView.Node.prototype.addChild = function(node) {
+  node.parent = this;
+  this.children.push(node);
+};
+
+
+/**
+ * Sorts all the node's children recursively.
+ *
+ * @param {function(devtools.profiler.ProfileView.Node,
+ *     devtools.profiler.ProfileView.Node):number} sortFunc A sorting
+ *     functions. Must comply with Array.sort sorting function requirements.
+ */
+devtools.profiler.ProfileView.Node.prototype.sortChildren = function(
+    sortFunc) {
+  this.children.sort(sortFunc);
+};
+
+/* splaytree.js */
+
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// A namespace stub. It will become more clear how to declare it properly
+// during integration of this script into Dev Tools.
+var goog = goog || {};
+goog.structs = goog.structs || {};
+
+
+/**
+ * Constructs a Splay tree.  A splay tree is a self-balancing binary
+ * search tree with the additional property that recently accessed
+ * elements are quick to access again. It performs basic operations
+ * such as insertion, look-up and removal in O(log(n)) amortized time.
+ *
+ * @constructor
+ */
+goog.structs.SplayTree = function() {
+};
+
+
+/**
+ * Pointer to the root node of the tree.
+ *
+ * @type {goog.structs.SplayTree.Node}
+ * @private
+ */
+goog.structs.SplayTree.prototype.root_ = null;
+
+
+/**
+ * @return {boolean} Whether the tree is empty.
+ */
+goog.structs.SplayTree.prototype.isEmpty = function() {
+  return !this.root_;
+};
+
+
+
+/**
+ * Inserts a node into the tree with the specified key and value if
+ * the tree does not already contain a node with the specified key. If
+ * the value is inserted, it becomes the root of the tree.
+ *
+ * @param {number} key Key to insert into the tree.
+ * @param {*} value Value to insert into the tree.
+ */
+goog.structs.SplayTree.prototype.insert = function(key, value) {
+  if (this.isEmpty()) {
+    this.root_ = new goog.structs.SplayTree.Node(key, value);
+    return;
+  }
+  // Splay on the key to move the last node on the search path for
+  // the key to the root of the tree.
+  this.splay_(key);
+  if (this.root_.key == key) {
+    return;
+  }
+  var node = new goog.structs.SplayTree.Node(key, value);
+  if (key > this.root_.key) {
+    node.left = this.root_;
+    node.right = this.root_.right;
+    this.root_.right = null;
+  } else {
+    node.right = this.root_;
+    node.left = this.root_.left;
+    this.root_.left = null;
+  }
+  this.root_ = node;
+};
+
+
+/**
+ * Removes a node with the specified key from the tree if the tree
+ * contains a node with this key. The removed node is returned. If the
+ * key is not found, an exception is thrown.
+ *
+ * @param {number} key Key to find and remove from the tree.
+ * @return {goog.structs.SplayTree.Node} The removed node.
+ */
+goog.structs.SplayTree.prototype.remove = function(key) {
+  if (this.isEmpty()) {
+    throw Error('Key not found: ' + key);
+  }
+  this.splay_(key);
+  if (this.root_.key != key) {
+    throw Error('Key not found: ' + key);
+  }
+  var removed = this.root_;
+  if (!this.root_.left) {
+    this.root_ = this.root_.right;
+  } else {
+    var right = this.root_.right;
+    this.root_ = this.root_.left;
+    // Splay to make sure that the new root has an empty right child.
+    this.splay_(key);
+    // Insert the original right child as the right child of the new
+    // root.
+    this.root_.right = right;
+  }
+  return removed;
+};
+
+
+/**
+ * Returns the node having the specified key or null if the tree doesn't contain
+ * a node with the specified key.
+ *
+ * @param {number} key Key to find in the tree.
+ * @return {goog.structs.SplayTree.Node} Node having the specified key.
+ */
+goog.structs.SplayTree.prototype.find = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  this.splay_(key);
+  return this.root_.key == key ? this.root_ : null;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the minimum key value.
+ */
+goog.structs.SplayTree.prototype.findMin = function() {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = this.root_;
+  while (current.left) {
+    current = current.left;
+  }
+  return current;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the maximum key value.
+ */
+goog.structs.SplayTree.prototype.findMax = function(opt_startNode) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = opt_startNode || this.root_;
+  while (current.right) {
+    current = current.right;
+  }
+  return current;
+};
+
+
+/**
+ * @return {goog.structs.SplayTree.Node} Node having the maximum key value that
+ *     is less or equal to the specified key value.
+ */
+goog.structs.SplayTree.prototype.findGreatestLessThan = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  // Splay on the key to move the node with the given key or the last
+  // node on the search path to the top of the tree.
+  this.splay_(key);
+  // Now the result is either the root node or the greatest node in
+  // the left subtree.
+  if (this.root_.key <= key) {
+    return this.root_;
+  } else if (this.root_.left) {
+    return this.findMax(this.root_.left);
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @return {Array<*>} An array containing all the values of tree's nodes.
+ */
+goog.structs.SplayTree.prototype.exportValues = function() {
+  var result = [];
+  this.traverse_(function(node) { result.push(node.value); });
+  return result;
+};
+
+
+/**
+ * Perform the splay operation for the given key. Moves the node with
+ * the given key to the top of the tree.  If no node has the given
+ * key, the last node on the search path is moved to the top of the
+ * tree. This is the simplified top-down splaying algorithm from:
+ * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+ *
+ * @param {number} key Key to splay the tree on.
+ * @private
+ */
+goog.structs.SplayTree.prototype.splay_ = function(key) {
+  if (this.isEmpty()) {
+    return;
+  }
+  // Create a dummy node.  The use of the dummy node is a bit
+  // counter-intuitive: The right child of the dummy node will hold
+  // the L tree of the algorithm.  The left child of the dummy node
+  // will hold the R tree of the algorithm.  Using a dummy node, left
+  // and right will always be nodes and we avoid special cases.
+  var dummy, left, right;
+  dummy = left = right = new goog.structs.SplayTree.Node(null, null);
+  var current = this.root_;
+  while (true) {
+    if (key < current.key) {
+      if (!current.left) {
+        break;
+      }
+      if (key < current.left.key) {
+        // Rotate right.
+        var tmp = current.left;
+        current.left = tmp.right;
+        tmp.right = current;
+        current = tmp;
+        if (!current.left) {
+          break;
+        }
+      }
+      // Link right.
+      right.left = current;
+      right = current;
+      current = current.left;
+    } else if (key > current.key) {
+      if (!current.right) {
+        break;
+      }
+      if (key > current.right.key) {
+        // Rotate left.
+        var tmp = current.right;
+        current.right = tmp.left;
+        tmp.left = current;
+        current = tmp;
+        if (!current.right) {
+          break;
+        }
+      }
+      // Link left.
+      left.right = current;
+      left = current;
+      current = current.right;
+    } else {
+      break;
+    }
+  }
+  // Assemble.
+  left.right = current.left;
+  right.left = current.right;
+  current.left = dummy.right;
+  current.right = dummy.left;
+  this.root_ = current;
+};
+
+
+/**
+ * Performs a preorder traversal of the tree.
+ *
+ * @param {function(goog.structs.SplayTree.Node)} f Visitor function.
+ * @private
+ */
+goog.structs.SplayTree.prototype.traverse_ = function(f) {
+  var nodesToVisit = [this.root_];
+  while (nodesToVisit.length > 0) {
+    var node = nodesToVisit.shift();
+    if (node == null) {
+      continue;
+    }
+    f(node);
+    nodesToVisit.push(node.left);
+    nodesToVisit.push(node.right);
+  }
+};
+
+
+/**
+ * Constructs a Splay tree node.
+ *
+ * @param {number} key Key.
+ * @param {*} value Value.
+ */
+goog.structs.SplayTree.Node = function(key, value) {
+  this.key = key;
+  this.value = value;
+};
+
+
+/**
+ * @type {goog.structs.SplayTree.Node}
+ */
+goog.structs.SplayTree.Node.prototype.left = null;
+
+
+/**
+ * @type {goog.structs.SplayTree.Node}
+ */
+goog.structs.SplayTree.Node.prototype.right = null;
+
+/* InspectorControllerImpl.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview DevTools' implementation of the InspectorController API.
+ */
+
+if (!this.devtools)
+    devtools = {};
+
+devtools.InspectorBackendImpl = function()
+{
+    WebInspector.InspectorBackendStub.call(this);
+    this.installInspectorControllerDelegate_("clearMessages");
+    this.installInspectorControllerDelegate_("copyNode");
+    this.installInspectorControllerDelegate_("deleteCookie");
+    this.installInspectorControllerDelegate_("didEvaluateForTestInFrontend");
+    this.installInspectorControllerDelegate_("disableResourceTracking");
+    this.installInspectorControllerDelegate_("disableSearchingForNode");
+    this.installInspectorControllerDelegate_("disableTimeline");
+    this.installInspectorControllerDelegate_("enableResourceTracking");
+    this.installInspectorControllerDelegate_("enableSearchingForNode");
+    this.installInspectorControllerDelegate_("enableTimeline");
+    this.installInspectorControllerDelegate_("getChildNodes");
+    this.installInspectorControllerDelegate_("getCookies");
+    this.installInspectorControllerDelegate_("getDatabaseTableNames");
+    this.installInspectorControllerDelegate_("getDOMStorageEntries");
+    this.installInspectorControllerDelegate_("getEventListenersForNode");
+    this.installInspectorControllerDelegate_("getResourceContent");
+    this.installInspectorControllerDelegate_("highlightDOMNode");
+    this.installInspectorControllerDelegate_("hideDOMNodeHighlight");
+    this.installInspectorControllerDelegate_("releaseWrapperObjectGroup");
+    this.installInspectorControllerDelegate_("reloadPage");
+    this.installInspectorControllerDelegate_("removeAttribute");
+    this.installInspectorControllerDelegate_("removeDOMStorageItem");
+    this.installInspectorControllerDelegate_("removeNode");
+    this.installInspectorControllerDelegate_("saveFrontendSettings");
+    this.installInspectorControllerDelegate_("setAttribute");
+    this.installInspectorControllerDelegate_("setDOMStorageItem");
+    this.installInspectorControllerDelegate_("setInjectedScriptSource");
+    this.installInspectorControllerDelegate_("setTextNodeValue");
+    this.installInspectorControllerDelegate_("startTimelineProfiler");
+    this.installInspectorControllerDelegate_("stopTimelineProfiler");
+    this.installInspectorControllerDelegate_("storeLastActivePanel");
+};
+devtools.InspectorBackendImpl.prototype.__proto__ = WebInspector.InspectorBackendStub.prototype;
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.debuggerEnabled = function()
+{
+    return true;
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.profilerEnabled = function()
+{
+    return true;
+};
+
+
+devtools.InspectorBackendImpl.prototype.setBreakpoint = function(sourceID, line, enabled, condition)
+{
+    this.removeBreakpoint(sourceID, line);
+    if (enabled)
+        devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
+};
+
+
+devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(sourceID, line)
+{
+    devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
+};
+
+
+devtools.InspectorBackendImpl.prototype.activateBreakpoints = function()
+{
+    devtools.tools.getDebuggerAgent().setBreakpointsActivated(true);
+};
+
+
+devtools.InspectorBackendImpl.prototype.deactivateBreakpoints = function()
+{
+    devtools.tools.getDebuggerAgent().setBreakpointsActivated(false);
+};
+
+
+devtools.InspectorBackendImpl.prototype.pauseInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().pauseExecution();
+};
+
+
+devtools.InspectorBackendImpl.prototype.resumeDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().resumeExecution();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepIntoStatement();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepOutOfFunction();
+};
+
+
+devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger = function()
+{
+    devtools.tools.getDebuggerAgent().stepOverStatement();
+};
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.setPauseOnExceptionsState = function(state)
+{
+    this._setPauseOnExceptionsState = state;
+    // TODO(yurys): support all three states. See http://crbug.com/32877
+    var enabled = (state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
+    WebInspector.updatePauseOnExceptionsState(enabled ? WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions : WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
+    devtools.tools.getDebuggerAgent().setPauseOnExceptions(enabled);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function()
+{
+    return devtools.tools.getDebuggerAgent().pauseOnExceptions();
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(value)
+{
+    return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.startProfiling = function()
+{
+    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.stopProfiling = function()
+{
+    devtools.tools.getProfilerAgent().stopProfiling( devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId)
+{
+    WebInspector.didGetProfileHeaders(callId, []);
+};
+
+
+/**
+ * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
+ * and is able to retrieve them by uid using "getProfile".
+ */
+devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile)
+{
+    WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
+    WebInspector.__fullProfiles[profile.uid] = profile;
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid)
+{
+    if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
+        WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function()
+{
+    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
+        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
+        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
+};
+
+
+/**
+ * @override
+ */
+devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript = function(callId, injectedScriptId, methodName, argsString, async)
+{
+    // Encode injectedScriptId into callId
+    if (typeof injectedScriptId !== "number")
+        injectedScriptId = 0;
+    RemoteToolsAgent.dispatchOnInjectedScript(callId, injectedScriptId, methodName, argsString, async);
+};
+
+
+/**
+ * Installs delegating handler into the inspector controller.
+ * @param {string} methodName Method to install delegating handler for.
+ */
+devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_ = function(methodName)
+{
+    this[methodName] = this.callInspectorController_.bind(this, methodName);
+};
+
+
+/**
+ * Bound function with the installInjectedScriptDelegate_ actual
+ * implementation.
+ */
+devtools.InspectorBackendImpl.prototype.callInspectorController_ = function(methodName, var_arg)
+{
+    var args = Array.prototype.slice.call(arguments, 1);
+    RemoteToolsAgent.dispatchOnInspectorController(WebInspector.Callback.wrap(function(){}), methodName, JSON.stringify(args));
+};
+
+
+InspectorBackend = new devtools.InspectorBackendImpl();
+
+/* DebuggerAgent.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Provides communication interface to remote v8 debugger. See
+ * protocol decription at http://code.google.com/p/v8/wiki/DebuggerProtocol
+ */
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @constructor
+ */
+devtools.DebuggerAgent = function()
+{
+    RemoteDebuggerAgent.debuggerOutput = this.handleDebuggerOutput_.bind(this);
+    RemoteDebuggerAgent.setContextId = this.setContextId_.bind(this);
+
+    /**
+     * Id of the inspected page global context. It is used for filtering scripts.
+     * @type {number}
+     */
+    this.contextId_ = null;
+
+    /**
+     * Mapping from script id to script info.
+     * @type {Object}
+     */
+    this.parsedScripts_ = null;
+
+    /**
+     * Mapping from the request id to the devtools.BreakpointInfo for the
+     * breakpoints whose v8 ids are not set yet. These breakpoints are waiting for
+     * "setbreakpoint" responses to learn their ids in the v8 debugger.
+     * @see #handleSetBreakpointResponse_
+     * @type {Object}
+     */
+    this.requestNumberToBreakpointInfo_ = null;
+
+    /**
+     * Information on current stack frames.
+     * @type {Array.<devtools.CallFrame>}
+     */
+    this.callFrames_ = [];
+
+    /**
+     * Whether to stop in the debugger on the exceptions.
+     * @type {boolean}
+     */
+    this.pauseOnExceptions_ = false;
+
+    /**
+     * Mapping: request sequence number->callback.
+     * @type {Object}
+     */
+    this.requestSeqToCallback_ = null;
+
+    /**
+     * Whether the scripts panel has been shown and initialilzed.
+     * @type {boolean}
+     */
+    this.scriptsPanelInitialized_ = false;
+
+    /**
+     * Whether the scripts list should be requested next time when context id is
+     * set.
+     * @type {boolean}
+     */
+    this.requestScriptsWhenContextIdSet_ = false;
+
+    /**
+     * Whether the agent is waiting for initial scripts response.
+     * @type {boolean}
+     */
+    this.waitingForInitialScriptsResponse_ = false;
+
+    /**
+     * If backtrace response is received when initial scripts response
+     * is not yet processed the backtrace handling will be postponed until
+     * after the scripts response processing. The handler bound to its arguments
+     * and this agent will be stored in this field then.
+     * @type {?function()}
+     */
+    this.pendingBacktraceResponseHandler_ = null;
+
+    /**
+     * Container of all breakpoints set using resource URL. These breakpoints
+     * survive page reload. Breakpoints set by script id(for scripts that don't
+     * have URLs) are stored in ScriptInfo objects.
+     * @type {Object}
+     */
+    this.urlToBreakpoints_ = {};
+
+    /**
+     * Exception message that is shown to user while on exception break.
+     * @type {WebInspector.ConsoleMessage}
+     */
+    this.currentExceptionMessage_ = null;
+
+    /**
+     * Whether breakpoints should suspend execution.
+     * @type {boolean}
+     */
+    this.breakpointsActivated_ = true;
+};
+
+
+/**
+ * A copy of the scope types from v8/src/mirror-delay.js
+ * @enum {number}
+ */
+devtools.DebuggerAgent.ScopeType = {
+    Global: 0,
+    Local: 1,
+    With: 2,
+    Closure: 3,
+    Catch: 4
+};
+
+
+/**
+ * Resets debugger agent to its initial state.
+ */
+devtools.DebuggerAgent.prototype.reset = function()
+{
+    this.contextId_ = null;
+    // No need to request scripts since they all will be pushed in AfterCompile
+    // events.
+    this.requestScriptsWhenContextIdSet_ = false;
+    this.waitingForInitialScriptsResponse_ = false;
+
+    this.parsedScripts_ = {};
+    this.requestNumberToBreakpointInfo_ = {};
+    this.callFrames_ = [];
+    this.requestSeqToCallback_ = {};
+};
+
+
+/**
+ * Initializes scripts UI. This method is called every time Scripts panel
+ * is shown. It will send request for context id if it's not set yet.
+ */
+devtools.DebuggerAgent.prototype.initUI = function()
+{
+    // Initialize scripts cache when Scripts panel is shown first time.
+    if (this.scriptsPanelInitialized_)
+        return;
+    this.scriptsPanelInitialized_ = true;
+    if (this.contextId_) {
+        // We already have context id. This means that we are here from the
+        // very beginning of the page load cycle and hence will get all scripts
+        // via after-compile events. No need to request scripts for this session.
+        //
+        // There can be a number of scripts from after-compile events that are
+        // pending addition into the UI.
+        for (var scriptId in this.parsedScripts_) {
+          var script = this.parsedScripts_[scriptId];
+          WebInspector.parsedScriptSource(scriptId, script.getUrl(), undefined /* script source */, script.getLineOffset() + 1);
+        }
+        return;
+    }
+    this.waitingForInitialScriptsResponse_ = true;
+    // Script list should be requested only when current context id is known.
+    RemoteDebuggerAgent.getContextId();
+    this.requestScriptsWhenContextIdSet_ = true;
+};
+
+
+/**
+ * Asynchronously requests the debugger for the script source.
+ * @param {number} scriptId Id of the script whose source should be resolved.
+ * @param {function(source:?string):void} callback Function that will be called
+ *     when the source resolution is completed. "source" parameter will be null
+ *     if the resolution fails.
+ */
+devtools.DebuggerAgent.prototype.resolveScriptSource = function(scriptId, callback)
+{
+    var script = this.parsedScripts_[scriptId];
+    if (!script || script.isUnresolved()) {
+        callback(null);
+        return;
+    }
+
+    var cmd = new devtools.DebugCommand("scripts", {
+        "ids": [scriptId],
+        "includeSource": true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    // Force v8 execution so that it gets to processing the requested command.
+    RemoteDebuggerAgent.processDebugCommands();
+
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+        if (msg.isSuccess()) {
+            var scriptJson = msg.getBody()[0];
+            if (scriptJson)
+                callback(scriptJson.source);
+            else
+                callback(null);
+        } else
+            callback(null);
+    };
+};
+
+
+/**
+ * Tells the v8 debugger to stop on as soon as possible.
+ */
+devtools.DebuggerAgent.prototype.pauseExecution = function()
+{
+    RemoteDebuggerCommandExecutor.DebuggerPauseScript();
+};
+
+
+/**
+ * @param {number} sourceId Id of the script fot the breakpoint.
+ * @param {number} line Number of the line for the breakpoint.
+ * @param {?string} condition The breakpoint condition.
+ */
+devtools.DebuggerAgent.prototype.addBreakpoint = function(sourceId, line, condition)
+{
+    var script = this.parsedScripts_[sourceId];
+    if (!script)
+        return;
+
+    line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
+
+    var commandArguments;
+    if (script.getUrl()) {
+        var breakpoints = this.urlToBreakpoints_[script.getUrl()];
+        if (breakpoints && breakpoints[line])
+            return;
+        if (!breakpoints) {
+            breakpoints = {};
+            this.urlToBreakpoints_[script.getUrl()] = breakpoints;
+        }
+
+        var breakpointInfo = new devtools.BreakpointInfo(line);
+        breakpoints[line] = breakpointInfo;
+
+        commandArguments = {
+            "groupId": this.contextId_,
+            "type": "script",
+            "target": script.getUrl(),
+            "line": line,
+            "condition": condition
+        };
+    } else {
+        var breakpointInfo = script.getBreakpointInfo(line);
+        if (breakpointInfo)
+            return;
+
+        breakpointInfo = new devtools.BreakpointInfo(line);
+        script.addBreakpointInfo(breakpointInfo);
+
+        commandArguments = {
+            "groupId": this.contextId_,
+            "type": "scriptId",
+            "target": sourceId,
+            "line": line,
+            "condition": condition
+        };
+    }
+
+    var cmd = new devtools.DebugCommand("setbreakpoint", commandArguments);
+
+    this.requestNumberToBreakpointInfo_[cmd.getSequenceNumber()] = breakpointInfo;
+
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    // Force v8 execution so that it gets to processing the requested command.
+    // It is necessary for being able to change a breakpoint just after it
+    // has been created (since we need an existing breakpoint id for that).
+    RemoteDebuggerAgent.processDebugCommands();
+};
+
+
+/**
+ * @param {number} sourceId Id of the script for the breakpoint.
+ * @param {number} line Number of the line for the breakpoint.
+ */
+devtools.DebuggerAgent.prototype.removeBreakpoint = function(sourceId, line)
+{
+    var script = this.parsedScripts_[sourceId];
+    if (!script)
+        return;
+
+    line = devtools.DebuggerAgent.webkitToV8LineNumber_(line);
+
+    var breakpointInfo;
+    if (script.getUrl()) {
+        var breakpoints = this.urlToBreakpoints_[script.getUrl()];
+        if (!breakpoints)
+            return;
+        breakpointInfo = breakpoints[line];
+        delete breakpoints[line];
+    } else {
+        breakpointInfo = script.getBreakpointInfo(line);
+        if (breakpointInfo)
+            script.removeBreakpointInfo(breakpointInfo);
+    }
+
+    if (!breakpointInfo)
+        return;
+
+    breakpointInfo.markAsRemoved();
+
+    var id = breakpointInfo.getV8Id();
+
+    // If we don't know id of this breakpoint in the v8 debugger we cannot send
+    // "clearbreakpoint" request. In that case it will be removed in
+    // "setbreakpoint" response handler when we learn the id.
+    if (id !== -1) {
+        this.requestClearBreakpoint_(id);
+    }
+};
+
+
+/**
+ * @param {boolean} activated Whether breakpoints should be activated.
+ */
+devtools.DebuggerAgent.prototype.setBreakpointsActivated = function(activated)
+{
+    this.breakpointsActivated_ = activated;
+};
+
+
+/**
+ * Tells the v8 debugger to step into the next statement.
+ */
+devtools.DebuggerAgent.prototype.stepIntoStatement = function()
+{
+    this.stepCommand_("in");
+};
+
+
+/**
+ * Tells the v8 debugger to step out of current function.
+ */
+devtools.DebuggerAgent.prototype.stepOutOfFunction = function()
+{
+    this.stepCommand_("out");
+};
+
+
+/**
+ * Tells the v8 debugger to step over the next statement.
+ */
+devtools.DebuggerAgent.prototype.stepOverStatement = function()
+{
+    this.stepCommand_("next");
+};
+
+
+/**
+ * Tells the v8 debugger to continue execution after it has been stopped on a
+ * breakpoint or an exception.
+ */
+devtools.DebuggerAgent.prototype.resumeExecution = function()
+{
+    this.clearExceptionMessage_();
+    var cmd = new devtools.DebugCommand("continue");
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Creates exception message and schedules it for addition to the resource upon
+ * backtrace availability.
+ * @param {string} url Resource url.
+ * @param {number} line Resource line number.
+ * @param {string} message Exception text.
+ */
+devtools.DebuggerAgent.prototype.createExceptionMessage_ = function(url, line, message)
+{
+    this.currentExceptionMessage_ = new WebInspector.ConsoleMessage(
+        WebInspector.ConsoleMessage.MessageSource.JS,
+        WebInspector.ConsoleMessage.MessageType.Log,
+        WebInspector.ConsoleMessage.MessageLevel.Error,
+        line,
+        url,
+        0 /* group level */,
+        1 /* repeat count */,
+        "[Exception] " + message);
+};
+
+
+/**
+ * Shows pending exception message that is created with createExceptionMessage_
+ * earlier.
+ */
+devtools.DebuggerAgent.prototype.showPendingExceptionMessage_ = function()
+{
+    if (!this.currentExceptionMessage_)
+        return;
+    var msg = this.currentExceptionMessage_;
+    var resource = WebInspector.resourceURLMap[msg.url];
+    if (resource) {
+        msg.resource = resource;
+        WebInspector.panels.resources.addMessageToResource(resource, msg);
+    } else
+        this.currentExceptionMessage_ = null;
+};
+
+
+/**
+ * Clears exception message from the resource.
+ */
+devtools.DebuggerAgent.prototype.clearExceptionMessage_ = function()
+{
+    if (this.currentExceptionMessage_) {
+        var messageElement = this.currentExceptionMessage_._resourceMessageLineElement;
+        var bubble = messageElement.parentElement;
+        bubble.removeChild(messageElement);
+        if (!bubble.firstChild) {
+            // Last message in bubble removed.
+            bubble.parentElement.removeChild(bubble);
+        }
+        this.currentExceptionMessage_ = null;
+    }
+};
+
+
+/**
+ * @return {boolean} True iff the debugger will pause execution on the
+ * exceptions.
+ */
+devtools.DebuggerAgent.prototype.pauseOnExceptions = function()
+{
+    return this.pauseOnExceptions_;
+};
+
+
+/**
+ * Tells whether to pause in the debugger on the exceptions or not.
+ * @param {boolean} value True iff execution should be stopped in the debugger
+ * on the exceptions.
+ */
+devtools.DebuggerAgent.prototype.setPauseOnExceptions = function(value)
+{
+    this.pauseOnExceptions_ = value;
+};
+
+
+/**
+ * Sends "evaluate" request to the debugger.
+ * @param {Object} arguments Request arguments map.
+ * @param {function(devtools.DebuggerMessage)} callback Callback to be called
+ *     when response is received.
+ */
+devtools.DebuggerAgent.prototype.requestEvaluate = function(arguments, callback)
+{
+    var cmd = new devtools.DebugCommand("evaluate", arguments);
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
+};
+
+
+/**
+ * Sends "lookup" request for each unresolved property of the object. When
+ * response is received the properties will be changed with their resolved
+ * values.
+ * @param {Object} object Object whose properties should be resolved.
+ * @param {function(devtools.DebuggerMessage)} Callback to be called when all
+ *     children are resolved.
+ * @param {boolean} noIntrinsic Whether intrinsic properties should be included.
+ */
+devtools.DebuggerAgent.prototype.resolveChildren = function(object, callback, noIntrinsic)
+{
+    if ("handle" in object) {
+        var result = [];
+        devtools.DebuggerAgent.formatObjectProperties_(object, result, noIntrinsic);
+        callback(result);
+    } else {
+        this.requestLookup_([object.ref], function(msg) {
+            var result = [];
+            if (msg.isSuccess()) {
+                var handleToObject = msg.getBody();
+                var resolved = handleToObject[object.ref];
+                devtools.DebuggerAgent.formatObjectProperties_(resolved, result, noIntrinsic);
+                callback(result);
+            } else
+                callback([]);
+        });
+    }
+};
+
+
+/**
+ * Sends "scope" request for the scope object to resolve its variables.
+ * @param {Object} scope Scope to be resolved.
+ * @param {function(Array.<WebInspector.ObjectPropertyProxy>)} callback
+ *     Callback to be called when all scope variables are resolved.
+ */
+devtools.DebuggerAgent.prototype.resolveScope = function(scope, callback)
+{
+    var cmd = new devtools.DebugCommand("scope", {
+        "frameNumber": scope.frameNumber,
+        "number": scope.index,
+        "compactFormat": true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+        var result = [];
+        if (msg.isSuccess()) {
+            var scopeObjectJson = msg.getBody().object;
+            devtools.DebuggerAgent.formatObjectProperties_(scopeObjectJson, result, true /* no intrinsic */);
+        }
+        callback(result);
+    };
+};
+
+
+/**
+ * Sends "scopes" request for the frame object to resolve all variables
+ * available in the frame.
+ * @param {number} callFrameId Id of call frame whose variables need to
+ *     be resolved.
+ * @param {function(Object)} callback Callback to be called when all frame
+ *     variables are resolved.
+ */
+devtools.DebuggerAgent.prototype.resolveFrameVariables_ = function(callFrameId, callback)
+{
+    var result = {};
+
+    var frame = this.callFrames_[callFrameId];
+    if (!frame) {
+        callback(result);
+        return;
+    }
+
+    var waitingResponses = 0;
+    function scopeResponseHandler(msg) {
+        waitingResponses--;
+
+        if (msg.isSuccess()) {
+            var properties = msg.getBody().object.properties;
+            for (var j = 0; j < properties.length; j++)
+                result[properties[j].name] = true;
+        }
+
+        // When all scopes are resolved invoke the callback.
+        if (waitingResponses === 0)
+            callback(result);
+    };
+
+    for (var i = 0; i < frame.scopeChain.length; i++) {
+        var scope = frame.scopeChain[i].objectId;
+        if (scope.type === devtools.DebuggerAgent.ScopeType.Global) {
+            // Do not resolve global scope since it takes for too long.
+            // TODO(yurys): allow to send only property names in the response.
+            continue;
+        }
+        var cmd = new devtools.DebugCommand("scope", {
+            "frameNumber": scope.frameNumber,
+            "number": scope.index,
+            "compactFormat": true
+        });
+        devtools.DebuggerAgent.sendCommand_(cmd);
+        this.requestSeqToCallback_[cmd.getSequenceNumber()] = scopeResponseHandler;
+        waitingResponses++;
+    }
+};
+
+/**
+ * Evaluates the expressionString to an object in the call frame and reports
+ * all its properties.
+ * @param{string} expressionString Expression whose properties should be
+ *     collected.
+ * @param{number} callFrameId The frame id.
+ * @param{function(Object result,bool isException)} reportCompletions Callback
+ *     function.
+ */
+devtools.DebuggerAgent.prototype.resolveCompletionsOnFrame = function(expressionString, callFrameId, reportCompletions)
+{
+      if (expressionString) {
+          expressionString = "var obj = " + expressionString +
+              "; var names = {}; for (var n in obj) { names[n] = true; };" +
+              "names;";
+          this.evaluateInCallFrame(
+              callFrameId,
+              expressionString,
+              function(result) {
+                  var names = {};
+                  if (!result.isException) {
+                      var props = result.value.objectId.properties;
+                      // Put all object properties into the map.
+                      for (var i = 0; i < props.length; i++)
+                          names[props[i].name] = true;
+                  }
+                  reportCompletions(names, result.isException);
+              });
+      } else {
+          this.resolveFrameVariables_(callFrameId,
+              function(result) {
+                  reportCompletions(result, false /* isException */);
+              });
+      }
+};
+
+
+/**
+ * @param{number} scriptId
+ * @return {string} Type of the context of the script with specified id.
+ */
+devtools.DebuggerAgent.prototype.getScriptContextType = function(scriptId)
+{
+    return this.parsedScripts_[scriptId].getContextType();
+};
+
+
+/**
+ * Removes specified breakpoint from the v8 debugger.
+ * @param {number} breakpointId Id of the breakpoint in the v8 debugger.
+ */
+devtools.DebuggerAgent.prototype.requestClearBreakpoint_ = function(breakpointId)
+{
+    var cmd = new devtools.DebugCommand("clearbreakpoint", {
+        "breakpoint": breakpointId
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends "backtrace" request to v8.
+ */
+devtools.DebuggerAgent.prototype.requestBacktrace_ = function()
+{
+    var cmd = new devtools.DebugCommand("backtrace", {
+        "compactFormat":true
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends command to v8 debugger.
+ * @param {devtools.DebugCommand} cmd Command to execute.
+ */
+devtools.DebuggerAgent.sendCommand_ = function(cmd)
+{
+    RemoteDebuggerCommandExecutor.DebuggerCommand(cmd.toJSONProtocol());
+};
+
+
+/**
+ * Tells the v8 debugger to make the next execution step.
+ * @param {string} action "in", "out" or "next" action.
+ */
+devtools.DebuggerAgent.prototype.stepCommand_ = function(action)
+{
+    this.clearExceptionMessage_();
+    var cmd = new devtools.DebugCommand("continue", {
+        "stepaction": action,
+        "stepcount": 1
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+};
+
+
+/**
+ * Sends "lookup" request to v8.
+ * @param {number} handle Handle to the object to lookup.
+ */
+devtools.DebuggerAgent.prototype.requestLookup_ = function(handles, callback)
+{
+    var cmd = new devtools.DebugCommand("lookup", {
+        "compactFormat":true,
+        "handles": handles
+    });
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    this.requestSeqToCallback_[cmd.getSequenceNumber()] = callback;
+};
+
+
+/**
+ * Sets debugger context id for scripts filtering.
+ * @param {number} contextId Id of the inspected page global context.
+ */
+devtools.DebuggerAgent.prototype.setContextId_ = function(contextId)
+{
+    this.contextId_ = contextId;
+
+    // If it's the first time context id is set request scripts list.
+    if (this.requestScriptsWhenContextIdSet_) {
+        this.requestScriptsWhenContextIdSet_ = false;
+        var cmd = new devtools.DebugCommand("scripts", {
+            "includeSource": false
+        });
+        devtools.DebuggerAgent.sendCommand_(cmd);
+        // Force v8 execution so that it gets to processing the requested command.
+        RemoteDebuggerAgent.processDebugCommands();
+
+        var debuggerAgent = this;
+        this.requestSeqToCallback_[cmd.getSequenceNumber()] = function(msg) {
+            // Handle the response iff the context id hasn't changed since the request
+            // was issued. Otherwise if the context id did change all up-to-date
+            // scripts will be pushed in after compile events and there is no need to
+            // handle the response.
+            if (contextId === debuggerAgent.contextId_)
+                debuggerAgent.handleScriptsResponse_(msg);
+
+            // We received initial scripts response so flush the flag and
+            // see if there is an unhandled backtrace response.
+            debuggerAgent.waitingForInitialScriptsResponse_ = false;
+            if (debuggerAgent.pendingBacktraceResponseHandler_) {
+                debuggerAgent.pendingBacktraceResponseHandler_();
+                debuggerAgent.pendingBacktraceResponseHandler_ = null;
+            }
+        };
+    }
+};
+
+
+/**
+ * Handles output sent by v8 debugger. The output is either asynchronous event
+ * or response to a previously sent request.  See protocol definitioun for more
+ * details on the output format.
+ * @param {string} output
+ */
+devtools.DebuggerAgent.prototype.handleDebuggerOutput_ = function(output)
+{
+    var msg;
+    try {
+        msg = new devtools.DebuggerMessage(output);
+    } catch(e) {
+        debugPrint("Failed to handle debugger response:\n" + e);
+        throw e;
+    }
+
+    if (msg.getType() === "event") {
+        if (msg.getEvent() === "break")
+            this.handleBreakEvent_(msg);
+        else if (msg.getEvent() === "exception")
+            this.handleExceptionEvent_(msg);
+        else if (msg.getEvent() === "afterCompile")
+            this.handleAfterCompileEvent_(msg);
+    } else if (msg.getType() === "response") {
+        if (msg.getCommand() === "scripts")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "setbreakpoint")
+            this.handleSetBreakpointResponse_(msg);
+        else if (msg.getCommand() === "clearbreakpoint")
+            this.handleClearBreakpointResponse_(msg);
+        else if (msg.getCommand() === "backtrace")
+            this.handleBacktraceResponse_(msg);
+        else if (msg.getCommand() === "lookup")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "evaluate")
+            this.invokeCallbackForResponse_(msg);
+        else if (msg.getCommand() === "scope")
+            this.invokeCallbackForResponse_(msg);
+    }
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleBreakEvent_ = function(msg)
+{
+    if (!this.breakpointsActivated_) {
+        this.resumeExecution();
+        return;
+    }
+
+    // Force scripts panel to be shown first.
+    WebInspector.currentPanel = WebInspector.panels.scripts;
+
+    var body = msg.getBody();
+
+    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
+    this.requestBacktrace_();
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleExceptionEvent_ = function(msg)
+{
+    // Force scripts panel to be shown first.
+    WebInspector.currentPanel = WebInspector.panels.scripts;
+
+    var body = msg.getBody();
+    // No script field in the body means that v8 failed to parse the script. We
+    // resume execution on parser errors automatically.
+    if (this.pauseOnExceptions_ && body.script) {
+        var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(body.sourceLine);
+        this.createExceptionMessage_(body.script.name, line, body.exception.text);
+        this.requestBacktrace_();
+    } else
+        this.resumeExecution();
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleScriptsResponse_ = function(msg)
+{
+    var scripts = msg.getBody();
+    for (var i = 0; i < scripts.length; i++) {
+        var script = scripts[i];
+
+        // Skip scripts from other tabs.
+        if (!this.isScriptFromInspectedContext_(script, msg))
+            continue;
+
+        // We may already have received the info in an afterCompile event.
+        if (script.id in this.parsedScripts_)
+            continue;
+        this.addScriptInfo_(script, msg);
+    }
+};
+
+
+/**
+ * @param {Object} script Json object representing script.
+ * @param {devtools.DebuggerMessage} msg Debugger response.
+ */
+devtools.DebuggerAgent.prototype.isScriptFromInspectedContext_ = function(script, msg)
+{
+    if (!script.context) {
+        // Always ignore scripts from the utility context.
+        return false;
+    }
+    var context = msg.lookup(script.context.ref);
+    var scriptContextId = context.data;
+    if (typeof scriptContextId === "undefined")
+        return false; // Always ignore scripts from the utility context.
+    if (this.contextId_ === null)
+        return true;
+    // Find the id from context data. The context data has the format "type,id".
+    var comma = context.data.indexOf(",");
+    if (comma < 0)
+        return false;
+    return (context.data.substring(comma + 1) == this.contextId_);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleSetBreakpointResponse_ = function(msg)
+{
+    var requestSeq = msg.getRequestSeq();
+    var breakpointInfo = this.requestNumberToBreakpointInfo_[requestSeq];
+    if (!breakpointInfo) {
+        // TODO(yurys): handle this case
+        return;
+    }
+    delete this.requestNumberToBreakpointInfo_[requestSeq];
+    if (!msg.isSuccess()) {
+        // TODO(yurys): handle this case
+        return;
+    }
+    var idInV8 = msg.getBody().breakpoint;
+    breakpointInfo.setV8Id(idInV8);
+
+    if (breakpointInfo.isRemoved())
+        this.requestClearBreakpoint_(idInV8);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleAfterCompileEvent_ = function(msg)
+{
+    if (!this.contextId_) {
+        // Ignore scripts delta if main request has not been issued yet.
+        return;
+    }
+    var script = msg.getBody().script;
+
+    // Ignore scripts from other tabs.
+    if (!this.isScriptFromInspectedContext_(script, msg))
+        return;
+    this.addScriptInfo_(script, msg);
+};
+
+
+/**
+ * Adds the script info to the local cache. This method assumes that the script
+ * is not in the cache yet.
+ * @param {Object} script Script json object from the debugger message.
+ * @param {devtools.DebuggerMessage} msg Debugger message containing the script
+ *     data.
+ */
+devtools.DebuggerAgent.prototype.addScriptInfo_ = function(script, msg)
+{
+    var context = msg.lookup(script.context.ref);
+    var contextType;
+    // Find the type from context data. The context data has the format
+    // "type,id".
+    var comma = context.data.indexOf(",");
+    if (comma < 0)
+        return
+    contextType = context.data.substring(0, comma);
+    this.parsedScripts_[script.id] = new devtools.ScriptInfo(script.id, script.name, script.lineOffset, contextType);
+    if (this.scriptsPanelInitialized_) {
+        // Only report script as parsed after scripts panel has been shown.
+        WebInspector.parsedScriptSource(script.id, script.name, script.source, script.lineOffset + 1);
+    }
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleClearBreakpointResponse_ = function(msg)
+{
+    // Do nothing.
+};
+
+
+/**
+ * Handles response to "backtrace" command.
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.handleBacktraceResponse_ = function(msg)
+{
+    if (this.waitingForInitialScriptsResponse_)
+        this.pendingBacktraceResponseHandler_ = this.doHandleBacktraceResponse_.bind(this, msg);
+    else
+        this.doHandleBacktraceResponse_(msg);
+};
+
+
+/**
+ * @param {devtools.DebuggerMessage} msg
+ */
+devtools.DebuggerAgent.prototype.doHandleBacktraceResponse_ = function(msg)
+{
+    var frames = msg.getBody().frames;
+    this.callFrames_ = [];
+    for (var i = 0; i <  frames.length; ++i)
+        this.callFrames_.push(this.formatCallFrame_(frames[i]));
+    WebInspector.pausedScript(this.callFrames_);
+    this.showPendingExceptionMessage_();
+    InspectorFrontendHost.activateWindow();
+};
+
+
+/**
+ * Evaluates code on given callframe.
+ */
+devtools.DebuggerAgent.prototype.evaluateInCallFrame = function(callFrameId, code, callback)
+{
+    var callFrame = this.callFrames_[callFrameId];
+    callFrame.evaluate_(code, callback);
+};
+
+
+/**
+ * Handles response to a command by invoking its callback (if any).
+ * @param {devtools.DebuggerMessage} msg
+ * @return {boolean} Whether a callback for the given message was found and
+ *     excuted.
+ */
+devtools.DebuggerAgent.prototype.invokeCallbackForResponse_ = function(msg)
+{
+    var callback = this.requestSeqToCallback_[msg.getRequestSeq()];
+    if (!callback) {
+        // It may happend if reset was called.
+        return false;
+    }
+    delete this.requestSeqToCallback_[msg.getRequestSeq()];
+    callback(msg);
+    return true;
+};
+
+
+/**
+ * @param {Object} stackFrame Frame json object from "backtrace" response.
+ * @return {!devtools.CallFrame} Object containing information related to the
+ *     call frame in the format expected by ScriptsPanel and its panes.
+ */
+devtools.DebuggerAgent.prototype.formatCallFrame_ = function(stackFrame)
+{
+    var func = stackFrame.func;
+    var sourceId = func.scriptId;
+
+    // Add service script if it does not exist.
+    var existingScript = this.parsedScripts_[sourceId];
+    if (!existingScript) {
+        this.parsedScripts_[sourceId] = new devtools.ScriptInfo(sourceId, null /* name */, 0 /* line */, "unknown" /* type */, true /* unresolved */);
+        WebInspector.parsedScriptSource(sourceId, null, null, 0);
+    }
+
+    var funcName = func.name || func.inferredName || "(anonymous function)";
+    var line = devtools.DebuggerAgent.v8ToWwebkitLineNumber_(stackFrame.line);
+
+    // Add basic scope chain info with scope variables.
+    var scopeChain = [];
+    var ScopeType = devtools.DebuggerAgent.ScopeType;
+    for (var i = 0; i < stackFrame.scopes.length; i++) {
+        var scope = stackFrame.scopes[i];
+        scope.frameNumber = stackFrame.index;
+        var scopeObjectProxy = new WebInspector.ObjectProxy(0, scope, [], "", true);
+        scopeObjectProxy.isScope = true;
+        switch(scope.type) {
+            case ScopeType.Global:
+                scopeObjectProxy.isDocument = true;
+                break;
+            case ScopeType.Local:
+                scopeObjectProxy.isLocal = true;
+                scopeObjectProxy.thisObject = devtools.DebuggerAgent.formatObjectProxy_(stackFrame.receiver);
+                break;
+            case ScopeType.With:
+            // Catch scope is treated as a regular with scope by WebKit so we
+            // also treat it this way.
+            case ScopeType.Catch:
+                scopeObjectProxy.isWithBlock = true;
+                break;
+            case ScopeType.Closure:
+                scopeObjectProxy.isClosure = true;
+                break;
+        }
+        scopeChain.push(scopeObjectProxy);
+    }
+    return new devtools.CallFrame(stackFrame.index, "function", funcName, sourceId, line, scopeChain);
+};
+
+
+/**
+ * Collects properties for an object from the debugger response.
+ * @param {Object} object An object from the debugger protocol response.
+ * @param {Array.<WebInspector.ObjectPropertyProxy>} result An array to put the
+ *     properties into.
+ * @param {boolean} noIntrinsic Whether intrinsic properties should be
+ *     included.
+ */
+devtools.DebuggerAgent.formatObjectProperties_ = function(object, result, noIntrinsic)
+{
+    devtools.DebuggerAgent.propertiesToProxies_(object.properties, result);
+    if (noIntrinsic)
+        return;
+
+    result.push(new WebInspector.ObjectPropertyProxy("__proto__", devtools.DebuggerAgent.formatObjectProxy_(object.protoObject)));
+    result.push(new WebInspector.ObjectPropertyProxy("constructor", devtools.DebuggerAgent.formatObjectProxy_(object.constructorFunction)));
+    // Don't add 'prototype' property since it is one of the regualar properties.
+};
+
+
+/**
+ * For each property in "properties" creates its proxy representative.
+ * @param {Array.<Object>} properties Receiver properties or locals array from
+ *     "backtrace" response.
+ * @param {Array.<WebInspector.ObjectPropertyProxy>} Results holder.
+ */
+devtools.DebuggerAgent.propertiesToProxies_ = function(properties, result)
+{
+    var map = {};
+    for (var i = 0; i < properties.length; ++i) {
+        var property = properties[i];
+        var name = String(property.name);
+        if (name in map)
+            continue;
+        map[name] = true;
+        var value = devtools.DebuggerAgent.formatObjectProxy_(property.value);
+        var propertyProxy = new WebInspector.ObjectPropertyProxy(name, value);
+        result.push(propertyProxy);
+    }
+};
+
+
+/**
+ * @param {Object} v An object reference from the debugger response.
+ * @return {*} The value representation expected by ScriptsPanel.
+ */
+devtools.DebuggerAgent.formatObjectProxy_ = function(v)
+{
+    var description;
+    var hasChildren = false;
+    if (v.type === "object") {
+        description = v.className;
+        hasChildren = true;
+    } else if (v.type === "function") {
+        if (v.source)
+            description = v.source;
+        else
+            description = "function " + v.name + "()";
+        hasChildren = true;
+    } else if (v.type === "undefined")
+        description = "undefined";
+    else if (v.type === "null")
+        description = "null";
+    else if (typeof v.value !== "undefined") {
+        // Check for undefined and null types before checking the value, otherwise
+        // null/undefined may have blank value.
+        description = v.value;
+    } else
+        description = "<unresolved ref: " + v.ref + ", type: " + v.type + ">";
+
+    var proxy = new WebInspector.ObjectProxy(0, v, [], description, hasChildren);
+    proxy.type = v.type;
+    proxy.isV8Ref = true;
+    return proxy;
+};
+
+
+/**
+ * Converts line number from Web Inspector UI(1-based) to v8(0-based).
+ * @param {number} line Resource line number in Web Inspector UI.
+ * @return {number} The line number in v8.
+ */
+devtools.DebuggerAgent.webkitToV8LineNumber_ = function(line)
+{
+    return line - 1;
+};
+
+
+/**
+ * Converts line number from v8(0-based) to Web Inspector UI(1-based).
+ * @param {number} line Resource line number in v8.
+ * @return {number} The line number in Web Inspector.
+ */
+devtools.DebuggerAgent.v8ToWwebkitLineNumber_ = function(line)
+{
+    return line + 1;
+};
+
+
+/**
+ * @param {number} scriptId Id of the script.
+ * @param {?string} url Script resource URL if any.
+ * @param {number} lineOffset First line 0-based offset in the containing
+ *     document.
+ * @param {string} contextType Type of the script's context:
+ *     "page" - regular script from html page
+ *     "injected" - extension content script
+ * @param {bool} opt_isUnresolved If true, script will not be resolved.
+ * @constructor
+ */
+devtools.ScriptInfo = function(scriptId, url, lineOffset, contextType, opt_isUnresolved)
+{
+    this.scriptId_ = scriptId;
+    this.lineOffset_ = lineOffset;
+    this.contextType_ = contextType;
+    this.url_ = url;
+    this.isUnresolved_ = opt_isUnresolved;
+
+    this.lineToBreakpointInfo_ = {};
+};
+
+
+/**
+ * @return {number}
+ */
+devtools.ScriptInfo.prototype.getLineOffset = function()
+{
+    return this.lineOffset_;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.ScriptInfo.prototype.getContextType = function()
+{
+    return this.contextType_;
+};
+
+
+/**
+ * @return {?string}
+ */
+devtools.ScriptInfo.prototype.getUrl = function()
+{
+    return this.url_;
+};
+
+
+/**
+ * @return {?bool}
+ */
+devtools.ScriptInfo.prototype.isUnresolved = function()
+{
+    return this.isUnresolved_;
+};
+
+
+/**
+ * @param {number} line 0-based line number in the script.
+ * @return {?devtools.BreakpointInfo} Information on a breakpoint at the
+ *     specified line in the script or undefined if there is no breakpoint at
+ *     that line.
+ */
+devtools.ScriptInfo.prototype.getBreakpointInfo = function(line)
+{
+    return this.lineToBreakpointInfo_[line];
+};
+
+
+/**
+ * Adds breakpoint info to the script.
+ * @param {devtools.BreakpointInfo} breakpoint
+ */
+devtools.ScriptInfo.prototype.addBreakpointInfo = function(breakpoint)
+{
+    this.lineToBreakpointInfo_[breakpoint.getLine()] = breakpoint;
+};
+
+
+/**
+ * @param {devtools.BreakpointInfo} breakpoint Breakpoint info to be removed.
+ */
+devtools.ScriptInfo.prototype.removeBreakpointInfo = function(breakpoint)
+{
+    var line = breakpoint.getLine();
+    delete this.lineToBreakpointInfo_[line];
+};
+
+
+
+/**
+ * @param {number} line Breakpoint 0-based line number in the containing script.
+ * @constructor
+ */
+devtools.BreakpointInfo = function(line)
+{
+    this.line_ = line;
+    this.v8id_ = -1;
+    this.removed_ = false;
+};
+
+
+/**
+ * @return {number}
+ */
+devtools.BreakpointInfo.prototype.getLine = function(n)
+{
+    return this.line_;
+};
+
+
+/**
+ * @return {number} Unique identifier of this breakpoint in the v8 debugger.
+ */
+devtools.BreakpointInfo.prototype.getV8Id = function(n)
+{
+    return this.v8id_;
+};
+
+
+/**
+ * Sets id of this breakpoint in the v8 debugger.
+ * @param {number} id
+ */
+devtools.BreakpointInfo.prototype.setV8Id = function(id)
+{
+    this.v8id_ = id;
+};
+
+
+/**
+ * Marks this breakpoint as removed from the  front-end.
+ */
+devtools.BreakpointInfo.prototype.markAsRemoved = function()
+{
+    this.removed_ = true;
+};
+
+
+/**
+ * @return {boolean} Whether this breakpoint has been removed from the
+ *     front-end.
+ */
+devtools.BreakpointInfo.prototype.isRemoved = function()
+{
+    return this.removed_;
+};
+
+
+/**
+ * Call stack frame data.
+ * @param {string} id CallFrame id.
+ * @param {string} type CallFrame type.
+ * @param {string} functionName CallFrame type.
+ * @param {string} sourceID Source id.
+ * @param {number} line Source line.
+ * @param {Array.<Object>} scopeChain Array of scoped objects.
+ * @construnctor
+ */
+devtools.CallFrame = function(id, type, functionName, sourceID, line, scopeChain)
+{
+    this.id = id;
+    this.type = type;
+    this.functionName = functionName;
+    this.sourceID = sourceID;
+    this.line = line;
+    this.scopeChain = scopeChain;
+};
+
+
+/**
+ * This method issues asynchronous evaluate request, reports result to the
+ * callback.
+ * @param {string} expression An expression to be evaluated in the context of
+ *     this call frame.
+ * @param {function(Object):undefined} callback Callback to report result to.
+ */
+devtools.CallFrame.prototype.evaluate_ = function(expression, callback)
+{
+    devtools.tools.getDebuggerAgent().requestEvaluate({
+            "expression": expression,
+            "frame": this.id,
+            "global": false,
+            "disable_break": false,
+            "compactFormat": true,
+            "maxStringLength": -1
+        },
+        function(response) {
+            var result = {};
+            if (response.isSuccess())
+                result.value = devtools.DebuggerAgent.formatObjectProxy_(response.getBody());
+            else {
+                result.value = response.getMessage();
+                result.isException = true;
+            }
+            callback(result);
+        });
+};
+
+
+/**
+ * JSON based commands sent to v8 debugger.
+ * @param {string} command Name of the command to execute.
+ * @param {Object} opt_arguments Command-specific arguments map.
+ * @constructor
+ */
+devtools.DebugCommand = function(command, opt_arguments)
+{
+    this.command_ = command;
+    this.type_ = "request";
+    this.seq_ = ++devtools.DebugCommand.nextSeq_;
+    if (opt_arguments)
+        this.arguments_ = opt_arguments;
+};
+
+
+/**
+ * Next unique number to be used as debugger request sequence number.
+ * @type {number}
+ */
+devtools.DebugCommand.nextSeq_ = 1;
+
+
+/**
+ * @return {number}
+ */
+devtools.DebugCommand.prototype.getSequenceNumber = function()
+{
+    return this.seq_;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.DebugCommand.prototype.toJSONProtocol = function()
+{
+    var json = {
+        "seq": this.seq_,
+        "type": this.type_,
+        "command": this.command_
+    }
+    if (this.arguments_)
+        json.arguments = this.arguments_;
+    return JSON.stringify(json);
+};
+
+
+/**
+ * JSON messages sent from v8 debugger. See protocol definition for more
+ * details: http://code.google.com/p/v8/wiki/DebuggerProtocol
+ * @param {string} msg Raw protocol packet as JSON string.
+ * @constructor
+ */
+devtools.DebuggerMessage = function(msg)
+{
+    this.packet_ = JSON.parse(msg);
+    this.refs_ = [];
+    if (this.packet_.refs) {
+        for (var i = 0; i < this.packet_.refs.length; i++)
+            this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
+    }
+};
+
+
+/**
+ * @return {string} The packet type.
+ */
+devtools.DebuggerMessage.prototype.getType = function()
+{
+    return this.packet_.type;
+};
+
+
+/**
+ * @return {?string} The packet event if the message is an event.
+ */
+devtools.DebuggerMessage.prototype.getEvent = function()
+{
+    return this.packet_.event;
+};
+
+
+/**
+ * @return {?string} The packet command if the message is a response to a
+ *     command.
+ */
+devtools.DebuggerMessage.prototype.getCommand = function()
+{
+    return this.packet_.command;
+};
+
+
+/**
+ * @return {number} The packet request sequence.
+ */
+devtools.DebuggerMessage.prototype.getRequestSeq = function()
+{
+    return this.packet_.request_seq;
+};
+
+
+/**
+ * @return {number} Whether the v8 is running after processing the request.
+ */
+devtools.DebuggerMessage.prototype.isRunning = function()
+{
+    return this.packet_.running ? true : false;
+};
+
+
+/**
+ * @return {boolean} Whether the request succeeded.
+ */
+devtools.DebuggerMessage.prototype.isSuccess = function()
+{
+    return this.packet_.success ? true : false;
+};
+
+
+/**
+ * @return {string}
+ */
+devtools.DebuggerMessage.prototype.getMessage = function()
+{
+    return this.packet_.message;
+};
+
+
+/**
+ * @return {Object} Parsed message body json.
+ */
+devtools.DebuggerMessage.prototype.getBody = function()
+{
+    return this.packet_.body;
+};
+
+
+/**
+ * @param {number} handle Object handle.
+ * @return {?Object} Returns the object with the handle if it was sent in this
+ *    message(some objects referenced by handles may be missing in the message).
+ */
+devtools.DebuggerMessage.prototype.lookup = function(handle)
+{
+    return this.refs_[handle];
+};
+
+/* ProfilerAgent.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Provides communication interface to remote v8 profiler.
+ */
+
+/**
+ * @constructor
+ */
+devtools.ProfilerAgent = function()
+{
+    RemoteProfilerAgent.didGetActiveProfilerModules = this._didGetActiveProfilerModules.bind(this);
+    RemoteProfilerAgent.didGetLogLines = this._didGetLogLines.bind(this);
+
+    /**
+     * Active profiler modules flags.
+     * @type {number}
+     */
+    this._activeProfilerModules = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
+
+    /**
+     * Interval for polling profiler state.
+     * @type {number}
+     */
+    this._getActiveProfilerModulesInterval = null;
+
+    /**
+     * Profiler log position.
+     * @type {number}
+     */
+    this._logPosition = 0;
+
+    /**
+     * Last requested log position.
+     * @type {number}
+     */
+    this._lastRequestedLogPosition = -1;
+
+    /**
+     * Whether log contents retrieval must be forced next time.
+     * @type {boolean}
+     */
+    this._forceGetLogLines = false;
+
+    /**
+     * Profiler processor instance.
+     * @type {devtools.profiler.Processor}
+     */
+    this._profilerProcessor = new devtools.profiler.Processor();
+};
+
+
+/**
+ * A copy of enum from include/v8.h
+ * @enum {number}
+ */
+devtools.ProfilerAgent.ProfilerModules = {
+    PROFILER_MODULE_NONE: 0,
+    PROFILER_MODULE_CPU: 1,
+    PROFILER_MODULE_HEAP_STATS: 1 << 1,
+    PROFILER_MODULE_JS_CONSTRUCTORS: 1 << 2,
+    PROFILER_MODULE_HEAP_SNAPSHOT: 1 << 16
+};
+
+
+/**
+ * Sets up callbacks that deal with profiles processing.
+ */
+devtools.ProfilerAgent.prototype.setupProfilerProcessorCallbacks = function()
+{
+    // A temporary icon indicating that the profile is being processed.
+    var processingIcon = new WebInspector.SidebarTreeElement(
+        "profile-sidebar-tree-item",
+        WebInspector.UIString("Processing..."),
+        '', null, false);
+    var profilesSidebar = WebInspector.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).treeElement;
+
+    this._profilerProcessor.setCallbacks(
+        function onProfileProcessingStarted() {
+            // Set visually empty string. Subtitle hiding is done via styles
+            // manipulation which doesn't play well with dynamic append / removal.
+            processingIcon.subtitle = " ";
+            profilesSidebar.appendChild(processingIcon);
+        },
+        function onProfileProcessingStatus(ticksCount) {
+            processingIcon.subtitle = WebInspector.UIString("%d ticks processed", ticksCount);
+        },
+        function onProfileProcessingFinished(profile) {
+            profilesSidebar.removeChild(processingIcon);
+            profile.typeId = WebInspector.CPUProfileType.TypeId;
+            InspectorBackend.addFullProfile(profile);
+            WebInspector.addProfileHeader(profile);
+            // If no profile is currently shown, show the new one.
+            var profilesPanel = WebInspector.panels.profiles;
+            if (!profilesPanel.visibleView) {
+                profilesPanel.showProfile(profile);
+            }
+        }
+    );
+};
+
+
+/**
+ * Initializes profiling state.
+ */
+devtools.ProfilerAgent.prototype.initializeProfiling = function()
+{
+    this.setupProfilerProcessorCallbacks();
+    this._forceGetLogLines = true;
+    this._getActiveProfilerModulesInterval = setInterval(function() { RemoteProfilerAgent.getActiveProfilerModules(); }, 1000);
+};
+
+
+/**
+ * Requests the next chunk of log lines.
+ * @param {boolean} immediately Do not postpone the request.
+ * @private
+ */
+devtools.ProfilerAgent.prototype._getNextLogLines = function(immediately)
+{
+    if (this._lastRequestedLogPosition == this._logPosition)
+        return;
+    var pos = this._lastRequestedLogPosition = this._logPosition;
+    if (immediately)
+        RemoteProfilerAgent.getLogLines(pos);
+    else
+        setTimeout(function() { RemoteProfilerAgent.getLogLines(pos); }, 500);
+};
+
+
+/**
+ * Starts profiling.
+ * @param {number} modules List of modules to enable.
+ */
+devtools.ProfilerAgent.prototype.startProfiling = function(modules)
+{
+    var cmd = new devtools.DebugCommand("profile", {
+        "modules": modules,
+        "command": "resume"});
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    RemoteDebuggerAgent.processDebugCommands();
+    if (modules & devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
+        // Active modules will not change, instead, a snapshot will be logged.
+        this._getNextLogLines();
+    }
+};
+
+
+/**
+ * Stops profiling.
+ */
+devtools.ProfilerAgent.prototype.stopProfiling = function(modules)
+{
+    var cmd = new devtools.DebugCommand("profile", {
+        "modules": modules,
+        "command": "pause"});
+    devtools.DebuggerAgent.sendCommand_(cmd);
+    RemoteDebuggerAgent.processDebugCommands();
+};
+
+
+/**
+ * Handles current profiler status.
+ * @param {number} modules List of active (started) modules.
+ */
+devtools.ProfilerAgent.prototype._didGetActiveProfilerModules = function(modules)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    var profModuleNone = profModules.PROFILER_MODULE_NONE;
+    if (this._forceGetLogLines || (modules !== profModuleNone && this._activeProfilerModules === profModuleNone)) {
+        this._forceGetLogLines = false;
+        // Start to query log data.
+        this._getNextLogLines(true);
+    }
+    this._activeProfilerModules = modules;
+    // Update buttons.
+    WebInspector.setRecordingProfile(modules & profModules.PROFILER_MODULE_CPU);
+};
+
+
+/**
+ * Handles a portion of a profiler log retrieved by getLogLines call.
+ * @param {number} pos Current position in log.
+ * @param {string} log A portion of profiler log.
+ */
+devtools.ProfilerAgent.prototype._didGetLogLines = function(pos, log)
+{
+    this._logPosition = pos;
+    if (log.length > 0)
+        this._profilerProcessor.processLogChunk(log);
+    else {
+        // Allow re-reading from the last position.
+        this._lastRequestedLogPosition = this._logPosition - 1;
+        if (this._activeProfilerModules === devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE)
+            // No new data and profiling is stopped---suspend log reading.
+            return;
+    }
+    this._getNextLogLines();
+};
+
+/* ProfilerProcessor.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Profiler processor is used to process log file produced
+ * by V8 and produce an internal profile representation which is used
+ * for building profile views in "Profiles" tab.
+ */
+
+
+/**
+ * Creates a Profile View builder object compatible with WebKit Profiler UI.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+devtools.profiler.WebKitViewBuilder = function(samplingRate)
+{
+    devtools.profiler.ViewBuilder.call(this, samplingRate);
+};
+devtools.profiler.WebKitViewBuilder.prototype.__proto__ = devtools.profiler.ViewBuilder.prototype;
+
+
+/**
+ * @override
+ */
+devtools.profiler.WebKitViewBuilder.prototype.createViewNode = function(funcName, totalTime, selfTime, head)
+{
+    return new devtools.profiler.WebKitViewNode(funcName, totalTime, selfTime, head);
+};
+
+
+/**
+ * Constructs a Profile View node object for displaying in WebKit Profiler UI.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ *     corresponding function and its descendants (not that depending on
+ *     profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ *     corresponding function only.
+ * @param {devtools.profiler.ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+devtools.profiler.WebKitViewNode = function(internalFuncName, totalTime, selfTime, head)
+{
+    devtools.profiler.ProfileView.Node.call(this, internalFuncName, totalTime, selfTime, head);
+    this.initFuncInfo_();
+    this.callUID = internalFuncName;
+};
+devtools.profiler.WebKitViewNode.prototype.__proto__ = devtools.profiler.ProfileView.Node.prototype;
+
+
+/**
+ * RegEx for stripping V8's prefixes of compiled functions.
+ */
+devtools.profiler.WebKitViewNode.FUNC_NAME_STRIP_RE = /^(?:LazyCompile|Function|Callback): (.*)$/;
+
+
+/**
+ * RegEx for extracting script source URL and line number.
+ */
+devtools.profiler.WebKitViewNode.FUNC_NAME_PARSE_RE = /^((?:get | set )?[^ ]+) (.*):(\d+)( \{\d+\})?$/;
+
+
+/**
+ * Inits "functionName", "url", and "lineNumber" fields using "internalFuncName"
+ * field.
+ * @private
+ */
+devtools.profiler.WebKitViewNode.prototype.initFuncInfo_ = function()
+{
+    var nodeAlias = devtools.profiler.WebKitViewNode;
+    this.functionName = this.internalFuncName;
+
+    var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName);
+    if (strippedName)
+        this.functionName = strippedName[1];
+
+    var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName);
+    if (parsedName) {
+        this.functionName = parsedName[1];
+        if (parsedName[4])
+            this.functionName += parsedName[4];
+        this.url = parsedName[2];
+        this.lineNumber = parsedName[3];
+    } else {
+        this.url = '';
+        this.lineNumber = 0;
+    }
+};
+
+
+/**
+ * Ancestor of a profile object that leaves out only JS-related functions.
+ * @constructor
+ */
+devtools.profiler.JsProfile = function()
+{
+    devtools.profiler.Profile.call(this);
+};
+devtools.profiler.JsProfile.prototype.__proto__ = devtools.profiler.Profile.prototype;
+
+
+/**
+ * RegExp that leaves only non-native JS functions.
+ * @type {RegExp}
+ */
+devtools.profiler.JsProfile.JS_NON_NATIVE_RE = new RegExp(
+      "^" +
+        "(?:Callback:)|" +
+        "(?:Script: (?!native))|" +
+        "(?:(?:LazyCompile|Function): [^ ]*(?: (?!native )[^ ]+:\\d+)?$)");
+
+
+/**
+ * @override
+ */
+devtools.profiler.JsProfile.prototype.skipThisFunction = function(name)
+{
+    return !devtools.profiler.JsProfile.JS_NON_NATIVE_RE.test(name);
+};
+
+
+/**
+ * Profiler processor. Consumes profiler log and builds profile views.
+ * FIXME: change field naming style to use trailing underscore.
+ *
+ * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
+ *     that receives a new processed profile.
+ * @constructor
+ */
+devtools.profiler.Processor = function()
+{
+    var dispatches = {
+        "code-creation": {
+            parsers: [null, this.createAddressParser("code"), parseInt, null],
+            processor: this.processCodeCreation_, backrefs: true,
+            needsProfile: true },
+        "code-move": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("code-move-to")],
+            processor: this.processCodeMove_, backrefs: true,
+            needsProfile: true },
+        "code-delete": { parsers: [this.createAddressParser("code")],
+            processor: this.processCodeDelete_, backrefs: true,
+            needsProfile: true },
+        "function-creation": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("function-obj")],
+            processor: this.processFunctionCreation_, backrefs: true },
+        "function-move": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("code-move-to")],
+            processor: this.processFunctionMove_, backrefs: true },
+        "function-delete": { parsers: [this.createAddressParser("code")],
+            processor: this.processFunctionDelete_, backrefs: true },
+        "tick": { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("stack"), parseInt, "var-args"],
+            processor: this.processTick_, backrefs: true, needProfile: true },
+        "profiler": { parsers: [null, "var-args"],
+            processor: this.processProfiler_, needsProfile: false },
+        "heap-sample-begin": { parsers: [null, null, parseInt],
+            processor: this.processHeapSampleBegin_ },
+        "heap-sample-stats": { parsers: [null, null, parseInt, parseInt],
+            processor: this.processHeapSampleStats_ },
+        "heap-sample-item": { parsers: [null, parseInt, parseInt],
+            processor: this.processHeapSampleItem_ },
+        "heap-js-cons-item": { parsers: [null, parseInt, parseInt],
+            processor: this.processHeapJsConsItem_ },
+        "heap-js-ret-item": { parsers: [null, "var-args"],
+            processor: this.processHeapJsRetItem_ },
+        "heap-sample-end": { parsers: [null, null],
+            processor: this.processHeapSampleEnd_ },
+        // Not used in DevTools Profiler.
+        "shared-library": null,
+        // Obsolete row types.
+        "code-allocate": null,
+        "begin-code-region": null,
+        "end-code-region": null};
+
+    if (devtools.profiler.Profile.VERSION === 2) {
+        dispatches["tick"] =  { parsers: [this.createAddressParser("code"),
+            this.createAddressParser("stack"),
+            this.createAddressParser("func"), parseInt, "var-args"],
+            processor: this.processTickV2_, backrefs: true };
+    }
+
+    devtools.profiler.LogReader.call(this, dispatches);
+
+    /**
+     * Callback that is called when a new profile is encountered in the log.
+     * @type {function()}
+     */
+    this.startedProfileProcessing_ = null;
+
+    /**
+     * Callback that is called periodically to display processing status.
+     * @type {function()}
+     */
+    this.profileProcessingStatus_ = null;
+
+    /**
+     * Callback that is called when a profile has been processed and is ready
+     * to be shown.
+     * @type {function(devtools.profiler.ProfileView)}
+     */
+    this.finishedProfileProcessing_ = null;
+
+    /**
+     * The current profile.
+     * @type {devtools.profiler.JsProfile}
+     */
+    this.currentProfile_ = null;
+
+    /**
+     * Builder of profile views. Created during "profiler,begin" event processing.
+     * @type {devtools.profiler.WebKitViewBuilder}
+     */
+    this.viewBuilder_ = null;
+
+    /**
+     * Next profile id.
+     * @type {number}
+     */
+    this.profileId_ = 1;
+
+    /**
+     * Counter for processed ticks.
+     * @type {number}
+     */
+    this.ticksCount_ = 0;
+
+    /**
+     * Interval id for updating processing status.
+     * @type {number}
+     */
+    this.processingInterval_ = null;
+
+    /**
+     * The current heap snapshot.
+     * @type {string}
+     */
+    this.currentHeapSnapshot_ = null;
+
+    /**
+     * Next heap snapshot id.
+     * @type {number}
+     */
+    this.heapSnapshotId_ = 1;
+};
+devtools.profiler.Processor.prototype.__proto__ = devtools.profiler.LogReader.prototype;
+
+
+/**
+ * @override
+ */
+devtools.profiler.Processor.prototype.printError = function(str)
+{
+    debugPrint(str);
+};
+
+
+/**
+ * @override
+ */
+devtools.profiler.Processor.prototype.skipDispatch = function(dispatch)
+{
+    return dispatch.needsProfile && this.currentProfile_ === null;
+};
+
+
+/**
+ * Sets profile processing callbacks.
+ *
+ * @param {function()} started Started processing callback.
+ * @param {function(devtools.profiler.ProfileView)} finished Finished
+ *     processing callback.
+ */
+devtools.profiler.Processor.prototype.setCallbacks = function(started, processing, finished)
+{
+    this.startedProfileProcessing_ = started;
+    this.profileProcessingStatus_ = processing;
+    this.finishedProfileProcessing_ = finished;
+};
+
+
+/**
+ * An address for the fake "(program)" entry. WebKit's visualisation
+ * has assumptions on how the top of the call tree should look like,
+ * and we need to add a fake entry as the topmost function. This
+ * address is chosen because it's the end address of the first memory
+ * page, which is never used for code or data, but only as a guard
+ * page for catching AV errors.
+ *
+ * @type {number}
+ */
+devtools.profiler.Processor.PROGRAM_ENTRY = 0xffff;
+/**
+ * @type {string}
+ */
+devtools.profiler.Processor.PROGRAM_ENTRY_STR = "0xffff";
+
+
+/**
+ * Sets new profile callback.
+ * @param {function(devtools.profiler.ProfileView)} callback Callback function.
+ */
+devtools.profiler.Processor.prototype.setNewProfileCallback = function(callback)
+{
+    this.newProfileCallback_ = callback;
+};
+
+
+devtools.profiler.Processor.prototype.processProfiler_ = function(state, params)
+{
+    switch (state) {
+        case "resume":
+            if (this.currentProfile_ === null) {
+                this.currentProfile_ = new devtools.profiler.JsProfile();
+                // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+                this.currentProfile_.addCode("Function", "(program)", devtools.profiler.Processor.PROGRAM_ENTRY, 1);
+                if (this.startedProfileProcessing_)
+                    this.startedProfileProcessing_();
+                this.ticksCount_ = 0;
+                var self = this;
+                if (this.profileProcessingStatus_) {
+                    this.processingInterval_ = window.setInterval(
+                        function() { self.profileProcessingStatus_(self.ticksCount_); },
+                        1000);
+                }
+            }
+            break;
+        case "pause":
+            if (this.currentProfile_ !== null) {
+                window.clearInterval(this.processingInterval_);
+                this.processingInterval_ = null;
+                if (this.finishedProfileProcessing_)
+                    this.finishedProfileProcessing_(this.createProfileForView());
+                this.currentProfile_ = null;
+            }
+            break;
+        case "begin":
+            var samplingRate = NaN;
+            if (params.length > 0)
+                samplingRate = parseInt(params[0]);
+            if (isNaN(samplingRate))
+                samplingRate = 1;
+            this.viewBuilder_ = new devtools.profiler.WebKitViewBuilder(samplingRate);
+            break;
+        // These events are valid but aren't used.
+        case "compression":
+        case "end": break;
+        default:
+            throw new Error("unknown profiler state: " + state);
+    }
+};
+
+
+devtools.profiler.Processor.prototype.processCodeCreation_ = function(type, start, size, name)
+{
+    this.currentProfile_.addCode(this.expandAlias(type), name, start, size);
+};
+
+
+devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to)
+{
+    this.currentProfile_.moveCode(from, to);
+};
+
+
+devtools.profiler.Processor.prototype.processCodeDelete_ = function(start)
+{
+    this.currentProfile_.deleteCode(start);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionCreation_ = function(functionAddr, codeAddr)
+{
+    this.currentProfile_.addCodeAlias(functionAddr, codeAddr);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionMove_ = function(from, to)
+{
+    this.currentProfile_.safeMoveDynamicCode(from, to);
+};
+
+
+devtools.profiler.Processor.prototype.processFunctionDelete_ = function(start)
+{
+    this.currentProfile_.safeDeleteDynamicCode(start);
+};
+
+
+// TODO(mnaganov): Remove after next V8 roll.
+devtools.profiler.Processor.prototype.processTick_ = function(pc, sp, vmState, stack)
+{
+    // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+    stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
+    this.currentProfile_.recordTick(this.processStack(pc, stack));
+    this.ticksCount_++;
+};
+
+
+devtools.profiler.Processor.prototype.processTickV2_ = function(pc, sp, func, vmState, stack)
+{
+    // see the comment for devtools.profiler.Processor.PROGRAM_ENTRY
+    stack.push(devtools.profiler.Processor.PROGRAM_ENTRY_STR);
+
+
+    if (func) {
+        var funcEntry = this.currentProfile_.findEntry(func);
+        if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction())
+            func = 0;
+        else {
+            var currEntry = this.currentProfile_.findEntry(pc);
+            if (!currEntry || !currEntry.isJSFunction || currEntry.isJSFunction()) {
+                func = 0;
+            }
+        }
+    }
+
+    this.currentProfile_.recordTick(this.processStack(pc, func, stack));
+    this.ticksCount_++;
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleBegin_ = function(space, state, ticks)
+{
+    if (space !== "Heap") return;
+    this.currentHeapSnapshot_ = {
+        number: this.heapSnapshotId_++,
+        entries: {},
+        clusters: {},
+        lowlevels: {},
+        ticks: ticks
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleStats_ = function(space, state, capacity, used)
+{
+    if (space !== "Heap") return;
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleItem_ = function(item, number, size)
+{
+    if (!this.currentHeapSnapshot_) return;
+    this.currentHeapSnapshot_.lowlevels[item] = {
+        type: item, count: number, size: size
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapJsConsItem_ = function(item, number, size)
+{
+    if (!this.currentHeapSnapshot_) return;
+    this.currentHeapSnapshot_.entries[item] = {
+        cons: item, count: number, size: size, retainers: {}
+    };
+};
+
+
+devtools.profiler.Processor.prototype.processHeapJsRetItem_ = function(item, retainersArray)
+{
+    if (!this.currentHeapSnapshot_) return;
+    var rawRetainers = {};
+    for (var i = 0, n = retainersArray.length; i < n; ++i) {
+        var entry = retainersArray[i].split(";");
+        rawRetainers[entry[0]] = parseInt(entry[1], 10);
+    }
+
+    function mergeRetainers(entry) {
+        for (var rawRetainer in rawRetainers) {
+            var consName = rawRetainer.indexOf(":") !== -1 ? rawRetainer.split(":")[0] : rawRetainer;
+            if (!(consName in entry.retainers))
+                entry.retainers[consName] = { cons: consName, count: 0, clusters: {} };
+            var retainer = entry.retainers[consName];
+            retainer.count += rawRetainers[rawRetainer];
+            if (consName !== rawRetainer)
+                retainer.clusters[rawRetainer] = true;
+        }
+    }
+
+    if (item.indexOf(":") !== -1) {
+      // Array, Function, or Object instances cluster case.
+      if (!(item in this.currentHeapSnapshot_.clusters)) {
+          this.currentHeapSnapshot_.clusters[item] = {
+              cons: item, retainers: {}
+          };
+      }
+      mergeRetainers(this.currentHeapSnapshot_.clusters[item]);
+      item = item.split(":")[0];
+    }
+    mergeRetainers(this.currentHeapSnapshot_.entries[item]);
+};
+
+
+devtools.profiler.Processor.prototype.processHeapSampleEnd_ = function(space, state)
+{
+    if (space !== "Heap") return;
+    var snapshot = this.currentHeapSnapshot_;
+    this.currentHeapSnapshot_ = null;
+    WebInspector.panels.profiles.addSnapshot(snapshot);
+};
+
+
+/**
+ * Creates a profile for further displaying in ProfileView.
+ */
+devtools.profiler.Processor.prototype.createProfileForView = function()
+{
+    var profile = this.viewBuilder_.buildView(this.currentProfile_.getTopDownProfile());
+    profile.uid = this.profileId_++;
+    profile.title = UserInitiatedProfileName + "." + profile.uid;
+    return profile;
+};
+
+/* HeapProfilerPanel.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Heap profiler panel implementation.
+ */
+
+WebInspector.ProfilesPanel.prototype.addSnapshot = function(snapshot) {
+    snapshot.title = WebInspector.UIString("Snapshot %d", snapshot.number);
+    snapshot.typeId = WebInspector.HeapSnapshotProfileType.TypeId;
+
+    var snapshots = WebInspector.HeapSnapshotProfileType.snapshots;
+    snapshots.push(snapshot);
+
+    snapshot.listIndex = snapshots.length - 1;
+
+    if (WebInspector.CPUProfile)
+        this.addProfileHeader(WebInspector.HeapSnapshotProfileType.TypeId, snapshot);
+    else
+        this.addProfileHeader(snapshot);
+
+    this.dispatchEventToListeners("snapshot added");
+}
+
+
+WebInspector.HeapSnapshotView = function(parent, profile)
+{
+    WebInspector.View.call(this);
+
+    this.element.addStyleClass("heap-snapshot-view");
+
+    this.parent = parent;
+    this.parent.addEventListener("snapshot added", this._updateBaseOptions, this);
+
+    this.showCountAsPercent = false;
+    this.showSizeAsPercent = false;
+    this.showCountDeltaAsPercent = false;
+    this.showSizeDeltaAsPercent = false;
+
+    this.categories = {
+        code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),
+        data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects"), "rgb(47,102,236)")
+    };
+
+    var summaryContainer = document.createElement("div");
+    summaryContainer.id = "heap-snapshot-summary-container";
+
+    this.countsSummaryBar = new WebInspector.SummaryBar(this.categories);
+    this.countsSummaryBar.element.className = "heap-snapshot-summary";
+    this.countsSummaryBar.calculator = new WebInspector.HeapSummaryCountCalculator();
+    var countsLabel = document.createElement("div");
+    countsLabel.className = "heap-snapshot-summary-label";
+    countsLabel.textContent = WebInspector.UIString("Count");
+    this.countsSummaryBar.element.appendChild(countsLabel);
+    summaryContainer.appendChild(this.countsSummaryBar.element);
+
+    this.sizesSummaryBar = new WebInspector.SummaryBar(this.categories);
+    this.sizesSummaryBar.element.className = "heap-snapshot-summary";
+    this.sizesSummaryBar.calculator = new WebInspector.HeapSummarySizeCalculator();
+    var sizesLabel = document.createElement("label");
+    sizesLabel.className = "heap-snapshot-summary-label";
+    sizesLabel.textContent = WebInspector.UIString("Size");
+    this.sizesSummaryBar.element.appendChild(sizesLabel);
+    summaryContainer.appendChild(this.sizesSummaryBar.element);
+
+    this.element.appendChild(summaryContainer);
+
+    var columns = { "cons": { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },
+                    "count": { title: WebInspector.UIString("Count"), width: "54px", sortable: true },
+                    "size": { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },
+                    "countDelta": { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },
+                    "sizeDelta": { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true } };
+
+    this.dataGrid = new WebInspector.DataGrid(columns);
+    this.dataGrid.addEventListener("sorting changed", this._sortData, this);
+    this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);
+    this.element.appendChild(this.dataGrid.element);
+
+    this.profile = profile;
+
+    this.baseSelectElement = document.createElement("select");
+    this.baseSelectElement.className = "status-bar-item";
+    this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);
+    this._updateBaseOptions();
+    if (this.profile.listIndex > 0)
+        this.baseSelectElement.selectedIndex = this.profile.listIndex - 1;
+    else
+        this.baseSelectElement.selectedIndex = this.profile.listIndex;
+    this._resetDataGridList();
+
+    this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");
+    this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);
+
+    this.refresh();
+
+    this._updatePercentButton();
+};
+
+WebInspector.HeapSnapshotView.prototype = {
+
+    get statusBarItems()
+    {
+        return [this.baseSelectElement, this.percentButton.element];
+    },
+
+    get profile()
+    {
+        return this._profile;
+    },
+
+    set profile(profile)
+    {
+        this._profile = profile;
+    },
+
+    show: function(parentElement)
+    {
+        WebInspector.View.prototype.show.call(this, parentElement);
+        this.dataGrid.updateWidths();
+    },
+
+    hide: function()
+    {
+        WebInspector.View.prototype.hide.call(this);
+        this._currentSearchResultIndex = -1;
+    },
+
+    resize: function()
+    {
+        if (this.dataGrid)
+            this.dataGrid.updateWidths();
+    },
+
+    refresh: function()
+    {
+        this.dataGrid.removeChildren();
+
+        var children = this.snapshotDataGridList.children;
+        var count = children.length;
+        for (var index = 0; index < count; ++index)
+            this.dataGrid.appendChild(children[index]);
+
+        this._updateSummaryGraph();
+    },
+
+    refreshShowAsPercents: function()
+    {
+        this._updatePercentButton();
+        this.refreshVisibleData();
+    },
+
+    _deleteSearchMatchedFlags: function(node)
+    {
+        delete node._searchMatchedConsColumn;
+        delete node._searchMatchedCountColumn;
+        delete node._searchMatchedSizeColumn;
+        delete node._searchMatchedCountDeltaColumn;
+        delete node._searchMatchedSizeDeltaColumn;
+    },
+
+    searchCanceled: function()
+    {
+        if (this._searchResults) {
+            for (var i = 0; i < this._searchResults.length; ++i) {
+                var profileNode = this._searchResults[i].profileNode;
+                this._deleteSearchMatchedFlags(profileNode);
+                profileNode.refresh();
+            }
+        }
+
+        delete this._searchFinishedCallback;
+        this._currentSearchResultIndex = -1;
+        this._searchResults = [];
+    },
+
+    performSearch: function(query, finishedCallback)
+    {
+        // Call searchCanceled since it will reset everything we need before doing a new search.
+        this.searchCanceled();
+
+        query = query.trimWhitespace();
+
+        if (!query.length)
+            return;
+
+        this._searchFinishedCallback = finishedCallback;
+
+        var helper = WebInspector.HeapSnapshotView.SearchHelper;
+
+        var operationAndNumber = helper.parseOperationAndNumber(query);
+        var operation = operationAndNumber[0];
+        var queryNumber = operationAndNumber[1];
+
+        var percentUnits = helper.percents.test(query);
+        var megaBytesUnits = helper.megaBytes.test(query);
+        var kiloBytesUnits = helper.kiloBytes.test(query);
+        var bytesUnits = helper.bytes.test(query);
+
+        var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));
+
+        function matchesQuery(heapSnapshotDataGridNode)
+        {
+            WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);
+
+            if (percentUnits) {
+                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);
+            } else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {
+                heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);
+            } else {
+                heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);
+            }
+
+            if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))
+                heapSnapshotDataGridNode._searchMatchedConsColumn = true;
+
+            if (heapSnapshotDataGridNode._searchMatchedConsColumn ||
+                heapSnapshotDataGridNode._searchMatchedCountColumn ||
+                heapSnapshotDataGridNode._searchMatchedSizeColumn ||
+                heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||
+                heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {
+                heapSnapshotDataGridNode.refresh();
+                return true;
+            }
+
+            return false;
+        }
+
+        var current = this.snapshotDataGridList.children[0];
+        var depth = 0;
+        var info = {};
+
+        // The second and subsequent levels of heap snapshot nodes represent retainers,
+        // so recursive expansion will be infinite, since a graph is being traversed.
+        // So default to a recursion cap of 2 levels.
+        var maxDepth = 2;
+
+        while (current) {
+            if (matchesQuery(current))
+                this._searchResults.push({ profileNode: current });
+            current = current.traverseNextNode(false, null, (depth >= maxDepth), info);
+            depth += info.depthChange;
+        }
+
+        finishedCallback(this, this._searchResults.length);
+    },
+
+    jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,
+    jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,
+    jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,
+    jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,
+    showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,
+    showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,
+    _jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,
+
+    refreshVisibleData: function()
+    {
+        var child = this.dataGrid.children[0];
+        while (child) {
+            child.refresh();
+            child = child.traverseNextNode(false, null, true);
+        }
+        this._updateSummaryGraph();
+    },
+
+    _changeBase: function() {
+        if (this.baseSnapshot === WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex])
+            return;
+
+        this._resetDataGridList();
+        this.refresh();
+
+        if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)
+            return;
+
+        // The current search needs to be performed again. First negate out previous match
+        // count by calling the search finished callback with a negative number of matches.
+        // Then perform the search again with the same query and callback.
+        this._searchFinishedCallback(this, -this._searchResults.length);
+        this.performSearch(this.currentQuery, this._searchFinishedCallback);
+    },
+
+    _createSnapshotDataGridList: function()
+    {
+        if (this._snapshotDataGridList)
+          delete this._snapshotDataGridList;
+
+        this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);
+        return this._snapshotDataGridList;
+    },
+
+    _mouseDownInDataGrid: function(event)
+    {
+        if (event.detail < 2)
+            return;
+
+        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
+        if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))
+            return;
+
+        if (cell.hasStyleClass("count-column"))
+            this.showCountAsPercent = !this.showCountAsPercent;
+        else if (cell.hasStyleClass("size-column"))
+            this.showSizeAsPercent = !this.showSizeAsPercent;
+        else if (cell.hasStyleClass("countDelta-column"))
+            this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;
+        else if (cell.hasStyleClass("sizeDelta-column"))
+            this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;
+
+        this.refreshShowAsPercents();
+
+        event.preventDefault();
+        event.stopPropagation();
+    },
+
+    get _isShowingAsPercent()
+    {
+        return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;
+    },
+
+    _percentClicked: function(event)
+    {
+        var currentState = this._isShowingAsPercent;
+        this.showCountAsPercent = !currentState;
+        this.showSizeAsPercent = !currentState;
+        this.showCountDeltaAsPercent = !currentState;
+        this.showSizeDeltaAsPercent = !currentState;
+        this.refreshShowAsPercents();
+    },
+
+    _resetDataGridList: function()
+    {
+        this.baseSnapshot = WebInspector.HeapSnapshotProfileType.snapshots[this.baseSelectElement.selectedIndex];
+        var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);
+        if (this.snapshotDataGridList)
+            lastComparator = this.snapshotDataGridList.lastComparator;
+        this.snapshotDataGridList = this._createSnapshotDataGridList();
+        this.snapshotDataGridList.sort(lastComparator, true);
+    },
+
+    _sortData: function()
+    {
+        var sortAscending = this.dataGrid.sortOrder === "ascending";
+        var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;
+        var sortProperty = {
+                "cons": ["constructorName", null],
+                "count": ["count", null],
+                "size": ["size", "count"],
+                "countDelta": this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],
+                "sizeDelta": this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]
+        }[sortColumnIdentifier];
+
+        this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));
+
+        this.refresh();
+    },
+
+    _updateBaseOptions: function()
+    {
+        var list = WebInspector.HeapSnapshotProfileType.snapshots;
+        // We're assuming that snapshots can only be added.
+        if (this.baseSelectElement.length === list.length)
+            return;
+
+        for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {
+            var baseOption = document.createElement("option");
+            baseOption.label = WebInspector.UIString("Compared to %s", list[i].title);
+            this.baseSelectElement.appendChild(baseOption);
+        }
+    },
+
+    _updatePercentButton: function()
+    {
+        if (this._isShowingAsPercent) {
+            this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");
+            this.percentButton.toggled = true;
+        } else {
+            this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");
+            this.percentButton.toggled = false;
+        }
+    },
+
+    _updateSummaryGraph: function()
+    {
+        this.countsSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
+        this.countsSummaryBar.update(this.profile.lowlevels);
+
+        this.sizesSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;
+        this.sizesSummaryBar.update(this.profile.lowlevels);
+    }
+};
+
+WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.HeapSnapshotView.SearchHelper = {
+    // In comparators, we assume that a value from a node is passed as the first parameter.
+    operations: { LESS: function (a, b) { return a !== null && a < b; },
+                  LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },
+                  EQUAL: function (a, b) { return a !== null && a === b; },
+                  GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },
+                  GREATER: function (a, b) { return a !== null && a > b; } },
+
+    operationParsers: { LESS: /^<(\d+)/,
+                        LESS_OR_EQUAL: /^<=(\d+)/,
+                        GREATER_OR_EQUAL: /^>=(\d+)/,
+                        GREATER: /^>(\d+)/ },
+
+    parseOperationAndNumber: function(query)
+    {
+        var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;
+        var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;
+        for (var operation in parsers) {
+            var match = query.match(parsers[operation]);
+            if (match !== null)
+                return [operations[operation], parseFloat(match[1])];
+        }
+        return [operations.EQUAL, parseFloat(query)];
+    },
+
+    percents: /%$/,
+
+    megaBytes: /MB$/i,
+
+    kiloBytes: /KB$/i,
+
+    bytes: /B$/i
+}
+
+WebInspector.HeapSummaryCalculator = function(lowLevelField)
+{
+    this.total = 1;
+    this.lowLevelField = lowLevelField;
+}
+
+WebInspector.HeapSummaryCalculator.prototype = {
+    computeSummaryValues: function(lowLevels)
+    {
+        var highLevels = {data: 0, code: 0};
+        this.total = 0;
+        for (var item in lowLevels) {
+            var highItem = this._highFromLow(item);
+            if (highItem) {
+                var value = lowLevels[item][this.lowLevelField];
+                highLevels[highItem] += value;
+                this.total += value;
+            }
+        }
+        var result = {categoryValues: highLevels};
+        if (!this.showAsPercent)
+            result.total = this.total;
+        return result;
+    },
+
+    formatValue: function(value)
+    {
+        if (this.showAsPercent)
+            return WebInspector.UIString("%.2f%%", value / this.total * 100.0);
+        else
+            return this._valueToString(value);
+    },
+
+    get showAsPercent()
+    {
+        return this._showAsPercent;
+    },
+
+    set showAsPercent(x)
+    {
+        this._showAsPercent = x;
+    }
+}
+
+WebInspector.HeapSummaryCountCalculator = function()
+{
+    WebInspector.HeapSummaryCalculator.call(this, "count");
+}
+
+WebInspector.HeapSummaryCountCalculator.prototype = {
+    _highFromLow: function(type) {
+        if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
+        if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/)) return "data";
+        return null;
+    },
+
+    _valueToString: function(value) {
+        return value.toString();
+    }
+}
+
+WebInspector.HeapSummaryCountCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
+
+WebInspector.HeapSummarySizeCalculator = function()
+{
+    WebInspector.HeapSummaryCalculator.call(this, "size");
+}
+
+WebInspector.HeapSummarySizeCalculator.prototype = {
+    _highFromLow: function(type) {
+        if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";
+        if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/)) return "data";
+        return null;
+    },
+
+    _valueToString: Number.bytesToString
+}
+
+WebInspector.HeapSummarySizeCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;
+
+WebInspector.HeapSnapshotSidebarTreeElement = function(snapshot)
+{
+    this.profile = snapshot;
+
+    WebInspector.SidebarTreeElement.call(this, "heap-snapshot-sidebar-tree-item", "", "", snapshot, false);
+
+    this.refreshTitles();
+};
+
+WebInspector.HeapSnapshotSidebarTreeElement.prototype = {
+    get mainTitle()
+    {
+        if (this._mainTitle)
+            return this._mainTitle;
+        return this.profile.title;
+    },
+
+    set mainTitle(x)
+    {
+        this._mainTitle = x;
+        this.refreshTitles();
+    }
+};
+
+WebInspector.HeapSnapshotSidebarTreeElement.prototype.__proto__ = WebInspector.ProfileSidebarTreeElement.prototype;
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)
+{
+    this.tree = owningTree;
+
+    WebInspector.DataGridNode.call(this, null, this._hasRetainers);
+
+    this.addEventListener("populate", this._populate, this);
+};
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {
+    isEmptySet: function(set)
+    {
+        for (var x in set)
+            return false;
+        return true;
+    },
+
+    get _hasRetainers()
+    {
+        return !this.isEmptySet(this.retainers);
+    },
+
+    get _parent()
+    {
+        // For top-level nodes, return owning tree as a parent, not data grid.
+        return this.parent !== this.dataGrid ? this.parent : this.tree;
+    },
+
+    _populate: function(event)
+    {
+        var self = this;
+        this.produceDiff(this.baseRetainers, this.retainers, function(baseItem, snapshotItem) {
+            self.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(self.snapshotView, baseItem, snapshotItem, self.tree));
+        });
+
+        if (this._parent) {
+            var currentComparator = this._parent.lastComparator;
+            if (currentComparator)
+                this.sort(currentComparator, true);
+        }
+
+        this.removeEventListener("populate", this._populate, this);
+    },
+
+    produceDiff: function(baseEntries, currentEntries, callback)
+    {
+        for (var item in currentEntries)
+            callback(baseEntries[item], currentEntries[item]);
+
+        for (item in baseEntries) {
+            if (!(item in currentEntries))
+                callback(baseEntries[item], null);
+        }
+    },
+
+    sort: function(comparator, force) {
+        if (!force && this.lastComparator === comparator)
+            return;
+
+        this.children.sort(comparator);
+        var childCount = this.children.length;
+        for (var childIndex = 0; childIndex < childCount; ++childIndex)
+            this.children[childIndex]._recalculateSiblings(childIndex);
+        for (var i = 0; i < this.children.length; ++i) {
+            var child = this.children[i];
+            if (!force && (!child.expanded || child.lastComparator === comparator))
+                continue;
+            child.sort(comparator, force);
+        }
+        this.lastComparator = comparator;
+    },
+
+    signForDelta: function(delta) {
+        if (delta === 0)
+            return "";
+        if (delta > 0)
+            return "+";
+        else
+            // Math minus sign, same width as plus.
+            return "\u2212";
+    },
+
+    showDeltaAsPercent: function(value) {
+        if (value === Number.POSITIVE_INFINITY)
+            return WebInspector.UIString("new");
+        else if (value === Number.NEGATIVE_INFINITY)
+            return WebInspector.UIString("deleted");
+        if (value > 1000.0)
+            return WebInspector.UIString("%s >1000%%", this.signForDelta(value));
+        return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));
+    },
+
+    getTotalCount: function() {
+        if (!this._count) {
+            this._count = 0;
+            for (var i = 0, n = this.children.length; i < n; ++i)
+                this._count += this.children[i].count;
+        }
+        return this._count;
+    },
+
+    getTotalSize: function() {
+        if (!this._size) {
+            this._size = 0;
+            for (var i = 0, n = this.children.length; i < n; ++i)
+                this._size += this.children[i].size;
+        }
+        return this._size;
+    },
+
+    get countPercent()
+    {
+        return this.count / this._parent.getTotalCount() * 100.0;
+    },
+
+    get sizePercent()
+    {
+        return this.size / this._parent.getTotalSize() * 100.0;
+    },
+
+    get countDeltaPercent()
+    {
+        if (this.baseCount > 0) {
+            if (this.count > 0)
+                return this.countDelta / this.baseCount * 100.0;
+            else
+                return Number.NEGATIVE_INFINITY;
+        } else
+            return Number.POSITIVE_INFINITY;
+    },
+
+    get sizeDeltaPercent()
+    {
+        if (this.baseSize > 0) {
+            if (this.size > 0)
+                return this.sizeDelta / this.baseSize * 100.0;
+            else
+                return Number.NEGATIVE_INFINITY;
+        } else
+            return Number.POSITIVE_INFINITY;
+    },
+
+    get data()
+    {
+        var data = {};
+
+        data["cons"] = this.constructorName;
+
+        if (this.snapshotView.showCountAsPercent)
+            data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);
+        else
+            data["count"] = this.count;
+
+        if (this.size !== null) {
+            if (this.snapshotView.showSizeAsPercent)
+                data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);
+            else
+                data["size"] = Number.bytesToString(this.size);
+        } else
+            data["size"] = "";
+
+        if (this.snapshotView.showCountDeltaAsPercent)
+            data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);
+        else
+            data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));
+
+        if (this.sizeDelta !== null) {
+            if (this.snapshotView.showSizeDeltaAsPercent)
+                data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);
+            else
+                data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));
+        } else
+            data["sizeDelta"] = "";
+
+        return data;
+    },
+
+    createCell: function(columnIdentifier)
+    {
+        var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);
+
+        if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||
+            (columnIdentifier === "count" && this._searchMatchedCountColumn) ||
+            (columnIdentifier === "size" && this._searchMatchedSizeColumn) ||
+            (columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||
+            (columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))
+            cell.addStyleClass("highlight");
+
+        return cell;
+    }
+};
+
+WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;
+
+WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
+{
+    this.snapshotView = snapshotView;
+
+    if (!snapshotEntry)
+        snapshotEntry = { cons: baseEntry.cons, count: 0, size: 0, retainers: {} };
+    this.constructorName = snapshotEntry.cons;
+    this.count = snapshotEntry.count;
+    this.size = snapshotEntry.size;
+    this.retainers = snapshotEntry.retainers;
+
+    if (!baseEntry)
+        baseEntry = { count: 0, size: 0, retainers: {} };
+    this.baseCount = baseEntry.count;
+    this.countDelta = this.count - this.baseCount;
+    this.baseSize = baseEntry.size;
+    this.sizeDelta = this.size - this.baseSize;
+    this.baseRetainers = baseEntry.retainers;
+
+    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
+};
+
+WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
+
+WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)
+{
+    this.tree = this;
+    this.snapshotView = snapshotView;
+    this.children = [];
+    this.lastComparator = null;
+    this.populateChildren(baseEntries, snapshotEntries);
+};
+
+WebInspector.HeapSnapshotDataGridList.prototype = {
+    appendChild: function(child)
+    {
+        this.insertChild(child, this.children.length);
+    },
+
+    insertChild: function(child, index)
+    {
+        this.children.splice(index, 0, child);
+    },
+
+    removeChildren: function()
+    {
+        this.children = [];
+    },
+
+    populateChildren: function(baseEntries, snapshotEntries)
+    {
+        var self = this;
+        this.produceDiff(baseEntries, snapshotEntries, function(baseItem, snapshotItem) {
+            self.appendChild(new WebInspector.HeapSnapshotDataGridNode(self.snapshotView, baseItem, snapshotItem, self));
+        });
+    },
+
+    produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,
+    sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,
+    getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,
+    getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize
+};
+
+WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];
+
+WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)
+{
+    var propertyHash = property + "#" + property2;
+    var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];
+    if (!comparator) {
+        comparator = function(lhs, rhs) {
+            var l = lhs[property], r = rhs[property];
+            if ((l === null || r === null) && property2 !== null)
+                l = lhs[property2], r = rhs[property2];
+            var result = l < r ? -1 : (l > r ? 1 : 0);
+            return isAscending ? result : -result;
+        };
+        this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;
+    }
+    return comparator;
+};
+
+WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)
+{
+    this.snapshotView = snapshotView;
+
+    if (!snapshotEntry)
+        snapshotEntry = { cons: baseEntry.cons, count: 0, clusters: {} };
+    this.constructorName = snapshotEntry.cons;
+    this.count = snapshotEntry.count;
+    this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);
+
+    if (!baseEntry)
+        baseEntry = { count: 0, clusters: {} };
+    this.baseCount = baseEntry.count;
+    this.countDelta = this.count - this.baseCount;
+    this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);
+
+    this.size = null;
+    this.sizeDelta = null;
+
+    WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);
+}
+
+WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {
+    get sizePercent()
+    {
+        return null;
+    },
+
+    get sizeDeltaPercent()
+    {
+        return null;
+    },
+
+    _calculateRetainers: function(snapshot, clusters) {
+        var retainers = {};
+        if (this.isEmptySet(clusters)) {
+            if (this.constructorName in snapshot.entries)
+                return snapshot.entries[this.constructorName].retainers;
+        } else {
+            // In case when an entry is retained by clusters, we need to gather up the list
+            // of retainers by merging retainers of every cluster.
+            // E.g. having such a tree:
+            //   A
+            //     Object:1  10
+            //       X       3
+            //       Y       4
+            //     Object:2  5
+            //       X       6
+            //
+            // will result in a following retainers list: X 9, Y 4.
+            for (var clusterName in clusters) {
+                if (clusterName in snapshot.clusters) {
+                    var clusterRetainers = snapshot.clusters[clusterName].retainers;
+                    for (var clusterRetainer in clusterRetainers) {
+                        var clusterRetainerEntry = clusterRetainers[clusterRetainer];
+                        if (!(clusterRetainer in retainers))
+                            retainers[clusterRetainer] = { cons: clusterRetainerEntry.cons, count: 0, clusters: {} };
+                        retainers[clusterRetainer].count += clusterRetainerEntry.count;
+                        for (var clusterRetainerCluster in clusterRetainerEntry.clusters)
+                            retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;
+                    }
+                }
+            }
+        }
+        return retainers;
+    }
+};
+
+WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;
+
+
+WebInspector.HeapSnapshotProfileType = function()
+{
+    WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));
+}
+
+WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";
+
+WebInspector.HeapSnapshotProfileType.snapshots = [];
+
+WebInspector.HeapSnapshotProfileType.prototype = {
+    get buttonTooltip()
+    {
+        return WebInspector.UIString("Take heap snapshot.");
+    },
+
+    get buttonStyle()
+    {
+        return "heap-snapshot-status-bar-item status-bar-item";
+    },
+
+    buttonClicked: function()
+    {
+        InspectorBackend.takeHeapSnapshot();
+    },
+
+    get welcomeMessage()
+    {
+        return WebInspector.UIString("Get a heap snapshot by pressing<br>the %s button on the status bar.");
+    },
+
+    createSidebarTreeElementForProfile: function(profile)
+    {
+        var element = new WebInspector.HeapSnapshotSidebarTreeElement(profile);
+        element.small = false;
+        return element;
+    },
+
+    createView: function(profile)
+    {
+        return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);
+    }
+}
+
+WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
+
+
+(function() {
+    var originalCreatePanels = WebInspector._createPanels;
+    WebInspector._createPanels = function() {
+        originalCreatePanels.apply(this, arguments);
+        if (WebInspector.panels.profiles)
+            WebInspector.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());
+    }
+})();
+
+/* DevTools.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @fileoverview Tools is a main class that wires all components of the
+ * DevTools frontend together. It is also responsible for overriding existing
+ * WebInspector functionality while it is getting upstreamed into WebCore.
+ */
+
+/**
+ * Dispatches raw message from the host.
+ * @param {string} remoteName
+ * @prama {string} methodName
+ * @param {string} param1, param2, param3 Arguments to dispatch.
+ */
+devtools$$dispatch = function(remoteName, methodName, param1, param2, param3)
+{
+    remoteName = "Remote" + remoteName.substring(0, remoteName.length - 8);
+    var agent = window[remoteName];
+    if (!agent) {
+        debugPrint("No remote agent '" + remoteName + "' found.");
+        return;
+    }
+    var method = agent[methodName];
+    if (!method) {
+        debugPrint("No method '" + remoteName + "." + methodName + "' found.");
+        return;
+    }
+    method.call(this, param1, param2, param3);
+};
+
+
+devtools.ToolsAgent = function()
+{
+    RemoteToolsAgent.didDispatchOn = WebInspector.Callback.processCallback;
+    RemoteToolsAgent.frameNavigate = this.frameNavigate_.bind(this);
+    RemoteToolsAgent.dispatchOnClient = this.dispatchOnClient_.bind(this);
+    this.debuggerAgent_ = new devtools.DebuggerAgent();
+    this.profilerAgent_ = new devtools.ProfilerAgent();
+};
+
+
+/**
+ * Resets tools agent to its initial state.
+ */
+devtools.ToolsAgent.prototype.reset = function()
+{
+    this.debuggerAgent_.reset();
+};
+
+
+/**
+ * @param {string} script Script exression to be evaluated in the context of the
+ *     inspected page.
+ * @param {function(Object|string, boolean):undefined} opt_callback Function to
+ *     call with the result.
+ */
+devtools.ToolsAgent.prototype.evaluateJavaScript = function(script, opt_callback)
+{
+    InspectorBackend.evaluate(script, opt_callback || function() {});
+};
+
+
+/**
+ * @return {devtools.DebuggerAgent} Debugger agent instance.
+ */
+devtools.ToolsAgent.prototype.getDebuggerAgent = function()
+{
+    return this.debuggerAgent_;
+};
+
+
+/**
+ * @return {devtools.ProfilerAgent} Profiler agent instance.
+ */
+devtools.ToolsAgent.prototype.getProfilerAgent = function()
+{
+    return this.profilerAgent_;
+};
+
+
+/**
+ * @param {string} url Url frame navigated to.
+ * @see tools_agent.h
+ * @private
+ */
+devtools.ToolsAgent.prototype.frameNavigate_ = function(url)
+{
+    this.reset();
+    // Do not reset Profiles panel.
+    var profiles = null;
+    if ("profiles" in WebInspector.panels) {
+        profiles = WebInspector.panels["profiles"];
+        delete WebInspector.panels["profiles"];
+    }
+    WebInspector.reset();
+    if (profiles !== null)
+        WebInspector.panels["profiles"] = profiles;
+};
+
+
+/**
+ * @param {string} message Serialized call to be dispatched on WebInspector.
+ * @private
+ */
+devtools.ToolsAgent.prototype.dispatchOnClient_ = function(message)
+{
+    var args = JSON.parse(message);
+    var methodName = args[0];
+    var parameters = args.slice(1);
+    WebInspector[methodName].apply(WebInspector, parameters);
+};
+
+
+/**
+ * Evaluates js expression.
+ * @param {string} expr
+ */
+devtools.ToolsAgent.prototype.evaluate = function(expr)
+{
+    RemoteToolsAgent.evaluate(expr);
+};
+
+
+/**
+ * Prints string  to the inspector console or shows alert if the console doesn't
+ * exist.
+ * @param {string} text
+ */
+function debugPrint(text) {
+    WebInspector.log(text);
+}
+
+
+/**
+ * Global instance of the tools agent.
+ * @type {devtools.ToolsAgent}
+ */
+devtools.tools = null;
+
+
+var context = {};  // Used by WebCore's inspector routines.
+
+///////////////////////////////////////////////////////////////////////////////
+// Here and below are overrides to existing WebInspector methods only.
+// TODO(pfeldman): Patch WebCore and upstream changes.
+var oldLoaded = WebInspector.loaded;
+WebInspector.loaded = function()
+{
+    devtools.tools = new devtools.ToolsAgent();
+    devtools.tools.reset();
+
+    Preferences.ignoreWhitespace = false;
+    Preferences.samplingCPUProfiler = true;
+    Preferences.heapProfilerPresent = true;
+    Preferences.debuggerAlwaysEnabled = true;
+    Preferences.profilerAlwaysEnabled = true;
+    oldLoaded.call(this);
+
+    InspectorFrontendHost.loaded();
+};
+
+
+/**
+ * This override is necessary for adding script source asynchronously.
+ * @override
+ */
+WebInspector.ScriptView.prototype.setupSourceFrameIfNeeded = function()
+{
+    if (!this._frameNeedsSetup)
+        return;
+
+    this.attach();
+
+    if (this.script.source)
+        this.didResolveScriptSource_();
+    else {
+        var self = this;
+        devtools.tools.getDebuggerAgent().resolveScriptSource(
+            this.script.sourceID,
+            function(source) {
+                self.script.source = source || WebInspector.UIString("<source is not available>");
+                self.didResolveScriptSource_();
+            });
+    }
+};
+
+
+/**
+ * Performs source frame setup when script source is aready resolved.
+ */
+WebInspector.ScriptView.prototype.didResolveScriptSource_ = function()
+{
+    this.sourceFrame.setContent("text/javascript", this.script.source);
+    this._sourceFrameSetup = true;
+    delete this._frameNeedsSetup;
+};
+
+
+/**
+ * @param {string} type Type of the the property value("object" or "function").
+ * @param {string} className Class name of the property value.
+ * @constructor
+ */
+WebInspector.UnresolvedPropertyValue = function(type, className)
+{
+    this.type = type;
+    this.className = className;
+};
+
+
+(function()
+{
+    var oldShow = WebInspector.ScriptsPanel.prototype.show;
+    WebInspector.ScriptsPanel.prototype.show =  function()
+    {
+        devtools.tools.getDebuggerAgent().initUI();
+        this.enableToggleButton.visible = false;
+        oldShow.call(this);
+    };
+})();
+
+
+(function InterceptProfilesPanelEvents()
+{
+    var oldShow = WebInspector.ProfilesPanel.prototype.show;
+    WebInspector.ProfilesPanel.prototype.show = function()
+    {
+        devtools.tools.getProfilerAgent().initializeProfiling();
+        this.enableToggleButton.visible = false;
+        oldShow.call(this);
+        // Show is called on every show event of a panel, so
+        // we only need to intercept it once.
+        WebInspector.ProfilesPanel.prototype.show = oldShow;
+    };
+})();
+
+
+/*
+ * @override
+ * TODO(mnaganov): Restore l10n when it will be agreed that it is needed.
+ */
+WebInspector.UIString = function(string)
+{
+    return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
+};
+
+// Activate window upon node search complete. This will go away once InspectorFrontendClient is landed.
+(function() {
+    var original = WebInspector.searchingForNodeWasDisabled;
+    WebInspector.searchingForNodeWasDisabled = function()
+    {
+        if (this.panels.elements._nodeSearchButton.toggled)
+            InspectorFrontendHost.activateWindow();
+        original.apply(this, arguments);
+    }
+})();
+
+
+// There is no clear way of setting frame title yet. So sniffing main resource
+// load.
+(function OverrideUpdateResource() {
+    var originalUpdateResource = WebInspector.updateResource;
+    WebInspector.updateResource = function(identifier, payload)
+    {
+        originalUpdateResource.call(this, identifier, payload);
+        var resource = this.resources[identifier];
+        if (resource && resource.mainResource && resource.finished)
+            document.title = WebInspector.UIString("Developer Tools - %s", resource.url);
+    };
+})();
+
+
+// Highlight extension content scripts in the scripts list.
+(function () {
+    var original = WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu;
+    WebInspector.ScriptsPanel.prototype._addScriptToFilesMenu = function(script)
+    {
+        var result = original.apply(this, arguments);
+        var debuggerAgent = devtools.tools.getDebuggerAgent();
+        var type = debuggerAgent.getScriptContextType(script.sourceID);
+        var option = script.filesSelectOption;
+        if (type === "injected" && option)
+            option.addStyleClass("injected");
+        return result;
+    };
+})();
+
+
+/** Pending WebKit upstream by apavlov). Fixes iframe vs drag problem. */
+(function()
+{
+    var originalDragStart = WebInspector.elementDragStart;
+    WebInspector.elementDragStart = function(element)
+    {
+        if (element) {
+            var glassPane = document.createElement("div");
+            glassPane.style.cssText = "position:absolute;width:100%;height:100%;opacity:0;z-index:1";
+            glassPane.id = "glass-pane-for-drag";
+            element.parentElement.appendChild(glassPane);
+        }
+
+        originalDragStart.apply(this, arguments);
+    };
+
+    var originalDragEnd = WebInspector.elementDragEnd;
+    WebInspector.elementDragEnd = function()
+    {
+        originalDragEnd.apply(this, arguments);
+
+        var glassPane = document.getElementById("glass-pane-for-drag");
+        if (glassPane)
+            glassPane.parentElement.removeChild(glassPane);
+    };
+})();
+
+
+(function () {
+var orig = InjectedScriptAccess.prototype.getProperties;
+InjectedScriptAccess.prototype.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback)
+{
+    if (objectProxy.isScope)
+        devtools.tools.getDebuggerAgent().resolveScope(objectProxy.objectId, callback);
+    else if (objectProxy.isV8Ref)
+        devtools.tools.getDebuggerAgent().resolveChildren(objectProxy.objectId, callback, false);
+    else
+        orig.apply(this, arguments);
+};
+})();
+
+
+(function()
+{
+InjectedScriptAccess.prototype.evaluateInCallFrame = function(callFrameId, code, objectGroup, callback)
+{
+    //TODO(pfeldman): remove once 49084 is rolled.
+    if (!callback)
+        callback = objectGroup;
+    devtools.tools.getDebuggerAgent().evaluateInCallFrame(callFrameId, code, callback);
+};
+})();
+
+
+(function()
+{
+var orig = InjectedScriptAccess.prototype.getCompletions;
+InjectedScriptAccess.prototype.getCompletions = function(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions)
+{
+    if (typeof callFrameId === "number")
+        devtools.tools.getDebuggerAgent().resolveCompletionsOnFrame(expressionString, callFrameId, reportCompletions);
+    else
+        return orig.apply(this, arguments);
+};
+})();
+
+
+// We need to have a place for postponed tasks
+// which should be executed when all the messages between agent and frontend
+// are processed.
+
+WebInspector.runAfterPendingDispatchesQueue = [];
+
+WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback)
+{
+    WebInspector.runAfterPendingDispatchesQueue.push(callback);
+};
+
+WebInspector.queuesAreEmpty = function()
+{
+    var copy = this.runAfterPendingDispatchesQueue.slice();
+    this.runAfterPendingDispatchesQueue = [];
+    for (var i = 0; i < copy.length; ++i)
+        copy[i].call(this);
+};
+
+(function()
+{
+var originalAddToFrame = InspectorFrontendHost.addResourceSourceToFrame;
+InspectorFrontendHost.addResourceSourceToFrame = function(identifier, element)
+{
+    var resource = WebInspector.resources[identifier];
+    if (!resource)
+        return;
+    originalAddToFrame.call(this, identifier, resource.mimeType, element);
+};
+})();
+
+WebInspector.pausedScript = function(callFrames)
+{
+    this.panels.scripts.debuggerPaused(callFrames);
+};
+
+/* DevToolsHostStub.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview These stubs emulate backend functionality and allows
+ * DevTools frontend to function as a standalone web app.
+ */
+
+if (!window["RemoteDebuggerAgent"]) {
+
+/**
+ * FIXME: change field naming style to use trailing underscore.
+ * @constructor
+ */
+RemoteDebuggerAgentStub = function()
+{
+};
+
+
+RemoteDebuggerAgentStub.prototype.getContextId = function()
+{
+    RemoteDebuggerAgent.setContextId(3);
+};
+
+
+RemoteDebuggerAgentStub.prototype.processDebugCommands = function()
+{
+};
+
+
+/**
+ * @constructor
+ */
+RemoteProfilerAgentStub = function()
+{
+};
+
+
+RemoteProfilerAgentStub.prototype.getActiveProfilerModules = function()
+{
+    ProfilerStubHelper.GetInstance().getActiveProfilerModules();
+};
+
+
+RemoteProfilerAgentStub.prototype.getLogLines = function(pos)
+{
+    ProfilerStubHelper.GetInstance().getLogLines(pos);
+};
+
+
+/**
+ * @constructor
+ */
+RemoteToolsAgentStub = function()
+{
+};
+
+
+RemoteToolsAgentStub.prototype.dispatchOnInjectedScript = function()
+{
+};
+
+
+RemoteToolsAgentStub.prototype.dispatchOnInspectorController = function()
+{
+};
+
+
+/**
+ * @constructor
+ */
+ProfilerStubHelper = function()
+{
+    this.activeProfilerModules_ = devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_NONE;
+    this.heapProfSample_ = 0;
+    this.log_ = '';
+};
+
+
+ProfilerStubHelper.GetInstance = function()
+{
+    if (!ProfilerStubHelper.instance_)
+        ProfilerStubHelper.instance_ = new ProfilerStubHelper();
+    return ProfilerStubHelper.instance_;
+};
+
+
+ProfilerStubHelper.prototype.StopProfiling = function(modules)
+{
+    this.activeProfilerModules_ &= ~modules;
+};
+
+
+ProfilerStubHelper.prototype.StartProfiling = function(modules)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    if (modules & profModules.PROFILER_MODULE_HEAP_SNAPSHOT) {
+        if (modules & profModules.PROFILER_MODULE_HEAP_STATS) {
+            this.log_ +=
+                'heap-sample-begin,"Heap","allocated",' +
+                    (new Date()).getTime() + '\n' +
+                'heap-sample-stats,"Heap","allocated",10000,1000\n';
+            this.log_ +=
+                'heap-sample-item,STRING_TYPE,100,1000\n' +
+                'heap-sample-item,CODE_TYPE,10,200\n' +
+                'heap-sample-item,MAP_TYPE,20,350\n';
+            this.log_ += ProfilerStubHelper.HeapSamples[this.heapProfSample_++];
+            this.heapProfSample_ %= ProfilerStubHelper.HeapSamples.length;
+            this.log_ += 'heap-sample-end,"Heap","allocated"\n';
+        }
+    } else {
+        if (modules & profModules.PROFILER_MODULE_CPU)
+            this.log_ += ProfilerStubHelper.ProfilerLogBuffer;
+        this.activeProfilerModules_ |= modules;
+    }
+};
+
+
+ProfilerStubHelper.prototype.getActiveProfilerModules = function()
+{
+    var self = this;
+    setTimeout(function() {
+        RemoteProfilerAgent.didGetActiveProfilerModules(self.activeProfilerModules_);
+    }, 100);
+};
+
+
+ProfilerStubHelper.prototype.getLogLines = function(pos)
+{
+    var profModules = devtools.ProfilerAgent.ProfilerModules;
+    var logLines = this.log_.substr(pos);
+    setTimeout(function() {
+        RemoteProfilerAgent.didGetLogLines(pos + logLines.length, logLines);
+    }, 100);
+};
+
+
+ProfilerStubHelper.ProfilerLogBuffer =
+    'profiler,begin,1\n' +
+    'profiler,resume\n' +
+    'code-creation,LazyCompile,0x1000,256,"test1 http://aaa.js:1"\n' +
+    'code-creation,LazyCompile,0x2000,256,"test2 http://bbb.js:2"\n' +
+    'code-creation,LazyCompile,0x3000,256,"test3 http://ccc.js:3"\n' +
+    'tick,0x1010,0x0,3\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x3010,0x0,3,0x2020, 0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x2030,0x0,3,0x2020, 0x1010\n' +
+    'tick,0x2020,0x0,3,0x1010\n' +
+    'tick,0x1010,0x0,3\n' +
+    'profiler,pause\n';
+
+
+ProfilerStubHelper.HeapSamples = [
+    'heap-js-cons-item,foo,1,100\n' +
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,Object,5,100\n' +
+    'heap-js-ret-item,foo,bar;3\n' +
+    'heap-js-ret-item,bar,foo;5\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1\n',
+
+    'heap-js-cons-item,foo,2000,200000\n' +
+    'heap-js-cons-item,bar,10,1000\n' +
+    'heap-js-cons-item,Object,6,120\n' +
+    'heap-js-ret-item,foo,bar;7,Object:0x1234;10\n' +
+    'heap-js-ret-item,bar,foo;10,Object:0x1234;10\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1\n',
+
+    'heap-js-cons-item,foo,15,1500\n' +
+    'heap-js-cons-item,bar,15,1500\n' +
+    'heap-js-cons-item,Object,5,100\n' +
+    'heap-js-cons-item,Array,3,1000\n' +
+    'heap-js-ret-item,foo,bar;3,Array:0x5678;1\n' +
+    'heap-js-ret-item,bar,foo;5,Object:0x1234;8,Object:0x5678;2\n' +
+    'heap-js-ret-item,Object:0x1234,(roots);1,Object:0x5678;2\n' +
+    'heap-js-ret-item,Object:0x5678,(global property);3,Object:0x1234;5\n' +
+    'heap-js-ret-item,Array:0x5678,(global property);3,Array:0x5678;2\n',
+
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,Object,6,120\n' +
+    'heap-js-ret-item,bar,foo;5,Object:0x1234;1,Object:0x1235;3\n' +
+    'heap-js-ret-item,Object:0x1234,(global property);3\n' +
+    'heap-js-ret-item,Object:0x1235,(global property);5\n',
+
+    'heap-js-cons-item,foo,15,1500\n' +
+    'heap-js-cons-item,bar,15,1500\n' +
+    'heap-js-cons-item,Array,10,1000\n' +
+    'heap-js-ret-item,foo,bar;1,Array:0x5678;1\n' +
+    'heap-js-ret-item,bar,foo;5\n' +
+    'heap-js-ret-item,Array:0x5678,(roots);3\n',
+
+    'heap-js-cons-item,bar,20,2000\n' +
+    'heap-js-cons-item,baz,15,1500\n' +
+    'heap-js-ret-item,bar,baz;3\n' +
+    'heap-js-ret-item,baz,bar;3\n'
+];
+
+
+/**
+ * @constructor
+ */
+RemoteDebuggerCommandExecutorStub = function()
+{
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.DebuggerCommand = function(cmd)
+{
+    if ('{"seq":2,"type":"request","command":"scripts","arguments":{"includeSource":false}}' === cmd) {
+        var response1 =
+            '{"seq":5,"request_seq":2,"type":"response","command":"scripts","' +
+            'success":true,"body":[{"handle":61,"type":"script","name":"' +
+            'http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
+            '"lineCount":1,"sourceStart":"function fib(n) {","sourceLength":300,' +
+            '"scriptType":2,"compilationType":0,"context":{"ref":60}}],"refs":[{' +
+            '"handle":60,"type":"context","data":"page,3"}],"running":false}';
+        this.sendResponse_(response1);
+    } else if ('{"seq":3,"type":"request","command":"scripts","arguments":{"ids":[59],"includeSource":true}}' === cmd) {
+        this.sendResponse_(
+            '{"seq":8,"request_seq":3,"type":"response","command":"scripts",' +
+            '"success":true,"body":[{"handle":1,"type":"script","name":' +
+            '"http://www/~test/t.js","id":59,"lineOffset":0,"columnOffset":0,' +
+            '"lineCount":1,"source":"function fib(n) {return n+1;}",' +
+            '"sourceLength":244,"scriptType":2,"compilationType":0,"context":{' +
+            '"ref":0}}],"refs":[{"handle":0,"type":"context","data":"page,3}],"' +
+            '"running":false}');
+    } else if (cmd.indexOf('"command":"profile"') !== -1) {
+        var cmdObj = JSON.parse(cmd);
+        if (cmdObj.arguments.command === "resume")
+            ProfilerStubHelper.GetInstance().StartProfiling(parseInt(cmdObj.arguments.modules));
+        else if (cmdObj.arguments.command === "pause")
+            ProfilerStubHelper.GetInstance().StopProfiling(parseInt(cmdObj.arguments.modules));
+        else
+            debugPrint("Unexpected profile command: " + cmdObj.arguments.command);
+    } else
+        debugPrint("Unexpected command: " + cmd);
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.DebuggerPauseScript = function()
+{
+};
+
+
+RemoteDebuggerCommandExecutorStub.prototype.sendResponse_ = function(response)
+{
+    setTimeout(function() {
+        RemoteDebuggerAgent.debuggerOutput(response);
+    }, 0);
+};
+
+
+DevToolsHostStub = function()
+{
+    this.isStub = true;
+};
+DevToolsHostStub.prototype.__proto__ = WebInspector.InspectorFrontendHostStub.prototype;
+
+
+DevToolsHostStub.prototype.reset = function()
+{
+};
+
+
+DevToolsHostStub.prototype.setting = function()
+{
+};
+
+
+DevToolsHostStub.prototype.setSetting = function()
+{
+};
+
+
+window["RemoteDebuggerAgent"] = new RemoteDebuggerAgentStub();
+window["RemoteDebuggerCommandExecutor"] = new RemoteDebuggerCommandExecutorStub();
+window["RemoteProfilerAgent"] = new RemoteProfilerAgentStub();
+window["RemoteToolsAgent"] = new RemoteToolsAgentStub();
+InspectorFrontendHost = new DevToolsHostStub();
+
+}
+
+/* Tests.js */
+
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/**
+ * @fileoverview This file contains small testing framework along with the
+ * test suite for the frontend. These tests are a part of the continues build
+ * and are executed by the devtools_sanity_unittest.cc as a part of the
+ * Interactive UI Test suite.
+ * FIXME: change field naming style to use trailing underscore.
+ */
+
+if (window.domAutomationController) {
+
+var ___interactiveUiTestsMode = true;
+
+/**
+ * Test suite for interactive UI tests.
+ * @constructor
+ */
+TestSuite = function()
+{
+    this.controlTaken_ = false;
+    this.timerId_ = -1;
+};
+
+
+/**
+ * Reports test failure.
+ * @param {string} message Failure description.
+ */
+TestSuite.prototype.fail = function(message)
+{
+    if (this.controlTaken_)
+        this.reportFailure_(message);
+    else
+        throw message;
+};
+
+
+/**
+ * Equals assertion tests that expected === actual.
+ * @param {Object} expected Expected object.
+ * @param {Object} actual Actual object.
+ * @param {string} opt_message User message to print if the test fails.
+ */
+TestSuite.prototype.assertEquals = function(expected, actual, opt_message)
+{
+    if (expected !== actual) {
+        var message = "Expected: '" + expected + "', but was '" + actual + "'";
+        if (opt_message)
+            message = opt_message + "(" + message + ")";
+        this.fail(message);
+    }
+};
+
+
+/**
+ * True assertion tests that value == true.
+ * @param {Object} value Actual object.
+ * @param {string} opt_message User message to print if the test fails.
+ */
+TestSuite.prototype.assertTrue = function(value, opt_message)
+{
+    this.assertEquals(true, !!value, opt_message);
+};
+
+
+/**
+ * Contains assertion tests that string contains substring.
+ * @param {string} string Outer.
+ * @param {string} substring Inner.
+ */
+TestSuite.prototype.assertContains = function(string, substring)
+{
+    if (string.indexOf(substring) === -1)
+        this.fail("Expected to: '" + string + "' to contain '" + substring + "'");
+};
+
+
+/**
+ * Takes control over execution.
+ */
+TestSuite.prototype.takeControl = function()
+{
+    this.controlTaken_ = true;
+    // Set up guard timer.
+    var self = this;
+    this.timerId_ = setTimeout(function() {
+        self.reportFailure_("Timeout exceeded: 20 sec");
+    }, 20000);
+};
+
+
+/**
+ * Releases control over execution.
+ */
+TestSuite.prototype.releaseControl = function()
+{
+    if (this.timerId_ !== -1) {
+        clearTimeout(this.timerId_);
+        this.timerId_ = -1;
+    }
+    this.reportOk_();
+};
+
+
+/**
+ * Async tests use this one to report that they are completed.
+ */
+TestSuite.prototype.reportOk_ = function()
+{
+    window.domAutomationController.send("[OK]");
+};
+
+
+/**
+ * Async tests use this one to report failures.
+ */
+TestSuite.prototype.reportFailure_ = function(error)
+{
+    if (this.timerId_ !== -1) {
+        clearTimeout(this.timerId_);
+        this.timerId_ = -1;
+    }
+    window.domAutomationController.send("[FAILED] " + error);
+};
+
+
+/**
+ * Runs all global functions starting with "test" as unit tests.
+ */
+TestSuite.prototype.runTest = function(testName)
+{
+    try {
+        this[testName]();
+        if (!this.controlTaken_)
+            this.reportOk_();
+    } catch (e) {
+        this.reportFailure_(e);
+    }
+};
+
+
+/**
+ * @param {string} panelName Name of the panel to show.
+ */
+TestSuite.prototype.showPanel = function(panelName)
+{
+    // Open Scripts panel.
+    var toolbar = document.getElementById("toolbar");
+    var button = toolbar.getElementsByClassName(panelName)[0];
+    button.click();
+    this.assertEquals(WebInspector.panels[panelName], WebInspector.currentPanel);
+};
+
+
+/**
+ * Overrides the method with specified name until it's called first time.
+ * @param {Object} receiver An object whose method to override.
+ * @param {string} methodName Name of the method to override.
+ * @param {Function} override A function that should be called right after the
+ *     overriden method returns.
+ * @param {boolean} opt_sticky Whether restore original method after first run
+ *     or not.
+ */
+TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_sticky)
+{
+    var orig = receiver[methodName];
+    if (typeof orig !== "function")
+        this.fail("Cannot find method to override: " + methodName);
+    var test = this;
+    receiver[methodName] = function(var_args) {
+        try {
+            var result = orig.apply(this, arguments);
+        } finally {
+            if (!opt_sticky)
+                receiver[methodName] = orig;
+        }
+        // In case of exception the override won't be called.
+        try {
+            override.apply(this, arguments);
+        } catch (e) {
+            test.fail("Exception in overriden method '" + methodName + "': " + e);
+        }
+        return result;
+    };
+};
+
+
+// UI Tests
+
+
+/**
+ * Tests that the real injected host is present in the context.
+ */
+TestSuite.prototype.testHostIsPresent = function()
+{
+    this.assertTrue(typeof InspectorFrontendHost === "object" && !InspectorFrontendHost.isStub);
+};
+
+
+/**
+ * Tests elements tree has an "HTML" root.
+ */
+TestSuite.prototype.testElementsTreeRoot = function()
+{
+    var doc = WebInspector.domAgent.document;
+    this.assertEquals("HTML", doc.documentElement.nodeName);
+    this.assertTrue(doc.documentElement.hasChildNodes());
+};
+
+
+/**
+ * Tests that main resource is present in the system and that it is
+ * the only resource.
+ */
+TestSuite.prototype.testMainResource = function()
+{
+    var tokens = [];
+    var resources = WebInspector.resources;
+    for (var id in resources)
+        tokens.push(resources[id].lastPathComponent);
+    this.assertEquals("simple_page.html", tokens.join(","));
+};
+
+
+/**
+ * Tests that resources tab is enabled when corresponding item is selected.
+ */
+TestSuite.prototype.testEnableResourcesTab = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            test.assertEquals("simple_page.html", payload.lastPathComponent);
+            WebInspector.panels.resources.refresh();
+            WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[identifier]);
+
+            test.releaseControl();
+        });
+
+    // Following call should lead to reload that we capture in the
+    // addResource override.
+    WebInspector.panels.resources._enableResourceTracking();
+
+    // We now have some time to report results to controller.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that correct content length is reported for resources.
+ */
+TestSuite.prototype.testResourceContentLength = function()
+{
+    this.showPanel("resources");
+    var test = this;
+
+    var png = false;
+    var html = false;
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            if (!payload.didLengthChange)
+                return;
+            var resource = WebInspector.resources[identifier];
+            if (!resource || !resource.url)
+                return;
+            if (resource.url.search("image.html") !== -1) {
+              var expectedLength = 87;
+              test.assertTrue(
+                  resource.resourceSize <= expectedLength,
+                  "image.html content length is greater thatn expected.");
+              if (expectedLength === resource.resourceSize)
+                  html = true;
+            } else if (resource.url.search("image.png") !== -1) {
+              var expectedLength = 257796;
+              test.assertTrue(
+                  resource.resourceSize <= expectedLength,
+                  "image.png content length is greater than expected.");
+              if (expectedLength === resource.resourceSize)
+                  png = true;
+            }
+            if (html && png) {
+              // Wait 1 second before releasing control to check that the content
+              // lengths are not updated anymore.
+              setTimeout(function() {
+                  test.releaseControl();
+              }, 1000);
+            }
+        }, true);
+
+    // Make sure resource tracking is on.
+    WebInspector.panels.resources._enableResourceTracking();
+    // Reload inspected page to update all resources.
+    test.evaluateInConsole_(
+        "window.location.reload(true);",
+         function(resultText) {
+             test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+         });
+
+    // We now have some time to report results to controller.
+    this.takeControl();
+};
+
+
+/**
+ * Tests resource headers.
+ */
+TestSuite.prototype.testResourceHeaders = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+
+    var responseOk = false;
+    var timingOk = false;
+
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            var resource = this.resources[identifier];
+            if (!resource || resource.mainResource) {
+                // We are only interested in secondary resources in this test.
+                return;
+            }
+
+            var requestHeaders = JSON.stringify(resource.requestHeaders);
+            test.assertContains(requestHeaders, "Accept");
+
+            if (payload.didResponseChange) {
+                var responseHeaders = JSON.stringify(resource.responseHeaders);
+                test.assertContains(responseHeaders, "Content-type");
+                test.assertContains(responseHeaders, "Content-Length");
+                test.assertTrue(typeof resource.responseReceivedTime !== "undefined");
+                responseOk = true;
+            }
+
+            if (payload.didTimingChange) {
+                test.assertTrue(typeof resource.startTime !== "undefined");
+                timingOk = true;
+            }
+
+            if (payload.didCompletionChange) {
+                test.assertTrue(responseOk);
+                test.assertTrue(timingOk);
+                test.assertTrue(typeof resource.endTime !== "undefined");
+                test.releaseControl();
+            }
+        }, true);
+
+    WebInspector.panels.resources._enableResourceTracking();
+    this.takeControl();
+};
+
+
+/**
+ * Tests the mime type of a cached (HTTP 304) resource.
+ */
+TestSuite.prototype.testCachedResourceMimeType = function()
+{
+    this.showPanel("resources");
+
+    var test = this;
+    var hasReloaded = false;
+
+    this.addSniffer(WebInspector, "updateResource",
+        function(identifier, payload) {
+            var resource = this.resources[identifier];
+            if (!resource || resource.mainResource) {
+                // We are only interested in secondary resources in this test.
+                return;
+            }
+
+            if (payload.didResponseChange) {
+                // Test server uses a default mime type for JavaScript files.
+                test.assertEquals("text/html", payload.mimeType);
+                if (!hasReloaded) {
+                    hasReloaded = true;
+                    // Reload inspected page to update all resources.
+                    test.evaluateInConsole_("window.location.reload(true);", function() {});
+                } else
+                    test.releaseControl();
+            }
+
+        }, true);
+
+    WebInspector.panels.resources._enableResourceTracking();
+    this.takeControl();
+};
+
+
+/**
+ * Tests that profiler works.
+ */
+TestSuite.prototype.testProfilerTab = function()
+{
+    this.showPanel("profiles");
+
+    var test = this;
+    this.addSniffer(WebInspector.panels.profiles, "addProfileHeader",
+        function(typeOrProfile, profile) {
+            if (!profile)
+                profile = typeOrProfile;
+            var panel = WebInspector.panels.profiles;
+            panel.showProfile(profile);
+            var node = panel.visibleView.profileDataGridTree.children[0];
+            // Iterate over displayed functions and search for a function
+            // that is called "fib" or "eternal_fib". If found, it will mean
+            // that we actually have profiled page's code.
+            while (node) {
+                if (node.functionName.indexOf("fib") !== -1)
+                    test.releaseControl();
+                node = node.traverseNextNode(true, null, true);
+            }
+
+            test.fail();
+        });
+    var ticksCount = 0;
+    var tickRecord = "\nt,";
+    this.addSniffer(RemoteProfilerAgent, "didGetLogLines",
+        function(posIgnored, log) {
+            var pos = 0;
+            while ((pos = log.indexOf(tickRecord, pos)) !== -1) {
+                pos += tickRecord.length;
+                ticksCount++;
+            }
+            if (ticksCount > 100)
+                InspectorBackend.stopProfiling();
+        }, true);
+
+    InspectorBackend.startProfiling();
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts tab can be open and populated with inspected scripts.
+ */
+TestSuite.prototype.testShowScriptsTab = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+    // There should be at least main page script.
+    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
+        function() {
+            test.releaseControl();
+        });
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts tab is populated with inspected scripts even if it
+ * hadn't been shown by the moment inspected paged refreshed.
+ * @see http://crbug.com/26312
+ */
+TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()
+{
+    var test = this;
+    this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one.");
+
+    this.addSniffer(devtools.DebuggerAgent.prototype, "reset", waitUntilScriptIsParsed);
+
+    // Reload inspected page. It will reset the debugger agent.
+    test.evaluateInConsole_(
+        "window.location.reload(true);",
+        function(resultText) {
+            test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+        });
+
+    function waitUntilScriptIsParsed() {
+        var parsed = devtools.tools.getDebuggerAgent().parsedScripts_;
+        for (var id in parsed) {
+            var url = parsed[id].getUrl();
+            if (url && url.search("debugger_test_page.html") !== -1) {
+                checkScriptsPanel();
+                return;
+            }
+        }
+        test.addSniffer(devtools.DebuggerAgent.prototype, "addScriptInfo_", waitUntilScriptIsParsed);
+    }
+
+    function checkScriptsPanel() {
+        test.showPanel("scripts");
+        test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Inspected script not found in the scripts list");
+        test.releaseControl();
+    }
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts list contains content scripts.
+ */
+TestSuite.prototype.testContentScriptIsPresent = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    test._waitUntilScriptsAreParsed(
+        ["page_with_content_script.html", "simple_content_script.js"],
+        function() {
+          test.releaseControl();
+        });
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that scripts are not duplicaed on Scripts tab switch.
+ */
+TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()
+{
+    var test = this;
+
+    // There should be two scripts: one for the main page and another
+    // one which is source of console API(see
+    // InjectedScript._ensureCommandLineAPIInstalled).
+    var expectedScriptsCount = 2;
+    var parsedScripts = [];
+
+    this.showPanel("scripts");
+
+
+    function switchToElementsTab() {
+        test.showPanel("elements");
+        setTimeout(switchToScriptsTab, 0);
+    }
+
+    function switchToScriptsTab() {
+        test.showPanel("scripts");
+        setTimeout(checkScriptsPanel, 0);
+    }
+
+    function checkScriptsPanel() {
+        test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view.");
+        test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing.");
+        checkNoDuplicates();
+        test.releaseControl();
+    }
+
+    function checkNoDuplicates() {
+        var scriptSelect = document.getElementById("scripts-files");
+        var options = scriptSelect.options;
+        for (var i = 0; i < options.length; i++) {
+            var scriptName = options[i].text;
+            for (var j = i + 1; j < options.length; j++)
+                test.assertTrue(scriptName !== options[j].text, "Found script duplicates: " + test.optionsToString_(options));
+        }
+    }
+
+    test._waitUntilScriptsAreParsed(
+        ["debugger_test_page.html"],
+        function() {
+            checkNoDuplicates();
+            setTimeout(switchToElementsTab, 0);
+        });
+
+
+    // Wait until all scripts are added to the debugger.
+    this.takeControl();
+};
+
+
+/**
+ * Tests that a breakpoint can be set.
+ */
+TestSuite.prototype.testSetBreakpoint = function()
+{
+    var test = this;
+    this.showPanel("scripts");
+
+    var breakpointLine = 12;
+
+    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
+        function() {
+          test.showMainPageScriptSource_(
+              "debugger_test_page.html",
+              function(view, url) {
+                view._addBreakpoint(breakpointLine);
+                // Force v8 execution.
+                RemoteDebuggerAgent.processDebugCommands();
+                test.waitForSetBreakpointResponse_(url, breakpointLine,
+                    function() {
+                        test.releaseControl();
+                    });
+              });
+        });
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that pause on exception works.
+ */
+TestSuite.prototype.testPauseOnException = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    // TODO(yurys): remove else branch once the states are supported.
+    if (WebInspector.ScriptsPanel.PauseOnExceptionsState) {
+        while (WebInspector.currentPanel._pauseOnExceptionButton.state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)
+            WebInspector.currentPanel._pauseOnExceptionButton.element.click();
+    } else {
+        // Make sure pause on exceptions is on.
+        if (!WebInspector.currentPanel._pauseOnExceptionButton.toggled)
+            WebInspector.currentPanel._pauseOnExceptionButton.element.click();
+    }
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["pause_on_exception.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["throwAnException", "handleClick", "(anonymous function)"],
+            lineNumber: 6,
+            lineText: "  return unknown_var;"
+        },
+        function() {
+            test.releaseControl();
+        });
+
+    this.takeControl();
+};
+
+
+// Tests that debugger works correctly if pause event occurs when DevTools
+// frontend is being loaded.
+TestSuite.prototype.testPauseWhenLoadingDevTools = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    var expectations = {
+            functionsOnStack: ["callDebugger"],
+            lineNumber: 8,
+            lineText: "  debugger;"
+        };
+
+
+    // Script execution can already be paused.
+    if (WebInspector.currentPanel.paused) {
+        var callFrame = WebInspector.currentPanel.sidebarPanes.callstack.selectedCallFrame;
+        this.assertEquals(expectations.functionsOnStack[0], callFrame.functionName);
+        var callbackInvoked = false;
+        this._checkSourceFrameWhenLoaded(expectations, function() {
+                callbackInvoked = true;
+                if (test.controlTaken_)
+                    test.releaseControl();
+            });
+        if (!callbackInvoked) {
+            test.takeControl();
+        }
+        return;
+    }
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["callDebugger"],
+            lineNumber: 8,
+            lineText: "  debugger;"
+        },
+        function() {
+            test.releaseControl();
+        });
+    this.takeControl();
+};
+
+
+// Tests that pressing "Pause" will pause script execution if the script
+// is already running.
+TestSuite.prototype.testPauseWhenScriptIsRunning = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    test.evaluateInConsole_(
+        'setTimeout("handleClick()" , 0)',
+        function(resultText) {
+          test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+          testScriptPauseAfterDelay();
+        });
+
+    // Wait for some time to make sure that inspected page is running the
+    // infinite loop.
+    function testScriptPauseAfterDelay() {
+        setTimeout(testScriptPause, 300);
+    }
+
+    function testScriptPause() {
+        // The script should be in infinite loop. Click "Pause" button to
+        // pause it and wait for the result.
+        WebInspector.panels.scripts.pauseButton.click();
+
+        test._waitForScriptPause(
+            {
+                functionsOnStack: ["handleClick", "(anonymous function)"],
+                lineNumber: 5,
+                lineText: "  while(true) {"
+            },
+            function() {
+                test.releaseControl();
+            });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Serializes options collection to string.
+ * @param {HTMLOptionsCollection} options
+ * @return {string}
+ */
+TestSuite.prototype.optionsToString_ = function(options)
+{
+    var names = [];
+    for (var i = 0; i < options.length; i++)
+        names.push('"' + options[i].text + '"');
+    return names.join(",");
+};
+
+
+/**
+ * Ensures that main HTML resource is selected in Scripts panel and that its
+ * source frame is setup. Invokes the callback when the condition is satisfied.
+ * @param {HTMLOptionsCollection} options
+ * @param {function(WebInspector.SourceView,string)} callback
+ */
+TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback)
+{
+    var test = this;
+
+    var scriptSelect = document.getElementById("scripts-files");
+    var options = scriptSelect.options;
+
+    test.assertTrue(options.length, "Scripts list is empty");
+
+    // Select page's script if it's not current option.
+    var scriptResource;
+    if (options[scriptSelect.selectedIndex].text === scriptName)
+        scriptResource = options[scriptSelect.selectedIndex].representedObject;
+    else {
+        var pageScriptIndex = -1;
+        for (var i = 0; i < options.length; i++) {
+            if (options[i].text === scriptName) {
+                pageScriptIndex = i;
+                break;
+            }
+        }
+        test.assertTrue(-1 !== pageScriptIndex, "Script with url " + scriptName + " not found among " + test.optionsToString_(options));
+        scriptResource = options[pageScriptIndex].representedObject;
+
+        // Current panel is "Scripts".
+        WebInspector.currentPanel._showScriptOrResource(scriptResource);
+        test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex, "Unexpected selected option index.");
+    }
+
+    test.assertTrue(scriptResource instanceof WebInspector.Resource,
+                    "Unexpected resource class.");
+    test.assertTrue(!!scriptResource.url, "Resource URL is null.");
+    test.assertTrue(scriptResource.url.search(scriptName + "$") !== -1, "Main HTML resource should be selected.");
+
+    var scriptsPanel = WebInspector.panels.scripts;
+
+    var view = scriptsPanel.visibleView;
+    test.assertTrue(view instanceof WebInspector.SourceView);
+
+    if (!view.sourceFrame._loaded) {
+        test.addSniffer(view, "_sourceFrameSetupFinished", function(event) {
+            callback(view, scriptResource.url);
+        });
+    } else
+        callback(view, scriptResource.url);
+};
+
+
+/*
+ * Evaluates the code in the console as if user typed it manually and invokes
+ * the callback when the result message is received and added to the console.
+ * @param {string} code
+ * @param {function(string)} callback
+ */
+TestSuite.prototype.evaluateInConsole_ = function(code, callback)
+{
+    WebInspector.console.visible = true;
+    WebInspector.console.prompt.text = code;
+    WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
+
+    this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
+        function(commandResult) {
+            callback(commandResult.toMessageElement().textContent);
+        });
+};
+
+
+/*
+ * Waits for "setbreakpoint" response, checks that corresponding breakpoint
+ * was successfully set and invokes the callback if it was.
+ * @param {string} scriptUrl
+ * @param {number} breakpointLine
+ * @param {function()} callback
+ */
+TestSuite.prototype.waitForSetBreakpointResponse_ = function(scriptUrl, breakpointLine, callback)
+{
+    var test = this;
+    test.addSniffer(
+        devtools.DebuggerAgent.prototype,
+        "handleSetBreakpointResponse_",
+        function(msg) {
+            var bps = this.urlToBreakpoints_[scriptUrl];
+            test.assertTrue(!!bps, "No breakpoints for line " + breakpointLine);
+            var line = devtools.DebuggerAgent.webkitToV8LineNumber_(breakpointLine);
+            test.assertTrue(!!bps[line].getV8Id(), "Breakpoint id was not assigned.");
+            callback();
+        });
+};
+
+
+/**
+ * Tests eval on call frame.
+ */
+TestSuite.prototype.testEvalOnCallFrame = function()
+{
+    this.showPanel("scripts");
+
+    var breakpointLine = 16;
+
+    var test = this;
+    this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
+        function(msg) {
+          test.showMainPageScriptSource_(
+              "debugger_test_page.html",
+              function(view, url) {
+                  view._addBreakpoint(breakpointLine);
+                  // Force v8 execution.
+                  RemoteDebuggerAgent.processDebugCommands();
+                  test.waitForSetBreakpointResponse_(url, breakpointLine, setBreakpointCallback);
+              });
+        });
+
+    function setBreakpointCallback() {
+      // Since breakpoints are ignored in evals' calculate() function is
+      // execute after zero-timeout so that the breakpoint is hit.
+      test.evaluateInConsole_(
+          'setTimeout("calculate(123)" , 0)',
+          function(resultText) {
+              test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+              waitForBreakpointHit();
+          });
+    }
+
+    function waitForBreakpointHit() {
+      test.addSniffer(
+          devtools.DebuggerAgent.prototype,
+          "handleBacktraceResponse_",
+          function(msg) {
+            test.assertEquals(2, this.callFrames_.length, "Unexpected stack depth on the breakpoint. " + JSON.stringify(msg));
+            test.assertEquals("calculate", this.callFrames_[0].functionName, "Unexpected top frame function.");
+            // Evaluate "e+1" where "e" is an argument of "calculate" function.
+            test.evaluateInConsole_(
+                "e+1",
+                function(resultText) {
+                    test.assertEquals("124", resultText, 'Unexpected "e+1" value.');
+                    test.releaseControl();
+                });
+          });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that console auto completion works when script execution is paused.
+ */
+TestSuite.prototype.testCompletionOnPause = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
+            lineNumber: 9,
+            lineText: "    debugger;"
+        },
+        showConsole);
+
+    function showConsole() {
+        test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
+        WebInspector.showConsole();
+    }
+
+    function testLocalsCompletion() {
+        checkCompletions("th", ["parameter1", "closureLocal", "p", "createClosureLocal"], testThisCompletion);
+    }
+
+    function testThisCompletion() {
+        checkCompletions("this.", ["field1", "field2", "m"], testFieldCompletion);
+    }
+
+    function testFieldCompletion() {
+        checkCompletions("this.field1.", ["id", "name"], function() { test.releaseControl(); });
+    }
+
+    function checkCompletions(expression, expectedProperties, callback) {
+        test.addSniffer(WebInspector.console, "_reportCompletions",
+            function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {
+                test.assertTrue(!isException, "Exception while collecting completions");
+                for (var i = 0; i < expectedProperties.length; i++) {
+                    var name = expectedProperties[i];
+                    test.assertTrue(result[name], "Name " + name + " not found among the completions: " + JSON.stringify(result));
+                }
+                setTimeout(callback, 0);
+            });
+      WebInspector.console.prompt.text = expression;
+      WebInspector.console.prompt.autoCompleteSoon();
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests that inspected page doesn't hang on reload if it contains a syntax
+ * error and DevTools window is open.
+ */
+TestSuite.prototype.testAutoContinueOnSyntaxError = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    function checkScriptsList() {
+        var scriptSelect = document.getElementById("scripts-files");
+        var options = scriptSelect.options;
+        // There should be only console API source (see
+        // InjectedScript._ensureCommandLineAPIInstalled) since the page script
+        // contains a syntax error.
+        for (var i = 0 ; i < options.length; i++) {
+            if (options[i].text.search("script_syntax_error.html") !== -1)
+                test.fail("Script with syntax error should not be in the list of parsed scripts.");
+        }
+    }
+
+    this.addSniffer(devtools.DebuggerAgent.prototype, "handleScriptsResponse_",
+        function(msg) {
+            checkScriptsList();
+
+            // Reload inspected page.
+            test.evaluateInConsole_(
+                "window.location.reload(true);",
+                function(resultText) {
+                    test.assertEquals("undefined", resultText, "Unexpected result of reload().");
+                    waitForExceptionEvent();
+                });
+        });
+
+    function waitForExceptionEvent() {
+      var exceptionCount = 0;
+      test.addSniffer(
+          devtools.DebuggerAgent.prototype,
+          "handleExceptionEvent_",
+          function(msg) {
+              exceptionCount++;
+              test.assertEquals(1, exceptionCount, "Too many exceptions.");
+              test.assertEquals(undefined, msg.getBody().script, "Unexpected exception: " + JSON.stringify(msg));
+              test.releaseControl();
+          });
+
+      // Check that the script is not paused on parse error.
+      test.addSniffer(
+          WebInspector,
+          "pausedScript",
+          function(callFrames) {
+              test.fail("Script execution should not pause on syntax error.");
+          });
+    }
+
+    this.takeControl();
+};
+
+
+/**
+ * Checks current execution line against expectations.
+ * @param {WebInspector.SourceFrame} sourceFrame
+ * @param {number} lineNumber Expected line number
+ * @param {string} lineContent Expected line text
+ */
+TestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber, lineContent)
+{
+    this.assertEquals(lineNumber, sourceFrame.executionLine, "Unexpected execution line number.");
+    this.assertEquals(lineContent, sourceFrame._textModel.line(lineNumber - 1), "Unexpected execution line text.");
+}
+
+
+/**
+ * Checks that all expected scripts are present in the scripts list
+ * in the Scripts panel.
+ * @param {Array.<string>} expected Regular expressions describing
+ *     expected script names.
+ * @return {boolean} Whether all the scripts are in "scripts-files" select
+ *     box
+ */
+TestSuite.prototype._scriptsAreParsed = function(expected)
+{
+    var scriptSelect = document.getElementById("scripts-files");
+    var options = scriptSelect.options;
+
+    // Check that at least all the expected scripts are present.
+    var missing = expected.slice(0);
+    for (var i = 0 ; i < options.length; i++) {
+        for (var j = 0; j < missing.length; j++) {
+            if (options[i].text.search(missing[j]) !== -1) {
+                missing.splice(j, 1);
+                break;
+            }
+        }
+    }
+    return missing.length === 0;
+};
+
+
+/**
+ * Waits for script pause, checks expectations, and invokes the callback.
+ * @param {Object} expectations  Dictionary of expectations
+ * @param {function():void} callback
+ */
+TestSuite.prototype._waitForScriptPause = function(expectations, callback)
+{
+    var test = this;
+    // Wait until script is paused.
+    test.addSniffer(
+        WebInspector,
+        "pausedScript",
+        function(callFrames) {
+            var functionsOnStack = [];
+            for (var i = 0; i < callFrames.length; i++)
+                functionsOnStack.push(callFrames[i].functionName);
+
+            test.assertEquals(expectations.functionsOnStack.join(","), functionsOnStack.join(","), "Unexpected stack.");
+
+            // Check that execution line where the script is paused is
+            // expected one.
+            test._checkSourceFrameWhenLoaded(expectations, callback);
+        });
+};
+
+
+/**
+ * Waits for current source frame to load, checks expectations, and invokes
+ * the callback.
+ * @param {Object} expectations  Dictionary of expectations
+ * @param {function():void} callback
+ */
+TestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callback)
+{
+    var test = this;
+
+    var frame = WebInspector.currentPanel.visibleView.sourceFrame;
+    if (frame._loaded)
+        checkExecLine();
+    else {
+        setTimeout(function() {
+            test._checkSourceFrameWhenLoaded(expectations, callback);
+        }, 100);
+    }
+    function checkExecLine() {
+        test._checkExecutionLine(frame, expectations.lineNumber, expectations.lineText);
+        callback();
+    }
+};
+
+
+/**
+ * Performs sequence of steps.
+ * @param {Array.<Object|Function>} Array [expectations1,action1,expectations2,
+ *     action2,...,actionN].
+ */
+TestSuite.prototype._performSteps = function(actions)
+{
+    var test = this;
+    var i = 0;
+    function doNextAction() {
+        if (i > 0)
+            actions[i++]();
+        if (i < actions.length - 1)
+            test._waitForScriptPause(actions[i++], doNextAction);
+    }
+    doNextAction();
+};
+
+
+/**
+ * Waits until all the scripts are parsed and asynchronously executes the code
+ * in the inspected page.
+ */
+TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedScripts)
+{
+    var test = this;
+
+    function executeFunctionInInspectedPage() {
+        // Since breakpoints are ignored in evals' calculate() function is
+        // execute after zero-timeout so that the breakpoint is hit.
+        test.evaluateInConsole_(
+            'setTimeout("' + code + '" , 0)',
+            function(resultText) {
+                test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+            });
+    }
+
+    test._waitUntilScriptsAreParsed(expectedScripts, executeFunctionInInspectedPage);
+};
+
+
+/**
+ * Waits until all the scripts are parsed and invokes the callback.
+ */
+TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback)
+{
+    var test = this;
+
+    function waitForAllScripts() {
+        if (test._scriptsAreParsed(expectedScripts))
+            callback();
+        else
+            test.addSniffer(WebInspector, "parsedScriptSource", waitForAllScripts);
+    }
+
+    waitForAllScripts();
+};
+
+
+/**
+ * Waits until all debugger scripts are parsed and executes "a()" in the
+ * inspected page.
+ */
+TestSuite.prototype._executeFunctionForStepTest = function()
+{
+    this._executeCodeWhenScriptsAreParsed("a()", ["debugger_step.html", "debugger_step.js"]);
+};
+
+
+/**
+ * Tests step over in the debugger.
+ */
+TestSuite.prototype.testStepOver = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 5,
+            lineText: "  var y = fact(10);"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 6,
+            lineText: "  return y;"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests step out in the debugger.
+ */
+TestSuite.prototype.testStepOut = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-out").click();
+        },
+        {
+            functionsOnStack: ["a","(anonymous function)"],
+            lineNumber: 8,
+            lineText: "  printResult(result);"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests step in in the debugger.
+ */
+TestSuite.prototype.testStepIn = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeFunctionForStepTest();
+
+    this._performSteps([
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 3,
+            lineText: "    debugger;"
+        },
+        function() {
+            document.getElementById("scripts-step-over").click();
+        },
+        {
+            functionsOnStack: ["d","a","(anonymous function)"],
+            lineNumber: 5,
+            lineText: "  var y = fact(10);"
+        },
+        function() {
+            document.getElementById("scripts-step-into").click();
+        },
+        {
+            functionsOnStack: ["fact","d","a","(anonymous function)"],
+            lineNumber: 15,
+            lineText: "  return r;"
+        },
+        function() {
+            test.releaseControl();
+        }
+    ]);
+
+    test.takeControl();
+};
+
+
+/**
+ * Gets a XPathResult matching given xpath.
+ * @param {string} xpath
+ * @param {number} resultType
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {XPathResult} Type of returned value is determined by "resultType" parameter
+ */
+
+TestSuite.prototype._evaluateXpath = function(xpath, resultType, opt_ancestor)
+{
+    if (!opt_ancestor)
+        opt_ancestor = document.documentElement;
+    try {
+        return document.evaluate(xpath, opt_ancestor, null, resultType, null);
+    } catch(e) {
+        this.fail('Error in expression: "' + xpath + '".' + e);
+    }
+};
+
+
+/**
+ * Gets first Node matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {?Node}
+ */
+TestSuite.prototype._findNode = function(xpath, opt_ancestor)
+{
+    var result = this._evaluateXpath(xpath, XPathResult.FIRST_ORDERED_NODE_TYPE, opt_ancestor).singleNodeValue;
+    this.assertTrue(!!result, "Cannot find node on path: " + xpath);
+    return result;
+};
+
+
+/**
+ * Gets a text matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified documentElement
+ *     will be used
+ * @return {?string}
+ */
+TestSuite.prototype._findText = function(xpath, opt_ancestor)
+{
+    var result = this._evaluateXpath(xpath, XPathResult.STRING_TYPE, opt_ancestor).stringValue;
+    this.assertTrue(!!result, "Cannot find text on path: " + xpath);
+    return result;
+};
+
+
+/**
+ * Gets an iterator over nodes matching given xpath.
+ * @param {string} xpath
+ * @param {Node} opt_ancestor Context node. If not specified, documentElement
+ *     will be used
+ * @return {XPathResult} Iterator over the nodes
+ */
+TestSuite.prototype._nodeIterator = function(xpath, opt_ancestor)
+{
+    return this._evaluateXpath(xpath, XPathResult.ORDERED_NODE_ITERATOR_TYPE, opt_ancestor);
+};
+
+
+/**
+ * Checks the scopeSectionDiv against the expectations.
+ * @param {Node} scopeSectionDiv The section div
+ * @param {Object} expectations Expectations dictionary
+ */
+TestSuite.prototype._checkScopeSectionDiv = function(scopeSectionDiv, expectations)
+{
+    var scopeTitle = this._findText('./div[@class="header"]/div[@class="title"]/text()', scopeSectionDiv);
+    this.assertEquals(expectations.title, scopeTitle, "Unexpected scope section title.");
+    if (!expectations.properties)
+        return;
+    this.assertTrue(scopeSectionDiv.hasStyleClass("expanded"), 'Section "' + scopeTitle + '" is collapsed.');
+
+    var propertyIt = this._nodeIterator("./ol/li", scopeSectionDiv);
+    var propertyLi;
+    var foundProps = [];
+    while (propertyLi = propertyIt.iterateNext()) {
+        var name = this._findText('./span[@class="name"]/text()', propertyLi);
+        var value = this._findText('./span[@class="value"]/text()', propertyLi);
+        this.assertTrue(!!name, 'Invalid variable name: "' + name + '"');
+        this.assertTrue(name in expectations.properties, "Unexpected property: " + name);
+        this.assertEquals(expectations.properties[name], value, 'Unexpected "' + name + '" property value.');
+        delete expectations.properties[name];
+        foundProps.push(name + " = " + value);
+    }
+
+    // Check that all expected properties were found.
+    for (var p in expectations.properties)
+        this.fail('Property "' + p + '" was not found in scope "' + scopeTitle + '". Found properties: "' + foundProps.join(",") + '"');
+};
+
+
+/**
+ * Expands scope sections matching the filter and invokes the callback on
+ * success.
+ * @param {function(WebInspector.ObjectPropertiesSection, number):boolean}
+ *     filter
+ * @param {Function} callback
+ */
+TestSuite.prototype._expandScopeSections = function(filter, callback)
+{
+    var sections = WebInspector.currentPanel.sidebarPanes.scopechain.sections;
+
+    var toBeUpdatedCount = 0;
+    function updateListener() {
+        --toBeUpdatedCount;
+        if (toBeUpdatedCount === 0) {
+            // Report when all scopes are expanded and populated.
+            callback();
+        }
+    }
+
+    // Global scope is always the last one.
+    for (var i = 0; i < sections.length - 1; i++) {
+        var section = sections[i];
+        if (!filter(sections, i))
+            continue;
+        ++toBeUpdatedCount;
+        var populated = section.populated;
+
+        this._hookGetPropertiesCallback(updateListener,
+            function() {
+                section.expand();
+                if (populated) {
+                    // Make sure "updateProperties" callback will be called at least once
+                    // after it was overridden.
+                    section.update();
+                }
+            });
+    }
+};
+
+
+/**
+ * Tests that scopes can be expanded and contain expected data.
+ */
+TestSuite.prototype.testExpandScope = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_closure.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["innerFunction", "handleClick", "(anonymous function)"],
+            lineNumber: 8,
+            lineText: "    debugger;"
+        },
+        expandAllSectionsExceptGlobal);
+
+    // Expanding Global scope takes for too long so we skeep it.
+    function expandAllSectionsExceptGlobal() {
+        test._expandScopeSections(function(sections, i) {
+            return i < sections.length - 1;
+        },
+        examineScopes /* When all scopes are expanded and populated check them. */);
+    }
+
+    // Check scope sections contents.
+    function examineScopes() {
+        var scopeVariablesSection = test._findNode('//div[@id="scripts-sidebar"]/div[div[@class="title"]/text()="Scope Variables"]');
+        var expectedScopes = [
+            {
+                title: "Local",
+                properties: {
+                    x:"2009",
+                    innerFunctionLocalVar:"2011",
+                    "this": "global",
+                }
+            },
+            {
+                title: "Closure",
+                properties: {
+                    n:"TextParam",
+                    makeClosureLocalVar:"local.TextParam",
+                }
+            },
+            {
+                title: "Global",
+            },
+        ];
+        var it = test._nodeIterator('./div[@class="body"]/div', scopeVariablesSection);
+        var scopeIndex = 0;
+        var scopeDiv;
+        while (scopeDiv = it.iterateNext()) {
+            test.assertTrue(scopeIndex < expectedScopes.length, "Too many scopes.");
+            test._checkScopeSectionDiv(scopeDiv, expectedScopes[scopeIndex]);
+            ++scopeIndex;
+        }
+        test.assertEquals(expectedScopes.length, scopeIndex, "Unexpected number of scopes.");
+
+        test.releaseControl();
+    }
+
+    test.takeControl();
+};
+
+
+/**
+ * Returns child tree element for a property with given name.
+ * @param {TreeElement} parent Parent tree element.
+ * @param {string} childName
+ * @param {string} objectPath Path to the object. Will be printed in the case
+ *     of failure.
+ * @return {TreeElement}
+ */
+TestSuite.prototype._findChildProperty = function(parent, childName, objectPath)
+{
+    var children = parent.children;
+    for (var i = 0; i < children.length; i++) {
+        var treeElement = children[i];
+        var property = treeElement.property;
+        if (property.name === childName)
+            return treeElement;
+    }
+    this.fail('Cannot find property "' + childName + '" in ' + objectPath);
+};
+
+
+/**
+ * Executes the 'code' with InjectedScriptAccess.getProperties overriden
+ * so that all callbacks passed to InjectedScriptAccess.getProperties are
+ * extended with the "hook".
+ * @param {Function} hook The hook function.
+ * @param {Function} code A code snippet to be executed.
+ */
+TestSuite.prototype._hookGetPropertiesCallback = function(hook, code)
+{
+    var accessor = InjectedScriptAccess.prototype;
+    var orig = accessor.getProperties;
+    accessor.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback) {
+        orig.call(this, objectProxy, ignoreHasOwnProperty, abbreviate,
+            function() {
+              callback.apply(this, arguments);
+              hook();
+            });
+    };
+    try {
+        code();
+    } finally {
+        accessor.getProperties = orig;
+    }
+};
+
+
+/**
+ * Tests that all elements in prototype chain of an object have expected
+ * intrinic proprties(__proto__, constructor, prototype).
+ */
+TestSuite.prototype.testDebugIntrinsicProperties = function()
+{
+    this.showPanel("scripts");
+    var test = this;
+
+    this._executeCodeWhenScriptsAreParsed("handleClick()", ["debugger_intrinsic_properties.html"]);
+
+    this._waitForScriptPause(
+        {
+            functionsOnStack: ["callDebugger", "handleClick", "(anonymous function)"],
+            lineNumber: 29,
+            lineText: "  debugger;"
+        },
+        expandLocalScope);
+
+    var localScopeSection = null;
+    function expandLocalScope() {
+      test._expandScopeSections(function(sections, i) {
+              if (i === 0) {
+                  test.assertTrue(sections[i].object.isLocal, "Scope #0 is not Local.");
+                  localScopeSection = sections[i];
+                  return true;
+              }
+              return false;
+          },
+          examineLocalScope);
+    }
+
+    function examineLocalScope() {
+      var scopeExpectations = [
+          "a", "Object", [
+              "constructor", "function Child()", [
+                  "constructor", "function Function()", null,
+                  "name", "Child", null,
+                  "prototype", "Object", [
+                      "childProtoField", 21, null
+                  ]
+              ],
+
+            "__proto__", "Object", [
+                  "__proto__", "Object", [
+                      "__proto__", "Object", [
+                          "__proto__", "null", null,
+                          "constructor", "function Object()", null,
+                      ],
+                    "constructor", "function Parent()", [
+                        "name", "Parent", null,
+                        "prototype", "Object", [
+                            "parentProtoField", 11, null,
+                        ]
+                    ],
+                    "parentProtoField", 11, null,
+                ],
+                "constructor", "function Child()", null,
+                "childProtoField", 21, null,
+            ],
+
+            "parentField", 10, null,
+            "childField", 20, null,
+          ]
+      ];
+
+      checkProperty(localScopeSection.propertiesTreeOutline, "<Local Scope>", scopeExpectations);
+    }
+
+    var propQueue = [];
+    var index = 0;
+    var expectedFinalIndex = 8;
+
+    function expandAndCheckNextProperty() {
+        if (index === propQueue.length) {
+            test.assertEquals(expectedFinalIndex, index, "Unexpected number of expanded objects.");
+            test.releaseControl();
+            return;
+        }
+
+        // Read next property data from the queue.
+        var treeElement = propQueue[index].treeElement;
+        var path = propQueue[index].path;
+        var expectations = propQueue[index].expectations;
+        index++;
+
+        // Expand the property.
+        test._hookGetPropertiesCallback(function() {
+                checkProperty(treeElement, path, expectations);
+            },
+            function() {
+                treeElement.expand();
+            });
+    }
+
+    function checkProperty(treeElement, path, expectations) {
+        for (var i = 0; i < expectations.length; i += 3) {
+            var name = expectations[i];
+            var description = expectations[i+1];
+            var value = expectations[i+2];
+
+            var propertyPath = path + "." + name;
+            var propertyTreeElement = test._findChildProperty(treeElement, name, path);
+            test.assertTrue(propertyTreeElement, 'Property "' + propertyPath + '" not found.');
+            test.assertEquals(description, propertyTreeElement.property.value.description, 'Unexpected "' + propertyPath + '" description.');
+            if (value) {
+                // Schedule property content check.
+                propQueue.push({
+                    treeElement: propertyTreeElement,
+                    path: propertyPath,
+                    expectations: value,
+                });
+            }
+        }
+        // Check next property in the queue.
+        expandAndCheckNextProperty();
+    }
+
+    test.takeControl();
+};
+
+
+/**
+ * Tests "Pause" button will pause debugger when a snippet is evaluated.
+ */
+TestSuite.prototype.testPauseInEval = function()
+{
+    this.showPanel("scripts");
+
+    var test = this;
+
+    var pauseButton = document.getElementById("scripts-pause");
+    pauseButton.click();
+
+    devtools.tools.evaluateJavaScript("fib(10)");
+
+    this.addSniffer(WebInspector, "pausedScript",
+        function() {
+            test.releaseControl();
+        });
+
+    test.takeControl();
+};
+
+
+/**
+ * Key event with given key identifier.
+ */
+TestSuite.createKeyEvent = function(keyIdentifier)
+{
+    var evt = document.createEvent("KeyboardEvent");
+    evt.initKeyboardEvent("keydown", true /* can bubble */, true /* can cancel */, null /* view */, keyIdentifier, "");
+    return evt;
+};
+
+
+/**
+ * Tests console eval.
+ */
+TestSuite.prototype.testConsoleEval = function()
+{
+    var test = this;
+    this.evaluateInConsole_("123",
+        function(resultText) {
+            test.assertEquals("123", resultText);
+            test.releaseControl();
+        });
+
+    this.takeControl();
+};
+
+
+/**
+ * Tests console log.
+ */
+TestSuite.prototype.testConsoleLog = function()
+{
+    WebInspector.console.visible = true;
+    var messages = WebInspector.console.messages;
+    var index = 0;
+
+    var test = this;
+    var assertNext = function(line, message, opt_class, opt_count, opt_substr) {
+        var elem = messages[index++].toMessageElement();
+        var clazz = elem.getAttribute("class");
+        var expectation = (opt_count || '') + 'console_test_page.html:' + line + message;
+        if (opt_substr)
+            test.assertContains(elem.textContent, expectation);
+        else
+            test.assertEquals(expectation, elem.textContent);
+        if (opt_class)
+            test.assertContains(clazz, "console-" + opt_class);
+    };
+
+    assertNext("5", "log", "log-level");
+    assertNext("7", "debug", "log-level");
+    assertNext("9", "info", "log-level");
+    assertNext("11", "warn", "warning-level");
+    assertNext("13", "error", "error-level");
+    assertNext("15", "Message format number 1, 2 and 3.5");
+    assertNext("17", "Message format for string");
+    assertNext("19", "Object Object");
+    assertNext("22", "repeated", "log-level", 5);
+    assertNext("26", "count: 1");
+    assertNext("26", "count: 2");
+    assertNext("29", "group", "group-title");
+    index++;
+    assertNext("33", "timer:", "log-level", "", true);
+    assertNext("35", "1 2 3", "log-level");
+    assertNext("37", "HTMLDocument", "log-level");
+    assertNext("39", "<html>", "log-level", "", true);
+};
+
+
+/**
+ * Tests eval of global objects.
+ */
+TestSuite.prototype.testEvalGlobal = function()
+{
+    WebInspector.console.visible = true;
+
+    var inputs = ["foo", "foobar"];
+    var expectations = ["foo", "fooValue", "foobar", "ReferenceError: foobar is not defined"];
+
+    // Do not change code below - simply add inputs and expectations above.
+    var initEval = function(input) {
+        WebInspector.console.prompt.text = input;
+        WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
+    };
+    var test = this;
+    var messagesCount = 0;
+    var inputIndex = 0;
+    this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",
+        function(commandResult) {
+            messagesCount++;
+            if (messagesCount === expectations.length) {
+                var messages = WebInspector.console.messages;
+                for (var i = 0; i < expectations; ++i) {
+                    var elem = messages[i++].toMessageElement();
+                    test.assertEquals(elem.textContent, expectations[i]);
+                }
+                test.releaseControl();
+            } else if (messagesCount % 2 === 0)
+                initEval(inputs[inputIndex++]);
+        }, true);
+
+    initEval(inputs[inputIndex++]);
+    this.takeControl();
+};
+
+
+/**
+ * Tests that Storage panel can be open and that local DOM storage is added
+ * to the panel.
+ */
+TestSuite.prototype.testShowStoragePanel = function()
+{
+    var test = this;
+    this.addSniffer(WebInspector.panels.storage, "addDOMStorage",
+        function(storage) {
+            var orig = storage.getEntries;
+            storage.getEntries = function(callback) {
+                orig.call(this, function(entries) {
+                    callback(entries);
+                    test.releaseControl();
+                });
+            };
+            try {
+                WebInspector.currentPanel.selectDOMStorage(storage.id);
+                storage.getEntries = orig;
+            } catch (e) {
+                test.fail("Exception in selectDOMStorage: " + e);
+            }
+        });
+    this.showPanel("storage");
+
+    // Access localStorage so that it's pushed to the frontend.
+    this.evaluateInConsole_(
+        'setTimeout("localStorage.x = 10" , 0)',
+        function(resultText) {
+            test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
+        });
+
+    // Wait until DOM storage is added to the panel.
+    this.takeControl();
+};
+
+
+/**
+ * Test runner for the test suite.
+ */
+var uiTests = {};
+
+
+/**
+ * Run each test from the test suit on a fresh instance of the suite.
+ */
+uiTests.runAllTests = function()
+{
+    // For debugging purposes.
+    for (var name in TestSuite.prototype) {
+        if (name.substring(0, 4) === "test" && typeof TestSuite.prototype[name] === "function")
+            uiTests.runTest(name);
+    }
+};
+
+
+/**
+ * Run specified test on a fresh instance of the test suite.
+ * @param {string} name Name of a test method from TestSuite class.
+ */
+uiTests.runTest = function(name)
+{
+    new TestSuite().runTest(name);
+};
+
+
+}
+
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/back.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/back.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/back.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/back.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointBorder.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointBorder.png
new file mode 100644
index 0000000..0b1b550
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointBorder.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png
new file mode 100644
index 0000000..430e37e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalBorder.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png
new file mode 100644
index 0000000..b4a5030
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointConditionalCounterBorder.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png
new file mode 100644
index 0000000..8b77b61
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointCounterBorder.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png
new file mode 100644
index 0000000..ce49aac
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsActivateButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png
new file mode 100644
index 0000000..5c5fcf6
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/breakpointsDeactivateButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/checker.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/checker.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/checker.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/checker.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/clearConsoleButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/closeButtons.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/closeButtons.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/closeButtons.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/closeButtons.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/consoleIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/cookie.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/cookie.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/cookie.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/cookie.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/database.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/database.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/database.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/database.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/databaseTable.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/databaseTable.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/databaseTable.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/databaseTable.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerContinue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerContinue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerContinue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerContinue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerPause.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerPause.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerPause.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerPause.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepInto.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepInto.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepInto.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepInto.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOut.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOut.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOut.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOut.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOver.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOver.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOver.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/debuggerStepOver.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDown.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallDownWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRight.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDown.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/disclosureTriangleSmallRightWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/dockButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/dockButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/elementsIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/elementsIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/elementsIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/elementsIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/enableOutlineButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/enableSolidButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorMediumIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorMediumIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorMediumIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorMediumIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorRedDot.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorRedDot.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/errorRedDot.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/errorRedDot.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/excludeButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/focusButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/focusButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/forward.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/forward.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/forward.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/forward.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/gearButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/gearButtonGlyph.png
new file mode 100644
index 0000000..19659c9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/gearButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeader.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeader.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeader.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeader.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderPressed.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelected.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/glossyHeaderSelectedPressed.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/goArrow.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/goArrow.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/goArrow.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/goArrow.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutLeft.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/graphLabelCalloutRight.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/grayConnectorPoint.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/grayConnectorPoint.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/largerResourcesButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/localStorage.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/localStorage.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/localStorage.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/localStorage.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/nodeSearchButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrow.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrow.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrow.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrow.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneBottomGrowActive.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneGrowHandleLine.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneSettingsButtons.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/paneSettingsButtons.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/pauseOnExceptionButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/percentButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/percentButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverArrows.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverArrows.png
new file mode 100644
index 0000000..ccefa16
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverArrows.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverBackground.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverBackground.png
new file mode 100644
index 0000000..f20c988
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/popoverBackground.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileGroupIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileGroupIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileGroupIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileGroupIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileSmallIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileSmallIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profileSmallIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profileSmallIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesSilhouette.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesSilhouette.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesSilhouette.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/profilesSilhouette.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/programCounterBorder.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/programCounterBorder.png
new file mode 100644
index 0000000..fed2f3e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/programCounterBorder.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/radioDot.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/radioDot.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/radioDot.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/radioDot.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/recordButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/recordButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/recordToggledButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/reloadButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceCSSIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceCSSIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceDocumentIconSmall.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceJSIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceJSIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceJSIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourceJSIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcePlainIconSmall.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSilhouette.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSilhouette.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesSizeGraphIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/resourcesTimeGraphIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsSilhouette.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/scriptsSilhouette.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBlue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBlue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBlue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBlue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallBrightBlue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallGray.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallGray.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallGray.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallGray.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/searchSmallWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segment.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segment.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segment.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segment.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentEnd.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentEnd.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentEnd.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentEnd.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHover.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHover.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHover.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHover.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEnd.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEnd.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentHoverEndChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelected.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelected.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelected.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelected.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEnd.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/segmentSelectedEndChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/sessionStorage.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/sessionStorage.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/sessionStorage.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/sessionStorage.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDimple.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDimple.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDimple.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDimple.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/splitviewDividerBackground.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackground.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackground.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackground.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackground.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBackgroundChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackground.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarBottomBackgroundChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtons.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtons.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtons.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtons.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarButtonsChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButton.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButton.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelected.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
old mode 100644
new mode 100755
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerHorizontal.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/statusbarResizerVertical.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/storageIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/storageIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/storageIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/storageIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/successGreenDot.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/successGreenDot.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/successGreenDot.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/successGreenDot.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png
new file mode 100644
index 0000000..a6ee561
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveHoriz.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveVert.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveVert.png
new file mode 100644
index 0000000..a3eabe8
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbActiveVert.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoriz.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoriz.png
new file mode 100644
index 0000000..c16559a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoriz.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png
new file mode 100644
index 0000000..0fe8d6a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverHoriz.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverVert.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverVert.png
new file mode 100644
index 0000000..30e315a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbHoverVert.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbVert.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbVert.png
new file mode 100644
index 0000000..61fbc06
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/thumbVert.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarBlue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarBlue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarBlue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarBlue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGray.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGray.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGray.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGray.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGreen.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGreen.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGreen.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarGreen.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarOrange.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarOrange.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarOrange.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarOrange.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarPurple.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarPurple.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarPurple.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarPurple.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarRed.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarRed.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarRed.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarRed.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarYellow.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarYellow.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarYellow.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineBarYellow.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineCheckmarks.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineCheckmarks.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineDots.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineDots.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineDots.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineDots.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillBlue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGray.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillGreen.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillOrange.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillPurple.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillRed.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineHollowPillYellow.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelineIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillBlue.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillBlue.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillBlue.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillBlue.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGray.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGray.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGray.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGray.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGreen.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGreen.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGreen.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillGreen.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillOrange.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillOrange.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillOrange.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillOrange.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillPurple.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillPurple.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillPurple.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillPurple.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillRed.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillRed.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillRed.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillRed.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillYellow.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillYellow.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillYellow.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/timelinePillYellow.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/toolbarItemSelected.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/toolbarItemSelected.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackHoriz.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackHoriz.png
new file mode 100644
index 0000000..517d306
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackHoriz.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackVert.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackVert.png
new file mode 100644
index 0000000..d49620d
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/trackVert.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeDownTriangleWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeRightTriangleWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleBlack.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/treeUpTriangleWhite.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/undockButtonGlyph.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/undockButtonGlyph.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputPreviousIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputResultIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputResultIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputResultIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/userInputResultIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningMediumIcon.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningMediumIcon.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningMediumIcon.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningMediumIcon.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningOrangeDot.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningOrangeDot.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningOrangeDot.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningOrangeDot.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningsErrors.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningsErrors.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/warningsErrors.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/warningsErrors.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/Images/whiteConnectorPoint.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/audits.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/audits.css
new file mode 100644
index 0000000..31b2287
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/audits.css
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.audits-sidebar-tree-item .icon {
+    content: url(Images/resourcesTimeGraphIcon.png);
+}
+
+.audit-result-sidebar-tree-item .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+#audit-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+    overflow: auto;
+}
+
+button.clear-audit-results-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+.audit-launcher-view {
+    z-index: 1000;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: white;
+    font-size: 13px;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    display: none;
+}
+
+.audit-launcher-view.visible {
+    display: block;
+}
+
+.audit-launcher-view .audit-launcher-view-content {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: 0 0 0 16px;
+    white-space: nowrap;
+}
+
+.audit-launcher-view h1 {
+    color: rgb(110, 116, 128);
+    font-size: 16px;
+    line-height: 20px;
+    font-weight: normal;
+    padding-top: 15px;
+}
+
+.audit-launcher-view h1.no-audits {
+    text-align: center;
+    font-style: italic;
+    position: relative;
+    left: -8px;
+}
+
+.audit-launcher-view div.button-container {
+    position: absolute;
+    width: 100%;
+    bottom: 16px;
+    padding-top: 16px;
+}
+
+.audit-launcher-view div.audit-categories-container {
+    position: relative;
+    top: 11px;
+    left: 0;
+    width: 100%;
+    overflow-y: auto;
+}
+
+.audit-launcher-view button {
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+.audit-launcher-view button {
+    font-size: 13px;
+    padding: 3px 20px;
+    height: 24px;
+    margin: 0 5px 0 0;
+}
+
+.audit-launcher-view button:active {
+    background-color: rgb(215, 215, 215);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+body.inactive .audit-launcher-view button, .audit-launcher-view button:disabled {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
+}
+
+.audit-launcher-view label {
+    position: relative;
+    display: block;
+    text-align: left;
+    word-break: break-word;
+    padding: 0 0 5px 0;
+}
+
+.audit-launcher-view label.disabled {
+    color: rgb(130, 130, 130);
+}
+
+.audit-launcher-view input[type="checkbox"] {
+    margin-left: 0;
+}
+
+.audit-launcher-view input[type="radio"] {
+    height: 17px;
+    width: 17px;
+    border: 1px solid rgb(165, 165, 165);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 8px;
+    -webkit-appearance: none;
+    vertical-align: middle;
+    margin: 0 5px 5px 0;
+}
+
+.audit-launcher-view input[type="radio"]:active:not(:disabled) {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+.audit-launcher-view input[type="radio"]:checked:not(:disabled), .audit-launcher-view input[type="radio"]:checked:disabled {
+    background: url(Images/radioDot.png) center no-repeat,
+                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+}
+
+.audit-result-view {
+    overflow: auto;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    display: none;
+}
+
+.audit-result-view.visible {
+    display: block;
+}
+
+.audit-result-view .severity-severe {
+    content: url(Images/errorRedDot.png);
+}
+
+.audit-result-view .severity-warning {
+    content: url(Images/warningOrangeDot.png);
+}
+
+.audit-result-view .severity-info {
+    content: url(Images/successGreenDot.png);
+}
+
+.audit-result-tree li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+    padding-right: 2px;
+}
+
+.audit-result-tree {
+    font-size: 11px;
+    line-height: 14px;
+}
+
+.audit-result-tree > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    color: rgb(84, 84, 84);
+    cursor: default;
+    min-width: 100%;
+}
+
+.audit-result-tree, .audit-result-tree ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.audit-result-tree li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-bottom: 1px;
+    word-wrap: break-word;
+    text-indent: -2px;
+}
+
+.audit-result-tree li.parent {
+    text-indent: -12px
+}
+
+.audit-result-tree li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 0;
+    padding-right: 2px;
+}
+
+.audit-result-tree li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.audit-result-tree ol.children {
+    display: none;
+}
+
+.audit-result-tree ol.children.expanded {
+    display: block;
+}
+
+.audit-result {
+    font-weight: bold;
+    color: black;
+}
+
+.audit-result img {
+    float: left;
+    margin-left: -40px;
+    margin-top: -1px;
+}
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devTools.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devTools.css
new file mode 100755
index 0000000..bb33f72
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devTools.css
@@ -0,0 +1,238 @@
+#scripts-files option.injected {
+    color: rgb(70, 134, 240);
+}
+
+.data-grid table {
+    line-height: 120%;
+}
+
+body.attached #toolbar {
+    height: 34px;
+    border-top: 1px solid rgb(100, 100, 100);
+    cursor: default; /* overriden */
+    padding-left: 0;
+}
+
+/* Chrome theme overrides */
+
+body.platform-windows #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(242, 247, 253)), to(rgb(223, 234, 248)));
+}
+
+body.platform-windows.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(248, 248, 248)), to(rgb(237, 237, 237)));
+}
+
+body.detached.platform-mac-leopard #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(175, 175, 175)), to(rgb(151, 151, 151))) !important;
+}
+
+body.detached.platform-mac-leopard.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(221, 221, 221)), to(rgb(207, 207, 207))) !important;
+}
+
+body.detached.platform-mac-snowleopard #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(189, 189, 189)), to(rgb(151, 151, 151))) !important;
+}
+
+body.detached.platform-mac-snowleopard.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(215, 215, 215)), to(rgb(207, 207, 207))) !important;
+}
+
+/* Heap Profiler Styles */
+
+.heap-snapshot-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.heap-snapshot-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.heap-snapshot-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.heap-snapshot-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.heap-snapshot-view.visible {
+    display: block;
+}
+
+.heap-snapshot-view .data-grid {
+    border: none;
+    max-height: 100%;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 93px;
+}
+
+.heap-snapshot-view .data-grid th.count-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.count-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.size-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.size-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.countDelta-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.countDelta-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid th.sizeDelta-column {
+    text-align: center;
+}
+
+.heap-snapshot-view .data-grid td.sizeDelta-column {
+    text-align: right;
+}
+
+#heap-snapshot-summary-container {
+    position: absolute;
+    padding-top: 20px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 93px;
+    margin-left: -1px;
+    border-left: 1px solid rgb(102, 102, 102);
+    background-color: rgb(101, 111, 130);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+    background-repeat: repeat-x;
+    background-position: top;
+    text-align: center;
+    text-shadow: black 0 1px 1px;
+    white-space: nowrap;
+    color: white;
+    -webkit-background-size: 1px 6px;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.heap-snapshot-summary {
+    display: inline-block;
+    width: 50%;
+    min-width: 300px;
+    position: relative;
+}
+
+.heap-snapshot-summary canvas.summary-graph {
+    width: 225px;
+}
+
+.heap-snapshot-summary-label {
+    font-size: 12px;
+    font-weight: bold;
+    position: absolute;
+    top: 1px;
+    width: 50%;
+    left: 25%;
+}
+
+body.platform-windows .section > .header {
+    border: 1px solid rgb(92, 116, 157);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(105, 133, 180)), to(rgb(92, 116, 157)));
+}
+
+body.platform-windows .console-group-messages .section > .header {
+    padding: 0 8px 0 0;
+    background-image: none;
+    border: none;
+    min-height: 0;
+}
+
+body.platform-windows #resources-filter {
+    background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));
+}
+
+body.platform-windows .crumbs .crumb {
+    -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.end {
+    -webkit-border-image: url(Images/segmentEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows .crumbs .crumb.selected {
+    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
+    color: white;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;
+}
+
+body.platform-windows .crumbs .crumb.selected:hover {
+    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
+    -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows .crumbs .crumb:hover {
+    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.dimmed:hover {
+    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;
+}
+
+body.platform-windows .crumbs .crumb.end:hover {
+    -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;
+}
+
+body.platform-windows body.drawer-visible #main-status-bar {
+    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);
+}
+
+body.platform-windows .status-bar {
+    background-image: url(Images/statusbarBackgroundChromium.png);
+}
+
+body.platform-windows button.status-bar-item {
+    background-image: url(Images/statusbarButtonsChromium.png);
+}
+
+body.platform-windows select.status-bar-item:active {
+    -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;
+}
+
+body.platform-windows #drawer {
+    background-image: url(Images/statusbarBottomBackgroundChromium.png);
+}
+
+body.platform-windows select.status-bar-item {
+    -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;
+}
+
+.scope-bar li.selected {
+    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
+}
+
+.scope-bar li:active {
+    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);
+}
+
+.timeline-category-tree-item input {
+    vertical-align: middle;
+}
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devtools.html b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devtools.html
new file mode 100644
index 0000000..6c8e28e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/devtools.html
@@ -0,0 +1,162 @@
+<!--
+Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1.  Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+2.  Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+    its contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <link rel="stylesheet" type="text/css" href="audits.css">
+    <link rel="stylesheet" type="text/css" href="inspector.css">
+    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
+    <link rel="stylesheet" type="text/css" href="popover.css">
+    <link rel="stylesheet" type="text/css" href="textViewer.css">
+    <script type="text/javascript" src="utilities.js"></script>
+    <script type="text/javascript" src="treeoutline.js"></script>
+    <script type="text/javascript" src="inspector.js"></script>
+    <script type="text/javascript" src="InspectorBackendStub.js"></script>
+    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
+    <script type="text/javascript" src="Object.js"></script>
+    <script type="text/javascript" src="Settings.js"></script>
+    <script type="text/javascript" src="ContextMenu.js"></script>
+    <script type="text/javascript" src="KeyboardShortcut.js"></script>
+    <script type="text/javascript" src="TextPrompt.js"></script>
+    <script type="text/javascript" src="Popover.js"></script>
+    <script type="text/javascript" src="Placard.js"></script>
+    <script type="text/javascript" src="View.js"></script>
+    <script type="text/javascript" src="Callback.js"></script>
+    <script type="text/javascript" src="Drawer.js"></script>
+    <script type="text/javascript" src="ChangesView.js"></script>
+    <script type="text/javascript" src="ConsoleView.js"></script>
+    <script type="text/javascript" src="Panel.js"></script>
+    <script type="text/javascript" src="TimelineGrid.js"></script>    
+    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
+    <script type="text/javascript" src="Resource.js"></script>
+    <script type="text/javascript" src="ResourceCategory.js"></script>
+    <script type="text/javascript" src="Database.js"></script>
+    <script type="text/javascript" src="DOMStorage.js"></script>
+    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
+    <script type="text/javascript" src="DataGrid.js"></script>
+    <script type="text/javascript" src="CookieItemsView.js"></script>
+    <script type="text/javascript" src="Script.js"></script>
+    <script type="text/javascript" src="Breakpoint.js"></script>
+    <script type="text/javascript" src="SidebarPane.js"></script>
+    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
+    <script type="text/javascript" src="SidebarTreeElement.js"></script>
+    <script type="text/javascript" src="Section.js"></script>
+    <script type="text/javascript" src="PropertiesSection.js"></script>
+    <script type="text/javascript" src="ObjectProxy.js"></script>
+    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
+    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
+    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
+    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
+    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
+    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
+    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
+    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
+    <script type="text/javascript" src="Color.js"></script>
+    <script type="text/javascript" src="StylesSidebarPane.js"></script>
+    <script type="text/javascript" src="PanelEnablerView.js"></script>
+    <script type="text/javascript" src="WelcomeView.js"></script>
+    <script type="text/javascript" src="StatusBarButton.js"></script>
+    <script type="text/javascript" src="SummaryBar.js"></script>
+    <script type="text/javascript" src="ElementsPanel.js"></script>
+    <script type="text/javascript" src="ResourcesPanel.js"></script>
+    <script type="text/javascript" src="InjectedFakeWorker.js"></script>
+    <script type="text/javascript" src="ScriptsPanel.js"></script>
+    <script type="text/javascript" src="StoragePanel.js"></script>
+    <script type="text/javascript" src="ProfilesPanel.js"></script>
+    <script type="text/javascript" src="ConsolePanel.js"></script>
+    <script type="text/javascript" src="AuditsPanel.js"></script>
+    <script type="text/javascript" src="AuditResultView.js"></script>
+    <script type="text/javascript" src="AuditLauncherView.js"></script>
+    <script type="text/javascript" src="AuditRules.js"></script>
+    <script type="text/javascript" src="AuditCategories.js"></script>
+    <script type="text/javascript" src="ResourceView.js"></script>
+    <script type="text/javascript" src="SourceFrame.js"></script>
+    <script type="text/javascript" src="DOMSyntaxHighlighter.js"></script>
+    <script type="text/javascript" src="TextEditorModel.js"></script>
+    <script type="text/javascript" src="TextEditorHighlighter.js"></script>
+    <script type="text/javascript" src="TextViewer.js"></script>
+    <script type="text/javascript" src="SourceTokenizer.js"></script>
+    <script type="text/javascript" src="SourceCSSTokenizer.js"></script>
+    <script type="text/javascript" src="SourceHTMLTokenizer.js"></script>
+    <script type="text/javascript" src="SourceJavaScriptTokenizer.js"></script>
+    <script type="text/javascript" src="SourceView.js"></script>
+    <script type="text/javascript" src="FontView.js"></script>
+    <script type="text/javascript" src="ImageView.js"></script>
+    <script type="text/javascript" src="DatabaseTableView.js"></script>
+    <script type="text/javascript" src="DatabaseQueryView.js"></script>
+    <script type="text/javascript" src="ScriptView.js"></script>
+    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="ProfileView.js"></script>
+    <script type="text/javascript" src="DOMAgent.js"></script>
+    <script type="text/javascript" src="InjectedScript.js"></script>
+    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
+    <script type="text/javascript" src="TimelineAgent.js"></script>
+    <script type="text/javascript" src="TimelinePanel.js"></script>
+    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
+    <script type="text/javascript" src="TestController.js"></script>
+
+    <!-- The following lines are added to include DevTools resources -->
+    <link rel="stylesheet" type="text/css" href="devTools.css">
+    <script type="text/javascript" src="codemap.js"></script>
+    <script type="text/javascript" src="consarray.js"></script>
+    <script type="text/javascript" src="csvparser.js"></script>
+    <script type="text/javascript" src="logreader.js"></script>
+    <script type="text/javascript" src="profile.js"></script>
+    <script type="text/javascript" src="profile_view.js"></script>
+    <script type="text/javascript" src="splaytree.js"></script>
+    <script type="text/javascript" src="InspectorControllerImpl.js"></script>
+    <script type="text/javascript" src="DebuggerAgent.js"></script>
+    <script type="text/javascript" src="ProfilerAgent.js"></script>
+    <script type="text/javascript" src="ProfilerProcessor.js"></script>
+    <script type="text/javascript" src="HeapProfilerPanel.js"></script>
+    <script type="text/javascript" src="DevTools.js"></script>
+    <script type="text/javascript" src="DevToolsHostStub.js"></script>
+    <script type="text/javascript" src="Tests.js"></script>
+    <!-- End of auto-added files list -->
+</head>
+<body class="detached">
+    <div id="toolbar">
+        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
+        <div class="toolbar-item flexable-space"></div>
+        <div class="toolbar-item hidden" id="search-results-matches"></div>
+        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
+        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
+    </div>
+    <div id="main">
+        <div id="main-panels" spellcheck="false"></div>
+        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
+    </div>
+    <div id="drawer">
+        <div id="console-view"><div id="console-messages" class="monospace"><div id="console-prompt" spellcheck="false"><br></div></div></div>
+        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
+    </div>
+</body>
+</html>
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.css
new file mode 100644
index 0000000..870e509
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.css
@@ -0,0 +1,3883 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+body {
+    cursor: default;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    overflow: hidden;
+    font-family: Lucida Grande, sans-serif;
+    font-size: 10px;
+    margin: 0;
+    -webkit-text-size-adjust: none;
+    -webkit-user-select: none;
+}
+
+* {
+    -webkit-box-sizing: border-box;
+}
+
+:focus {
+    outline: none;
+}
+
+input[type="search"]:focus, input[type="text"]:focus {
+    outline: auto 5px -webkit-focus-ring-color;
+}
+
+iframe, a img {
+    border: none;
+}
+
+img {
+    -webkit-user-drag: none;
+}
+
+.hidden {
+    display: none !important;
+}
+
+#toolbar {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 56px;
+    display: -webkit-box;
+    padding: 0 5px;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(191, 191, 191)), to(rgb(151, 151, 151)));
+    border-bottom: 1px solid rgb(80, 80, 80);
+    -webkit-box-orient: horizontal;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+body.inactive #toolbar {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(207, 207, 207)));
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+}
+
+body.detached.platform-mac-leopard #toolbar,
+body.detached.platform-mac-snowleopard #toolbar {
+    background: transparent !important;
+}
+
+body.attached #toolbar {
+    height: 34px;
+    border-top: 1px solid rgb(100, 100, 100);
+    cursor: row-resize;
+    padding-left: 0;
+}
+
+body.attached.port-qt #toolbar {
+    cursor: auto;
+}
+
+body.attached.inactive #toolbar {
+    border-top: 1px solid rgb(64%, 64%, 64%);
+}
+
+.toolbar-item {
+    display: -webkit-box;
+    padding: 4px 6px;
+    margin: 0;
+    background-color: transparent;
+    border-style: none;
+    border-color: transparent;
+    -webkit-box-orient: vertical;
+    -webkit-box-align: center;
+    -webkit-box-pack: end;
+}
+
+.toolbar-item.toggleable.toggled-on {
+    border-width: 0 2px 0 2px;
+    padding: 4px 4px;
+    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;
+}
+
+.toolbar-item.flexable-space {
+    -webkit-box-flex: 1;
+    visibility: hidden;
+}
+
+.toolbar-item input {
+    margin-bottom: 8px;
+}
+
+.toolbar-icon {
+    display: inline-block;
+    width: 32px;
+    height: 32px;
+    -webkit-background-size: 100% auto;
+}
+
+body.attached .toolbar-icon {
+    width: 24px;
+    height: 24px;
+    vertical-align: middle;
+}
+
+.toolbar-item:active .toolbar-icon {
+    background-position: 0 32px;
+}
+
+body.attached .toolbar-item:active .toolbar-icon {
+    background-position: 0 24px;
+}
+
+.toolbar-label {
+    font-size: 11px;
+    font-family: Lucida Grande, sans-serif;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+}
+
+.toolbar-item.toggleable:active .toolbar-label {
+    text-shadow: none;
+}
+
+body.attached .toolbar-label {
+    display: inline-block;
+    vertical-align: middle;
+    margin-left: 3px;
+}
+
+body.attached #search-toolbar-label {
+    display: none;
+}
+
+#search {
+    width: 205px;
+    font-size: 16px;
+    margin-bottom: 5px;
+}
+
+body.attached #search {
+    font-size: 11px;
+    margin-bottom: 8px;
+}
+
+#search-results-matches {
+    font-size: 11px;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    margin-bottom: 22px;
+}
+
+body.attached #search-results-matches {
+    margin-bottom: 6px;
+}
+
+.toolbar-item.elements .toolbar-icon {
+    background-image: url(Images/elementsIcon.png);
+}
+
+.toolbar-item.resources .toolbar-icon {
+    background-image: url(Images/resourcesIcon.png);
+}
+
+.toolbar-item.scripts .toolbar-icon {
+    background-image: url(Images/scriptsIcon.png);
+}
+
+.toolbar-item.timeline .toolbar-icon {
+    background-image: url(Images/timelineIcon.png);
+}
+
+.toolbar-item.storage .toolbar-icon {
+    background-image: url(Images/storageIcon.png);
+}
+
+.toolbar-item.profiles .toolbar-icon {
+    background-image: url(Images/profilesIcon.png);
+}
+
+.toolbar-item.console .toolbar-icon {
+    background-image: url(Images/consoleIcon.png);
+}
+
+#close-button-left, #close-button-right {
+    width: 14px;
+    height: 14px;
+    background-image: url(Images/closeButtons.png);
+    background-position: 0 0;
+    background-color: transparent;
+    border: 0 none transparent;
+    margin: 5px 0;
+}
+
+#close-button-left:hover, #close-button-right:hover {
+    background-position: 14px 0;
+}
+
+#close-button-left:active, #close-button-right:active {
+    background-position: 28px 0;
+}
+
+body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {
+    display: none;
+}
+
+body.attached.port-qt .toolbar-item.close-left, body.attached.port-qt .toolbar-item.close-right {
+    display: none;
+}
+
+body.platform-mac .toolbar-item.close-right {
+    display: none;
+}
+
+body:not(.platform-mac) .toolbar-item.close-left {
+    display: none;
+}
+
+#main {
+    position: absolute;
+    z-index: 1;
+    top: 56px;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: hidden;
+    background-color: white;
+}
+
+body.attached #main {
+    top: 34px;
+}
+
+#main-panels {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 23px;
+    overflow: hidden;
+}
+
+#main-status-bar {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+body.drawer-visible #main-status-bar {
+    height: 24px;
+    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackground.png);
+    background-repeat: no-repeat, repeat-x;
+    background-position: right center, center;
+    cursor: row-resize;
+}
+
+body.drawer-visible #main-status-bar * {
+    cursor: default;
+}
+
+body.drawer-visible #main-panels {
+    bottom: 24px;
+}
+
+.status-bar {
+    background-color: rgb(235, 235, 235);
+    background-image: url(Images/statusbarBackground.png);
+    background-repeat: repeat-x;
+    white-space: nowrap;
+    height: 23px;
+    overflow: hidden;
+    z-index: 12;
+}
+
+.status-bar > div {
+    display: inline-block;
+    vertical-align: top;
+}
+
+.status-bar-item {
+    display: inline-block;
+    height: 24px;
+    padding: 0;
+    margin-left: -1px;
+    margin-right: 0;
+    vertical-align: top;
+    border: 0 transparent none;
+    background-color: transparent;
+}
+
+.status-bar-item:active {
+    position: relative;
+    z-index: 200;
+}
+
+.glyph {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.75);
+    z-index: 1;
+}
+
+.glyph.shadow {
+    top: 1px;
+    background-color: white !important;
+    z-index: 0;
+}
+
+button.status-bar-item {
+    position: relative;
+    width: 32px;
+    background-image: url(Images/statusbarButtons.png);
+    background-position: 0 0;
+}
+
+button.status-bar-item:active {
+    background-position: 32px 0 !important;
+}
+
+button.status-bar-item .glyph.shadow {
+    background-color: rgba(255, 255, 255, 0.33) !important;
+}
+
+button.status-bar-item.toggled-on .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+button.status-bar-item.toggled-1 .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+button.status-bar-item.toggled-2 .glyph {
+    background-color: purple;   
+}
+
+button.status-bar-item:disabled {
+    opacity: 0.5;
+    background-position: 0 0 !important;
+}
+
+select.status-bar-item {
+    min-width: 48px;
+    border-width: 0 17px 0 2px;
+    padding: 0 2px 0 6px;
+    font-weight: bold;
+    color: rgb(48, 48, 48);
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    -webkit-border-image: url(Images/statusbarMenuButton.png) 0 17 0 2;
+    -webkit-border-radius: 0;
+    -webkit-appearance: none;
+}
+
+select.status-bar-item:active {
+    color: black;
+    -webkit-border-image: url(Images/statusbarMenuButtonSelected.png) 0 17 0 2;
+}
+
+#dock-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/undockButtonGlyph.png);
+}
+
+body.detached #dock-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/dockButtonGlyph.png);
+}
+
+body.port-qt #dock-status-bar-item {
+    display: none
+}
+
+#console-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/consoleButtonGlyph.png);
+}
+
+#clear-console-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+#changes-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/consoleButtonGlyph.png); /* TODO: Needs Image for Changes Toggle Button */
+}
+
+#clear-changes-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+#count-items {
+    position: absolute;
+    right: 16px;
+    top: 0;
+    cursor: pointer;
+    padding: 6px 2px;
+    font-size: 10px;
+    height: 19px;
+}
+
+#changes-count, #error-warning-count {
+    display: inline;
+}
+
+#error-warning-count:hover, #changes-count:hover {
+    border-bottom: 1px solid rgb(96, 96, 96);
+}
+
+#style-changes-count::before {
+    content: url(Images/styleIcon.png); /* TODO: Needs Image for Style Changes Icon */
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+
+#error-count::before {
+    content: url(Images/errorIcon.png);
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+    
+#changes-count + #error-warning-count, #error-count + #warning-count {
+    margin-left: 6px;
+}
+
+#warning-count::before {
+    content: url(Images/warningIcon.png);
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+
+#drawer {
+    display: none;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 200px;
+    background-color: white;
+    background-image: url(Images/statusbarBottomBackground.png);
+    background-repeat: repeat-x;
+    background-position: bottom;
+}
+
+body.drawer-visible #drawer {
+    display: block;
+}
+
+#drawer-status-bar {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background: none;
+}
+
+.monospace {
+    font-size: 10px;
+    font-family: monospace;
+}
+
+body.platform-mac .monospace, body.platform-mac .source-code {
+    font-family: Monaco, monospace;
+}
+
+/* Keep .platform-mac to make the rule more specific than the general one above. */
+body.platform-mac.platform-mac-snowleopard .monospace,
+body.platform-mac.platform-mac-snowleopard .source-code {
+    font-size: 11px;
+    font-family: Menlo, monospace;
+}
+
+body.platform-windows .monospace, body.platform-windows .source-code {
+    font-size: 12px;
+    font-family: Consolas, Lucida Console, monospace;
+}
+
+body.platform-linux .monospace, body.platform-linux .source-code {
+    font-size: 11px;
+    font-family: dejavu sans mono, monospace;
+}
+
+#console-messages {
+    position: absolute;
+    z-index: 0;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 23px;
+    padding: 2px 0;
+    overflow-y: overlay;
+    word-wrap: break-word;
+    -webkit-user-select: text;
+    -webkit-text-size-adjust: auto;
+}
+
+#console-prompt {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+#console-prompt::before {
+    background-image: url(Images/userInputIcon.png);
+}
+
+.console-user-command-result.console-log-level::before {
+    background-image: url(Images/userInputResultIcon.png);
+}
+
+.console-message, .console-user-command {
+    position: relative;
+    border-bottom: 1px solid rgb(240, 240, 240);
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+}
+
+.console-adjacent-user-command-result {
+    border-bottom: none;
+}
+
+.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {
+    background-image: none;
+}
+
+.console-message::before, .console-user-command::before, #console-prompt::before, .console-group-title::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: 7px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -5px;
+    -webkit-user-select: none;
+}
+
+.console-message .bubble {
+    display: inline-block;
+    height: 14px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    margin-top: -2px;
+    margin-right: 4px;
+    text-align: left;
+    font-size: 11px;
+    line-height: normal;
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    -webkit-border-radius: 7px;
+}
+
+.console-message-text {
+    white-space: pre-wrap;
+}
+
+.repeated-message {
+    padding-left: 6px;
+}
+
+.repeated-message.console-error-level::before, .repeated-message.console-warning-level:before, .repeated-message.console-debug-level:before {
+    visibility: hidden;
+}
+
+.console-group .console-group > .console-group-messages {
+    margin-left: 16px;
+}
+
+.console-group-title {
+    font-weight: bold;
+}
+
+.console-group-title::before {
+    background-image: url(Images/disclosureTriangleSmallDown.png);
+    top: 0.6em;
+    width: 11px;
+    height: 12px;
+}
+
+.console-group.collapsed .console-group-title::before {
+    background-image: url(Images/disclosureTriangleSmallRight.png);
+}
+
+.console-group.collapsed > .console-group-messages {
+    display: none;
+}
+
+.console-error-level .console-message-text {
+    color: red;
+}
+
+.console-debug-level .console-message-text {
+    color: blue;
+}
+
+.console-debug-level::before {
+    background-image: url(Images/searchSmallBrightBlue.png);
+}
+
+.console-error-level::before {
+    background-image: url(Images/errorIcon.png);
+}
+
+.console-warning-level::before {
+    background-image: url(Images/warningIcon.png);
+}
+
+.console-user-command .console-message {
+    margin-left: -24px;
+    padding-right: 0;
+    border-bottom: none;
+}
+
+.console-user-command::before {
+    background-image: url(Images/userInputPreviousIcon.png);
+}
+
+.console-user-command > .console-message-text {
+    color: rgb(0, 128, 255);
+}
+
+#console-messages a {
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+}
+
+#console-messages a:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+.console-message-url {
+    float: right;
+}
+
+.console-group-messages .section {
+    margin: 0 0 0 12px !important;
+}
+
+.console-group-messages .section .header {
+    padding: 0 8px 0 0;
+    background-image: none;
+    border: none;
+    min-height: 0;
+}
+
+.console-group-messages .section .header::before {
+    position: absolute;
+    top: 1px;
+    left: 1px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.console-group-messages .section.expanded .header::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.console-group-messages .section .header .title {
+    color: black;
+    font-weight: normal;
+}
+
+.console-group-messages .section .properties li .info {
+    padding-top: 0;
+    padding-bottom: 0;
+    color: rgb(60%, 60%, 60%);
+}
+
+.console-group-messages .outline-disclosure {
+    padding-left: 0;
+}
+
+.console-group-messages .outline-disclosure > ol {
+    padding: 0 0 0 12px !important;
+}
+
+.console-group-messages .outline-disclosure, .console-group-messages .outline-disclosure ol {
+    font-size: inherit;
+    line-height: 12px;
+}
+
+.console-group-messages .outline-disclosure.single-node li {
+    padding-left: 2px;
+}
+
+.console-group-messages .outline-disclosure li .selection {
+    margin-left: -6px;
+    margin-right: -6px;
+}
+
+.console-group-messages .add-attribute {
+    display: none;
+}
+
+.console-formatted-object, .console-formatted-node {
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+}
+
+.console-formatted-object .section, .console-formatted-node .section {
+    position: static;
+}
+
+.console-formatted-object .properties, .console-formatted-node .properties {
+    padding-left: 0 !important;
+}
+
+.console-formatted-number {
+    color: rgb(28, 0, 207);
+}
+
+.console-formatted-string, .console-formatted-regexp {
+    color: rgb(196, 26, 22);
+}
+
+.console-formatted-null, .console-formatted-undefined {
+    color: rgb(128, 128, 128);
+}
+
+.error-message {
+    color: red;
+}
+
+.auto-complete-text {
+    color: rgb(128, 128, 128);
+    -webkit-user-select: none;
+    -webkit-user-modify: read-only;
+}
+
+.panel {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.panel.visible {
+    display: block;
+}
+
+.resource-view {
+    display: none;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.resource-view.visible {
+    display: block;
+}
+
+.resource-view .scope-bar {
+    display: none;
+    position: absolute;
+    height: 20px;
+    top: 0;
+    left: 0;
+    right: 0;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.resource-view.headers-visible .scope-bar {
+    display: block;
+}
+
+.resource-view .scope-bar li {
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 0;
+}
+
+.resource-view-headers {
+    padding: 6px;
+    -webkit-user-select: text;    
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: auto;
+}
+
+.resource-view.headers-visible .resource-view-headers {
+    top: 20px;
+}
+
+.resource-view-headers .outline-disclosure .parent {
+    -webkit-user-select: none;
+    font-weight: bold;
+}
+
+.resource-view-headers .outline-disclosure .children li {
+    white-space: nowrap;
+}
+
+.resource-view-headers .outline-disclosure li.expanded .header-count {
+    display: none;
+}
+
+.resource-view-headers .outline-disclosure .header-name {
+    color: rgb(33%, 33%, 33%);
+    display: inline-block;
+    margin-right: 0.5em;
+    font-weight: bold;
+    vertical-align: top;
+    white-space: pre-wrap;
+}
+
+.resource-view-headers .outline-disclosure .header-value {
+    display: inline;
+    margin-right: 100px;
+    white-space: pre-wrap;
+    word-break: break-all;
+    margin-top: 1px;
+}
+
+.resource-view-headers .outline-disclosure .raw-form-data {
+    white-space:pre-wrap;
+}
+
+.resource-view .resource-view-content {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+}
+
+.resource-view.headers-visible .resource-view-content {
+    top: 20px;
+}
+
+.webkit-line-gutter-backdrop {
+    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
+    width: 31px;
+    background-color: rgb(240, 240, 240);
+    border-right: 1px solid rgb(187, 187, 187);
+    position: absolute;
+    z-index: -1;
+    left: 0;
+    top: 0;
+    height: 100%
+}
+
+.resource-view.font .resource-view-content {
+    font-size: 60px;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    text-align: center;
+    padding: 15px;
+}
+
+.resource-view.image .resource-view-content > .image {
+    padding: 20px 20px 10px 20px;
+    text-align: center;
+}
+
+.resource-view.image .resource-view-content > .info {
+    padding-bottom: 10px;
+    font-size: 11px;
+    -webkit-user-select: text;
+}
+
+.resource-view.image img.resource-image-view {
+    max-width: 100%;
+    max-height: 1000px;
+    background-image: url(Images/checker.png);
+    -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
+    -webkit-user-select: text;
+    -webkit-user-drag: auto;
+}
+
+.resource-url {
+    vertical-align: middle;
+}
+
+.resource-status-image {
+    margin-top: -3px;
+    vertical-align: middle;
+}
+
+.resource-view.image .title {
+    text-align: center;
+    font-size: 13px;
+}
+
+.resource-view.image .infoList {
+    margin: 0;
+}
+
+.resource-view.image .infoList dt {
+    font-weight: bold;
+    display: inline-block;
+    width: 50%;
+    text-align: right;
+    color: rgb(76, 76, 76);
+}
+
+.resource-view.image .infoList dd {
+    display: inline-block;
+    padding-left: 8px;
+    width: 50%;
+    text-align: left;
+    margin: 0;
+}
+
+.resource-view.image .infoList dd::after {
+    white-space: pre;
+    content: "\A";
+}
+
+#elements-content {
+    display: block;
+    overflow: auto;
+    padding: 0;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 225px;
+    bottom: 0;
+}
+
+#elements-sidebar {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    width: 225px;
+    background-color: rgb(245, 245, 245);
+    border-left: 1px solid rgb(64%, 64%, 64%);
+    cursor: default;
+    overflow: auto;
+}
+
+.crumbs {
+    display: inline-block;
+    font-size: 11px;
+    line-height: 19px;
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    color: rgb(20, 20, 20);
+    margin-left: -1px;
+    padding-right: 12px;
+}
+
+.crumbs .crumb {
+    height: 24px;
+    border-width: 0 12px 0 2px;
+    -webkit-border-image: url(Images/segment.png) 0 12 0 2;
+    margin-right: -12px;
+    padding-left: 18px;
+    padding-right: 2px;
+    white-space: nowrap;
+    line-height: 23px;
+    float: right;
+}
+
+.crumbs .crumb.collapsed > * {
+    display: none;
+}
+
+.crumbs .crumb.collapsed::before {
+    content: "\2026";
+    font-weight: bold;
+}
+
+.crumbs .crumb.compact .extra {
+    display: none;
+}
+
+.crumbs .crumb.dimmed {
+    color: rgba(0, 0, 0, 0.45);
+}
+
+.crumbs .crumb.start {
+    padding-left: 7px;
+}
+
+.crumbs .crumb.end {
+    border-width: 0 2px 0 2px;
+    padding-right: 6px;
+    -webkit-border-image: url(Images/segmentEnd.png) 0 2 0 2;
+}
+
+.crumbs .crumb.selected {
+    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
+    color: black;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+}
+
+.crumbs .crumb.selected:hover {
+    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;
+}
+
+.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {
+    -webkit-border-image: url(Images/segmentSelectedEnd.png) 0 2 0 2;
+}
+
+.crumbs .crumb:hover {
+    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
+    color: black;
+}
+
+.crumbs .crumb.dimmed:hover {
+    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;
+    color: rgba(0, 0, 0, 0.75);
+}
+
+.crumbs .crumb.end:hover {
+    -webkit-border-image: url(Images/segmentHoverEnd.png) 0 2 0 2;
+}
+
+.outline-disclosure li.hovered:not(.selected) .selection {
+    display: block;
+    left: 3px;
+    right: 3px;
+    background-color: rgba(56, 121, 217, 0.1);
+    -webkit-border-radius: 5px;
+}
+
+.outline-disclosure li.highlighted .highlight {
+    background-color: rgb(255, 230, 179);
+    -webkit-border-radius: 4px;
+    padding-bottom: 2px;
+    margin-bottom: -2px;
+}
+
+.outline-disclosure li.selected.highlighted .highlight {
+    background-color: transparent;
+    padding-bottom: 0;
+    margin-bottom: 0;
+}
+
+.outline-disclosure li .selection {
+    display: none;
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 15px;
+    z-index: -1;
+}
+
+.outline-disclosure li.selected .selection {
+    display: block;
+    background-color: rgb(212, 212, 212);
+}
+
+.outline-disclosure ol:focus li.selected .selection {
+    background-color: rgb(56, 121, 217);
+}
+
+.outline-disclosure {
+    font-size: 11px;
+}
+
+.outline-disclosure > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    color: black;
+    cursor: default;
+    min-width: 100%;
+}
+
+.outline-disclosure, .outline-disclosure ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.source-code {
+    font-family: monospace;
+    font-size: 10px;
+    white-space: pre-wrap;
+}
+
+.outline-disclosure li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-bottom: 1px;
+    word-wrap: break-word;
+    text-indent: -2px;
+}
+
+.resources .outline-disclosure li {
+    text-indent: -1px;
+}
+
+.outline-disclosure ol:focus li.selected {
+    color: white;
+}
+
+.outline-disclosure ol:focus li.selected * {
+    color: inherit;
+}
+
+.outline-disclosure li.parent {
+    text-indent: -12px
+}
+
+.outline-disclosure li .webkit-html-tag.close {
+    margin-left: -12px;
+}
+
+.outline-disclosure li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+    padding-right: 2px;
+}
+
+.outline-disclosure li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.outline-disclosure ol:focus li.parent.selected::before {
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.outline-disclosure li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.outline-disclosure ol:focus li.parent.expanded.selected::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.outline-disclosure ol.children {
+    display: none;
+}
+
+.outline-disclosure ol.children.expanded {
+    display: block;
+}
+
+.add-attribute {
+    margin-left: 1px;
+    margin-right: 1px;
+    white-space: nowrap;
+}
+
+.placard {
+    position: relative;
+    margin-top: 1px;
+    padding: 3px 8px 4px 18px;
+    min-height: 18px;
+    white-space: nowrap;
+}
+
+.placard:nth-of-type(2n) {
+    background-color: rgb(234, 243, 255);
+}
+
+.placard.selected {
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+:focus .placard.selected {
+    border-top: 1px solid rgb(68, 128, 200);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
+}
+
+body.inactive .placard.selected {
+    border-top: 1px solid rgb(151, 151, 151);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
+}
+
+.placard .title {
+    color: black;
+    font-weight: normal;
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.placard.selected .title {
+    color: white;
+    font-weight: bold;
+}
+
+.placard .subtitle {
+    float: right;
+    font-size: 10px;
+    margin-left: 5px;
+    max-width: 55%;
+    color: rgba(0, 0, 0, 0.7);
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.placard.selected .subtitle {
+    color: rgba(255, 255, 255, 0.7);
+}
+
+.placard .subtitle a {
+    color: inherit;
+}
+
+.section {
+    position: relative;
+    margin-top: 1px;
+}
+
+.section:nth-last-of-type(1), .event-bar:nth-last-of-type(1) {
+    margin-bottom: 1px;
+}
+
+.watch-expressions-buttons-container {
+    text-align: center;
+}
+
+.event-bar:first-child {
+    margin-top: 1px;
+}
+
+.event-bar:nth-last-of-type(1) .header {
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.section .header {
+    padding: 2px 8px 4px 18px;
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    min-height: 18px;
+    white-space: nowrap;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.section.no-affect .header {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(167, 167, 167)), to(rgb(123, 123, 123)))
+}
+
+.section .header::before {
+    position: absolute;
+    top: 4px;
+    left: 7px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.section.blank-section .header::before {
+    display: none;
+}
+
+.section.expanded .header::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.section .header .title, .event-bar .header .title {
+    color: white;
+    font-weight: bold;
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.section .header .title.blank-title {
+    font-style: italic;
+}
+
+.section .header label, .event-bar .header label {
+    display: none;
+}
+
+.section.expanded .header label, .event-bar.expanded .header label {
+    display: inline;
+}
+
+.section .header input[type=checkbox] {
+    height: 10px;
+    width: 10px;
+    margin-left: 0;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: 2px;
+}
+
+.section .header .subtitle, .event-bar .header .subtitle {
+    float: right;
+    font-size: 10px;
+    margin-left: 5px;
+    max-width: 55%;
+    color: rgba(255, 255, 255, 0.7);
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.section .header .subtitle a {
+    color: inherit;
+}
+
+.section .properties, .event-bar .event-properties {
+    display: none;
+    margin: 0;
+    padding: 2px 6px 3px;
+    list-style: none;
+    min-height: 18px;
+}
+
+.section.no-affect .properties li {
+    opacity: 0.5;
+}
+
+.section.no-affect .properties li.editing {
+    opacity: 1.0;
+}
+
+.section.expanded .properties, .event-bar.expanded .event-properties {
+    display: block;
+}
+
+.section .properties li, .event-properties li {
+    margin-left: 12px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-user-select: text;
+    cursor: auto;
+}
+
+.section .properties li.parent, .event-properties li.parent {
+    margin-left: 1px;
+}
+
+.section .properties ol, .event-properties ol {
+    display: none;
+    margin: 0;
+    -webkit-padding-start: 12px;
+    list-style: none;
+}
+
+.section .properties ol.expanded, .event-properties ol.expanded {
+    display: block;
+}
+
+.section .properties li.parent::before, .event-properties li.parent::before {
+    content: url(Images/treeRightTriangleBlack.png);
+    opacity: 0.75;
+    float: left;
+    width: 8px;
+    height: 8px;
+    margin-top: 0;
+    padding-right: 3px;
+    -webkit-user-select: none;
+    cursor: default;
+}
+
+.section .properties li.parent.expanded::before, .event-properties li.parent.expanded::before {
+    content: url(Images/treeDownTriangleBlack.png);
+    margin-top: 1px;
+}
+
+.section .properties li .info, .event-properties li .info {
+    padding-top: 4px;
+    padding-bottom: 3px;
+}
+
+.section .event-bars {
+    display: none;
+}
+
+.section.expanded .event-bars {
+    display: block;
+}
+
+.event-bar {
+    position: relative;
+}
+
+.event-bar-connector {
+    position: absolute;
+    left: 75%;
+    bottom: -7px;
+    margin-left: -7px;
+    content: url(Images/grayConnectorPoint.png);
+    z-index: 3;
+}
+
+.event-bar.expanded .event-bar-connector {
+    content: url(Images/whiteConnectorPoint.png);
+}
+
+.event-bars .event-bar .header {
+    padding: 2px 8px 4px 18px;
+    border-top: 1px solid rgb(163, 163, 163);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), to(rgb(207, 207, 207)));
+    min-height: 18px;
+    white-space: nowrap;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.event-bars .event-bar.expanded .header {
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.event-bars .event-bar .header .title {
+    font-weight: bold;
+    color: #333;
+    text-shadow: white 0 1px 0; 
+}
+
+.event-bars .event-bar .header .subtitle {
+    color: rgba(90, 90, 90, 0.75);
+}
+
+.event-bars .event-bar .header::before {
+    position: absolute;
+    top: 4px;
+    left: 7px;
+    width: 8px;
+    height: 8px;
+    opacity: 0.75;
+    content: url(Images/treeRightTriangleBlack.png);
+}
+
+.event-bars .event-bar.expanded .header::before {
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+.editing {
+    -webkit-user-select: text;
+    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    outline: 1px solid rgb(66%, 66%, 66%) !important;
+    background-color: white;
+    -webkit-user-modify: read-write-plaintext-only;
+    text-overflow: clip;
+    padding-left: 2px;
+    margin-left: -2px;
+    padding-right: 2px;
+    margin-right: -2px;
+    margin-bottom: -1px;
+    padding-bottom: 1px;
+    opacity: 1.0 !important;
+}
+
+.editing, .editing * {
+    color: black !important;
+    text-decoration: none !important;
+}
+
+.elements-tree-editor {
+    -webkit-user-select: text;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+.section .properties li.editing {
+    margin-left: 10px;
+    text-overflow: clip;
+}
+
+li.editing .swatch, li.editing .enabled-button,  li.editing-sub-part .delete-button {
+    display: none !important;
+}
+
+.watch-expressions > li.editing-sub-part .name {
+    display: block; 
+    width: 100%;
+}
+
+.watch-expressions > li.editing-sub-part .value, .watch-expressions > li.editing-sub-part .separator  {
+    display: none;
+}
+
+.watch-expressions-error-level {
+    color: red;
+}
+
+.section .properties li.editing-sub-part {
+    padding: 3px 6px 8px 18px;
+    margin: -3px -6px -8px -6px;
+    text-overflow: clip;
+}
+
+.section .properties .overloaded, .section .properties .disabled {
+    text-decoration: line-through;
+}
+
+.section.computed-style .properties .disabled {
+    text-decoration: none;
+    opacity: 0.5;
+}
+
+.section .properties .implicit, .section .properties .inherited {
+    opacity: 0.5;
+}
+
+.section:not(.show-inherited) .properties .inherited {
+    display: none;
+}
+
+.section .properties .enabled-button {
+    display: none;
+    float: right;
+    font-size: 10px;
+    margin: 0 0 0 4px;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+}
+
+/* FIXME: need a better icon (comment in bug 27514) */
+.section .properties .delete-button {
+    width: 10px;
+    height: 10px;
+    background-image: url(Images/errorIcon.png);
+    background-position: 0 0;
+    background-color: transparent;
+    background-repeat: no-repeat;
+    border: 0 none transparent;
+}
+
+.section:hover .properties .enabled-button {
+    display: block;
+}
+
+.section .properties .name, .event-properties .name {
+    color: rgb(136, 19, 145);
+}
+
+.section .properties .value.dimmed {
+    color: rgb(100, 100, 100);
+}
+
+.section .properties .value.error {
+    color: red;
+}
+
+.section .properties .number, .event-properties .number {
+    color: blue;
+}
+
+.section .properties .priority {
+    color: rgb(128, 0, 0);
+}
+
+.section .properties .keyword, .event-properties .keyword {
+    color: rgb(136, 19, 79);
+}
+
+.section .properties .color, .event-properties .color {
+    color: rgb(118, 15, 21);
+}
+
+.swatch {
+    display: inline-block;
+    vertical-align: baseline;
+    margin-left: 1px;
+    margin-right: 2px;
+    margin-bottom: -1px;
+    width: 1em;
+    height: 1em;
+    border: 1px solid rgba(128, 128, 128, 0.6);
+}
+
+.swatch:hover {
+    border: 1px solid rgba(64, 64, 64, 0.8);
+}
+
+.pane:not(.expanded) + .pane, .pane:first-of-type {
+    margin-top: -1px;
+}
+
+.pane > .title {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));
+    height: 20px;
+    padding: 0 5px;
+    border-top: 1px solid rgb(189, 189, 189);
+    border-bottom: 1px solid rgb(189, 189, 189);
+    font-weight: bold;
+    font-size: 12px;
+    line-height: 18px;
+    color: rgb(110, 110, 110);
+    text-shadow: white 0 1px 0;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+.pane > .title:active {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(231, 231, 231)), color-stop(0.05, rgb(231, 231, 231)), color-stop(0.05, rgb(207, 207, 207)), to(rgb(186, 186, 186)));
+    border-top: 1px solid rgb(178, 178, 178);
+    border-bottom: 1px solid rgb(178, 178, 178);
+}
+
+.pane > .title::before {
+    content: url(Images/disclosureTriangleSmallRightBlack.png);
+    float: left;
+    width: 11px;
+    height: 12px;
+    margin-right: 2px;
+    margin-top: 1px;
+}
+
+.pane.expanded > .title::before {
+    content: url(Images/disclosureTriangleSmallDownBlack.png);
+}
+
+.pane > .title > select {
+    display: none;
+    float: right;
+    width: 23px;
+    height: 17px;
+    color: transparent;
+    background-color: transparent;
+    border: none;
+    background-image: url(Images/paneSettingsButtons.png);
+    background-repeat: no-repeat;
+    margin: 1px 0 0 0;
+    padding: 0;
+    -webkit-border-radius: 0;
+    -webkit-appearance: none;
+}
+
+.pane.expanded:hover > .title > select {
+    display: inline-block;
+}
+
+.pane > .title > select:hover {
+    background-position: -23px 0px;
+}
+
+.pane > .title > select:active {
+    background-position: -46px 0px;
+}
+
+.pane > .title > select > option, .pane > .title > select > hr {
+    color: black;
+}
+
+.pane > .body {
+    position: relative;
+    display: none;
+    background-color: white;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+.pane > .body .info {
+    text-align: center;
+    font-style: italic;
+    font-size: 10px;
+    padding: 6px;
+    color: gray;
+}
+
+.pane.expanded > .body, .pane.expanded > .growbar {
+    display: block;
+}
+
+.pane.expanded:nth-last-of-type(1) {
+    border-bottom: 1px solid rgb(189, 189, 189);
+}
+
+.pane > .growbar {
+    display: none;
+    background-image: url(Images/paneGrowHandleLine.png), url(Images/paneBottomGrow.png);
+    background-repeat: no-repeat, repeat-x;
+    background-position: center center, bottom;
+    height: 5px;
+}
+
+.metrics {
+    padding: 8px;
+    font-size: 10px;
+    text-align: center;
+    white-space: nowrap;
+}
+
+.metrics .label {
+    position: absolute;
+    margin-top: -10px;
+    font-size: 9px;
+    color: grey;
+    background-color: white;
+    margin-left: 3px;
+    padding-left: 2px;
+    padding-right: 2px;
+}
+
+.metrics .position {
+    border: 1px rgb(66%, 66%, 66%) dotted;
+    display: inline-block;
+    text-align: center;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .margin {
+    border: 1px dashed;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .border {
+    border: 1px black solid;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .padding {
+    border: 1px grey dashed;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .content {
+    position: static;
+    border: 1px grey solid;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+    min-width: 80px;
+    text-align: center;
+    overflow: visible;
+}
+
+.metrics .content span {
+    display: inline-block;
+}
+
+.metrics .editing {
+    position: relative;
+    z-index: 100;
+}
+
+.metrics .left {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .right {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .top {
+    display: inline-block;
+}
+
+.metrics .bottom {
+    display: inline-block;
+}
+
+.sidebar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 200px;
+    overflow-y: auto;
+    overflow-x: hidden;
+    background-color: rgb(214, 221, 229);
+    border-right: 1px solid rgb(64%, 64%, 64%);
+}
+
+body.inactive .sidebar {
+    background-color: rgb(232, 232, 232);
+}
+
+.database-sidebar-tree-item .icon {
+    content: url(Images/database.png);
+}
+
+.database-table-sidebar-tree-item .icon {
+    content: url(Images/databaseTable.png);
+}
+
+.domstorage-sidebar-tree-item.local-storage .icon {
+    content: url(Images/localStorage.png);
+}
+
+.domstorage-sidebar-tree-item.session-storage .icon {
+    content: url(Images/sessionStorage.png);
+}
+
+.cookie-sidebar-tree-item .icon {
+    content: url(Images/cookie.png);
+}
+
+#storage-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+.storage-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.storage-view.visible {
+    display: block;
+}
+
+.storage-view.table {
+    overflow: hidden;
+}
+
+.storage-view.table .data-grid {
+    border: none;
+    height: 100%;
+}
+
+.storage-view.table .storage-table-empty, .storage-view.table .storage-table-error {
+    position: absolute;
+    top: 0;
+    bottom: 25%;
+    left: 0;
+    right: 0;
+    font-size: 24px;
+    color: rgb(75%, 75%, 75%);
+    margin-top: auto;
+    margin-bottom: auto;
+    height: 50px;
+    line-height: 26px;
+    text-align: center;
+    font-weight: bold;
+    padding: 10px;
+    white-space: pre-wrap;
+}
+
+.storage-view.table .storage-table-error {
+    color: rgb(66%, 33%, 33%);
+}
+
+.data-grid {
+    position: relative;
+    border: 1px solid #aaa;
+}
+
+.data-grid .highlight {
+    background-color: rgb(255, 230, 179);
+}
+
+.data-grid tr.selected .highlight {
+    background-color: transparent;
+}
+
+.data-grid table {
+    table-layout: fixed;
+    border-spacing: 0;
+    border-collapse: collapse;
+    width: 100%;
+    font-size: 10px;
+    font-family: Lucida Grande, sans-serif;
+}
+
+.data-grid .data-container {
+    position: absolute;
+    top: 16px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    padding-right: 14px;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
+    -webkit-background-size: 1px 32px;
+}
+
+.data-grid.inline .data-container {
+    position: static;
+}
+
+.data-grid th {
+    text-align: left;
+    background-image: url(Images/glossyHeader.png);
+    background-repeat: repeat-x;
+    border-right: 1px solid rgb(179, 179, 179);
+    border-bottom: 1px solid rgb(179, 179, 179);
+    height: 15px;
+    font-weight: normal;
+    vertical-align: middle;
+    padding: 0 4px;
+    white-space: nowrap;
+}
+
+.data-grid th.corner {
+    width: 15px;
+    border-right: 0 none transparent;
+}
+
+.data-grid tr.filler {
+    display: table-row !important;
+    height: auto !important;
+}
+
+.data-grid tr.filler td {
+    height: auto !important;
+    padding: 0 !important;
+}
+
+.data-grid table.data {
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 16px;
+    bottom: 0;
+    height: 100%;
+    border-top: 0 none transparent;
+    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));
+    -webkit-background-size: 1px 32px;
+}
+
+.data-grid.inline table.data {
+    position: static;
+}
+
+.data-grid table.data tr {
+    display: none;
+}
+
+.data-grid table.data tr.revealed {
+    display: table-row;
+}
+
+.data-grid td {
+    vertical-align: top;
+    height: 12px;
+    line-height: 12px;
+    padding: 2px 4px;
+    white-space: nowrap;
+    border-right: 1px solid #aaa;
+    -webkit-user-select: text;
+}
+
+.data-grid td > div, .data-grid th > div {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.data-grid .centered div {
+    text-align: center;
+}
+
+.data-grid .right div {
+    text-align: right;
+}
+
+.data-grid th.sortable div {
+    position: relative;
+}
+
+.data-grid th.sortable:active {
+    background-image: url(Images/glossyHeaderPressed.png);
+}
+
+.data-grid th.sort-ascending, .data-grid th.sort-descending {
+    border-right: 1px solid rgb(107, 140, 196);
+    border-bottom: 1px solid rgb(107, 140, 196);
+    background-image: url(Images/glossyHeaderSelected.png);
+    background-repeat: repeat-x;
+}
+
+.data-grid th.sortable.sort-ascending:active, .data-grid th.sortable.sort-descending:active {
+    background-image: url(Images/glossyHeaderSelectedPressed.png);
+}
+
+.data-grid th.sort-ascending div::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeUpTriangleBlack.png);
+}
+
+.data-grid th.sort-descending div::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    margin-top: 1px;
+    width: 8px;
+    height: 8px;
+    content: url(Images/treeDownTriangleBlack.png);
+}
+
+body.inactive .data-grid th.sort-ascending, body.inactive .data-grid th.sort-descending {
+    background-image: url(Images/glossyHeader.png);
+    border-right: 1px solid rgb(179, 179, 179);
+    border-bottom: 1px solid rgb(179, 179, 179);
+}
+
+.data-grid tr.parent td.disclosure::before {
+    float: left;
+    content: url(Images/treeRightTriangleBlack.png);
+    width: 8px;
+    height: 8px;
+    margin-right: 2px;
+    -webkit-user-select: none;
+}
+
+.data-grid tr.expanded td.disclosure::before {
+    content: url(Images/treeDownTriangleBlack.png);
+    width: 8px;
+    height: 8px;
+    margin-top: 1px;
+}
+
+.data-grid tr.selected {
+    background-color: rgb(212, 212, 212);
+    color: inherit;
+}
+
+.data-grid:focus tr.selected {
+    background-color: rgb(56, 121, 217);
+    color: white;
+}
+
+.data-grid:focus tr.parent.selected td.disclosure::before {
+    content: url(Images/treeRightTriangleWhite.png);
+}
+
+.data-grid:focus tr.expanded.selected td.disclosure::before {
+    content: url(Images/treeDownTriangleWhite.png);
+}
+
+.data-grid tr:not(.parent) td.disclosure {
+    text-indent: 10px;
+}
+
+.data-grid-resizer {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+    cursor: col-resize;
+}
+
+.storage-view.query {
+    padding: 2px 0;
+    overflow-y: overlay;
+    overflow-x: hidden;
+    -webkit-text-size-adjust: auto;
+}
+
+.database-query-prompt {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+    -webkit-user-select: text;
+}
+
+.database-user-query::before, .database-query-prompt::before, .database-query-result::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: 7px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -5px;
+    -webkit-user-select: none;
+}
+
+.database-query-prompt::before {
+    background-image: url(Images/userInputIcon.png);
+}
+
+.database-user-query {
+    position: relative;
+    border-bottom: 1px solid rgb(245, 245, 245);
+    padding: 1px 22px 1px 24px;
+    min-height: 16px; 
+}
+
+.database-user-query::before {
+    background-image: url(Images/userInputPreviousIcon.png);
+}
+
+.database-query-text {
+    color: rgb(0, 128, 255);
+    -webkit-user-select: text;
+}
+
+.database-query-result {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+    margin-left: -24px;
+    padding-right: 0;
+}
+
+.database-query-result.error {
+    color: red;
+    -webkit-user-select: text;
+}
+
+.database-query-result.error::before {
+    background-image: url(Images/errorIcon.png);
+}
+
+.panel-enabler-view {
+    z-index: 1000;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: white;
+    font-size: 13px;
+    text-align: center;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    display: none;
+}
+
+.panel-enabler-view.visible {
+    display: block;
+}
+
+.panel-enabler-view .panel-enabler-view-content {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    max-height: 390px;
+    margin: auto;
+    white-space: nowrap;
+}
+
+.panel-enabler-view h1 {
+    color: rgb(110, 116, 128);
+    font-size: 16px;
+    line-height: 20px;
+    font-weight: normal;
+    margin-top: 0;
+}
+
+.panel-enabler-disclaimer {
+    font-size: 10px;
+    color: rgb(110, 116, 128);
+    margin-bottom: 12px;
+    margin-left: 20px;
+}
+
+.panel-enabler-disclaimer:empty {
+    display: none;
+}
+
+.panel-enabler-view img, div.welcome-instructions-aligner {
+    height: 100%;
+    min-height: 200px;
+    max-width: 100%;
+    top: 0;
+    bottom: 0;
+    padding: 20px 0 20px 20px;
+    margin: auto;
+    vertical-align: middle;
+}
+
+.panel-enabler-view img.hidden {
+    display: initial !important;
+    width: 0;
+}
+
+.panel-enabler-view form {
+    display: inline-block;
+    vertical-align: middle;
+    width: 330px;
+    margin: 0;
+    padding: 15px;
+    white-space: normal;
+}
+
+.panel-enabler-view label {
+    position: relative;
+    display: block;
+    text-align: left;
+    word-break: break-word;
+    margin: 0 0 5px 20px;
+}
+
+.panel-enabler-view button:not(.status-bar-item), .pane button, button.show-all-nodes {
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+.panel-enabler-view button:not(.status-bar-item) {
+    font-size: 13px;
+    margin: 6px 0 0 0;
+    padding: 3px 20px;
+    height: 24px;
+}
+
+button.show-all-nodes {
+    font-size: 13px;
+    margin: 0;
+    padding: 0 20px;
+    height: 20px;
+}
+
+.panel-enabler-view.welcome {
+    z-index: auto;
+}
+
+.panel-enabler-view.welcome div.welcome-instructions-aligner {
+    display: inline-block;
+    width: 0;
+}
+
+.panel-enabler-view.welcome .instructions {
+    display: inline-block;
+    vertical-align: middle;
+    width: 330px;
+    margin: 0;
+    white-space: normal;
+    line-height: 175%;
+}
+
+.panel-enabler-view.welcome .message {
+    margin-bottom: 2ex;
+}
+
+.panel-enabler-view.welcome button.status-bar-item {
+    vertical-align: middle;
+}
+
+.pane button {
+    margin: 6px 0 6px 3px;
+    padding: 2px 9px;
+}
+
+.panel-enabler-view button:active:not(.status-bar-item), .pane button:active, button.show-all-nodes:active {
+    background-color: rgb(215, 215, 215);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+body.inactive .panel-enabler-view button:not(.status-bar-item), .panel-enabler-view button:disabled:not(.status-bar-item), body.inactive .pane button, .pane button:disabled, body.inactive button.show-all-nodes {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));
+}
+
+.panel-enabler-view input {
+    height: 17px;
+    width: 17px;
+    border: 1px solid rgb(165, 165, 165);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+    -webkit-border-radius: 8px;
+    -webkit-appearance: none;
+    vertical-align: middle;
+    margin: 0 5px 5px 0;
+}
+
+.panel-enabler-view input:active {
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));
+}
+
+.panel-enabler-view input:checked {
+    background: url(Images/radioDot.png) center no-repeat,
+                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));
+}
+
+.panel-enabler-view.resources img {
+    content: url(Images/resourcesSilhouette.png);
+}
+
+.panel-enabler-view.scripts img {
+    content: url(Images/scriptsSilhouette.png);
+}
+
+.panel-enabler-view.profiles img {
+    content: url(Images/profilesSilhouette.png);
+}
+
+button.enable-toggle-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/enableOutlineButtonGlyph.png);
+}
+
+button.enable-toggle-status-bar-item.toggled-on .glyph {
+    -webkit-mask-image: url(Images/enableSolidButtonGlyph.png);
+}
+
+.scripts-pause-on-exceptions-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/pauseOnExceptionButtonGlyph.png);
+}
+
+#scripts-status-bar {
+    position: absolute;
+    top: -1px;
+    left: 0;
+    right: 0;
+    height: 24px;
+}
+
+#scripts-files {
+    max-width: 250px;
+}
+
+#scripts-functions {
+    max-width: 150px;
+}
+
+#scripts-status-bar .status-bar-item img {
+    margin-top: 2px;
+}
+
+#scripts-back img {
+    content: url(Images/back.png);
+}
+
+#scripts-forward img {
+    content: url(Images/forward.png);
+}
+
+#scripts-pause img {
+    content: url(Images/debuggerPause.png);
+}
+
+#scripts-pause.paused img {
+    content: url(Images/debuggerContinue.png);
+}
+
+#scripts-step-over img {
+    content: url(Images/debuggerStepOver.png);
+}
+
+#scripts-step-into img {
+    content: url(Images/debuggerStepInto.png);
+}
+
+#scripts-step-out img {
+    content: url(Images/debuggerStepOut.png);
+}
+
+.toggle-breakpoints .glyph {
+    -webkit-mask-image: url(Images/breakpointsActivateButtonGlyph.png);
+    background-color: rgb(96, 96, 96) !important;
+}
+
+.toggle-breakpoints.toggled-on .glyph {
+    -webkit-mask-image: url(Images/breakpointsDeactivateButtonGlyph.png);
+}
+
+#scripts-debugger-status {
+    position: absolute;
+    line-height: 24px;
+    top: 0;
+    right: 8px;
+}
+
+#scripts-sidebar-resizer-widget {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 225px;
+    width: 16px;
+    cursor: col-resize;
+    background-image: url(Images/statusbarResizerHorizontal.png);
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+#scripts-sidebar-buttons {
+    position: absolute;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    width: 225px;
+    overflow: hidden;
+    border-left: 1px solid rgb(64%, 64%, 64%);
+}
+
+#script-resource-views {
+    display: block;
+    padding: 0;
+    position: absolute;
+    top: 23px;
+    left: 0;
+    right: 225px;
+    bottom: 0;
+}
+
+.script-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.script-view.visible {
+    display: block;
+}
+
+#scripts-sidebar {
+    position: absolute;
+    top: 23px;
+    right: 0;
+    bottom: 0;
+    width: 225px;
+    background-color: rgb(245, 245, 245);
+    border-left: 1px solid rgb(64%, 64%, 64%);
+    cursor: default;
+    overflow: auto;
+}
+
+.resources-larger-resources-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);
+}
+
+#resources-filter, #console-filter.console-filter-top {
+    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+    width: 100%;
+}
+
+#console-messages.console-filter-top {
+    margin-top: 23px;
+}
+
+#console-filter {
+    margin-top: 1px;
+}
+
+.scope-bar {
+    height: 23px;
+    padding: 2px 10px 0;
+    overflow: hidden;
+}
+
+.scope-bar li {
+    display: inline-block;
+    margin: 1px 2px 0 0;
+    padding: 1px 7px 3px;
+    font-size: 11px;
+    line-height: 12px;
+    font-weight: bold;
+    color: rgb(46, 46, 46);
+    background: transparent;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    -webkit-border-radius: 8px;
+    vertical-align: middle;
+}
+
+.scope-bar .divider {
+    margin: 1px 9px 0 8px;
+    background-color: rgba(0, 0, 0, 0.4);
+    height: 16px;
+    width: 1px;
+    vertical-align: middle;
+    display: inline-block;
+}
+
+.scope-bar li.selected, .scope-bar li:hover, .scope-bar li:active {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
+}
+
+.scope-bar li:hover {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+.scope-bar li.selected {
+    background: rgba(0, 0, 0, 0.3);
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.scope-bar li:active {
+    background: rgba(0, 0, 0, 0.5);
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+#resources-container {
+    position: absolute;
+    top: 23px;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    border-right: 0 none transparent;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+#resources-container.viewing-resource {
+    right: auto;
+    width: 200px;
+    border-right: 1px solid rgb(64%, 64%, 64%);
+}
+
+#resources-container.viewing-resource #resources-sidebar {
+    width: 100%;
+    border-right: 0 none transparent;
+}
+
+#resources-sidebar {
+    min-height: 100%;
+    bottom: auto;
+    overflow: visible;
+}
+
+#resources-container-content {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    min-height: 100%;
+}
+
+#resources-container.viewing-resource #resources-container-content {
+    display: none;
+}
+
+#resources-summary {
+    position: absolute;
+    padding-top: 20px;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 93px;
+    margin-left: -1px;
+    border-left: 1px solid rgb(102, 102, 102);
+    background-color: rgb(101, 111, 130);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.5)));
+    background-repeat: repeat-x;
+    background-position: bottom;
+    text-align: center;
+    text-shadow: black 0 1px 1px;
+    white-space: nowrap;
+    color: white;
+    -webkit-background-size: 1px 6px;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+    z-index: 400;
+}
+
+.summary-graph-legend {
+    margin-top: -10px;
+    padding-left: 15px;
+}
+
+.summary-graph-legend-item {
+    display: inline-block;
+    font-weight: bold;
+    margin-right: 15px;
+    vertical-align: top;
+}
+
+.summary-graph-legend-item.total {
+    margin-left: 10px;
+}
+
+.summary-graph-legend-label {
+    display: inline-block;
+    text-align: left;
+}
+
+.summary-graph-legend-header {
+    font-size: 12px;
+}
+
+.summary-graph-legend-value {
+    font-size: 10px;
+}
+
+.summary-graph-legend-swatch {
+    vertical-align: top;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+#resources-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: -100;
+}
+
+#resources-event-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: 300;
+    pointer-events: none;
+}
+
+#resources-dividers-label-bar {
+    position: absolute;
+    top: 0;
+    left: 0px;
+    right: 0;
+    background-color: rgba(255, 255, 255, 0.8);
+    background-clip: padding;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
+    height: 20px;
+    z-index: 200;
+}
+
+.resources-divider {
+    position: absolute;
+    width: 1px;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.resources-event-divider-padding {
+    position: absolute;
+    width: 8px;
+    top: 0;
+    bottom: 0;
+    pointer-events: auto;
+}
+
+.resources-onload-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+    background-color: rgba(255, 0, 0, 0.5);
+}
+
+.resources-ondomcontent-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+    background-color: rgba(0, 0, 255, 0.5);
+}
+
+.resources-divider.last {
+    background-color: transparent;
+}
+
+.resources-divider-label {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    font-size: 9px;
+    color: rgb(50%, 50%, 50%);
+    white-space: nowrap;
+}
+
+.resources-graph-label {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    height: 13px;
+    line-height: 13px;
+    font-size: 9px;
+    color: rgba(0, 0, 0, 0.75);
+    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;
+    z-index: 150;
+    overflow: hidden;
+    text-align: center;
+    font-weight: bold;
+    opacity: 0;
+    -webkit-transition: opacity 250ms ease-in-out;
+}
+
+.resources-graph-side:hover .resources-graph-label {
+    opacity: 1;
+}
+
+.resources-graph-label:empty {
+    display: none;
+}
+
+.resources-graph-label.waiting {
+    margin-right: 5px;
+}
+
+.resources-graph-label.waiting-right {
+    margin-left: 5px;
+}
+
+.resources-graph-label.before {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: right;
+    margin-right: 2px;
+}
+
+.resources-graph-label.before::after {
+    padding-left: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutLeft.png);
+}
+
+.resources-graph-label.after {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: left;
+    margin-left: 2px;
+}
+
+.resources-graph-label.after::before {
+    padding-right: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutRight.png);
+}
+
+.resources-graph-bar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    border-width: 6px 7px;
+    height: 13px;
+    min-width: 14px;
+    opacity: 0.65;
+    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;
+}
+
+.resources-category-documents, .resources-category-stylesheets, .resources-category-images,
+.resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other {
+    display: none;
+}
+
+.filter-all .resources-category-documents, .filter-documents .resources-category-documents,
+.filter-all .resources-category-stylesheets, .filter-stylesheets .resources-category-stylesheets,
+.filter-all .resources-category-images, .filter-images .resources-category-images,
+.filter-all .resources-category-scripts, .filter-scripts .resources-category-scripts,
+.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,
+.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,
+.filter-all .resources-category-other, .filter-other .resources-category-other,
+.resource-sidebar-tree-item.selected {
+    display: list-item;
+}
+
+.console-warning-level, .console-error-level, .console-log-level {
+    display: none;
+}
+
+.filter-all .console-warning-level, .filter-warnings .console-warning-level,
+.filter-all .console-error-level, .filter-errors .console-error-level,
+.filter-all .console-log-level, .filter-logs .console-log-level {
+    display: block;
+}
+
+.console-user-command-result {
+    display: block;
+}
+
+.resources-graph-bar.waiting, .resources-graph-bar.waiting-right {
+    opacity: 0.35;
+}
+
+.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;
+}
+
+.resources-category-documents .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;
+}
+
+.resources-category-documents.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;
+}
+
+.resources-category-stylesheets .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;
+}
+
+.resources-category-stylesheets.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;
+}
+
+.resources-category-images .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;
+}
+
+.resources-category-images.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;
+}
+
+.resources-category-fonts .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;
+}
+
+.resources-category-fonts.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;
+}
+
+.resources-category-scripts .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;
+}
+
+.resources-category-scripts.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;
+}
+
+.resources-category-xhr .resources-graph-bar {
+    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;
+}
+
+.resources-category-xhr.resource-cached .resources-graph-bar {
+    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;
+}
+
+#resource-views {
+    position: absolute;
+    top: 23px;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+.source-view-frame {
+    width: 100%;
+    height: 100%;
+}
+
+.sidebar-resizer-vertical {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+    cursor: col-resize;
+}
+
+.resources .sidebar-resizer-vertical {
+    top: 23px;
+}
+
+.sidebar-tree, .sidebar-tree .children {
+    position: relative;
+    padding: 0;
+    margin: 0;
+    list-style: none;
+    font-size: 11px;
+}
+
+.sidebar-tree-section {
+    position: relative;
+    height: 18px;
+    padding: 4px 10px 6px 10px;
+    white-space: nowrap;
+    margin-top: 1px;
+    color: rgb(92, 110, 129);
+    font-weight: bold;
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+}
+
+.sidebar-tree-item {
+    position: relative;
+    height: 36px;
+    padding: 0 5px 0 5px;
+    white-space: nowrap;
+    margin-top: 1px;
+    line-height: 34px;
+    border-top: 1px solid transparent;
+}
+
+.sidebar-tree .children {
+    display: none;
+}
+
+.sidebar-tree .children.expanded {
+    display: block;
+}
+
+.sidebar-tree-section + .children > .sidebar-tree-item {
+    padding-left: 10px !important;
+}
+
+.sidebar-tree-section + .children.small > .sidebar-tree-item {
+    padding-left: 17px !important;
+}
+
+.sidebar-tree > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree > .children > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree > .children.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {
+    margin-left: 16px;
+}
+
+.sidebar-tree-item .disclosure-button {
+    float: left;
+    width: 16px;
+    height: 100%;
+    border: 0;
+    background-color: transparent;
+    background-image: url(Images/disclosureTriangleSmallRight.png);
+    background-repeat: no-repeat;
+    background-position: center;
+    -webkit-apearance: none;
+}
+
+.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {
+    display: none;
+}
+
+body.inactive .sidebar-tree-item .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
+}
+
+body.inactive .sidebar-tree-item.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
+}
+
+body.inactive .sidebar-tree-item .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDownBlack.png);
+}
+
+.sidebar-tree-item.selected .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallRightWhite.png) !important;
+}
+
+.sidebar-tree-item.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDown.png);
+}
+
+.sidebar-tree-item.selected.expanded .disclosure-button {
+    background-image: url(Images/disclosureTriangleSmallDownWhite.png) !important;
+}
+
+.sidebar-tree-item.selected .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDownWhite.png) !important;
+}
+
+.sidebar-tree-item .disclosure-button:active {
+    background-image: url(Images/disclosureTriangleSmallRightDown.png);
+}
+
+.sidebar-tree-item .icon {
+    float: left;
+    width: 32px;
+    height: 32px;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+.sidebar-tree-item .status {
+    float: right;
+    height: 16px;
+    margin-top: 9px;
+    margin-left: 4px;
+    line-height: 1em;
+}
+
+.sidebar-tree-item .status:empty {
+    display: none;
+}
+
+.sidebar-tree-item .status .bubble {
+    display: inline-block;
+    height: 14px;
+    min-width: 16px;
+    margin-top: 1px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    text-align: center;
+    font-size: 11px;
+    line-height: normal;
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    -webkit-border-radius: 7px;
+}
+
+.sidebar-tree-item .status .bubble:empty {
+    display: none;
+}
+
+.sidebar-tree-item.selected .status .bubble {
+    background-color: white !important;
+    color: rgb(132, 154, 190) !important;
+}
+
+:focus .sidebar-tree-item.selected .status .bubble {
+    color: rgb(36, 98, 172) !important;
+}
+
+body.inactive .sidebar-tree-item.selected .status .bubble {
+    color: rgb(159, 159, 159) !important;
+}
+
+.sidebar-tree.small .sidebar-tree-item, .sidebar-tree .children.small .sidebar-tree-item, .sidebar-tree-item.small, .small .resources-graph-side {
+    height: 20px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .icon, .sidebar-tree .children.small .sidebar-tree-item .icon, .sidebar-tree-item.small .icon {
+    width: 16px;
+    height: 16px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .status, .sidebar-tree .children.small .sidebar-tree-item .status, .sidebar-tree-item.small .status {
+    margin-top: 1px;
+}
+
+.sidebar-tree-item.selected {
+    color: white;
+    border-top: 1px solid rgb(145, 160, 192);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));
+    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;
+    font-weight: bold;
+    -webkit-background-origin: padding;
+    -webkit-background-clip: padding;
+}
+
+:focus .sidebar-tree-item.selected {
+    border-top: 1px solid rgb(68, 128, 200);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));
+}
+
+body.inactive .sidebar-tree-item.selected {
+    border-top: 1px solid rgb(151, 151, 151);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));
+}
+
+.sidebar-tree-item .titles {
+    position: relative;
+    top: 5px;
+    line-height: 11px;
+    padding-bottom: 1px;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.sidebar-tree-item .titles.no-subtitle {
+    top: 10px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .titles, .sidebar-tree .children.small .sidebar-tree-item .titles, .sidebar-tree-item.small .titles {
+    top: 2px;
+    line-height: normal;
+}
+
+.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after, .sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {
+    content: "\A";
+    white-space: pre;
+}
+
+.sidebar-tree-item .subtitle {
+    font-size: 9px;
+    color: rgba(0, 0, 0, 0.7);
+}
+
+.sidebar-tree.small .sidebar-tree-item .subtitle, .sidebar-tree .children.small .sidebar-tree-item .subtitle, .sidebar-tree-item.small .subtitle {
+    display: none;
+}
+
+.sidebar-tree-item.selected .subtitle {
+    color: rgba(255, 255, 255, 0.9);
+}
+
+#resources-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 112px;
+}
+
+.resources-graph-side {
+    position: relative;
+    height: 36px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 1px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+}
+
+.resources-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 8px;
+    left: 9px;
+}
+
+#resources-container:not(.viewing-resource) .resource-sidebar-tree-item:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+#resources-container:not(.viewing-resource) .resources-graph-side:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.resources-time-graph-sidebar-item .icon {
+    content: url(Images/resourcesTimeGraphIcon.png);
+}
+
+.resources-size-graph-sidebar-item .icon {
+    content: url(Images/resourcesSizeGraphIcon.png);
+}
+
+.resources-size-graph-sidebar-item .icon {
+    content: url(Images/resourcesSizeGraphIcon.png);
+}
+
+.resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-documents .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-documents .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-stylesheets .icon {
+    content: url(Images/resourceCSSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-stylesheets .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-images .icon {
+    position: relative;
+    background-image: url(Images/resourcePlainIcon.png);
+    background-repeat: no-repeat;
+    content: "";
+}
+
+.resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
+    position: absolute;
+    margin: auto;
+    top: 3px;
+    bottom: 4px;
+    left: 5px;
+    right: 5px;
+    max-width: 18px;
+    max-height: 21px;
+    min-width: 1px;
+    min-height: 1px;
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-images .icon {
+    background-image: url(Images/resourcePlainIconSmall.png);
+    content: "";
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-images .image-resource-icon-preview {
+    top: 2px;
+    bottom: 1px;
+    left: 3px;
+    right: 3px;
+    max-width: 8px;
+    max-height: 11px;
+}
+
+.resource-sidebar-tree-item.resources-category-fonts .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-fonts .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-scripts .icon {
+    content: url(Images/resourceJSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-scripts .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-category-xhr .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-category-xhr .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.bubble.debug, .console-debug-level .bubble {
+    background-color: rgb(0, 0, 255) !important;
+}
+
+.bubble.warning, .console-warning-level .bubble {
+    background-color: rgb(232, 164, 0) !important;
+}
+
+.bubble.error, .console-error-level .bubble {
+    background-color: rgb(216, 35, 35) !important;
+}
+
+.bubble.search-matches {
+    background-image: url(Images/searchSmallWhite.png);
+    background-repeat: no-repeat;
+    background-position: 3px 2px;
+    padding-left: 13px !important;
+}
+
+.sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallBlue.png);
+}
+
+:focus .sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallBrightBlue.png);
+}
+
+body.inactive .sidebar-tree-item.selected .bubble.search-matches {
+    background-image: url(Images/searchSmallGray.png);
+}
+
+/* Timeline Style */
+
+#timeline-overview-panel {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 80px;
+}
+
+#timeline-overview-panel .timeline-graph-bar {
+    pointer-events: none;
+}
+
+.timeline-sidebar-background {
+    top: 90px;
+    bottom: 0;
+}
+
+.timeline .sidebar {
+    overflow-y: hidden;
+    z-index: 100;
+    min-height: 100%;
+    bottom: auto;
+}
+
+#timeline-overview-separator {
+    position: absolute;
+    top: 80px;
+    left: 0;
+    right: 0;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(253, 253, 253)), to(rgb(213, 213, 213)));
+    border-top: 1px solid rgb(140, 140, 140);
+    border-bottom: 1px solid rgb(115, 115, 115);
+    height: 10px;
+}
+
+#timeline-overview-sidebar {
+    position: absolute;
+    width: 200px;
+    top: 0px;
+    bottom: 0px;
+    left: 0px;
+    padding-top: 1px;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(242, 242, 242)), to(rgb(209, 209, 209)));
+    border-right: 1px solid rgb(163, 163, 163);
+}
+
+#timeline-overview-grid {
+    position: absolute;
+    top: 0px;
+    bottom: 0px;
+    left: 200px;
+    right: 0px;
+    background-color: rgb(224, 224, 224);
+}
+
+#timeline-overview-window {
+    background-color: white;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    z-index: 150;
+}
+
+.timeline-window-resizer {
+    position: absolute;
+    top: 35px;
+    bottom: 15px;
+    width: 5px;
+    margin-left: -3px;
+    margin-right: -2px;
+    background-color: rgb(153, 153, 153);
+    z-index: 500;
+    cursor: col-resize;
+    -webkit-border-radius: 2px;
+    -webkit-box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
+}
+
+#timeline-overview-grid #resources-graphs {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 80px;
+}
+
+#timeline-container {
+    position: absolute;
+    top: 90px;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    border-right: 0 none transparent;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+.timeline-clear-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);
+}
+
+.timeline-category-tree-item {
+    height: 20px;
+    line-height: 20px;
+    padding-left: 6px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    font-weight: bold;
+}
+
+.timeline-category-tree-item .timeline-category-checkbox {
+    width: 10px;
+    height: 11px;
+    margin: 0 3px 0 5px;
+    padding: 0;
+    background-image: url(Images/timelineCheckmarks.png);
+    background-repeat: no-repeat;
+    background-position: 0 -66px;
+    vertical-align: -1px;
+    -webkit-appearance: none;
+}
+
+.timeline-category-tree-item .timeline-category-checkbox:checked {
+    background-position-x: -10px;
+}
+
+.timeline-category-tree-item.timeline-category-loading .timeline-category-checkbox {
+    background-position-y: 0;
+}
+
+.timeline-category-tree-item.timeline-category-scripting .timeline-category-checkbox {
+    background-position-y: -33px;
+}
+
+.timeline-category-tree-item.timeline-category-rendering .timeline-category-checkbox {
+    background-position-y: -11px;
+}
+
+.timeline-category-tree-item:nth-of-type(2n) {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-tree-item {
+    height: 18px;
+    line-height: 15px;
+    padding-right: 5px;
+    padding-left: 10px;
+    padding-top: 2px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.timeline-expandable {
+    position: absolute;
+    border-left: 1px solid rgb(163, 163, 163);
+}
+
+.timeline-expandable-left {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 3px;
+    border-top: 1px solid rgb(163, 163, 163);
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.timeline-expandable-collapsed {
+    background-image: url(Images/disclosureTriangleSmallRightBlack.png);
+    background-position-x: 1px;
+    background-position-y: 2px;
+    background-repeat: no-repeat;
+}
+
+.timeline-expandable-expanded {
+    background-image: url(Images/disclosureTriangleSmallDownBlack.png);
+    background-position-x: 1px;
+    background-position-y: 3px;
+    background-repeat: no-repeat;
+}
+
+.timeline-tree-item .type {
+    padding-left: 14px;
+}
+
+.timeline-tree-item .count {
+    font-family: Helvetica, Arial, sans-serif;
+    font-weight: bold;
+}
+
+.timeline-tree-item .timeline-tree-icon {
+    background-image: url(Images/timelineDots.png);
+    margin-top: 2px;
+    width: 12px;
+    height: 12px;
+    position: absolute;
+}
+
+.timeline-tree-item.even {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-tree-item .data.dimmed {
+    color: rgba(0, 0, 0, 0.7);
+}
+
+#timeline-overview-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 20px;
+}
+
+#timeline-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 19px;
+}
+
+.timeline-graph-side {
+    position: relative;
+    height: 18px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 0px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+    pointer-events: none;
+}
+
+.timeline-overview-graph-side {
+    height: 20px;
+    z-index: 170;
+    pointer-events: none;
+}
+
+.timeline-overview-graph-side .timeline-graph-bar {
+    height: 13px;
+}
+
+.timeline-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    left: 3px;
+    pointer-events: none;
+}
+
+.timeline-graph-bar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -2px;
+    border-width: 4px 4px 5px;
+    height: 9px;
+    min-width: 5px;
+    opacity: 0.8;
+    -webkit-border-image: url(Images/timelineBarGray.png) 4 4 5 4;
+    z-index: 180;
+    pointer-events: visibleFill;
+}
+
+.timeline-graph-side.even {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.timeline-category-loading .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;
+}
+
+.timeline-category-scripting .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;
+}
+
+.timeline-category-rendering .timeline-graph-bar {
+    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;
+}
+
+.timeline-category-loading .timeline-tree-icon {
+    background-position-y: 0px;
+}
+
+.timeline-category-scripting .timeline-tree-icon {
+    background-position-y: 48px;
+}
+
+.timeline-category-rendering .timeline-tree-icon {
+    background-position-y: 72px;
+}
+
+/* Profiler Style */
+
+#profile-views {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 200px;
+    bottom: 0;
+}
+
+#profile-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+.profile-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.profile-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.profile-group-sidebar-tree-item .icon {
+    content: url(Images/profileGroupIcon.png);
+}
+
+.profile-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.profile-view.visible {
+    display: block;
+}
+
+.profile-view .data-grid {
+    border: none;
+    height: 100%;
+}
+
+.profile-view .data-grid th.average-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.average-column {
+    text-align: right;
+}
+
+.profile-view .data-grid th.self-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.self-column {
+    text-align: right;
+}
+
+.profile-view .data-grid th.total-column {
+    text-align: center;
+}
+
+.profile-view .data-grid td.total-column {
+    text-align: right;
+}
+
+.profile-view .data-grid .calls-column {
+    text-align: center;
+}
+
+.profile-node-file {
+    float: right;
+    color: gray;
+    margin-top: -1px;
+}
+
+.data-grid tr.selected .profile-node-file {
+    color: rgb(33%, 33%, 33%);
+}
+
+.data-grid:focus tr.selected .profile-node-file {
+    color: white;
+}
+
+button.enable-toggle-status-bar-item .glyph {
+}
+
+.record-profile-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/recordButtonGlyph.png);
+}
+
+.record-profile-status-bar-item.toggled-on .glyph {
+    -webkit-mask-image: url(Images/recordToggledButtonGlyph.png);
+    background-color: rgb(216, 0, 0) !important;
+}
+
+/* FIXME: should have its own glyph. */
+.heap-snapshot-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.node-search-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/nodeSearchButtonGlyph.png);
+}
+
+.percent-time-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/percentButtonGlyph.png);
+}
+
+.focus-profile-node-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/focusButtonGlyph.png);
+}
+
+.exclude-profile-node-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
+}
+
+.reset-profile-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
+}
+
+.delete-storage-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/excludeButtonGlyph.png);
+}
+
+#storage-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+.refresh-storage-status-bar-item .glyph {
+    -webkit-mask-image: url(Images/reloadButtonGlyph.png);
+}
+
+#storage-view-status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 200px;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+ol.breakpoint-list {
+    -webkit-padding-start: 2px;
+    list-style: none;
+    margin: 0;
+}
+
+.breakpoint-list li {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    margin: 4px 0;
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+}
+
+.breakpoint-list li:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+.breakpoint-list .checkbox-elem {
+    font-size: 10px;
+    margin: 0 4px;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+}
+
+.breakpoint-list .source-text {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    margin: 2px 0 0px 20px;
+}
+
+.webkit-html-js-node, .webkit-html-css-node {
+    white-space: pre;
+}
+
+.source-frame-breakpoint-condition {
+    z-index: 30;
+    padding: 4px;
+    background-color: rgb(203, 226, 255);
+    -webkit-border-radius: 7px;
+    border: 2px solid rgb(169, 172, 203); 
+    width: 90%; 
+}
+
+.source-frame-breakpoint-message {
+    background-color: transparent;
+    font-family: Lucida Grande, sans-serif; 
+    font-weight: normal;
+    font-size: 11px;
+    text-align: left;
+    text-shadow: none;
+    color: rgb(85, 85, 85);
+    cursor: default;
+    margin: 0 0 2px 0; 
+}
+
+#source-frame-breakpoint-condition {
+    margin: 0;
+    border: 1px inset rgb(190, 190, 190) !important;
+    width: 100%;
+    box-shadow: none !important;
+    outline: none !important;
+    -webkit-user-modify: read-write;
+}
+
+.source-frame-popover-title {
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+    font-weight: bold;
+    padding-left: 18px;
+}
+
+.source-frame-popover-tree {
+    border-top: 1px solid rgb(194, 194, 147);
+    overflow: auto;
+    position: absolute;
+    top: 15px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.source-frame-eval-expression {
+    border: 1px solid rgb(163, 41, 34);
+    margin: -1px;
+    background-color: rgb(255, 255, 194);
+}
+
+.timeline-details {
+    -webkit-user-select: text;
+}
+
+.timeline-details-row-title {
+    font-weight: bold;
+    text-align: right;
+    white-space: nowrap;
+}
+
+.timeline-details-row-data {
+    white-space: nowrap;
+}
+
+.timeline-details-title {
+    font-weight: bold;
+    white-space: nowrap;
+}
+
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.html b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.html
new file mode 100644
index 0000000..e5295f2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspector.html
@@ -0,0 +1,143 @@
+<!--
+Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1.  Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+2.  Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+    its contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <link rel="stylesheet" type="text/css" href="audits.css">
+    <link rel="stylesheet" type="text/css" href="inspector.css">
+    <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
+    <link rel="stylesheet" type="text/css" href="popover.css">
+    <link rel="stylesheet" type="text/css" href="textViewer.css">
+    <script type="text/javascript" src="utilities.js"></script>
+    <script type="text/javascript" src="treeoutline.js"></script>
+    <script type="text/javascript" src="inspector.js"></script>
+    <script type="text/javascript" src="InspectorBackendStub.js"></script>
+    <script type="text/javascript" src="InspectorFrontendHostStub.js"></script>
+    <script type="text/javascript" src="Object.js"></script>
+    <script type="text/javascript" src="Settings.js"></script>
+    <script type="text/javascript" src="ContextMenu.js"></script>
+    <script type="text/javascript" src="KeyboardShortcut.js"></script>
+    <script type="text/javascript" src="TextPrompt.js"></script>
+    <script type="text/javascript" src="Popover.js"></script>
+    <script type="text/javascript" src="Placard.js"></script>
+    <script type="text/javascript" src="View.js"></script>
+    <script type="text/javascript" src="Callback.js"></script>
+    <script type="text/javascript" src="Drawer.js"></script>
+    <script type="text/javascript" src="ChangesView.js"></script>
+    <script type="text/javascript" src="ConsoleView.js"></script>
+    <script type="text/javascript" src="Panel.js"></script>
+    <script type="text/javascript" src="TimelineGrid.js"></script>    
+    <script type="text/javascript" src="AbstractTimelinePanel.js"></script>
+    <script type="text/javascript" src="Resource.js"></script>
+    <script type="text/javascript" src="ResourceCategory.js"></script>
+    <script type="text/javascript" src="Database.js"></script>
+    <script type="text/javascript" src="DOMStorage.js"></script>
+    <script type="text/javascript" src="DOMStorageItemsView.js"></script>
+    <script type="text/javascript" src="DataGrid.js"></script>
+    <script type="text/javascript" src="CookieItemsView.js"></script>
+    <script type="text/javascript" src="Script.js"></script>
+    <script type="text/javascript" src="Breakpoint.js"></script>
+    <script type="text/javascript" src="SidebarPane.js"></script>
+    <script type="text/javascript" src="ElementsTreeOutline.js"></script>
+    <script type="text/javascript" src="SidebarTreeElement.js"></script>
+    <script type="text/javascript" src="Section.js"></script>
+    <script type="text/javascript" src="PropertiesSection.js"></script>
+    <script type="text/javascript" src="ObjectProxy.js"></script>
+    <script type="text/javascript" src="ObjectPropertiesSection.js"></script>
+    <script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
+    <script type="text/javascript" src="CallStackSidebarPane.js"></script>
+    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
+    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
+    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
+    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
+    <script type="text/javascript" src="EventListenersSidebarPane.js"></script>
+    <script type="text/javascript" src="Color.js"></script>
+    <script type="text/javascript" src="StylesSidebarPane.js"></script>
+    <script type="text/javascript" src="PanelEnablerView.js"></script>
+    <script type="text/javascript" src="WelcomeView.js"></script>
+    <script type="text/javascript" src="StatusBarButton.js"></script>
+    <script type="text/javascript" src="SummaryBar.js"></script>
+    <script type="text/javascript" src="ElementsPanel.js"></script>
+    <script type="text/javascript" src="ResourcesPanel.js"></script>
+    <script type="text/javascript" src="InjectedFakeWorker.js"></script>
+    <script type="text/javascript" src="ScriptsPanel.js"></script>
+    <script type="text/javascript" src="StoragePanel.js"></script>
+    <script type="text/javascript" src="ProfilesPanel.js"></script>
+    <script type="text/javascript" src="ConsolePanel.js"></script>
+    <script type="text/javascript" src="AuditsPanel.js"></script>
+    <script type="text/javascript" src="AuditResultView.js"></script>
+    <script type="text/javascript" src="AuditLauncherView.js"></script>
+    <script type="text/javascript" src="AuditRules.js"></script>
+    <script type="text/javascript" src="AuditCategories.js"></script>
+    <script type="text/javascript" src="ResourceView.js"></script>
+    <script type="text/javascript" src="SourceFrame.js"></script>
+    <script type="text/javascript" src="DOMSyntaxHighlighter.js"></script>
+    <script type="text/javascript" src="TextEditorModel.js"></script>
+    <script type="text/javascript" src="TextEditorHighlighter.js"></script>
+    <script type="text/javascript" src="TextViewer.js"></script>
+    <script type="text/javascript" src="SourceTokenizer.js"></script>
+    <script type="text/javascript" src="SourceCSSTokenizer.js"></script>
+    <script type="text/javascript" src="SourceHTMLTokenizer.js"></script>
+    <script type="text/javascript" src="SourceJavaScriptTokenizer.js"></script>
+    <script type="text/javascript" src="SourceView.js"></script>
+    <script type="text/javascript" src="FontView.js"></script>
+    <script type="text/javascript" src="ImageView.js"></script>
+    <script type="text/javascript" src="DatabaseTableView.js"></script>
+    <script type="text/javascript" src="DatabaseQueryView.js"></script>
+    <script type="text/javascript" src="ScriptView.js"></script>
+    <script type="text/javascript" src="ProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="BottomUpProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="TopDownProfileDataGridTree.js"></script>
+    <script type="text/javascript" src="ProfileView.js"></script>
+    <script type="text/javascript" src="DOMAgent.js"></script>
+    <script type="text/javascript" src="InjectedScript.js"></script>
+    <script type="text/javascript" src="InjectedScriptAccess.js"></script>
+    <script type="text/javascript" src="TimelineAgent.js"></script>
+    <script type="text/javascript" src="TimelinePanel.js"></script>
+    <script type="text/javascript" src="TimelineOverviewPane.js"></script>
+    <script type="text/javascript" src="TestController.js"></script>
+</head>
+<body class="detached">
+    <div id="toolbar">
+        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
+        <div class="toolbar-item flexable-space"></div>
+        <div class="toolbar-item hidden" id="search-results-matches"></div>
+        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
+        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
+    </div>
+    <div id="main">
+        <div id="main-panels" spellcheck="false"></div>
+        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="count-items"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>
+    </div>
+    <div id="drawer">
+        <div id="console-view"><div id="console-messages" class="monospace"><div id="console-prompt" spellcheck="false"><br></div></div></div>
+        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>
+    </div>
+</body>
+</html>
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
new file mode 100644
index 0000000..0965a5c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/inspectorSyntaxHighlight.css
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2009 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.webkit-css-comment { 
+    color: rgb(0, 116, 0);
+}
+
+.webkit-css-url, .webkit-css-color, .webkit-css-string, .webkit-css-keyword {
+    color: rgb(7, 144, 154);
+ }
+
+.webkit-css-number {
+    color: rgb(50, 0, 255);
+}
+
+.webkit-css-property, .webkit-css-at-rule {
+    color: rgb(200, 0, 0);
+}
+
+.webkit-css-selector {
+    color: black;
+}
+
+.webkit-css-important {
+    color: rgb(200, 0, 180);
+}
+
+.webkit-javascript-comment {
+    color: rgb(0, 116, 0);
+}
+
+.webkit-javascript-keyword {
+    color: rgb(170, 13, 145);
+}
+
+.webkit-javascript-number {
+    color: rgb(28, 0, 207);
+}
+
+.webkit-javascript-string, .webkit-javascript-regexp {
+    color: rgb(196, 26, 22);
+}
+
+.webkit-javascript-ident {
+    color: black;
+}
+
+.webkit-html-comment {
+    /* Keep this in sync with view-source.css (.webkit-html-comment) */
+    color: rgb(35, 110, 37);
+}
+
+.webkit-html-tag {
+    /* Keep this in sync with view-source.css (.webkit-html-tag) */
+    color: rgb(136, 18, 128);
+}
+
+.webkit-html-doctype {
+    /* Keep this in sync with view-source.css (.webkit-html-doctype) */
+    color: rgb(192, 192, 192);
+}
+
+.webkit-html-attribute-name {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
+    color: rgb(153, 69, 0);
+}
+
+.webkit-html-attribute-value {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
+    color: rgb(26, 26, 166);
+}
+
+.webkit-html-external-link, .webkit-html-resource-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */
+    color: #00e;
+}
+
+.webkit-html-external-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link) */
+    text-decoration: none;
+}
+
+.webkit-html-external-link:hover {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */
+    text-decoration: underline;
+}
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/popover.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/popover.css
new file mode 100644
index 0000000..ae6f610
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/popover.css
@@ -0,0 +1,200 @@
+.popover {
+    position: absolute;
+    -webkit-border-image: url(Images/popoverBackground.png) 25 25 25 25;
+    border-width: 25px;
+    z-index: 100;
+    pointer-events: none;
+}
+
+.popover .content {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    pointer-events: auto;
+    overflow: auto;
+}
+
+.popover .arrow {
+    position: absolute;
+    background-image: url(Images/popoverArrows.png);
+    width: 19px;
+    height: 19px;
+    margin-left: 15px;
+    margin-top: -25px;
+    top: 0;
+    left: 0;
+}
+
+.popover.top-left-arrow .arrow {
+    /* The default is top-left, no styles needed. */
+}
+
+.popover.top-right-arrow .arrow {
+    right: 25px;
+    left: auto;
+}
+
+.popover.bottom-left-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.bottom-right-arrow .arrow {
+    right: 15px;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.left-top-arrow .arrow {
+    top: 0;
+    margin-top: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.left-bottom-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.right-top-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: 0;
+    margin-top: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
+.popover.right-bottom-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
+.popover ::-webkit-scrollbar {
+    width: 11px;
+    height: 11px;
+}
+
+.popover ::-webkit-scrollbar-corner {
+    display: none;
+}
+
+.popover ::-webkit-resizer {
+    display: none;
+}
+
+/* Horizontal Scrollbar Styles */
+
+.popover ::-webkit-scrollbar:horizontal:corner-present {
+    border-right-width: 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal {
+    -webkit-border-image: url(Images/thumbHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px;
+    min-width: 20px;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal:hover {
+    -webkit-border-image: url(Images/thumbHoverHoriz.png) 0 11 0 11;
+}
+
+.popover ::-webkit-scrollbar-thumb:horizontal:active {
+    -webkit-border-image: url(Images/thumbActiveHoriz.png) 0 11 0 11;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:start {
+    margin-left: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:end {
+    margin-right: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:end:corner-present {
+    margin-right: 4px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:decrement {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 0 0 11px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:horizontal:increment {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px 0 0;
+}
+
+/* Vertical Scrollbar Styles */
+
+
+.popover ::-webkit-scrollbar:vertical:corner-present {
+    border-bottom-width: 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical {
+    -webkit-border-image: url(Images/thumbVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0;
+    min-height: 20px;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical:hover {
+    -webkit-border-image: url(Images/thumbHoverVert.png) 11 0 11 0;
+}
+
+.popover ::-webkit-scrollbar-thumb:vertical:active {
+    -webkit-border-image: url(Images/thumbActiveVert.png) 11 0 11 0;
+}
+
+
+.popover ::-webkit-scrollbar-track-piece:vertical:start {
+    margin-top: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:end {
+    margin-bottom: 5px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:end:corner-present {
+    margin-bottom: 4px;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:decrement {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0 0 0;
+}
+
+.popover ::-webkit-scrollbar-track-piece:vertical:increment {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 0 0 11px 0;
+}
+
+/* Forced Scrollbar Mode Styles */
+
+.popover ::-webkit-scrollbar-button {
+    display: none;
+}
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/textViewer.css b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/textViewer.css
new file mode 100644
index 0000000..b69545f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/inspector/textViewer.css
@@ -0,0 +1,162 @@
+.text-editor {
+    position: absolute;
+    top:0;
+    left:0;
+    right:0;
+    bottom:0;
+    white-space: pre;
+    overflow: auto;
+}
+
+.text-editor-lines {
+    border: 0;
+    -webkit-border-horizontal-spacing: 0;
+    -webkit-border-vertical-spacing: 0;
+    -webkit-user-select: text;
+}
+
+.webkit-html-message-bubble {
+    -webkit-box-shadow: black 0px 2px 5px;
+    -webkit-border-radius: 9px;
+    -webkit-border-fit: lines;
+    font-size: 10px;
+    font-family: Lucida Grande, sans-serif;
+    font-weight: bold;
+    margin: 6px 25px;
+    padding: 0 7px 1px;
+    z-index:20;
+    max-width: 80%;
+    
+}
+
+.webkit-html-warning-message {
+    background-color: rgb(100%, 62%, 42%);
+    border: 2px solid rgb(100%, 52%, 21%);
+}
+
+.webkit-html-error-message {
+    background-color: rgb(100%, 42%, 42%);
+    border: 2px solid rgb(100%, 31%, 31%);
+}
+
+.webkit-html-message-line {
+    padding-left: 23px;
+    text-indent: -20px;
+}
+
+.webkit-html-message-line-hover {
+    padding-left: 23px;
+    text-indent: -20px;
+    white-space: auto;
+    text-overflow: auto;
+    overflow: auto;
+}
+
+.webkit-html-message-icon {
+    position: relative;
+    top: 2px;
+    margin: 0 4px;
+}
+
+.webkit-line-number {
+    color: rgb(128, 128, 128);
+    background-color: rgb(240, 240, 240);
+    border-right: 1px solid rgb(187, 187, 187);
+    text-align: right;
+    word-break: normal;
+    -webkit-user-select: none;
+	padding-right: 4px;
+	padding-left: 6px;
+}
+
+.webkit-line-number-outer {
+    margin-right: -4px;
+    margin-left: -4px;
+    border-color: transparent;
+    border-style: solid;
+    border-width: 0 0 0px 2px;
+    vertical-align: top;
+}
+
+.webkit-line-number-inner {
+    margin-right: 4px;
+}
+
+.webkit-breakpoint .webkit-line-number-inner, .webkit-breakpoint-conditional .webkit-line-number-inner, .webkit-execution-line .webkit-line-number-inner {
+    margin-right: -10px;
+}
+
+.webkit-line-content {
+    width: 100%;
+    padding-left: 2px;
+    vertical-align: top;
+}
+
+.webkit-breakpoint .webkit-line-number-outer {
+    color: white;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/breakpointBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-conditional .webkit-line-number-outer {
+    color: white;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/breakpointConditionalBorder.png) 0 14 0 2;
+}
+
+.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    border-width: 0 14px 0px 2px;
+    -webkit-border-image: url(Images/programCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {
+    color: white;
+    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number-outer {
+    color: transparent;
+    -webkit-border-image: url(Images/breakpointConditionalCounterBorder.png) 0 14 0 2;
+}
+
+.webkit-breakpoint-disabled .webkit-line-number-outer {
+    opacity: 0.5;
+}
+
+.breakpoints-deactivated .webkit-breakpoint .webkit-line-number-outer {
+    opacity: 0.5;
+}
+
+.breakpoints-deactivated .webkit-breakpoint-disabled .webkit-line-number-outer {
+    opacity: 0.3;
+}
+
+.webkit-execution-line .webkit-line-content {
+    background-color: rgb(171, 191, 254);
+    outline: 1px solid rgb(64, 115, 244);
+}
+
+.webkit-search-result {
+    -webkit-border-radius: 4px;
+    padding: 2px 2px 2px 3px;
+    margin: -2px -2px -2px -3px;
+    opacity: 0.8;
+    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    background-color: rgb(241, 234, 0);
+    color: black;
+}
+
+.webkit-highlighted-line .webkit-line-content {
+    -webkit-animation: "fadeout" 2s 0s;
+}
+
+@-webkit-keyframes fadeout {
+    from {background-color: rgb(255, 255, 120); }
+    to { background-color: white; }
+}
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak
new file mode 100644
index 0000000..7daa87f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/it.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak
new file mode 100644
index 0000000..3c91c3b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ja.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/keystone_promote_postflight.sh b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/keystone_promote_postflight.sh
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/keystone_promote_postflight.sh
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/keystone_promote_postflight.sh
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/keystone_promote_preflight.sh b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/keystone_promote_preflight.sh
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/keystone_promote_preflight.sh
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/keystone_promote_preflight.sh
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak
new file mode 100644
index 0000000..6a2f985
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/kn.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak
new file mode 100644
index 0000000..34f8083
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ko.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/linkCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/linkCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/linkCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/linkCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak
new file mode 100644
index 0000000..944bcb4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lt.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak
new file mode 100644
index 0000000..a0b7688
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/lv.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf
new file mode 100644
index 0000000..2d24f04
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf
new file mode 100644
index 0000000..358288f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_chrome_rtl_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf
new file mode 100644
index 0000000..f592a3c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf
new file mode 100644
index 0000000..4349fa9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/menu_page_rtl_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/missingImage.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/missingImage.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/missingImage.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/missingImage.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak
new file mode 100644
index 0000000..e8467a6
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ml.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/moveCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/moveCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/moveCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/moveCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak
new file mode 100644
index 0000000..6738e06
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/mr.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nav.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nav.pdf
new file mode 100644
index 0000000..a567165
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nav.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak
new file mode 100644
index 0000000..e2a86d4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nb.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab.pdf
new file mode 100644
index 0000000..d20a819
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_h.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_h.pdf
new file mode 100644
index 0000000..22dd259
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_h.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_p.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_p.pdf
new file mode 100644
index 0000000..788c249
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/newtab_p.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak
new file mode 100644
index 0000000..f350bb5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/nl.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/noDropCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/noDropCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/noDropCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/noDropCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/noneCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/noneCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/noneCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/noneCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northEastResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northEastResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northEastResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northEastResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northEastSouthWestResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northEastSouthWestResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northEastSouthWestResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northEastSouthWestResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northSouthResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northSouthResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northSouthResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northSouthResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northWestResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northWestResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northWestResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northWestResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northWestSouthEastResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northWestSouthEastResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/northWestSouthEastResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/northWestSouthEastResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/notAllowedCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/notAllowedCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/notAllowedCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/notAllowedCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak
new file mode 100644
index 0000000..aa7baa4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/or.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/otr_icon.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/otr_icon.pdf
new file mode 100644
index 0000000..3ded470
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/otr_icon.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak
new file mode 100644
index 0000000..1d05a9a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pl.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/product_logo_32.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/product_logo_32.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/product_logo_32.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/product_logo_32.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/progressCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/progressCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/progressCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/progressCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak
new file mode 100644
index 0000000..71f443b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_BR.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak
new file mode 100644
index 0000000..a86a469
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/pt_PT.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/reload_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/reload_Template.pdf
new file mode 100644
index 0000000..aefef90
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/reload_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/renderer.sb b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/renderer.sb
new file mode 100644
index 0000000..27b2a90
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/renderer.sb
@@ -0,0 +1,39 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for Fonts.
+(allow file-read-data (regex #"^/System/Library/Fonts($|/)"))  ; 10.5.6
+;10.6_ONLY (allow file-read-data (regex #"^/Library/Fonts($|/)"))  ; 10.6
+(allow mach-lookup (global-name "com.apple.FontObjectsServer"))  ; 10.5.6
+;10.6_ONLY (allow mach-lookup (global-name "com.apple.FontServer"))  ; 10.6
+
+; USER_HOMEDIR is substitued at runtime - http://crbug.com/11269 
+;10.6_ONLY (allow file-read-data (subpath "USER_HOMEDIR/Library/Fonts"))  ; 10.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak
new file mode 100644
index 0000000..212d3c8
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ro.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak
new file mode 100644
index 0000000..7bf942d
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ru.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak
new file mode 100644
index 0000000..e59b92a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sk.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak
new file mode 100644
index 0000000..282db16
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sl.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southEastResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southEastResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southEastResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southEastResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southWestResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southWestResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/southWestResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/southWestResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak
new file mode 100644
index 0000000..69dc63d
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sr.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/star_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/star_Template.pdf
new file mode 100644
index 0000000..c6e3d6a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/star_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/starred.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/starred.pdf
new file mode 100644
index 0000000..a555b0f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/starred.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/stop_Template.pdf b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/stop_Template.pdf
new file mode 100644
index 0000000..445355f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/stop_Template.pdf
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak
new file mode 100644
index 0000000..e712b09
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sv.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak
new file mode 100644
index 0000000..7dafebf
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/sw.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak
new file mode 100644
index 0000000..af00c4e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/ta.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak
new file mode 100644
index 0000000..584da4a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/te.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak
new file mode 100644
index 0000000..398bd06
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/th.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak
new file mode 100644
index 0000000..ef5bb84
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/tr.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak
new file mode 100644
index 0000000..9efb195
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/uk.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/utility.sb b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/utility.sb
new file mode 100644
index 0000000..a4bd16b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/utility.sb
@@ -0,0 +1,40 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+; This is the Sandbox configuration file used for safeguarding the utility
+; process which is used for performing sandboxed operations that need to touch
+; the filesystem like decoding theme images and unpacking extensions.
+;
+; This configuration locks everything down, except access to one configurable
+; directory.  This is different from other sandbox configuration files where
+; file system access is entireley restricted.
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
+
+; Enable full access to given directory if needed.
+;ENABLE_DIRECTORY_ACCESS (allow file-read* file-write* (regex #"DIR_TO_ALLOW_ACCESS"))
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/verticalTextCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/verticalTextCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/verticalTextCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/verticalTextCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak
new file mode 100644
index 0000000..af38b77
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/vi.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/waitCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/waitCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/waitCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/waitCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/westResizeCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/westResizeCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/westResizeCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/westResizeCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/worker.sb b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/worker.sb
new file mode 100644
index 0000000..6d3907b
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/worker.sb
@@ -0,0 +1,35 @@
+;;
+;; Copyright (c) 2009 The Chromium Authors. All rights reserved.
+;; Use of this source code is governed by a BSD-style license that can be
+;; found in the LICENSE file.
+;;
+; This is the Sandbox configuration file used for safeguarding the worker
+; process which is used to run web workers in a sandboxed environment.
+;
+; This is the most restrictive sandbox profile and only enables just enough
+; to allow basic use of Cocoa.
+(version 1)
+(deny default)
+; Support for programmatically enabling verbose debugging.
+;ENABLE_LOGGING (debug deny)
+
+; Allow sending signals to self - http://crbug.com/20370
+(allow signal (target self))
+
+; Needed for full-page-zoomed controls - http://crbug.com/11325
+(allow sysctl-read)
+
+; Each line is marked with the System version that needs it.
+; This profile is tested with the following system versions:
+;     10.5.6, 10.6
+
+; Allow following symlinks
+(allow file-read-metadata)  ; 10.5.6
+
+; Loading System Libraries.
+(allow file-read-data (regex #"^/System/Library/Frameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/PrivateFrameworks($|/)"))  ; 10.5.6
+(allow file-read-data (regex #"^/System/Library/CoreServices($|/)"))  ; 10.5.6
+
+; Needed for IPC on 10.6
+;10.6_ONLY (allow ipc-posix-shm)
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak
new file mode 100644
index 0000000..92c5154
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_CN.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak
new file mode 100644
index 0000000..09104d9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zh_TW.lproj/locale.pak
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zoomInCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zoomInCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zoomInCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zoomInCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zoomOutCursor.png b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zoomOutCursor.png
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Framework.framework/Resources/zoomOutCursor.png
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Framework.framework/Resources/zoomOutCursor.png
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Info.plist b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Info.plist
new file mode 100644
index 0000000..7ca8ce4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Info.plist
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>Google Chrome Helper</string>
+	<key>CFBundleExecutable</key>
+	<string>Google Chrome Helper</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.Chrome.helper</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>Chrome Helper</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>5.0.350.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>350.0</string>
+	<key>LSFileQuarantineEnabled</key>
+	<true/>
+	<key>LSHasLocalizedDisplayName</key>
+	<string>1</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>10.5.0</string>
+	<key>LSUIElement</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper
new file mode 100755
index 0000000..aa0d2e2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
new file mode 100755
index 0000000..7b93ae1
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/MacOS/libplugin_carbon_interpose.dylib
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/PkgInfo b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/PkgInfo
similarity index 100%
rename from Google Chrome.app/Contents/Versions/4.0.287.0/Google Chrome Helper.app/Contents/PkgInfo
rename to Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/PkgInfo
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
new file mode 100644
index 0000000..4534121
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/am.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
new file mode 100644
index 0000000..6d8c9cf
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ar.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bg.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b0a7e61
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/bn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b675c7f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ca.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/cs.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
new file mode 100644
index 0000000..faab5bc
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/da.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/de.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/el.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/en_GB.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
new file mode 100644
index 0000000..a831e90
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
new file mode 100644
index 0000000..568c0c8
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/es_419.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
new file mode 100644
index 0000000..d2eb4f4
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/et.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fil.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..3a4c21c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/fr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
new file mode 100644
index 0000000..e0155e1
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/gu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/he.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b4c54a9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
new file mode 100644
index 0000000..75b1496
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/hu.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
new file mode 100644
index 0000000..af33ff5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/id.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
new file mode 100644
index 0000000..5ae465c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/it.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ja.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
new file mode 100644
index 0000000..4bf0fe9
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/kn.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
new file mode 100644
index 0000000..0c471c8
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ko.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
new file mode 100644
index 0000000..1c62024
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lt.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/lv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
new file mode 100644
index 0000000..5a5ea3a
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ml.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..a7d5458
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/mr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
new file mode 100644
index 0000000..ea2392e
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nb.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/nl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/or.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..7e9cad0
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
new file mode 100644
index 0000000..2997bb3
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
new file mode 100644
index 0000000..3936b20
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/pt_PT.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ro.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ru.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
new file mode 100644
index 0000000..7cc3aa2
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sl.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..ea2f07c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sv.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
new file mode 100644
index 0000000..d223957
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/sw.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
new file mode 100644
index 0000000..948d987
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/ta.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
new file mode 100644
index 0000000..a53a0a5
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/te.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
new file mode 100644
index 0000000..05be084
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/th.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b5bfe03
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/tr.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
new file mode 100644
index 0000000..207e0c3
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/uk.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
new file mode 100644
index 0000000..552bbf0
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/vi.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
new file mode 100644
index 0000000..8c6437c
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
Binary files differ
diff --git a/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
new file mode 100644
index 0000000..d07f70f
--- /dev/null
+++ b/Google Chrome.app/Contents/Versions/5.0.350.0/Google Chrome Helper.app/Contents/Resources/zh_TW.lproj/InfoPlist.strings
Binary files differ
diff --git a/notes.txt b/notes.txt
index 942e2e6..b6e3b99 100644
--- a/notes.txt
+++ b/notes.txt
@@ -34,8 +34,11 @@
         svn add --no-ignore Chromium.app/Contents/Versions/[new_version]
 
 
-Since there usually isn't an official build with exact same revsion, you have
-to do that yourself ("branding=Chrome buildtype=Official").
+Since there usually isn't an official build with exact same revsion,
+you have to do that yourself ("branding=Chrome buildtype=Official").
+You must build the official build on a Mac OS X 10.5 machine, unless
+we started building the official builds on Mac OS X 10.6 (see
+http://crbug.com/38443).
 
 
 Once the build is done, remove the keystone framework and plist keys so when