@@ -235,6 +235,11 @@ void FrameLoaderClientQt::setFrame(QWebFrameAdapter* webFrame, LocalFrame* frame
235235
236236 connect (this , SIGNAL (titleChanged (QString)),
237237 m_webFrame->handle (), SIGNAL (titleChanged (QString)));
238+
239+ connect (this , SIGNAL (resourceLoadStarted (const QUrl&, const QtResourceRequestInfo&, bool )),
240+ m_webFrame->pageAdapter ->handle (), SIGNAL (resourceLoadStarted (const QUrl&, const QtResourceRequestInfo&, bool )));
241+ connect (this , SIGNAL (resourceLoadFinished (const QUrl, qint64, const QtResourceTimingInfo&, bool )),
242+ m_webFrame->pageAdapter ->handle (), SIGNAL (resourceLoadFinished (const QUrl&, qint64, const QtResourceTimingInfo&, bool )));
238243}
239244
240245bool FrameLoaderClientQt::hasWebView () const
@@ -1392,6 +1397,116 @@ RefPtr<HistoryItem> FrameLoaderClientQt::createHistoryItemTree(bool clipAtTarget
13921397 return coreMainFrame->loader ().history ().createItemTree (*m_frame, clipAtTarget, itemID);
13931398}
13941399
1400+
1401+ void FrameLoaderClientQt::dispatchDidStartResourceLoad (const WebCore::CachedResource& resource)
1402+ {
1403+ QUrl qurl (resource.url ());
1404+
1405+ bool isCoalesced = resource.numberOfClients () == 0 ;
1406+
1407+ QtResourceRequestInfo requestInfo;
1408+ requestInfo.resourceType = resourceTypeToString (resource.type ());
1409+ requestInfo.initiatorType = resource.initiatorType ().string ();
1410+
1411+ Q_EMIT resourceLoadStarted (qurl, requestInfo, isCoalesced);
1412+ }
1413+
1414+ void FrameLoaderClientQt::dispatchDidFinishResourceLoad (const WebCore::CachedResource& resource)
1415+ {
1416+ QUrl qurl (resource.url ());
1417+ qint64 size = resource.encodedSize ();
1418+ bool success = (resource.status () != WebCore::CachedResource::Status::LoadError &&
1419+ resource.status () != WebCore::CachedResource::Status::DecodeError);
1420+
1421+ // Create timing info from resource
1422+ QtResourceTimingInfo timing;
1423+ if (auto networkMetrics = const_cast <WebCore::CachedResource&>(resource).takeNetworkLoadMetrics ()) {
1424+ timing = extractTimingInfo (*networkMetrics);
1425+ } else {
1426+ timing.totalMs = 0 ; // Fallback
1427+ }
1428+
1429+ Q_EMIT resourceLoadFinished (qurl, size, timing, success);
1430+ }
1431+
1432+ QString FrameLoaderClientQt::resourceTypeToString (WebCore::CachedResource::Type type) const
1433+ {
1434+ switch (type) {
1435+ case WebCore::CachedResource::Type::MainResource:
1436+ return QStringLiteral (" document" );
1437+ case WebCore::CachedResource::Type::ImageResource:
1438+ return QStringLiteral (" image" );
1439+ case WebCore::CachedResource::Type::CSSStyleSheet:
1440+ return QStringLiteral (" stylesheet" );
1441+ case WebCore::CachedResource::Type::Script:
1442+ return QStringLiteral (" script" );
1443+ case WebCore::CachedResource::Type::FontResource:
1444+ return QStringLiteral (" font" );
1445+ case WebCore::CachedResource::Type::SVGFontResource:
1446+ return QStringLiteral (" svg-font" );
1447+ case WebCore::CachedResource::Type::MediaResource:
1448+ return QStringLiteral (" media" );
1449+ case WebCore::CachedResource::Type::RawResource:
1450+ return QStringLiteral (" xhr" );
1451+ case WebCore::CachedResource::Type::Icon:
1452+ return QStringLiteral (" icon" );
1453+ case WebCore::CachedResource::Type::Beacon:
1454+ return QStringLiteral (" beacon" );
1455+ case WebCore::CachedResource::Type::Ping:
1456+ return QStringLiteral (" ping" );
1457+ #if ENABLE(XSLT)
1458+ case WebCore::CachedResource::Type::XSLStyleSheet:
1459+ return QStringLiteral (" xsl" );
1460+ #endif
1461+ case WebCore::CachedResource::Type::LinkPrefetch:
1462+ return QStringLiteral (" prefetch" );
1463+ #if ENABLE(VIDEO)
1464+ case WebCore::CachedResource::Type::TextTrackResource:
1465+ return QStringLiteral (" track" );
1466+ #endif
1467+ #if ENABLE(APPLICATION_MANIFEST)
1468+ case WebCore::CachedResource::Type::ApplicationManifest:
1469+ return QStringLiteral (" manifest" );
1470+ #endif
1471+ case WebCore::CachedResource::Type::SVGDocumentResource:
1472+ return QStringLiteral (" svg" );
1473+ }
1474+ return QStringLiteral (" unknown" );
1475+ }
1476+
1477+ QtResourceTimingInfo FrameLoaderClientQt::extractTimingInfo (const WebCore::NetworkLoadMetrics& metrics) const
1478+ {
1479+ QtResourceTimingInfo info;
1480+
1481+ // Extract detailed timing breakdown from NetworkLoadMetrics (W3C Resource Timing API)
1482+ if (metrics.domainLookupStart .secondsSinceEpoch ().value () > 0 && metrics.domainLookupEnd .secondsSinceEpoch ().value () > 0 ) {
1483+ info.domainLookupMs = (metrics.domainLookupEnd - metrics.domainLookupStart ).millisecondsAs <qint64>();
1484+ }
1485+
1486+ if (metrics.connectStart .secondsSinceEpoch ().value () > 0 && metrics.connectEnd .secondsSinceEpoch ().value () > 0 ) {
1487+ info.connectMs = (metrics.connectEnd - metrics.connectStart ).millisecondsAs <qint64>();
1488+ }
1489+
1490+ if (metrics.secureConnectionStart .secondsSinceEpoch ().value () > 0 && metrics.connectEnd .secondsSinceEpoch ().value () > 0 ) {
1491+ info.sslMs = (metrics.connectEnd - metrics.secureConnectionStart ).millisecondsAs <qint64>();
1492+ }
1493+
1494+ if (metrics.requestStart .secondsSinceEpoch ().value () > 0 && metrics.responseStart .secondsSinceEpoch ().value () > 0 ) {
1495+ info.requestMs = (metrics.responseStart - metrics.requestStart ).millisecondsAs <qint64>();
1496+ }
1497+
1498+ if (metrics.responseStart .secondsSinceEpoch ().value () > 0 && metrics.responseEnd .secondsSinceEpoch ().value () > 0 ) {
1499+ info.responseMs = (metrics.responseEnd - metrics.responseStart ).millisecondsAs <qint64>();
1500+ }
1501+
1502+ // Calculate total timing
1503+ if (metrics.fetchStart .secondsSinceEpoch ().value () > 0 && metrics.responseEnd .secondsSinceEpoch ().value () > 0 ) {
1504+ info.totalMs = (metrics.responseEnd - metrics.fetchStart ).millisecondsAs <qint64>();
1505+ }
1506+
1507+ return info;
1508+ }
1509+
13951510}
13961511
13971512#include " moc_FrameLoaderClientQt.cpp"
0 commit comments