summaryrefslogtreecommitdiffstats
path: root/src/core/renderer_host/web_engine_page_host.cpp
blob: ea9b363eab95a1009b6a7ff58b7a84aa5e35465c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "web_engine_page_host.h"

#include "qtwebengine/browser/qtwebenginepage.mojom.h"
#include "content/public/browser/web_contents.h"

#include "render_widget_host_view_qt.h"
#include "type_conversion.h"
#include "web_contents_adapter_client.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"

namespace QtWebEngineCore {

WebEnginePageHost::WebEnginePageHost(content::WebContents *webContents,
                                     WebContentsAdapterClient *adapterClient)
    : content::WebContentsObserver(webContents), m_adapterClient(adapterClient)
{
}

void WebEnginePageHost::FetchDocumentMarkup(uint64_t requestId)
{
    auto &remote = GetWebEnginePageRenderFrame(web_contents()->GetPrimaryMainFrame());
    remote->FetchDocumentMarkup(
            requestId,
            base::BindOnce(&WebEnginePageHost::OnDidFetchDocumentMarkup, base::Unretained(this)));
}

void WebEnginePageHost::FetchDocumentInnerText(uint64_t requestId)
{
    auto &remote = GetWebEnginePageRenderFrame(web_contents()->GetPrimaryMainFrame());
    remote->FetchDocumentInnerText(requestId,
                                   base::BindOnce(&WebEnginePageHost::OnDidFetchDocumentInnerText,
                                                  base::Unretained(this)));
}

void WebEnginePageHost::OnDidFetchDocumentMarkup(uint64_t requestId, const std::string &markup)
{
    m_adapterClient->didFetchDocumentMarkup(requestId, toQt(markup));
}

void WebEnginePageHost::OnDidFetchDocumentInnerText(uint64_t requestId,
                                                    const std::string &innerText)
{
    m_adapterClient->didFetchDocumentInnerText(requestId, toQt(innerText));
}

void WebEnginePageHost::RenderFrameDeleted(content::RenderFrameHost *render_frame)
{
    m_renderFrames.erase(render_frame);
}

void WebEnginePageHost::SetBackgroundColor(uint32_t color)
{
    auto &remote = GetWebEnginePageRenderFrame(web_contents()->GetPrimaryMainFrame());
    remote->SetBackgroundColor(color);
}

const WebEnginePageRenderFrameRemote &
WebEnginePageHost::GetWebEnginePageRenderFrame(content::RenderFrameHost *rfh)
{
    auto it = m_renderFrames.find(rfh);
    if (it == m_renderFrames.end()) {
        WebEnginePageRenderFrameRemote remote;
        rfh->GetRemoteAssociatedInterfaces()->GetInterface(remote.BindNewEndpointAndPassReceiver());
        it = m_renderFrames.insert(std::make_pair(rfh, std::move(remote))).first;
    } else if (it->second.is_bound() && !it->second.is_connected()) {
        it->second.reset();
        rfh->GetRemoteAssociatedInterfaces()->GetInterface(&it->second);
    }

    return it->second;
}

} // namespace QtWebEngineCore