Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(658)

Unified Diff: telemetry/telemetry/internal/snap_page_util.py

Issue 3017573002: Make sure snap_page combined iframe serialized dom
Patch Set: . Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: telemetry/telemetry/internal/snap_page_util.py
diff --git a/telemetry/telemetry/internal/snap_page_util.py b/telemetry/telemetry/internal/snap_page_util.py
index 57210030776187a0ebe0b2ee0350d5fc817607c3..bef1e129b2263167f4f812b348ca2fc0b4bbf8ac 100644
--- a/telemetry/telemetry/internal/snap_page_util.py
+++ b/telemetry/telemetry/internal/snap_page_util.py
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import os
+import json
from telemetry.core import util
from telemetry.internal.browser import browser_finder
@@ -17,28 +18,53 @@ def SnapPage(finder_options, url, interactive, snapshot_file):
try:
tab = browser.tabs[0]
tab.Navigate(url)
- tab.WaitForDocumentReadyStateToBeComplete()
if interactive:
raw_input(
'Activating interactive mode. Press enter after you finish '
"interacting with the page to snapshot the page's DOM content.")
- with open(
- os.path.join(util.GetTelemetryThirdPartyDir(), 'snap-it',
- 'HTMLSerializer.js')) as f:
- snapit_script = f.read()
- tab.ExecuteJavaScript(snapit_script)
- tab.ExecuteJavaScript(
- '''
- var serializedDomArray;
- var htmlSerializer = new HTMLSerializer();
- htmlSerializer.processDocument(document);
- htmlSerializer.fillHolesAsync(document, function(s) {
- serializedDomArray = s.html;
- });
- ''')
+
print 'Snapshotting content of %s. This could take a while...' % url
- tab.WaitForJavaScriptCondition('serializedDomArray !== undefined')
- serialized_dom = ''.join(tab.EvaluateJavaScript('serializedDomArray'))
- snapshot_file.write(serialized_dom)
+ tab.WaitForDocumentReadyStateToBeComplete()
+ tab.action_runner.WaitForNetworkQuiescence()
+
+ with open(os.path.join(util.GetTelemetryThirdPartyDir(), 'snap-it',
+ 'HTMLSerializer.js')) as f:
+ snapit_script = f.read()
+
+ with open(os.path.join(util.GetTelemetryThirdPartyDir(), 'snap-it',
+ 'popup.js')) as f:
+ dom_combining_script = f.read()
+
+ serialized_doms = []
+
+ # Serialize the dom in each frame.
+ for context_id in tab.EnableAllContexts():
+ tab.ExecuteJavaScript(snapit_script, context_id=context_id)
+ tab.ExecuteJavaScript(
+ '''
+ var serializedDom;
+ var htmlSerializer = new HTMLSerializer();
+ htmlSerializer.processDocument(document);
+ htmlSerializer.fillHolesAsync(document, function(s) {
+ serializedDom = s.asDict();
+ });
+ ''', context_id=context_id)
+ tab.WaitForJavaScriptCondition(
+ 'serializedDom !== undefined', context_id=context_id)
+ serialized_doms.append(tab.EvaluateJavaScript(
+ 'serializedDom', context_id=context_id))
+
+ # Sending all the serialized doms back to tab execution context.
+ tab.ExecuteJavaScript('var serializedDoms = [];')
+ for sub_dom in serialized_doms:
+ print len(json.dumps(sub_dom))
+ tab.ExecuteJavaScript('serializedDoms.push({{sub_dom}})', sub_dom=sub_dom)
+
+ # Combine all the doms to one HTML string.
+ tab.EvaluateJavaScript(dom_combining_script)
+ page_snapshot = tab.ExecuteJavaScript(
+ 'var domString = outputHTMLString(serialized_doms);')
+
+ snapshot_file.write(page_snapshot)
finally:
browser.Close()

Powered by Google App Engine
This is Rietveld 408576698